实验表如下:
t4
t5
子查询分类:
查询对象的关系上分类:
1、相关子查询
select * from t4 where t4.id4 = any ( select t5.id5 from t5 where t5.b5 = t4.b4);
2、非相关子查询
select * from t1 where a1 = any (select a2 from t2 where t2.a2 = 10);
从特定谓词分类:
1、IN 操作符
IN 操作符允许我们在 WHERE 子句中规定多个值。
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
select * from t4 where t4.id4 in (1,3);
2、ALL\ANY\SOME操作符
SOME 是与 ANY 等效的 ISO 标准。
以 > 比较运算符为例,>ALL 表示大于每一个值。换句话说,它表示大于最大值。例如,>ALL (1, 2, 3) 表示大于 3。>ANY 表示至少大于一个值,即大于最小值。因此 >ANY (1, 2, 3) 表示大于 1。
select * from t5 where t5.id5 > any ( select id4 from t4 where t4.id4>5);
select * from t5 where t5.id5 > ALL ( select id4 from t4 where t4.id4>5);
3、EXISTS操作符
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。
EXISTS 指定一个子查询,检测行的存在。语法:EXISTS subquery。参数 subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。结果类型为 Boolean,如果子查询包含行,则返回 TRUE。
select * from t5 where exists ( select * from t4 where t4.id4>t5.id5);
转化成同义的IN语句:
select * from t5 where id5 in ( select id5 from t4 where t4.id4>t5.id5);
从语句的构成分类:
1、SPJ查询:
选择:select * from t4 where t4.id4=1;
投影: select id4, b4 from t4;
连接:select * from t4, t5 where t4.id4 = t5.id5;
2、group by子查询:
我们拥有下面这个 "Orders" 表:
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
现在,我们希望查找每个客户的总金额(总订单)。
我们想要使用 GROUP BY 语句对客户进行组合。
我们使用下列 SQL 语句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
结果集类似这样:
Customer SUM(OrderPrice)
Bush 2000
Carter 1700
Adams 2000
让我们看一下如果省略 GROUP BY 会出现什么情况:
SELECT Customer,SUM(OrderPrice) FROM Orders
结果集类似这样:
Customer SUM(OrderPrice)
Bush 5700
Carter 5700
Bush 5700
Bush 5700
Adams 5700
Carter 5700
3、其他:
TOP-N : SELECT TOP 50 PERCENT * FROM Customers;
mysql 不支持 等价于Mysql中 select * from t4 limit 10;
LIMIT & order by: select * from t4 order by id4 desc limit 2,5;