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(+);

 

原文地址:https://www.cnblogs.com/pugang/p/13770440.html