– 子查询:
– 在一个select语句中,嵌入了另一个select语句,那么被嵌入的select语句被称为子查询语句,
– 主查询:
– 主要的查询对象,第一条select语句
– 二者关系:
– 1,子查询是嵌入到主查询中
– 2,子查询是辅助主查询的,要么充当了条件,要么充当了数据源
– 子查询是有一个可以独立存在的语句,是一个完整的select语句
– 子查询的分类:
(按照结果集的行列数分)
– 1,标量子查询:返回的结果是一个数据(一行一列)
– 2,列子查询:返回结果是一列(一列多行)
– 3,行子查询:返回结果是一行(一行多列)
– 4.表子查询:返回的结果是多行多列
(按照子查询出现的位置来分)
1,select后面—标量子查询
2,from后面—表字表子查询
3,where或者having的后面
4,exists后面相关子查询:表字查询
子查询的特点:
1,将子查询放在小括号中
2,子查询的优先级大于主查询
3,子查询一般放在条件的右侧使用,配合>,<,=,<=,>=
#找出单价比短裤的价格高的商品
1.0,找出短裤的价格
select goods.price from goods where goods.name=‘短裤’;
2.0,在1的基础上找出价格比当前高的商品
select * from goods where goods.price>(select goods.price from goods where goods.name=‘短裤’)
#查询cate_id和香梨的cate_id一致的,并且价格大于大蒜的商品的名字和价格
1.0,找出香梨的cate_id
select goods.cate_id
from goods
where goods.name=‘香梨’;
2.0,找出大蒜的价格
select goods.price
from goods
where goods.name=‘大蒜’;
3.0,结果
select *
from goods
where goods,cate_id=(
select goods.cate_id
from goods
where goods.name=‘香梨’
and goods.prive>(
select goods.price
from goods
where goods,
name=‘大蒜’
)
)
#查询价格最低的商品的名字
1.0,找出最低价
select min(goods.price) from goods;
2.0找商品
select * from goods where goods.price=(select min(goods.price) from goods);
#查询出所有商品最高价格大于生鲜商品最高价格的种类以及最高价格
1.0,查询生鲜商品最高价格
select max(goods.price)
from goods
inner join cate
on goods.cate_id=cate.id
where cate.name=‘生鲜’;
2.0,找每种商品的最高价格
select goods.cate_id,max(goods.price)
from goods
group by goods.cate_id;
3.0找出价格高于
select goods.cate_id,max(goods.price)
from goods
group by goods.cate_id
having max(price>(
select max(goods.price)
from goods
inner join cate
on goods.cate_id=cate.id
where cate.name=‘生鲜’
)
);
#返回的数据不是标量子查询
select * from goods where price>(select price from goods where cate_id=2);
#找出含有cate_id=2或者3的品牌中所有商品的价格和名字
1.0,找出所有商品的价格和名字
select goods.price,goods.name from goods where goods.brande_id in (select distinct goods.brande_id from goods where goods.cate_id=2 or goods.cate_id=3);
2.0,找出品牌中cate_id=2或者3的品牌
select distinct goods.brande_id from goods where goods.cate_id=2 or goods.cate_id=3;
#找出所有的价格低于天猫一小时达价格的商品
1.0,找出天猫一小时达的最小价格
select min(goods.price)
from goods
inner join brand
on goods.brande_id=brand.id
where brand.brandename=‘天猫一小时达’;
2.0,找出价格低于的商品
select * from goods where goods.price<
(
select min(goods.price)
from goods
inner join brand
on goods.brande_id=brand.id
where brand.brandename=‘天猫一小时达’
);
#查询每一个品牌的信息以及品牌对应的个数
1.0,查询每个品牌的信息
select * from brand;
2.0,查个数
select count() from goods
3.0拼接
select brand.,(select count(*) from goods where goods.brande_id=brand.id) from brand
– select后面只支持标量子查询
#查询每个品牌的平均价格,价格等级
1.0,查询平均价格
select goods.brande_id,avg(goods.price)
from goods
GROUP BY goods.brande_id
2.0,进行两张表的合表
select * from
(
select goods.brande_id,avg(goods.price)
from goods
GROUP BY goods.brande_id
)
as avg_price_table
inner join price_grade
on avg_price_table.avg_price
between price_grade.min_price and price_grade.max_price
– 将子查询放在from后面,充当了数据源,是一张表,要求必须取名字
#exists用来搞判断的,返回的结果是0/1
查询有商品的品牌名字
1.0,查询出goods表中的数据
select * from goods
2.0,查询所有商品
select * from brand
where id in(
select goods.brande_id from goods)
#判断是否存在一个品牌京东
==联合查询=
注意点:联合查询的时候,查询的字段个数必须是一致的
2,尽量使得相同意义的字段放在一起
3,union 可以自动去重,union all 不可以去重
1,查询品牌id大于3或者名字中带火的商品
select *
from goods
join brand
on goods.brande_id=brand.id
where goods.name
like ‘%火%’ or brand.id>3
select * from goods where goods.brande_id>3
union
select * from goods where goods.name
like ‘%火%’
2,查询商品id>3的商品,展示id和商品名,找出品牌id>3的id和品牌名
select goods.id,goods.name
from goods where goods.id>3
union
select brand.id,brand.brandename from brand where brand.id>3
查询的完整格式=
select 字段1,字段2,…
from 表名
where 条件筛选(原始数据上直接筛选)
group by 分组条件1 desc|asc,分组条件2…
having 条件筛选
order by 排序的字段1 asc|desc,字段2 asc|desc
limit 起始位置,数量
– select goods.brande_id,GROUP_CONCAT(name) from goods order by goods.brande_id desc
– 执行顺序
from 表名
where 条件
group by…
select distinct 字段
having 条件
order by 字段
limit