MySQL子查询(嵌套查询)
一、子查询
1、子查询允许把一个查询嵌套在另一个查询当中(也就是嵌套查询)
2、子查询可以包含普通select可以包括的任何子句,比如:distinct、 group by、order by、 limit、join和union等,但是对应的外部查询必须是以下语句之一:select、insert、update、delete、set或者do
二、子查询的分类
1、表子查询:
------返回的结果集是 N 行 N 列
2、标量子查询:
------返回单一值的标量,最简单的形式
3、列子查询:
------返回的结果集是 N 行 1 列
4、行子查询:
------返回的结果集是 1 行 N 列
可以使用的操作符: = , >, <, >=, <=, <>, ANY, IN, SOME, ALL, EXISTS
三、实例
1、表子查询:
指子查询返回的结果集是: N 行 N 列,的一个表数据
SELECT * FROM article WHERE (title, content, uid) IN (SELECT title, content, uid FROM blog);
2、标量子查询:
是指子查询返回的是单一值的标量,如一个数字或一个字符串,也是子查询中最简单的返回形式。可以使用:=, >, < ,>=, <=, <>,这些操作符对子查询的标量结果进行比较,通常子查询的位置在比较式的右侧
SELECT * FROM article WHERE uid=(SELECT uid FROM user WHERE status=1 ORDER BY uid DESC LIMIT 1)
SELECT * FROM t1 WHERE column1=(SELECT MAX(column2) FROM t2);
SELECT * FROM article AS t WHERE column2=(SELECT COUNT(*) FROM article WHERE article.uid=t.uid);
3、列子查询:
指子查询返回的结果集是: N 行 1 列,该结果通常来自对表的某个字段查询返回
可以使用:IN、 ANY、 ALL操作符
SELECT * FROM article WHERE uid IN (SELECT uid FROM user WHERE status=1);
SELECT s1 FROM table1 WHERE s1>ANY (SELECT s2 FROM table2);
SELECT s1 FROM table1 WHERE s1>ALL (SELECT s2 FROM table2);
4、行子查询 :
指子查询返回的结果集是: 1 行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集
SELECT * FROM article WHERE (title,content,uid)=(SELECT title, content,uid FROM blog WHERE bid=2);
四、EXISTS谓词
EXISTS是一个非常牛叉的谓词,它允许数据库高效地检查指定查询是否产生某些行
select * from t1 where city='shanghai' and EXISTS(select * from t2 where t1.cid=t2.cid);
例如:
查询 x1 表中 name 字段下是否有 zhangsan,若有则查询 x1 表中的记录,否则不查询
select * from x1 where EXISTS(select name from fruits where name='zhangsan');
查询 x1 表中是否存在 num=7 的记录,若存在,则查询 x1 表中 success 大于 80 的记录
select * from x1 where success>80 and EXISTS (select num from x1 where num=7);
相反,可以使用 not exists 查询不存在(用法相同)