子查询 (SubQuery)
什么是子查询
1)子查询概念
•一条select 查询语句的结果, 作为另一条 select 语句的一部分
2)子查询的特点
•子查询必须放在小括号中
•子查询一般作为父查询的查询条件使用
3)子查询常见分类
•where型 子查询: 将子查询的结果, 作为父查询的比较条件
•from型 子查询 : 将子查询的结果, 作为 一张表,提供给父层查询使用
•单列多行子查询: 子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果
子查询的结果作为查询条件
语法格式
•SELECT 查询字段 FROM 表 WHERE 字段 运算符(子查询);
- 通过子查询的方式, 查询价格最高的商品信息
-- 通过子查询的方式, 查询价格最高的商品信息
-- 1.先查询出最高价格
SELECT MAX(price) FROM products;
-- 2.将最高价格作为条件,获取商品信息
SELECT * FROM products WHERE price = (SELECT MAX(price) FROM products);
- 查询化妆品分类下的 商品名称 商品价格
-- 查询化妆品分类下的 商品名称 商品价格
-- 先查出化妆品分类的 id
SELECT cid FROM category WHERE cname = '化妆品';
-- 根据分类id ,去商品表中查询对应的商品信息
SELECT
p.`pname`,
p.`price`
FROM products p
WHERE p.`category_id` = (SELECT cid FROM category WHERE cname = '化妆品');
- 查询小于平均价格的商品信息
-- 1.查询平均价格
SELECT AVG(price) FROM products; -- 1866
-- 2.查询小于平均价格的商品
SELECT * FROM products
WHERE price < (SELECT AVG(price) FROM products);
子查询的结果作为一张表
语法格式
•SELECT 查询字段 FROM (子查询)表别名 WHERE 条件;
查询商品中,价格大于500的商品信息,包括 商品名称 商品价格 商品所属分类名称
-- 1. 先查询分类表的数据
SELECT * FROM category;
-- 2.将上面的查询语句 作为一张表使用
SELECT
p.`pname`,
p.`price`,
c.cname
FROM products p
-- 子查询作为一张表使用时 要起别名 才能访问表中字段
INNER JOIN (SELECT * FROM category) c
ON p.`category_id` = c.cid WHERE p.`price` > 500;
注意: 当子查询作为一张表的时候,需要起别名,否则无法访问表中的字段。
子查询结果是单列多行
子查询的结果类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果
语法格式
•SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
- 查询价格小于两千的商品,来自于哪些分类(名称)
-- 查询价格小于两千的商品,来自于哪些分类(名称)
-- 先查询价格小于2000 的商品的,分类ID
SELECT DISTINCT category_id FROM products WHERE price < 2000;
-- 在根据分类的id信息,查询分类名称
-- 报错: Subquery returns more than 1 row
-- 子查询的结果 大于一行
SELECT * FROM category
WHERE cid = (SELECT DISTINCT category_id FROM products WHERE price < 2000);
使用in函数, in( c002, c003 )
-- 子查询获取的是单列多行数据
SELECT * FROM category
WHERE cid IN (SELECT DISTINCT category_id FROM products WHERE price < 2000);
- 查询家电类 与 鞋服类下面的全部商品信息
-- 查询家电类 与 鞋服类下面的全部商品信息
-- 先查询出家电与鞋服类的 分类ID
SELECT cid FROM category WHERE cname IN ('家电','鞋服');
-- 根据cid 查询分类下的商品信息
SELECT * FROM products
WHERE category_id IN (SELECT cid FROM category WHERE cname IN ('家电','鞋服'));
子查询总结
•子查询如果查出的是一个字段(单列), 那就在where后面作为条件使用。
•子查询如果查询出的是多个字段(多列), 就当做一张表使用(要起别名)。