子查询:又分为where型子查询,from型子查询,exists型子查询这三类。

where型子查询:指把内层查询的结果作为外层查询的比较条件:

举个例子:

我们想查出goods_id最大的商品,要求不能用排序:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
select goods_id,goods_name,cat_id,shop_price from goods where goods_id=(select max(goods_id)from goods);

mysql学习之基础篇06 Mysql 第1张

我们还想查出每个栏目下goods_id最大的商品,要求使用where型子查询:

select goods_id,goods_name,cat_id,shop_price from goods where goods_id in (select max(goods_id)from goods group by cat_id);

mysql学习之基础篇06 Mysql 第2张

from型子查询:

 内层sql的查询结果当成一张临时表,供外层sql再次查询

举个例子,我们想查询上面那张表中shop_price在20到100之间的商品:

select t1.goods_id,t1.goods_name,t1.cat_id,t1.shop_price 

from(select goods_id,goods_name,cat_id,shop_price from goods where goods_id in (select max(goods_id)from goods group by cat_id))

as t1 where t1.shop_price between 20 and 100;

 mysql学习之基础篇06 Mysql 第3张

exists 型子查询:

把外层的查询结果拿到内层进行测试,如果内层存在,则输出外层

我们还有一张category表:

mysql学习之基础篇06 Mysql 第4张

我们现在想取出category栏目下有商品的栏目:

select * from category 
where exists (select * from goods where category.cat_id=goods.cat_id);

mysql学习之基础篇06 Mysql 第5张

 

对null的理解:

建表时列后面not null default ''/not null default 0 是什么意思?

答:就是让这个列的值不为nul,就算某个列确实没有填值,也不让它为null

为什么?

答:null是空,它的比较要用到特殊的比较符is null,is not null ,效率不高而且会影响索引效果

左连接:

假设A表在左,不动,有一张B表在A右边滑动,A表与B表之间通过一个关系来筛选B表的行。

A left join B on 条件。 条件为真,则B表中对应的行被取出。

上面的category表有一列cat_name,我们把它跟goods表左连接看看效果:

select goods_id,goods_name,shop_price,goods.cat_id,cat_name 
from goods left join category on goods.cat_id=category.cat_id;

mysql学习之基础篇06 Mysql 第6张

我们可以看到category表中的cat_name列与goods表连接在了一起

右连接也是类似,不过处于移植性和兼容性方面考虑,我们通常使用左连接。

我们有两个表t,m:

mysql学习之基础篇06 Mysql 第7张

mysql学习之基础篇06 Mysql 第8张

我们想把它显示为以下的效果:

mysql学习之基础篇06 Mysql 第9张

该怎么做?提示:使用两次左连接

select t1.tname,mres,t2.tname,matime 
from m left join t as t1 on t1.tid=m.hid
left join t as t2 on t2.tid=m.gid
where matime between '2006-06-01' and '2006-07-01';

mysql学习之基础篇06 Mysql 第10张

 

union:

合并两条或多条sql语句的结果

语法:sqlA union sqlB

要求查询价格低于100元和价格高于4000元的商品(不能用or

(select goods_id,goods_name,cat_id,shop_price from goods where shop_price<100)
union
(select goods_id,goods_name,cat_id,shop_price from goods where shop_price>4000);

mysql学习之基础篇06 Mysql 第11张

使用union时默认去重,如果不想去掉重复数据可以用union all

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄