【Mysql】子查询

子查询 (SubQuery)

什么是子查询

1)子查询概念
•一条select 查询语句的结果, 作为另一条 select 语句的一部分

2)子查询的特点
•子查询必须放在小括号中
•子查询一般作为父查询的查询条件使用

3)子查询常见分类
•where型 子查询: 将子查询的结果, 作为父查询的比较条件
•from型 子查询 : 将子查询的结果, 作为 一张表,提供给父层查询使用
•单列多行子查询: 子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果

子查询的结果作为查询条件
语法格式

•SELECT 查询字段 FROM 表 WHERE 字段 运算符(子查询);

  1. 通过子查询的方式, 查询价格最高的商品信息
-- 通过子查询的方式, 查询价格最高的商品信息
-- 1.先查询出最高价格
SELECT MAX(price) FROM products;

-- 2.将最高价格作为条件,获取商品信息
SELECT * FROM products WHERE price = (SELECT MAX(price) FROM products);
  1. 查询化妆品分类下的 商品名称 商品价格
-- 查询化妆品分类下的 商品名称 商品价格

-- 先查出化妆品分类的 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. 查询小于平均价格的商品信息
-- 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 (子查询);

  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);
  1. 查询家电类 与 鞋服类下面的全部商品信息
-- 查询家电类 与 鞋服类下面的全部商品信息
-- 先查询出家电与鞋服类的 分类ID
SELECT cid FROM category WHERE cname IN ('家电','鞋服');

-- 根据cid 查询分类下的商品信息
SELECT * FROM products 
WHERE category_id IN (SELECT cid FROM category WHERE cname IN ('家电','鞋服'));

子查询总结
•子查询如果查出的是一个字段(单列), 那就在where后面作为条件使用。
•子查询如果查询出的是多个字段(多列), 就当做一张表使用(要起别名)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZikH~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值