• 10、子查询、exists


    一、子查询
    1、含义:出现在其他语句中的select语句,称为子查询或内查询
    外部的查询语句,称为主查询或外查询
    2、分类:按子查询出现的位置
    select后面
    仅仅支持标量子查询
    from后面
    支持表子查询
    where或having后面
    标量子查询(单行)
    列子查询(多行)
    行子查询
    特点:
    子查询放在小括号内
    子查询一般放在条件的右侧
    标量子查询,一般搭配这单行操作符使用 > < = != <> >= <=
    列子查询,一般搭配着多行操作符使用 in(等于列表的任意一个)、any/some(和子查询返回的某一个值比较)、all(和子查询返回的所有值比较 )
    子查询的执行优先与主查询执行,因为主查询的条件用到了子查询的结果
    exists后面(相关子查询)
    表子查询
    按结果集的行列数不同
    标量子查询(又称单行子查询,结果集只有一行一列)
    列子查询(结果集只有一列多行)
    行子查询(结果集有一行多列、多列多行)
    表子查询(结果集一般为多行多列)
     
    二、exists:判断查询结果是否有值
    语法:exists(完整的查询语句)
    与子查询运行规则相悖:外部sql先运行,内部sql后运行
    如果查询语句存在值则返回1,否则返回0
     
    三、案例
     1 -- 一、放在where后面
     2 -- 标量子查询
     3 # 案例1:查询谁的工资比Abel高 (标量子查询)
     4 select last_name,salary from employees where salary>(select salary from employees where last_name='Abel');
     5 
     6 # 案例2:返回job_id与141号员工相同,salary比143号员工多的员工姓名、job_id、工资
     7 select last_name,job_id,salary from employees where job_id=(select job_id from employees where employee_id='141') and salary>(select salary from employees where employee_id='143');
     8 
     9 # 案例3:返回公司工资最少的员工的last_name,job_id,salary
    10 select last_name,job_id,salary from employees where salary=(select min(salary) from employees);
    11 
    12 # 案例4:查询最低工资大于50号部门的最低工资部门id和其最低工资
    13 select department_id,min(salary) as salary from employees group by department_id having salary>(select min(salary) from employees where department_id='50');
    14 
    15 -- 列子查询
    16 # 案例1:返回location_id是1400或1700的部门的所有员工姓名
    17 select last_name from employees where department_id in (select distinct department_id from departments where location_id in ('1400','1700'));
    18 
    19 # 案例2:返回其他部门中比job_id为‘it_prog’部门任意工资低的员工的员工号、姓名、job_id以及salary
    20 select employee_id,last_name,job_id,salary from employees where salary<any(select distinct salary from employees where job_id='IT_PROG') and job_id<>'IT_PROG';
    21 
    22 # 案例3:返回其他部门中比job_id为‘it_prog’部门所有工资低的员工的员工号、姓名、job_id以及salary
    23 select employee_id,last_name,job_id,salary from employees where salary<all(select distinct salary from employees where job_id='IT_PROG') and job_id<>'IT_PROG';
    24 
    25 -- 行子查询
    26 # 案例1:查询员工编号最小并且工资最高的员工信息
    27 select * from employees where (employee_id,salary)=(select min(employee_id),max(salary) from employees);
    28 select * from employees where employee_id=(select min(employee_id) from employees where salary=(select max(salary) from employees));
    29 
    30 -- 二、放在select后面(只支持标量子查询)
    31 # 案例1:查询每个部门的员工个数
    32 select department_id,(select count(*) from employees s where s.department_id=d.department_id) from departments d;
    33 # 案例2:查询员工号=102的部门名
    34 select (select department_name from departments d,employees s where d.department_id=s.department_id and employee_id='102') as 部门名;
    35 
    36 -- 三、from后面
    37 # 案例1:查询每个部门的平均工资的工资等级
    38 select department_id,salary,grade_level
    39 from job_grades j inner join (select department_id,(salary) as salary from employees group by department_id) g where salary BETWEEN lowest_sal and highest_sal;
    40 
    41 -- 四、exists后面(相关子查询)
    42 # 案例1:查询有员工的部门名
    43 select department_name from departments d where exists (select * from employees s where d.department_id=s.department_id);
  • 相关阅读:
    Skype 1.4 for Linux 掉丢掉更新
    Skype 1.4 for Linux 失掉更新
    DiffMerge:可视化的文件相比与兼并东西
    Qt 4.3 公布揭晓
    Netscape Navigator 9 Beta 1 颁布
    Qtpfsgui:HDR 图片处置责罚器材
    Akregator 运用评测
    PenguinTV 3.0
    Exchange Server 2003备份
    Windows 编程[13] 菜单与菜单资源(二)
  • 原文地址:https://www.cnblogs.com/luohuasheng/p/16488637.html
Copyright © 2020-2023  润新知