MySQL:子查询

1 什么是子查询 

<1>子查询概念 

    一条select 查询语句的结果, 作为另一条 select 语句的一部分 

<2>子查询的特点

    子查询必须放在小括号中 

    子查询一般作为父查询的查询条件使用 

<3>子查询常见分类 

    where型 子查询:  将子查询的结果, 作为父查询的比较条件 

    from型 子查询 :  将子查询的结果, 作为 一张表,提供给父层查询使用

    exists型 子查询:   子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查 询的结果 

2 子查询的结果作为查询条件

语法格式

SELECT 查询字段 FROMWHERE 字段=(子查询); 

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 查询字段 FROMWHERE 字段 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. 子查询如果查询出的是多个字段(多列), 就当做一张表使用(要起别名).

原文地址:https://www.cnblogs.com/JasperZhao/p/15020777.html