【一文看懂SQL系列】攻下 查询 最难知识点之 子查询

子查询

含义
出现在其他语句中的 SELECT 语句,称为子查询或内查询;外部查询为外查询或主查询

分类
按子查询出现的位置:

  • SELECT后面:仅仅支持标量子查询
  • FROM后面:支持表子查询
  • WHEREHAVING 后面:标量子查询,列子查询,行子查询
  • EXISTS后面(相关子查询)表子查询

按结果集的行列数不同:

  • 标量子查询(结果集只有一行一列)
  • 行子查询(结果集只有一行多列)
  • 列子查询(结果集只有一列多行)
  • 表子查询(结果集为多行多列)
一、WHEREHAVING 后面

特点

  1. 子查询放在小括号内
  2. 子查询一般放在条件的右侧
  3. 标量子查询,一般搭配着单行操作符使用 < > >= <= = <>
    列子查询,一般搭配着多行操作符使用 in, any / some, all

子查询的执行优先于主查询的执行,主查询的条件用到了子查询的结果

1.标量子查询

案例:查询每个部门最小工资比50号部门编号最小的员工工资大的部门编号

SELECT MIN(salary), department_id 
FROM employees 
GROUP BY department_id 
HAVING MIN(salary) > (
SELECT MIN(salary) 
FROM employees 
WHERE department_id = 50);
2.列子查询(多行子查询)

案例:查询比50号部门编号任意员工工资小的员工姓名

SELECT name 
FROM employees 
WHERE salary < ANY(
SELECT salary 
FROM employees 
WHERE department_id = 50);
3.行子查询(一行多列或多行多列)

案例:查询最大编号最少工资的员工姓名

SELECT name 
FROM employees 
WHERE (employ_id, salary) = (SELECT MAX(employ_id), MIN(salaray) 
FROM employees);
二、SELECT 后面

案例:查询每个部门的员工个数

SELECT d.*,SELECT COUNT(*) 
FROM employees e 
WHERE e.department_id = d.department_id)个数 
FROM department d;
二、FROM 后面

案例:查询每个部门的平均工资的工资等级
员工表和工资等级表连接

SELECT ag_dep.*, g.grade_level 
FROM (
SELECT AVG(salary) ag, department_id 
FROM employees 
GROUP BY department_id)  ag_dep
INNER JOIN jobs_grades g 
ON ag_dep.ag 
BETWEEN g.lowest_sal AND g.highest_sal;
三、EXISTS 后面

语句:exists (完整查询语句)
结果:0或1
案例:查询有员工的部门名

扫描二维码关注公众号,回复: 10301489 查看本文章
SELECT department_name 
FROM department d 
WHERE EXISTS (
SELECT * 
FROM employees e 
WHERE e.department_id = d.department_id);
SELECT department_name 
FROM department d 
WHERE d.department_id IN (
SELECT department_id
FROM employees e 
);
发布了21 篇原创文章 · 获赞 17 · 访问量 3695

猜你喜欢

转载自blog.csdn.net/qq_33892106/article/details/105168226