子查詢:又分為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