• sql 单行和多行子查询


    单行和多行子查询

    单行和多行子查询

    --子查询(单行子查询,多行子查询)
    --查询比"CLARK"工资高的员工的信息?
      --[1]'CLARK'的工资是多少?
      SELECT SAL FROM EMP WHERE ENAME ='CLARK';   --2450
      
      --[2]比2450高的员工信息
      SELECT * FROM EMP WHERE SAL >2450;  
      
    ----子查询:
    --将一个查询的结果作为另外一个查询的条件来使用 
     SELECT * FROM EMP WHERE SAL >(SELECT SAL FROM EMP WHERE ENAME ='CLARK');
          
        语法:
        SELECT 字段列名 FROM 表名
        WHERE 条件 比较符 (SELECT * FROM 表名);
                 
    -- 特点:
        --子查询在主查询前执行一次
        --主查询使用子查询的结果
            
    --【1】子查询可以作为另外的一个查询的条件来使用
        --查询工资高于平均工资的雇员的名字和工资
        --[1]平均工资
            SELECT AVG (SAL) FROM EMP;
            
            SELECT ENAME ,SAL 
            FROM EMP 
            WHERE SAL >( SELECT AVG (SAL) FROM EMP)
            ORDER BY SAL;
                          
    --查询和SCOTT同一部门且比他工资低的雇员的名字和工资
        --'SCOTT'在哪个部门?
        SELECT DEPTNO  FROM EMP WHERE ENAME ='SCOTT';   --20
        --'SCOTT'的工资?
        SELECT SAL FROM EMP WHERE ENAME ='SCOTT';   --3000
                          
        SELECT ENAME,SAL
        FROM EMP 
        WHERE DEPTNO = ( SELECT DEPTNO  FROM EMP WHERE ENAME ='SCOTT')
        AND SAL<(SELECT SAL FROM EMP WHERE ENAME ='SCOTT');   
                   
        --注意:子查询的字段不能多于一个,只能有一个
                  
        --【2】子查询可以作为insert语句的值来使用
        --今天新入职一个员工,与'SCOTT'同一个部门
        INSERT INTO EMP (EMPNO,ENAME,DEPTNO,HIREDATE)
        VALUES
        (1001,'码上成功',
        (SELECT DEPTNO  FROM EMP WHERE ENAME ='SCOTT'),SYSDATE);
                   
        SELECT * FROM emp;
                   
        --【3】子查询可以作为update的条件或修改的值来使用
        --将 ‘新员工’ 的工作修改为与‘SMITH’的工作相同
        --[1]smith的工作
        SELECT job FROM EMP WHERE ENAME = 'SMITH';
                   
        UPDATE EMP 
        SET JOB =( SELECT job FROM EMP WHERE ENAME = 'SMITH') 
        WHERE ENAME = '成功';
                   
        --将比FORD工资低的员工都加1000块钱
        --[1]'FORD'的工资是
        SELECT SAL FROM EMP WHERE  ENAME = 'FORD';
                   
        UPDATE EMP SET SAL =SAL+1000
        WHERE SAL<(SELECT SAL FROM EMP WHERE  ENAME = 'FORD');
        SELECT * FROM EMP;
                   
        --【4】子查询可以作为delete的条件使用
        --比FORD工资高的都删除
        DELETE EMP 
        WHERE SAL >(SELECT SAL FROM EMP WHERE  ENAME = 'FORD'); 
                   
                   
        --【5】子查询的结果可以作为一个表来使用
        SELECT EMPNO AS 经理编号,ENAME AS 经理姓名 FROM EMP; 
        --查询员工的编号,姓名,经理姓名
                    
        SELECT E.EMPNO 员工编号,E.ENAME 员工姓名 ,M.经理姓名
        FROM EMP E,( SELECT EMPNO AS 经理编号,ENAME AS 经理姓名 FROM EMP) M
        WHERE E.MGR = M.经理编号(+);     --92标准
                    
        SELECT E.EMPNO 员工编号,E.ENAME 员工姓名 ,M.经理姓名
        FROM EMP E LEFT JOIN 
        ( SELECT EMPNO AS 经理编号,ENAME AS 经理姓名 FROM EMP) M
        ON E.MGR = M.经理编号;      --99
    
    --多行子查询
    --子查询的结果返回是 多行数据
        --all:和子查询返回的所有值比较
        --any:和子查询返回的任意一个值比较
        --in :等于列表中的任何一个
    
    --查询工资低于任何一个“CLERK”岗位的工资的雇员信息。
        --查询CLERK这个职位的工资是多少?   1300  
        SELECT SAL FROM EMP WHERE JOB = 'CLERK';
             
        SELECT MAX(SAL) FROM EMP WHERE JOB = 'CLERK';
             
        SELECT * FROM EMP 
        WHERE SAL <(SELECT MAX(SAL) FROM EMP WHERE JOB = 'CLERK');
             
        SELECT * FROM emp;
        SELECT * FROM EMP 
        WHERE SAL < ANY (SELECT SAL FROM EMP WHERE JOB = 'CLERK');
           
    --查询工资比所有的'SALESMAN'职位都高的雇员的编号,名字和工资
        --[1]'SALESMAN'工资都是多少?
        SELECT SAL FROM EMP WHERE JOB = 'SALESMAN';
           
        SELECT EMPNO,ENAME,SAL 
        FROM EMP 
        WHERE SAL >ALL (SELECT SAL FROM EMP WHERE JOB = 'SALESMAN') ;
           
           
    --查询部门20中的职务同部门10的雇员一样的雇员信息.
        --[2]部门10是什么职务
        SELECT JOB FROM EMP WHERE DEPTNO = 10;
           
        SELECT * FROM EMP 
        WHERE JOB IN(SELECT JOB FROM EMP WHERE DEPTNO = 10)
        AND DEPTNO = 20;
           
    --查询在雇员中那些是经理人
    --查询经理人的编号
           
           
        --查询每个部门平均薪水的等级
           
           
    --小结:
    --[1]多表连接查询  --92标准
        --等值连接查询    -->两个表之间,存在主外键关系
        --非等值连接       -->两个表之间没有直接关系    >= ,<= .....
        --以上两个查询,参与查询的表是平级关系
            
        --左外连接,右外连接  --参与查询的两个表之间有主次之分
            
            
    --[2]多表连接查询--99标准
        --交叉连接  croos join -->笛卡尔积
        --自然连接   natural join
        -->相当于等值连接(前提是两个参与表中有同名列,要求同名列类型完全一致)
        --using连接   
        -->参与查询的两个表中多个同名列,使用using制定使用特定的列进行连接
        --inner join ....on...where  --等值连接
        --左外链接   left join 
        --右外连接   right join 
        --全连接  full join 
             
    --[3] 单行子查询
        --子查询的结果是单行单列    
        --使用>=,<=,=,<,>,<> 进行where后的条件判断
              
    --[4]多行子查询    
        --子查询的结果是多行单列的
        --使用 any :任意一个 ,  all(全部),  in(等值)
    
  • 相关阅读:
    Core Java 5
    pyDay11
    c++第二十一天
    pyDay10
    c++第二十天
    RadioButton控件
    ListBox控件
    Image控件
    FileUpload控件
    DropDownList控件
  • 原文地址:https://www.cnblogs.com/SacredOdysseyHD/p/9063065.html
Copyright © 2020-2023  润新知