6.查询
子查询
简介
使用子查询相当于执行两个连续查询并且用第一个的查询结果作为第二个查询的搜索值。
子查询是一个select语句,它是嵌在另一个select语句中的子句,使用子查询可以用简单的语句构建功能强大的语句,
可以将子查询放入以下sql语句中:WHERE子句、FROM子句、HAVING子句
子查询语法
SELECT select_list
FROM table_name1
WHERE expr operator (SELECT select_list FROM table_name2);
使用子查询的原则
- 子查询放在圆括号中
- 将子查询放在比较条件的右边
- 在单行子查询中使用单行运算符:>、<、<=、>=、<>;多行子查询中使用多行运算符:IN、BETWEEN、AND
子查询的类型
- 单行运算符
- 多行运算符
单行子查询
什么是单行子查询
- 仅返回一行数据
- 使用单行比较符:>、<、<=、>=、<>
示例
# 查询fox的同事,但不包括他自己
SELECT e.last_name
FROM employees e
WHERE e.department_id = (SELECT department_id FROM employees WHERE last_name = "fox")
AND e.last_name <>"fox";
多行子查询
什么是多行子查询
- 子查询返回的数据多于一行
- 使用多行运算比较符:
- IN:等于列表中的任何成员
- ANY:比较子查询返回的每一个值
- ALL:比较子查询返回的全部值
使用ANY比较符
ANY运算符含义:
-
<ANY意思是小于最大值
-
大于(>)ANY意思是大于最小值
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary < ANY(
SELECT salary FROM employees WHERE job_id = "IT_PROJ")
AND job_id <> "IT_PROJ";
# salary < ANY(9000,6000,2000) 小于最大值,也就是小于9000

使用ALL比较符
ALL运算符含义:
- <ALL 意思是小于最小值
- 大于(>)ALL 意思是大于最大值
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary < ALL(
SELECT salary FROM employees WHERE job_id = "IT_PROJ")
AND job_id <> "IT_PROJ";
# salary < ALL(9000,6000,2000) 小于最小值,也就是小于2000

子查询中的空值

内查询返回的值含有空值,并因此整个查询无返回行,原因是用大于、小于或不等于比较Null值,都返回null。所以,只要空值可能是子查询结果集的一部分,就不能用 NOT IN 运算符。NOT IN 运算符相当于 <> ALL。
注意,空值作为一个子查询结果集的一部分,如果使用 IN 操作符的话,不是一个问题。IN 操作符相当于 =ANY。
分页查询
MySQL分页查询原则
- 在MySQL数据库中使用LIMIT子句进行分页查询
- MySQL分页中开始位置为0
- 分页子句在查询语句的最后侧
LIMIT子句
SELECT [* | <column_name>[,...]]
FROM <table_name>[,...]
WHERE condition
ORDER BY <column_name>
LIMIT 开始位置,查询数量;
示例:
# employees表中所有数据,按id排序,实现分页查询,每次返回两条结果
SELECT * FROM employees ORDER BY employees_id LIMIT 0,2;
LIMIT OFFSET子句
SELECT [* | <column_name>[,...]]
FROM <table_name>[,...]
WHERE condition
ORDER BY <column_name>
LIMIT 查询数量
OFFSET 开始位置;
示例:
# employees表中所有数据,按id排序,实现分页查询,每次返回两条结果
SELECT * FROM employees ORDER BY employees_id LIMIT 2 OFFSET 0;

浙公网安备 33010602011771号