image.png
image.png
多行子查询 in用的比较多!
https://www.bilibili.com/video/BV12b411K7Zu?p=289

image.png
select title,count(*),avg(salary)
from emp
where title is not null
group by title
having avg(salary) > (select avg(salary) from emp where title=’操作员’);
子查询一定要小括号抱起来,不然报错

where后面

#单行子查询

image.png

#多行子查询

image.png
any:任一个
x>any(10,30,50) ,x大于 10,30,50中的任意一个即可,相当于x>min()
image.png
all:所有的
x>all(10,30,50) ,x大于它们(20,30,50),相当于x大于max()

image.png
image.png
子查询中有多个记录,用in,当不知道子查询里会有几个记录时,最好用in,不会出错,注意distinct对子查询去重.

image.png
image.png
小于比任一工资低的,就相当于小于最大的,只要满足一个就行了.
https://www.bilibili.com/video/BV12b411K7Zu?p=291

select后面

image.png
相当于直接把查询结果放select后面,个数是别名.

from后面

image.png
image.png
将实表和虚表连接起来,一定要给虚表中的AVG(salary)起别名,不然报错,起别名就相当于将虚写”实”了

exist后面

image.png
exists中有结果返回的 1 ,没有返回0
image.png
有结果就是1,没有就是0

有无Abel
1

查询有女朋友的男神信息.
image.png
https://www.bilibili.com/video/BV12b411K7Zu?p=292

难题

image.png
#查询的是Toronto

image.png
image.png
首先查出每个部分的平均工资,接下来就是部门中比平均工资高的人员信息,人员信息表与查询子表比较,就相当于员工表和子查询表做一个部门id相同的等值连接.
就两种办法:子查询,连接查询,一个不行想另一个呗.

image.png
image.png
image.png
首先根据部门分组,查询平均工资.
然后查询每个部门平均工资最低的那个部门,利用排序和limit子句.
最后形成的虚表与部门表通过部门id等值连接,查询结果.

image.png
image.png
https://www.bilibili.com/video/BV12b411K7Zu?p=303

  1. 查询出公司中所有 manager 的详细信息.
    SELECT e.*
    FROM employees e
    WHERE employee_id IN(
    SELECT DISTINCT manager_id
    FROM employees
    WHERE manager_id IS NOT NULL
    );
    #子表结果有null值,在用in(值1,值2,null)时候会报错,应该先排除掉空值.
    in在使用时必须保证后面列表没有空值。

查询平均工资高于公司平均工资的部门有哪些?
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (
SELECT AVG(salary)
FROM employees
);
第一步查询出公司平均工资
SELECT AVG(salary)
FROM employees;
按照部门分组,部门平均工资高于公司平均工资,先分组,后比较,having子句
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (
SELECT AVG(salary)
FROM employees
);