子查询
嵌套在其他查询中的查询
子查询涉及的表可以是两张不一样的表,也可以使同一张表。
如果子查询得到的结果是一个常数,那么就可以把查询语句用括号括起来当做常数使用。这样的语句称为标量子查询。
例如,如果想查出表中大于日用品均价的日用品条目,可用下面的子查询:
SELECT *
FROM pro_info AS p2
WHERE p2.class = '日用品'
AND p2.sale_price > (
SELECT AVG(p.sale_price)
FROM pro_info AS p
WHERE p.class = '日用品'
GROUP BY p.class);
如果查出不止日用品一类,想查出每一类商品中,大于均价的条目,可以使用下面的语句:
SELECT *
FROM pro_info AS p2
WHERE p2.sale_price > (
SELECT AVG(p.sale_price)
FROM pro_info AS p
WHERE p.class = p2.class
GROUP BY p.class);
上面的的语句为关联子查询。将多个一样结构的标量子查询组合在一起。
普通子查询:子查询返回一列数据,将子查询的结果列,作为主查询的取值范围。
如果子查询返回的是二维表,则也可以当做主查询的新的检索表。
表联结
表联结的前提是两个表之间具有共同的列。
SELECT [列名]
FROM [表1],[表2]
WHERE [表1.列a] = [表2.列b]
内部联结:所有相互关联的行
将,
用INNER JOIN
代替,将 WHERE
用ON
代替
SELECT [列名]
FROM [表1] INNER JOIN [表2]
ON [表1.列a] = [表2.列b]
外部联结:所有表的所有列,包含没有相互关联的行
- 左外部联结
LEFT OUTER JOIN
- 右外部联结
RIGHT OUTER JOIN
- 全外部联结
FULL OUTER JOIN
SELECT c.*, l.*
FROM cust_info AS c LEFT OUTER JOIN order_list AS l
ON c.cust_id = l.cust_id
AND l.order_id LIKE '20190407%'
表联结进行聚合:(重点)
把联结后的表当成结果表进行查询即可。
SELECT c.cust_id, COUNT(l.prod_id)
FROM cust_info AS c LEFT OUTER JOIN order_list AS l
ON c.cust_id = l.cust_id
AND l.order_id LIKE '20190407%'
GROUP BY c.cust_id;
组合查询 UNION
- 自动过滤重复的行
- 多条
SELECT
语句,每两条之间使用一次UNION
- 组合的结果,其列、表达式、聚集函数需要相同,数据类型需要兼容
- 最终的字段名由第一条
SELECT
语句决定 - 最后一个
SELECT
语句可以使用ORDER BY
语句,来对UNION
的结果进行排序
SELECT [列] FROM [表]
UNION
SELECT [列] FROM [表]
UNION ALL 不自动过滤重复行