子查询:
where型子查询,from型子查询,exists型子查询
where型例子:
#查出表中最新的商品(以id最大为最新)
select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);
#查出每个栏目下最新的商品
select goods_id,cat_id,goods_name from goods where goods_id in (select max(goods_id) from goods group by cat_id);
#查出每个栏目下最贵的商品
select goods_id,cat_id,goods_name,shop_price from goods where shop_price in (select max(shop_price) from goods group by cat_id);
from型例子:
#查出每个栏目下最新的商品
select * from (select goods_id,cat_id,goods_name from goods order by cat_id asc,goods_id desc) as tmp group by cat_id;
#查出挂科2门及以上的学生的平均分
exists型例子:
union联合
把2次或多次查询结果合并起来
要求:两次查询的列数一致
推荐:查询的每一列相对应的列类型一样
可以来自于多张表,多次sql语句取出的列名可以不一致,此时以第一个sql列名为准
如果不同的语句中取出的行,有完全相同(每个列的值都相同),那么相同的行讲会合并(去重复),如果不去重复,可以加all
如果子句中有order by,limit等,须加括号,避免产生歧义而出错。推荐放到所有子句之后,即对最终合并后的结果来排序(在子句中,order by 配合limit使用才有意义)
例:select goods_id,goods_ name,shop_price from goods where shop_price > 5000 union select goods_id,goods_name,shop_price from goods where shop_price < 20;
#将ta和tb表中id相同的项num相加,不相同的项单独列出来
select id,sum(num) from (select * from ta union all select * from tb) as tmp group by id;
连接查询(左连接,右连接,内连接)
要素:连接接上表;连接条件
select
goods_id, goods.cat_id, cat_name, goods_name, shop_price
from
goods left join category
on goods.cat_id = category.cat_id;
左连接:
select 列1,列2,列N from
tableA left join tableB
on tableA.列=tableB.列 (此处表连接成一张大表)
where group,having....照常写
特点:以左表为准,去右表找匹配数据,找不到匹配用NULL补齐。结果行数>=M (假设A表M行,B表N行数据)
右连接:
select 列1,列2,列N from
tableA right join tableB
on tableA.列=tableB.列 (此处表连接成一张大表)
where group,having....照常写
特点:以右表为准,去左表找匹配数据,找不到匹配用NULL补齐。结果行数>=M (假设A表M行,B表N行数据)
左右连接可以相互转化,推荐使用左连接代替右连接
内连接:
select 列1,列2,列N from
tableA inner join tableB
on tableA.列=tableB.列 (此处表连接成一张大表)
where group,having....照常写
特点:查询左右表中匹配的项,左右表中不匹配的数据项丢弃。结果行数<=M或N (假设A表M行,B表N行数据),内连接是此左右连接的交集(求左右连接的并集时,可以将左右连接的结果union一下)
在girl表中增加一行数据
取出商品的名称,栏目名,品牌名(连接3张表进行查询)
where型子查询,from型子查询,exists型子查询

where型例子:
#查出表中最新的商品(以id最大为最新)
select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);
#查出每个栏目下最新的商品
select goods_id,cat_id,goods_name from goods where goods_id in (select max(goods_id) from goods group by cat_id);
#查出每个栏目下最贵的商品
select goods_id,cat_id,goods_name,shop_price from goods where shop_price in (select max(shop_price) from goods group by cat_id);
from型例子:
#查出每个栏目下最新的商品
select * from (select goods_id,cat_id,goods_name from goods order by cat_id asc,goods_id desc) as tmp group by cat_id;
#查出挂科2门及以上的学生的平均分

exists型例子:

union联合
把2次或多次查询结果合并起来
要求:两次查询的列数一致
推荐:查询的每一列相对应的列类型一样
可以来自于多张表,多次sql语句取出的列名可以不一致,此时以第一个sql列名为准
如果不同的语句中取出的行,有完全相同(每个列的值都相同),那么相同的行讲会合并(去重复),如果不去重复,可以加all
如果子句中有order by,limit等,须加括号,避免产生歧义而出错。推荐放到所有子句之后,即对最终合并后的结果来排序(在子句中,order by 配合limit使用才有意义)
例:select goods_id,goods_ name,shop_price from goods where shop_price > 5000 union select goods_id,goods_name,shop_price from goods where shop_price < 20;
#将ta和tb表中id相同的项num相加,不相同的项单独列出来
select id,sum(num) from (select * from ta union all select * from tb) as tmp group by id;



连接查询(左连接,右连接,内连接)
要素:连接接上表;连接条件
select
goods_id, goods.cat_id, cat_name, goods_name, shop_price
from
goods left join category
on goods.cat_id = category.cat_id;
左连接:
select 列1,列2,列N from
tableA left join tableB
on tableA.列=tableB.列 (此处表连接成一张大表)
where group,having....照常写
特点:以左表为准,去右表找匹配数据,找不到匹配用NULL补齐。结果行数>=M (假设A表M行,B表N行数据)

右连接:
select 列1,列2,列N from
tableA right join tableB
on tableA.列=tableB.列 (此处表连接成一张大表)
where group,having....照常写
特点:以右表为准,去左表找匹配数据,找不到匹配用NULL补齐。结果行数>=M (假设A表M行,B表N行数据)
左右连接可以相互转化,推荐使用左连接代替右连接
内连接:
select 列1,列2,列N from
tableA inner join tableB
on tableA.列=tableB.列 (此处表连接成一张大表)
where group,having....照常写
特点:查询左右表中匹配的项,左右表中不匹配的数据项丢弃。结果行数<=M或N (假设A表M行,B表N行数据),内连接是此左右连接的交集(求左右连接的并集时,可以将左右连接的结果union一下)




在girl表中增加一行数据




取出商品的名称,栏目名,品牌名(连接3张表进行查询)




