Oracle DML , DDL , DCL
DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据。
DML包括: SELECT:用于检索数据;
INSERT:用于增加数据到数据库;
UPDATE:用于从数据库中修改现存的数据
DELETE:用于从数据库中删除数据。
DDL(Data Definition Language,数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象。
DDL包括:DDL语句可以用于创建用户和重建数据库对象。下面是DDL命令:
CREATE TABLE:创建表
ALTER TABLE
DROP TABLE:删除表
CREATE INDEX
DROP INDEX
DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。
DCL包括:
ALTER PASSWORD
GRANT
REVOKE
CREATE SYNONYM
一:DCL(数据控制语言)
1、创建用户test2,密码也是test2(记得最有以分;号结束):
create user test2 identified by test2;
2、给test2授权:create session;(允许用户登陆Oracle):
grant create session to test2;
3、给test2分配创建表的权限;
grant create table to test2;
4、给test2分配表空间的使用权限;
grant unlimited tablespace to test2;
二:DDL(数据定义语言练习)
1、创建表:SQL> create table t_user(
userid number(30) not null primary key,
username varchar(20) not null,
age number(3),
sex varchar(2),
departid number(30) not null,
foreign key(departid) references t_depart(departid)
);
★alter table student add primary key(userid)这样用alter也可以创建关联主外键。
2、删除表:SQL> drop table t_depart;
3、创建序列:
create sequence seq_a minvalue 1000 maxvalue 99999999 start with 1000 increment by 1 nocache;
三:DML(数据操作语言):
1、insert插入SQL:
(1)insert into t_depart (departid,departname,createdate)
values (1,'市场部',sysdate);
(2)insert into t_user values (seq_user.nextval,'马文涛',23,'男');
2、delete删除SQL:
(1)delete t_user;(太可怕了,如果在删除时不加条件,则把此表中的所有数据都会删除!)
(2)delete t_user where userid = 3;
3、update更新SQL:
(1) update t_user set username = '争伟',sex = '男';
(太恐怖了,更新时不加条件表中所有行记录的姓名都被修改了!)
(2)update t_user set username = '文涛' where userid = 7;
★小结:我发现在增、删、改的SQL语句中用不到from关键字。
4、select查询SQL:格式——>select···from···where···group by···having···order by···;
(1)查询所有的用户:select * from t_user;
★在oracle中这里的表明用别名时不能加as关键字
如: select * from t_user u;正确
select * from t_user as u;错误
(2)查询指定的列: select username,sex from t_user;
(3)as给列以别名显示:select username as 用户名 from t_user;(这里的as关键字可以省略)
(4)distinct去掉重复的行:select distinct username from t_user;
(5)使用运算符:select age+10 from t_user;(给每个人的年龄都加10岁)
(6)连接字符串: select '用户名:' || username from t_user;(Oracle用||做连接字符串操作符)
(7)where子句:select * from t_user where username = '宝宝';
(8)between and在···之间:
select * from t_user where userid between 9 and 10;这也等价于下面这条SQL:
select * from t_user where userid >=9 and userid <=10;
(9)in匹配集合中的任意值:select * from t_user where username in('马文涛','宝宝');
(10)like模糊查询:%匹配0个或多个任意字符串,_匹配1个任意字符串。
select * from t_user where username like '%涛%';
(11)null判断某列为空:select * from t_user where sex is null;
(这里用is,不能用=,如果要返回不为null的记录就可以用is not null)
(12)order by排序:ASC: 升序排列(可以省略),DESC: 降序排列
升序:select u.userid,u.username from t_user u order by u.userid;
降序:select u.userid,u.username from t_user u order by u.userid desc;
(13)系统函数(对一组数据进行处理,返回一个值):
AVG–求平均值,COUNT–统计记录数,MAX–最大值,MIN–最小值,SUM–求和
<1>返回最小和最大的用户编号: select min(userid),max(userid) from t_user;
<2>返回总记录数: select count(*) from t_user;
<3>返回某个字段不为空的记录数: select count(sex) from t_user;
<4>返回不为空且不重复的记录数: select count(distinct sex) from t_user;
(14)group by分组(分组了就不能直接返回*,经常和聚合函数count(age)一起使用):
<1>按姓名分组,并统计每组人数:select count(*),username from t_user group by username;
<2>根据多个字段分组: select username,age,count(*) from t_user group by username,age;
◆group by有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。
(15)having过滤分组:select username from t_user group by username having count(*) > 2;
(16)子查询(子查询自身只能返回一个单独的值):
<1>子查询放在select后面,作为其中的一个字段返回。
select u.username,(select d.departname from t_depart d where d.departid = u.departid) from t_user u;
(返回用户和所属的部门,这中子查询理论上先执行外面的查询,只是我的感觉哦,嘿嘿!)
<2>子查询放在from后面,作为一张临时表。
select * from (select username,sex s from t_user where departid=1)
where s = '男';
(这种子查询应该先执行里面)
<3>子查询放在where后面,作为条件的一部分。
select * from t_user where departid = (select departid from t_depart where departname = '财务部');
(这种子查询也应该先执行里面)
(17)联合查询(当n张表连接时, 需要n-1个连接条件):
<1>等值连接(内连接):select u.username,d.departname from t_user u,t_depart d
where u.departid = d.departid;
<2>外连接:即把不满足条件的记录也返回,用个+就行了,
(+)操作符在哪边就代表另外一边不满足联合条件的记录可以被输出。这个感觉不太常用。
select b.book_id,b.book_name from book_info as b,book_click_num as c
where b.book_id = c.book_id(+);