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