連接查詢
1.基本概念:就是將兩個或兩個以上的表,連接起來,當做一個數據源,並從中取得所需要的數據。
連接方式:將每一個表的每一行數據兩兩之間相互對接起來,每次對接的結果都是連接結果的“一行”數據。
沒有條件的連接,形式爲:
Select* from 表1,表2;
Select* from 表1 join 表2;
Select* from 表1 cross join 表2;
2.連接基本形式:
表1 【連接形式】 join 表2 【on 連接條件】;
如果是3個表,則進一步擴展:
表1 【連接形式】 join 表2 【on 連接條件】 【連接形式】 join 表3 【on 連接條件】;
3.連接的分類
(1)交叉連接(cross join):沒有連接條件,知識按連接的基本概念將所有數據行都連接起來的結果,又叫做“笛卡爾積”。
對於表1(n1個字段,n2行),表2(m1個字段,m2行),交叉連接的結果是:
有n1+m1個列,n2+m2個行;
形式有:
Select* from 表1,表2;
Select* from 表1 join 表2;
Select* from 表1 cross join 表2;
(2)內連接(inner join):找出交叉連接中有意義的數據
形式:
Select* from 表1 【inner】 join 表2 on 連接條件;
連接條件,簡單的說是“外鍵關係”的一個描述(沒有外鍵關係也可以使用)
例如:
select * from product inner join product_type on product.protype_id=product_type.protype_id;
簡化:
select * from product as A inner join product_type as B onA.protype_id=B.protype_id;
select A.*,t.protype_name from product as A inner join product_type as B onA.protype_id=B.protype_id;
(2)左(外)連接left(outer) join:
形式:表1(左表) left 【outer】 join 表2(右表) on 連接條件;
含義:將兩個表內連接的結果,再加上左邊表的不符合內連接所設定的條件的那些數據的結果(右表中沒有的值,爲NULL)。
即,左邊表的數據全部取出。
(3)右(外)連接right (outer) join
形式:表1(左表) right 【outer】 join 表2(右表) on 連接條件;
含義:將兩個表內連接的結果,再加上右邊表的不符合內連接所設定的條件的那些數據的結果。
即,右邊表的數據全部取出,左表中沒有對應數據則爲NULL。
(4)全(外)連接 full(outer) join
形式:mysql不支持全連接的語法
含義:將兩個表內連接的結果,再加上左邊表的不符合內連接所設定的條件的那些數據的結果以及左邊表的不符合內連接所設定的條件的那些數據的結果。
連接查詢舉例:
例1:查出每個品種各有多少個商品
select p.protype_id,product_name,count(*) as 數量
from product as p inner join product_type as t on p.protype_id=t.protype_id
group by p.protype_id;
例2:查出計算機系的所有學生信息
select s.* from stuinfo as s inner join yuanxi as y ons.yuanxi_id=y.yuanxi_id
where yuanxi_name=’計算機系’;
子查詢
概念:
在一個查詢語句(select語句)中的內部,某些位置(select部分,from部分,where部分),又出現的“查詢語句”。
則有兩個概念:主查詢、子查詢
通常子查詢是爲主查詢服務的,通常都是子查詢獲得一定的結果數據後,纔去執行主查詢。
分類:
(1)按子查詢結果分爲:
表子查詢:一個子查詢的結果是以“多行多列”的時候,此時可以當作一個表來使用,通常放在from後面
行子查詢:結果是一行多列的形式,可當作行來使用,通常放在“行比較語法”中。
行比較語法:where row(字段1,字段2)=(select 行子查詢)
列子查詢:返回結果是多行一列,可當作多個值來使用,類似於:(5,17,8,22)
標量子查詢:結果是一行一列,可當作單個值來使用
(2)按位置分類:
作爲主查詢的結果數據:
Select c1,(select f1 from tab2) as fl1 from tab1;#這裏子查詢應該只有一個數據(標量子查詢)
作爲主查詢的條件數據:
Select c1 fromtab1 where c1 in (select f1 from tab2);#這裏子查詢可以是多個數據(多行一列、列子查詢)
作爲主查詢的來源數據:
Select c1 from(select f1 as c1,f2 from tab2) ast2; #這裏子查詢可以是任意查詢結果(表子查詢)
常見子查詢
(1)比較運算符中的子查詢:
形式:操作數 比較運算符 (標量子查詢)
說明:操作數,其實就是比較運算符的2個數據之一而已,通常就是一個字段名
例:select * from productwhere price=(select max(price) from product);
(2)使用in的子查詢
形式:操作數(字段名) in (列子查詢)
舉例:select * from productwhere protype_id in (select protype_id from product_type where protype_namelike ‘%電%’);
(3)使用any的子查詢
形式:操作數 比較運算符 any(列子查詢);
含義:當某個操作數(字段)對於該列子查詢的其中的任意一個值,滿足該比較運算符,則就算滿足了條件。
例:select * from tab1 whereid > any (select f1 from tab2);
(4)使用all的子查詢
形式:操作數 比較運算符 all(列子查詢);
含義:當某個操作數(字段)對於該列子查詢的其中的所有值,都滿足該比較運算符,則滿足了條件(要求全部都滿足)。
例:select * from tab1 whereid < all (select f1 from tab2);
舉例:
查詢所有非最高價的商品;(至少會小於所有價格中的一個)
Select * from product where price < any(selectprice from product);
查詢所有最高價的商品(大於等於所有價格)
Select * from product where price >= all(selectprice from product);
(5)使用some的子查詢
some是any的同義詞
(6)使用exists的子查詢
形式:where exists(子查詢)
含義:該子查詢如果“有數據”,則exists的結果是true,否則就是false
例:
select * from product where exists
(select * from product_type
whereprotype_name like ‘%電%’ and protype_id=product.protype_id);
product爲主查詢表,後邊的等式是隱含的連接條件
注意:
1.這種子查詢不可獨立運行,必須與主查詢配合使用;
2.該子查詢中的條件,應該設定爲跟主查詢的某個字段有一定的關聯性判斷,通常該判斷就是這兩個表的“本來該有的連接條件”(外鍵關係等)
2.其他子查詢可以獨立運行;
結論:如果一個查詢需求,可以使用一個連接查詢得到,也可以使用一個子查詢得到,則推薦使用連接查詢,效率更高。
聯合查詢union
基本概念:將兩個具有相同字段數的查詢語句的結果,以上下堆疊的方式合併爲一個查詢結果。
例:select id,f1,f2 from jointable1
Union
select id2,c1,f2 from jointable2;
結果以第一個select語句的字段爲準,默認情況下,order by 與limit子句只能對整個聯合後的結果進行排序和數量限定。如果第一個select語句中有別名,則使用order by 時必須使用該別名。
兩個select語句的字段數一致,字段類型一致。
語法形式:
Select語句1
Union 【all |distinct】
Select語句2;
默認會“自動消除重複行”,即默認是distinct,如果想要顯示所有行,就使用all
應用:用union實現全外連接:
Select * from 表1 left join 表2 on 條件
Union
Select * from 表1 right join 表2 on 條件;