SQL函数的学习

-- 函数的学习 
   -- 函数的用途 
   -- 函数的参数的个数 以及参数的数据类型   to_date( , )
   -- 函数的返回值类型   
    -- 内关联 根据关联字段取交集
     select  E.*,D.*
     from emp e  join dept d  on e.deptno = d.deptno 
     where  d.loc = 'NEW YORK' ;  
     -- 去重 distinct  
     select  distinct deptno   from  emp ;  
     select    deptno   from  dept ;  
    -- 外关联  
      -- 左外关联
       select  字段  from 表1  -- 主表 驱动表 
       left [ outer ] join 表2    --从表 
       on  关联条件 
       and  过滤条件 ;
      -- 找出 部门在 new york 的员工信息 
       select  
          e.empno,
          e.ename,
          e.job,
          e.mgr,
          e.hiredate,
          e.sal,
          e.comm,
          e.deptno,
         
          d.dname,
          d.loc
       from emp e  -- 主表
       left outer join  dept d  -- 从表
       on e.deptno = d.deptno ;
       -- 主从 换位置
        select  
          d.deptno,
          d.dname,
          d.loc,
          e.deptno ,
          e.empno,
          e.ename,
          e.job,
          e.mgr,
          e.hiredate,
          e.sal,
          e.comm
          
       from dept d  -- 主表
       left outer join  emp e  -- 从表
       on e.deptno = d.deptno ; 
      --  左外关联 加过滤条件  
        select  
          d.deptno,
          d.dname,
          d.loc,
          e.empno,
          e.ename,
          e.job,
          e.mgr,
          e.hiredate,
          e.sal,
          e.comm
       from dept d  -- 主表
       left outer join  emp e  -- 从表
       on e.deptno = d.deptno  and  d.loc = 'NEW YORK' ; 
       -- 左外关联在where  过滤
        select  
          d.deptno,
          d.dname,
          d.loc,
          e.empno,
          e.ename,
          e.job,
          e.mgr,
          e.hiredate,
          e.sal,
          e.comm
       from dept d  -- 主表
       left outer join  emp e  -- 从表
       on e.deptno = d.deptno  
       where   d.loc = 'NEW YORK' ; 
       on 和 where 中的过滤  有什么区别 ?
       1. 在内关联中 on 和 where 是等效的  
       2.  在外关联中 on 只过滤 从表的数据 ,不过滤主表的数据 
       3. 在where 中 是对 两个表关联之后的结果 进行过滤 ,
          所以过滤条件既会影响从表也会影响主表

       
      -- 右外关联   
       select  字段  from 表1  -- 从表 
       right [ outer ] join 表2    -- 主表 驱动表 
       on  关联条件 
       and  过滤条件 ;
        select  
          d.deptno,
          d.dname,
          d.loc,
          e.empno,
          e.ename,
          e.job,
          e.mgr,
          e.hiredate,
          e.sal,
          e.comm
       from   emp e      right outer join    dept d  -- 主表
       on e.deptno = d.deptno   ; 
      -- 全外关联 
        -- 建表语句  
         create table  表名 
          as  
          查询语句   ; 
         -- 案例:  
         create  table  emp_test 
         as 
           select *  from  emp  ;  
           -- 查询结果
        select  *  from  emp_test ; 
         -- 添加数据 
         insert into 表名 values ( 值1 ,值2 ...) ;
          commit ;
         注意 :  1. 值的个数要和原表保持一致
                 2.  值得数据类型要保持一致   
         insert into  emp_test  
         values( 1234 ,'扫地僧','扫地',7788, to_date('2000-01-01','YYYY-MM-DD'),5000,NULL ,50  ) ; 
          COMMIT ;
         SELECT *  FROM EMP_TEST ; 
         -- 删 表 
           drop table  EMP_TEST ;
         -- 删某条 数据  
           delete emp_test  where   empno = 1234 ;
        --全外关联  
         select  字段 from 表1 
         full join  表2 
         on 关联条件 
         and 过滤条件 ; 
         --案例  
         select  *  from emp_test e 
         full join dept d 
         on e.deptno = d.deptno  ;
       -- 
         select nvl(d.deptno ,e.deptno )  部门编号, e.ename ,d.loc from emp_test e 
         full join dept d 
         on e.deptno = d.deptno  ;   
        
       -- 不等值 关联  
         
         select  *  from  salgrade ; 
        -- 算出每个人的工资等级  
           select  e.ename,e.sal ,sl.grade ,sl.losal, sl.hisal
           from emp e 
           join  salgrade sl 
           on e.sal >= sl.losal 
            and  e.sal <= sl.hisal  ;
        --  用 between改写  
          select  e.ename,e.sal ,sl.grade ,sl.losal, sl.hisal
           from emp e 
           join  salgrade sl 
           on e.sal between  sl.losal  and   sl.hisal  ;   
       -- 练习1 查询 各部门的部门名称 ,以及对应的 经理姓名 
          -- 部门名称 部门编号 部门经理姓名 
       select *  from emp   ;
         select  D.DNAME ,D.DEPTNO ,E.ENAME
         from dept d 
         left join  emp e
         on  d.deptno = e.deptno 
          AND  e.job = 'MANAGER' ; 
    -- 聚合函数   
        -- 同时对多行进行操作, 并返回一个结果 
        -- max() 求最大值 
        -- min() 求最小值 
        -- sum() 求和 
        -- avg() 平均值 
        -- count() 返回查询结果的行数
        -- 案例 
        select 
          max(e.sal) 最高工资 ,
          min(e.sal) 最低工资 ,
          sum(e.sal) 工资总和 ,
          round(avg(e.sal ) ,2) 平均工资 , -- round 四舍五入 
          count(e.empno) 公司总人数
        from emp e ; 
        --  聚合函数 会跳过 空值  
         select 
          max(e.comm) 最高奖金 ,
          min(e.comm) 最低奖金  ,
          sum(e.comm) 工资总和 ,
          round(avg(e.comm ) ,2) 平均工资 , -- round 四舍五入 
          count(e.comm) 公司总人数
        from emp e ;  
        -- 错误演示 
         select 
          deptno ,
          max(e.comm) 最高奖金 ,
          min(e.comm) 最低奖金  ,
          sum(e.comm) 工资总和 ,
          round(avg(e.comm ) ,2) 平均工资 , -- round 四舍五入 
          count(e.comm) 公司总人数
        from emp e ;  
 
    -- 分组   GROUP BY 
    --  算出 不是 10部门 各部门的 最高工资 ..... 
       select 
          deptno 部门编号 ,
          max(e.sal) 最高工资 ,
          min(e.sal) 最低工资 ,
          sum(e.sal) 工资总和 ,
          round(avg(e.sal ) ,2) 平均工资 , -- round 四舍五入 
          count(e.empno) 部门总人数
        from emp e   
        where  e.deptno <> 10  
        group by e.deptno ;  
      -- 小练习 算出 各岗位 人数 ,最高工资 , 平均工资  
        
        select 
          e.job  岗位名称, 
          count(e.empno) 人数, 
          max(e.sal) 最高工资,
          round( avg(e.sal ) ,2) 平均工资
        from  emp e 
        group by e.job ;
      --  各年份 各部门 入职的人数  
        select 
           
          to_char( e.hiredate ,'YYYY' ) 入职年份, 
           deptno  部门 ,
          count(e.empno) 人数 
        from  emp e 
        group by   to_char( e.hiredate ,'YYYY' ) , deptno ;
      总结 :
         1. 聚合函数可以单独使用 ; -- select count(empno) from emp ;  
         2. 聚合函数还可以分组的字段结合起来使用  
             select deptno ,count(empno) from emp group by deptno ;
         3. select 后面 只能 分组字段 和 其他聚合函数
           错误案例   select deptno , job ,count(empno) from emp group by deptno  ;
       -- having   对聚合结果进行筛选 
        -- 求 部门人人数 大于4 部门部门  
         select 
           deptno ,
           count(empno) 
         from  emp e 
          -- WHERE JOB = 'MANAGER'
         group by deptno 
         having  count(empno) > 4 ; 
        -- 求出 各平均工资 大于 2500 的岗位 , 并列出岗位人数  
             
          select  
           e.job , 
           count(e.empno )  --
          from  emp e
          group by e.job 
           having  avg(e.sal) > 2500 ; 
       --  找出 部门  20  按照岗位进行分组 , 岗位人数大于一 ,并且最低薪资大于1000 , 的部门 
         按照 岗位人数进行排序  
         --  列出 岗位名称 , 岗位最低工资 ,岗位最高工资 ,岗位人数  
          
         select 
            e.job 岗位名称 ,
            min(e.sal) 最低工资 ,
            max(e.sal) 最高工资 ,
            count(e.empno) 岗位人数 
         from  emp e
         where  
          e.deptno = 20  
         group by e.job   
         having  count(e.empno) >1  and min(e.sal) > 1000 
         order by  岗位人数  ; 
       
    --  整个sql 的执行顺序  
     FROM  -- 第一步 加载表 
     WHERE -- 第二步 筛选表中的数据
     GROUP BY -- 第三步  分组  
     HAVING   -- 第四步  对分组后的结果进行过滤 
     SELECT  --  第五步  列出需要展示的字段  
     ORDER BY  -- 第六步  对查询结果进行排序   
   
-- 数学函数 
   -- 求绝对值  ABS(X)
   SELECT ABS( -19) FROM DUAL ; 
   -- 取余 MOD(X,Y) X除以y的余数 
   SELECT MOD( 8, 3) FROM DUAL ;
   -- 幂运算 POWER( X ,Y)  X 的 y 次方 
   SELECT POWER( 2, 3 ) FROM DUAL ;
   -- 截取 TRUNC( X ,Y)  对x 截取 y 位  
   SELECT TRUNC( 3.1415 , 3 ) FROM DUAL ;
   --  正负代表方向 , y 代表位数
   SELECT TRUNC( 314.15 , -2 ) FROM DUAL ;
    -- 向上取整  CEIL( X) 
    SELECT CEIL( 3.14) FROM DUAL ;
    -- 向下取整 FLOOR( X)  
    SELECT FLOOR( 3.14) FROM DUAL ;
    --  将 数字 634.47 处理成630 
     SELECT TRUNC(634.47, -1) FROM DUAL ;
    --  将 数字 634.47  处理成 634.4  
         SELECT TRUNC(634.47, 1) FROM DUAL ;
 -- 日期函数 
    --  截取日期 TRUNC  年份  当年的 1号
    SELECT TRUNC( SYSDATE , 'YYYY'  ) FROM DUAL ;
   -- 截取 月份  得到当月的一号
    SELECT TRUNC( SYSDATE , 'MM'  ) FROM DUAL ;
   -- 截取 日  得到当天的 0时
    SELECT TRUNC( SYSDATE , 'DD'  ) FROM DUAL ; 
   -- 截取 季度  得到当季度的 1号
    SELECT TRUNC( SYSDATE , 'Q'  ) FROM DUAL ;
   -- 截取 周  得到当 周的 1号
    SELECT TRUNC( SYSDATE , 'D'  ) FROM DUAL ;   
   -- 小练习  用 TRUNC 算出每年  入职员工数 
     select TRUNC( E.HIREDATE , 'YYYY' ) ,COUNT(E.EMPNO) 人数  FROM EMP E
      GROUP  BY TRUNC( E.HIREDATE , 'YYYY' ) ; 
   -- 小练习  用  TRUNC  算出 1981年 每个季度的 入职员工数  
      select TRUNC( E.HIREDATE , 'Q' ) ,COUNT(E.EMPNO) 人数  FROM EMP E
      WHERE  TO_CHAR(E.HIREDATE , 'YYYY' ) = '1981'
      GROUP  BY TRUNC( E.HIREDATE , 'Q' ) ; 
   -- 对年份 四舍五入 ROUND  极限值 7月 
      SELECT  ROUND(SYSDATE ,'YYYY' ) FROM  DUAL ;
      SELECT  ROUND( TO_DATE('20220630','YYYYMMDD' )  ,'YYYY' ) FROM  DUAL ;
      SELECT  ROUND( TO_DATE('20220701','YYYYMMDD' )  ,'YYYY' ) FROM  DUAL ;
    -- 对月份 四舍五入  极限值 16号
      SELECT  ROUND(SYSDATE ,'MM' ) FROM  DUAL ;
      SELECT  ROUND( TO_DATE('20220216','YYYYMMDD' )  ,'MM' ) FROM  DUAL ;
    -- 对天 四舍五入   极限值  中午 12点
      SELECT  ROUND(SYSDATE ,'DD' ) FROM  DUAL ;
      SELECT  ROUND( TO_DATE('20220216 11:59:59','YYYYMMDD HH:MI:SS' )  ,'DD' ) FROM  DUAL ;
      SELECT  ROUND( TO_DATE('20220216 13:59:59','YYYYMMDD HH24:MI:SS' )  ,'DD' ) FROM  DUAL ;
    -- 对周 四舍五入   极限值  周三的 12点  
      SELECT  ROUND(SYSDATE ,'D' ) FROM  DUAL ; 
      SELECT  ROUND( TO_DATE('20220823','YYYYMMDD' )  ,'D' ) FROM  DUAL ;
      SELECT  ROUND( TO_DATE('20220824 01:59:59','YYYYMMDD HH24:MI:SS' )  ,'D' ) FROM  DUAL ;
     

-- 数学函数 
   -- 求绝对值  ABS(X)
   SELECT ABS( -19) FROM DUAL ; 
   -- 取余 MOD(X,Y) X除以Y的余数 
   SELECT MOD( 8, 3) FROM DUAL ; -- 判断奇数或者是偶数
   -- 幂运算 POWER( X ,Y)  X 的 Y 次方 
   SELECT POWER( 2, 3 ) FROM DUAL ;
   -- 截取 TRUNC( X ,Y)  对X 截取 Y 位  
   SELECT TRUNC( 3.1415 , 3 ) FROM DUAL ;
   --  正负代表方向 , Y 代表位数
   SELECT TRUNC( 314.15 , -2 ) FROM DUAL ;
    -- 向上取整  CEIL( X) 
    SELECT CEIL( 3.14) FROM DUAL ;
    -- 向下取整 FLOOR( X)  
    SELECT FLOOR( 3.14) FROM DUAL ;
    --  将 数字 634.47 处理成630 
     SELECT TRUNC(634.47, -1) FROM DUAL ;
    --  将 数字 634.47  处理成 634.4  
         SELECT TRUNC(634.47, 1) FROM DUAL ;
 -- 日期函数 
    --  截取日期 TRUNC  年份  当年的 1号
    SELECT TRUNC( SYSDATE , 'YYYY'  ) FROM DUAL ;
   -- 截取 月份  得到当月的一号
    SELECT TRUNC( SYSDATE , 'MM'  ) FROM DUAL ;
   -- 截取 日  得到当天的 0时
    SELECT TRUNC( SYSDATE , 'DD'  ) FROM DUAL ; 
   -- 截取 季度  得到当季度的 1号
    SELECT TRUNC( SYSDATE , 'Q'  ) FROM DUAL ;
   -- 截取 周  得到当 周的 1号
    SELECT TRUNC( SYSDATE , 'D'  ) FROM DUAL ;   
   -- 小练习  用 TRUNC 算出每年  入职员工数 
     SELECT TRUNC( E.HIREDATE , 'YYYY' ) ,COUNT(E.EMPNO) 人数  FROM EMP E
      GROUP  BY TRUNC( E.HIREDATE , 'YYYY' ) ; 
   -- 小练习  用  TRUNC  算出 1981年 每个季度的 入职员工数  
      SELECT TRUNC( E.HIREDATE , 'Q' ) ,COUNT(E.EMPNO) 人数  FROM EMP E
      WHERE  TO_CHAR(E.HIREDATE , 'YYYY' ) = '1981'
      GROUP  BY TRUNC( E.HIREDATE , 'Q' ) ; 
   -- 对年份 四舍五入 ROUND  极限值 7月 
      SELECT  ROUND(SYSDATE ,'YYYY' ) FROM  DUAL ;
      SELECT  ROUND( TO_DATE('20220630','YYYYMMDD' )  ,'YYYY' ) FROM  DUAL ;
      SELECT  ROUND( TO_DATE('20220701','YYYYMMDD' )  ,'YYYY' ) FROM  DUAL ;
    -- 对月份 四舍五入  极限值 16号
      SELECT  ROUND(SYSDATE ,'MM' ) FROM  DUAL ;
      SELECT  ROUND( TO_DATE('20220216','YYYYMMDD' )  ,'MM' ) FROM  DUAL ;
    -- 对天 四舍五入   极限值  中午 12点
      SELECT  ROUND(SYSDATE ,'DD' ) FROM  DUAL ;
      SELECT  ROUND( TO_DATE('20220216 11:59:59','YYYYMMDD HH:MI:SS' )  ,'DD' ) FROM  DUAL ;
      SELECT  ROUND( TO_DATE('20220216 13:59:59','YYYYMMDD HH24:MI:SS' )  ,'DD' ) FROM  DUAL ;
    -- 对周 四舍五入   极限值  周三的 12点  
      SELECT  ROUND(SYSDATE ,'D' ) FROM  DUAL ; 
      SELECT  ROUND( TO_DATE('20220823','YYYYMMDD' )  ,'D' ) FROM  DUAL ;
      SELECT  ROUND( TO_DATE('20220824 01:59:59','YYYYMMDD HH24:MI:SS' )  ,'D' ) FROM  DUAL ;
    -- 月份的加减  ADD_MONTHS(DATE , VALUE ) 
     SELECT ADD_MONTHS( SYSDATE , -1 ) FROM DUAL ;
     SELECT ADD_MONTHS( SYSDATE ,  2 ) FROM DUAL ;
    -- 天数的加减   +1 
     SELECT   SYSDATE + 1   FROM DUAL ;
    -- 两个日期相差的 月数  MONTHS_BETWEEN( DATE1 ,DATE 2)  DATE1 - DATE2 
     SELECT  MONTHS_BETWEEN(SYSDATE  , TO_DATE( '20000101' ,'YYYYMMDD')  )  FROM DUAL 
    -- 小练习  算出   20000101 出生的人 今年 多大?
     SELECT  CEIL( MONTHS_BETWEEN(SYSDATE  , TO_DATE( '20000101' ,'YYYYMMDD')  )/12 ) FROM DUAL ;  
    -- 两个日期相差的天数  
      SELECT  CEIL( (SYSDATE  - TO_DATE( '20000101' ,'YYYYMMDD')  ) ) FROM DUAL ;       
    -- 返回指定日期 当月 的最后一天   LAST_DAY( DATE)

     SELECT  LAST_DAY( SYSDATE)  FROM DUAL ;
    -- 字符串函数 
      -- 字符串的拼接   CONCAT( 值1 , 值2 )
     SELECT  CONCAT( '小明' , '去电影院' )  FROM DUAL ;
     -- 将 EMP 表中 员工编号 和员工姓名 拼到一起  中间用 : 隔开  例子 :  7369:SMITH
      SELECT  CONCAT(CONCAT( EMPNO ,':' ),ENAME ) FROM EMP E ;
     --  多个值得拼接  ||   
      select  empno || ':' || ename from emp ; 
     -- 将一列中的多行 ,拼成 1 行   wm_concat( 字段)  
     select wm_concat(ename ) from emp ;  
     select deptno ,wm_concat(ename ) from emp   
     group by deptno ;  
    -- to_char 
    --  返回字符串的字符长度  LENGTH(X) 
       SELECT LENGTH( 'SCOTT' )  FROM DUAL ;
       SELECT LENGTH( '我吃西红柿' )  FROM DUAL ;
    -- 返回字符串的字节长度  LENGTHB(X)    
       SELECT LENGTHB( 'SCOTT' )  FROM DUAL ;
       SELECT LENGTHB( '我吃西红柿' )  FROM DUAL ;
     计算机中存储单位 
            1024 
        bit - byte(B) - KB - MB - GB - TB - PB  
    --  字符串的查找   instr( 字段 , 需要查找的值 [,数值(从哪里开始找) ,数值(第几次出现)] )   string   
         SELECT INSTR( E.ENAME  , 'S' ,1 ,1  ) , E.ENAME FROM EMP E ; 
         SELECT INSTR( E.ENAME  , 'S'   ) , E.ENAME FROM EMP E ; 
       -- 小练习 找到名字 t 第二次出现的位置 
         SELECT INSTR( E.ENAME  , 'T' , 1 ,2  ) , E.ENAME FROM EMP E ; 
       --  找出名字中带 S 员工  
         SELECT   *  FROM EMP E
           WHERE  INSTR( E.ENAME  , 'S'   ) > 0   ; 
    --  字符串替换  replace( 字段, 旧值, 新值) 
        SELECT  ename , replace( ename ,'S' ,'张' )   FROM EMP E
    --  小练习 将 各部门的 员工姓名 放入一行中 并且用 _ 分隔       
         select deptno ,replace(wm_concat(ename ),',', '_') from emp   
         group by deptno ;   
    -- 大小写转换  
      'SCOTT' , 'scott' ,'Scott' 
     -- 转小写 lower(x) 
            
     SELECT lower('SCOTT')  FROM DUAL ;
     --转大写 upper(x)
     SELECT  upper('scott')  FROM DUAL ;
     --使用案例:
      select  *  from emp 
      where  lower(ename) = 'scott' ; 
     
     SELECT   FROM DUAL ;
    -- 截取 
      -- 从左边截取 LTRIM( 字段 [,需要截取的内容 ]) 
    SELECT LTRIM( 'SASADFG' ,'SA'  )  FROM DUAL ; 
    SELECT LTRIM( 'SASAAAAAASSSSSDFG' ,'SA'  )  FROM DUAL ;  'SA'- S - A
    -- 小练习 'LSASAAAAAASSSSSDFG'
    SELECT LTRIM( 'LSASAAAAAASSSSSDFG' ,'SA'  )  FROM DUAL ;  
     -- 缺省 
      SELECT ' SDFSDFJK' 名字 FROM  DUAL ;   -- where  ename = 'SCOTT' ;
      SELECT  LTRIM('    SCOTT' ) FROM  DUAL ;
     -- 从右边截取 RTRIM  
    SELECT RTRIM( 'SASADFGSSSSAAAA' ,'SA'  )  FROM DUAL ; 
     -- 缺省 
    SELECT   ('SCOTT    ' ) FROM  DUAL ;    
    SELECT  RTRIM('SCOTT    ' ) FROM  DUAL ;
    -- 从两边切  TRIM( 需要切的字符  FROM  字段 ) 
     --  1. 只能写单个字符 
    SELECT TRIM(  'AS' FROM   'AAAASADFGSSSSAAAA'   )  FROM DUAL ; 
    -- 缺省  
    SELECT TRIM(  '  AAAASADFGSSSSAAAA   '   )  FROM DUAL ; 
    -- 按照字符的位数切 SUBSTR( 字段 , 从哪里开始切 [,切的长度] ) 
       '2022-08-24 01:59:59'  
     SELECT SUBSTR('2022-08-24 01:59:59', 1 , 10   )  FROM DUAL ;
     --  将时分秒 切出来 
     SELECT SUBSTR('2022-08-24 01:59:59', 12 , 8   )  FROM DUAL ;
     SELECT SUBSTR('2022-08-24 01:59:59', 12    )  FROM DUAL ;
     SELECT SUBSTR('2022-08-24 01:59:59', -8    )  FROM DUAL ;
     -- 实战演练  
     create table p_t as 
SELECT '浙江省 杭州市 余杭区'                  ADDRESS  FROM DUAL UNION ALL
SELECT '福建省 莆田市 仙游县'                  ADDRESS  FROM DUAL UNION ALL
SELECT '广西壮族自治区 百色市 田林县'          ADDRESS  FROM DUAL UNION ALL
SELECT '云南省 德宏傣族景颇族自治州 瑞丽市'    ADDRESS  FROM DUAL UNION ALL
SELECT '新疆维吾尔自治区 乌鲁木齐市 水磨沟区'  ADDRESS  FROM DUAL  ;
SELECT *  FROM p_t ;   
 ---  需求 切出省份 
   SELECT  SUBSTR( ADDRESS , 1 ,3 ) FROM  P_T ;
 ---   
   SELECT   ADDRESS ,SUBSTR( ADDRESS ,1 , INSTR( ADDRESS ,' ')-1 ) FROM  P_T ; 
 --  切出市  
    SELECT  ADDRESS  , 
            SUBSTR( ADDRESS ,  INSTR( ADDRESS ,' ') +1  , 
            INSTR( ADDRESS ,' ',1,2) - INSTR( ADDRESS ,' ') -1  
     ) FROM  P_T ; 
     ---  截取 区  
       SELECT  ADDRESS  , 
            SUBSTR( ADDRESS ,  INSTR( ADDRESS ,' ',1,2 ) +1   ) FROM  P_T ;  
-- 子查询   
   -- 什么是子查询 ?
    sql 语句中 另外一条 select 语句 
   -- 什么时候去使用子查询 ?
      当你不知道条件是什么的时候 
    -- 查询 emp 表中  部门所在地是  new york 的 员工信息 
     --  单行子查询 
        1.子查询 返回结果为 1行  2.只能返回一个字段 
     SELECT *  FROM  EMP 
     WHERE  DEPTNO  =  ( select  deptno   from dept where loc = 'NEW YORK' )  ; 
     -- 小需求 找出 工资 比  SMITH 工资高的 员工 的信息   
        SELECT  *  FROM  EMP E 
        WHERE  E.SAL >(
           -- 第一步 找出 smith 的工资  
            SELECT SAL  FROM EMP WHERE ENAME = 'SMITH' ) ;  
     -- 多行子查询  
      -- 多行子查询 在  in 里面 使用
       -- 找出 在 10 和20部门中  和  30 部门 岗位相同  员工信息  
        
        SELECT *   FROM EMP E 
        WHERE  JOB IN  (     
          SELECT JOB  FROM EMP  WHERE DEPTNO =30 ) 
          AND DEPTNO <> 30 ;
       -- 多行子查询 在  any 里面 使用     
          --  any 任何的意思  
           sal  > any( 500, 600 ,5000 ) 
          select *  from  emp 
           where  sal > any( 2000 ,2500 ,3000 )  ;  
           -- 表示 大于 集合中的最小值 
       --  小需求 查出  emp 表中 工资高于 10 部门中 任意一个员工的 员工信息   
         
         select *   from  emp e where  e.sal < any (
           -- 查出 10 部门 的 员工工资  
           select sal  from emp where deptno = 10)  ;
       -- 多行子查询 在  all 里面 使用   
          sal > all ( 2000 ,2500 ,3000 )   -- sal 大于最大值 
        -- 查出  emp 表中 工资高于 20部门所有人 工资的 员工信息 
         
        select *   from  emp e where  e.sal > all (
           -- 查出 10 部门 的 员工工资  
           select sal  from emp where deptno = 20)  
            and  deptno <> 20  ;
        -- 总结 :  
          1. any 在 > 的比较中 是和最小值比较  , 在 < 的比较中 是比较最大值,   sal  <  any( 3000, 4000,5000 )
          2. all 在 > 的比较中 是和最大值比较  ,  在 < 的比较中 是比较最小值
       子查询: 
         1.可以在 from 中使用  
           
         select  *  from  ( select  ename , sal from emp
           where  deptno = 20 ) s1 
         where  s1.sal > 2000 ;   
         2. 可以在 select 中使用  
         select  ename , sal , ( select deptno from dept where deptno = 10 ) from emp  
         
         -- sql 语言的分类 
         DDL 数据定义语言  CREATE(创建) , ALTER( 修改 ) , DROP( 删除) , TRUNCATE( 截断/清空)  
         DML  数据操纵语言  INSERT(插入) ,UPDATE(更新) , DELETE(删除)  
         DQL   数据查询语言 基本的查询语句, order by ,group by  
         
         DCL  数据控制语言  GRANT( 授权 ) , revoke( 撤销)   
         TCL  事务控制语言  COMMIT(提交) , ROLLBACK(回滚)  
          --DDL 语句不能回滚 
          -- 建表  
            第一种建表 
            CREATE TABLE 表名(
               字段名1  数据类型( 长度) ,
               字段名2  数据类型( 长度) , ....
            ) ;  
            CREATE TABLE TEST_1
            (  
              TNAME VARCHAR2(10) ,
              AGE NUMBER   --  默认给38 
            ) ;
           -- 第二种建表  根据查询结果建表 ,既有表结构,又有数据 
             CREATE TABLE 表名 
              AS  
               查询语句  ; 
             create table emp_t 
             as  
             select  ename 姓名  from emp ; 
             select  *   from emp_t ;
           起名字的原则 :
           1. 不要用中文 
           2. 不要用拼音  
           3. 不要拼音的首拼 
           原则:见名知意
           
           常见的起名 : 
           1. 用下划线去 区分 不同的单词
           2. 驼峰式  empTest 
           3. 小驼峰式  EmpTest 
          -- 第三种建表方式  只要表结构 不要数据  
             create table emp_t2 
             as  
             select *  from emp  where 1 = 2 ; 
             select  *   from emp_t2 ;
          -- DROP TABLE 表名
             DROP TABLE emp_t2 ;
          --   TRUNCATE  清空和截断表  
            TRUNCATE  table  emp_t  ; 
           select  *  from emp_t ; 
          -- insert  插入语句  
            -- 第一种 指定 插入字段 
             INSERT INTO 表名( 字段1 ,字段2 ...) values( 值1 ,值2 .... )  ;
              INSERT INTO   emp_t2( empno ,ename ) values( 1234 , '张三' ) ;
            -- 第二种 不指定插入字段   
             INSERT INTO 表名 values( 值1 ,值2 .... )  ; 
              INSERT INTO   emp_t2 values( 1234 , '张三' ) ;
             -- 第三种 可以通过查询结果集插入数据  
              INSERT INTO 表名 
               查询语句; 
              insert into emp_t2 
              select  *  from emp ;  
              select * from emp_t2 ;
             -- UPDATE 更新数据  
             update 表名 set 字段 = 值 ,字段2 = 值 ... 
              where 条件:  
              -- 案例
              update emp_t2  set sal = 10000  
               where empno = 7369 ;  
             --  给 所有与 smith 部门相同 的员工 工资涨到 6000 
              update emp_t2 e  set sal = 6000  
               where e.deptno =    
               ( select deptno from  emp  where ename = 'SMITH' )
                ;   
               SELECT *  FROM  emp_t2 ;       
               COMMIT ;       
         
         
         
             
       
  
          
 

     
          
          
          
             
          
       
     

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值