mysql学习之基础篇06
程序员文章站
2022-04-10 16:15:54
子查询:又分为where型子查询,from型子查询,exists型子查询这三类。 where型子查询:指把内层查询的结果作为外层查询的比较条件: 举个例子: 我们想查出goods_id最大的商品,要求不能用排序: 我们还想查出每个栏目下goods_id最大的商品,要求使用where型子查询: fro ......
子查询:又分为where型子查询,from型子查询,exists型子查询这三类。
where型子查询:指把内层查询的结果作为外层查询的比较条件:
举个例子:
我们想查出goods_id最大的商品,要求不能用排序:
select goods_id,goods_name,cat_id,shop_price from goods where goods_id=(select max(goods_id)from goods);
我们还想查出每个栏目下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);
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;
exists 型子查询:
把外层的查询结果拿到内层进行测试,如果内层存在,则输出外层
我们还有一张category表:
我们现在想取出category栏目下有商品的栏目:
select * from category where exists (select * from goods where category.cat_id=goods.cat_id);
对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;
我们可以看到category表中的cat_name列与goods表连接在了一起
右连接也是类似,不过处于移植性和兼容性方面考虑,我们通常使用左连接。
我们有两个表t,m:
我们想把它显示为以下的效果:
该怎么做?提示:使用两次左连接
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';
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);
使用union时默认去重,如果不想去掉重复数据可以用union all