MySQL子查询

什么是子查询

子查询是指一个查询语句嵌套在另一个查询语句的内部,将select语句的结果作为另外一个查询语句的条件。子查询的操作符有any、all、in、exists。子查询可以添加到select、update和delete语句中。子查询的作为条件可以使用比较运算符。

ANY

any表示只要满足子条件的任意一条记录即可。

#查询与表1中的数字大于表二中任意一个数字的信息
SELECT
	*
FROM
	表1
WHERE
	数字1> ANY (
		SELECT
			数字2
		FROM
			表2
	);

ALL

all和any不同,any只要满足一条记录就可以,all是要和表的所有数据比较,都要满足才可以。

#查询与表1中的数字大于表二中所有一个数字的信息
SELECT
	*
FROM
	表1
WHERE
	数字1> ALL(
		SELECT
			数字2
		FROM
			表2
	);

IN

in子查询的内层值返回一列值,这个数据列的值提供给外层做比较。

#查询表1和表2中都存在的值
SELECT
	*
FROM
	表1
WHERE
	数字1 IN (
		SELECT
			数字2
		FROM
			表2
	);

表2的数子查询出来后,表1的数字会比较是否在表2的结果中。

EXISTS

exists关键字后面的参数是一条任意完整的子查询,系统对子查询运算如果返回行,那么就只需外层的运算,如果没有就不执行。

#如果表2中的数字大于10,则查询表1中的所有数据
SELECT
	*
FROM
	表1
WHERE
	EXISTS (
		SELECT
			数字2
		FROM
			表2
		WHERE
			数字2>10
	);

如果exists后面的sql语句返回空结果,表示没有大于10的记录,结果是false。这样前面的语句就不执行。

表子查询

• 表子查询返回的结果是多行多列的一个表数据
• 行子查询是用于where条件判断,是属于where子查询
• 表子查询是用于from数据源,是属于from子查询

语法

SELECT
字段列表
FROM
(表字查询)新表
……

示例:查询每个班身高最高的学生
1) 将每个班最高的学生排在最前面,order by
2) 再针对结果进行order by : 保留每组的第一个

SELECT
		*
	FROM
		(
SELECT
	*
FROM
	学生总表
ORDER BY 身高 DESC
)AS 表1
	GROUP BY 班级;

分页查询

分页查询:mysql中分页使用limit 关键字,limit关键字是mysql独有的 ,oracle中为rownum

注意:起始条目数可以省略,默认从0开始。
语法:LIMIT (角标Index),(显示个数length)

# 查询员工信息表,显示工资前三的员工信息
SELECT 
		ename,
		salary
FROM 
		emp
ORDER BY  salary DESC
LIMIT 0,3;

# 查询工资4~6名的员工信息
SELECT 
		ename,
		salary
FROM 
		emp
ORDER BY  salary DESC
LIMIT 3,3