Mysql-DQL(子查询)

子查询

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

按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集只有一行多列)
表子查询(一般为多行多列)

分类:
按子查询出现的位置
select:
支持 标量子查询
from:
表子查询
where或having:
标量子查询、列子查询、行子查询(较少使用)
exists后面(相关子查询)
表子查询

特点:
①子查询放在小括号内
②子查询一般放在条件的右侧
③标量子查询,一般搭配着单行操作符使用> 、 <
>= 、 <= 、 = 、 <>
列子查询,一般搭配着多行操作符使用
in、any/some、all
④子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果

一、标量子查询

#案例1、谁的工资比Abel高
SELECT *
FROM employees
WHERE salary>(
    SELECT salary FROM employees WHERE last_name='Abel'
);
#案例2、返回job_id与141号员工相同,salary比143号员工多的员工姓名 job_id和工资
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);
#案例3:返回公司工资最少的员工的last_name,job_id,salary
SELECT last_name,job_id,salary
FROM employees 
WHERE salary=(SELECT MIN(salary) FROM employees);

2、列子查询(多行子查询)

#案例1、返回location_id是1400或1700的部门中的所有员工姓名
SELECT last_name 
FROM employees
WHERE department_id 
IN (SELECT department_id FROM departments WHERE location_id IN(1400,1700));
#案例2:返回其他部门中比job_id为'IT_PROG'部门任一工资低的员工的员工号、姓名、job_id、以及salary
SELECT last_name,job_id,salary,employee_id 
FROM employees
WHERE salary < ANY(SELECT DISTINCT salary FROM employees WHERE job_id ='IT_PROG')
AND job_id!='IT_PROG';

3、行子查询

#案例:查询员工编号最小并且工资最高的员工信息
SELECT *
FROM employees
WHERE (employee_id,salary)=(SELECT MIN(employee_id),MAX(salary) FROM employees);

二、放在select后面

/*
仅支持标量子查询
*/
#案例 查询每个部门的员工个数
SELECT d.*,(SELECT COUNT(*) FROM employees WHERE d.`department_id`=employees.`department_id`)
FROM  departments d; 

三、from: 表子查询

 #案例:查询每个部门的平均工资的工资等级
 /*
 将子查询结果充当一张表 必须起别名
 */
 SELECT grade_level,ag_dep.*
 FROM (
 SELECT AVG(salary) ag,department_id 
 FROM employees 
 GROUP BY department_id
 ) ag_dep
 JOIN job_grades g
 ON ag_dep.ag BETWEEN g.`lowest_sal` AND g.`highest_sal`;
发布了22 篇原创文章 · 获赞 15 · 访问量 5494

猜你喜欢

转载自blog.csdn.net/qq_42193790/article/details/104187168