1 什么是子查询
<1>子查询概念
一条select 查询语句的结果, 作为另一条 select 语句的一部分
<2>子查询的特点
子查询必须放在小括号中
子查询一般作为父查询的查询条件使用
<3>子查询常见分类
where型 子查询: 将子查询的结果, 作为父查询的比较条件
from型 子查询 : 将子查询的结果, 作为 一张表,提供给父层查询使用
exists型 子查询: 子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查 询的结果
2 子查询的结果作为查询条件
语法格式
SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
1. 通过子查询的方式, 查询价格最高的商品信息:
# 通过子查询的方式, 查询价格最高的商品信息 -- 1.先查询出最高价格 SELECT MAX(price) FROM products; -- 2.将最高价格作为条件,获取商品信息 SELECT * FROM products WHERE price = (SELECT MAX(price) FROM products);
2. 查询化妆品分类下的, 商品名称 & 商品价格
#查询化妆品分类下的 商品名称 商品价格 -- 先查出化妆品分类的 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 = '化妆品');
3. 查询小于平均价格的商品信息
-- 1.查询平均价格 SELECT AVG(price) FROM products; -- 1866 -- 2.查询小于平均价格的商品 SELECT * FROM products WHERE price < (SELECT AVG(price) FROM products);
3 子查询的结果作为一张表
语法格式
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;
注意: 当子查询作为一张表的时候,需要起别名,否则无法访问表中的字段。
4 子查询结果是单列多行
子查询的结果类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果
语法格式
SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
<1>查询价格小于两千的商品,来自于哪些分类(名称)
# 查询价格小于两千的商品,来自于哪些分类(名称) -- 先查询价格小于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);
<2>查询家电类 与 鞋服类下面的全部商品信息
# 查询家电类 与 鞋服类下面的全部商品信息 -- 先查询出家电与鞋服类的 分类ID SELECT cid FROM category WHERE cname IN ('家电','鞋服'); -- 根据cid 查询分类下的商品信息 SELECT * FROM products WHERE category_id IN (SELECT cid FROM category WHERE cname IN ('家电','鞋服'));
5 子查询总结
1. 子查询如果查出的是一个字段(单列), 那就在where后面作为条件使用.
2. 子查询如果查询出的是多个字段(多列), 就当做一张表使用(要起别名).