sql常用操作(三)多表查詢
1 連線查詢
1.1連線就是指兩個或2個以上的表(資料來源)“連線起來成為一個數據源”。
實際上,兩個表的完全的連線是這樣的一個過程:
左邊的表的每一行,跟右邊的表的每一行,兩兩互相“橫向對接”後所得到的所有資料行的結果。
注意:連線之後,並非形成了一個新的資料表,而只是一種“記憶體形態”。
1.2連線語法的基本形式
from 表1 [連線方式] join 表2 [on 連線條件];
連線的結果可以當作一個“表”來使用。常用有以下幾種連線方式:
1.3交叉連線
實際上,交叉連線是將兩個表不設定任何條件的連線結果。
交叉連線通常也被叫做“笛卡爾積”——數學上可能比較多。(最後結果是:表1條數*表2條數)
語法:
from 表1 [cross] join 表2 ; //可見交叉連線只是沒有on條件而已。
(cross這個詞也可以省略,還可以使用inner這個詞代替)
例:
select * from emp;
select * from dept;
select * from emp join dept; 或 select * from emp cross join dept;
1.4內連線(用的較多)
語法:
from 表1 [inner] join 表2 on 表1.欄位1=表2.欄位2;
含義:
找出(過濾)在交叉連線的結果表中的表1的欄位1的值等於表2的欄位2的值的那些行。
例:上面那個例子改一下:
select * from emp join dept where deptid=id;
比較正規的寫法是:select * from emp join dept on emp.deptid=dept.id;
結果相同:
1.5左[外]連線
形式:
from 表1 left [outer] join 表2 on 連線條件。
說明:
1,這裡,left是關鍵字。
2,連線條件跟內連線一樣。
3,含義是:內連線的結果基礎上,加上左邊表中所有不符合連線條件的資料,相應放右邊表的欄位的位置就自動補為“null”值。
例:(內連線)
select * from product join product_type on product.protype_id =product_type.protype_id;
/*左外連線*/
select * from product_type left join product
on product.protype_id =product_type.protype_id;
1.6右[外]連線
右連線跟左連線恰恰相反:
形式:
from 表1 right [outer] join 表2 on 連線條件。
說明:
1,這裡,right是關鍵字。
2,連線條件跟內連線一樣。
3,含義是:在內連線的結果基礎上,加上右邊表中所有不符合連線條件的資料,相應本應放左邊表的欄位的位置就自動補為“null”值。
例:
/*右外連線*/
select * from product right join product_type
on product.protype_id =product_type.protype_id;
1.7全[外]連線 (和交叉連線不同)
形式:
from 表1 full [outer] join 表2 on 連線條件;
說明:
1,含義:其實是左右連線的“並集”(消除重複項),即內連線的結果,加上左表中不滿足條件的所有行(右邊對應補null),再加上,右表中不滿足條件的所有行(左邊對應補null)。
2,mysql中其實不認識全[外]連線語法,即mysql這個軟體本身不支援全連線的語法。
3,此概念在其他資料庫有的存在,瞭解就可以。
1.8 練習:
1)找出索尼4g手機所屬類別名稱
select protype_name from product join product_type
on product.protype_id=product_type.protype_id
where pro_name like '%索尼%4g手機%';
2)找出所有屬於手機數碼的產品
select * from product join product_type
on product.protype_id=product_type.protype_id
where protype_name='手機數碼';
2 子查詢
2.1子查詢就是把一個查詢的結果當作另一個查詢的條件。
例1:
/*找出索尼4g手機所屬類別名稱*/
第一步,找條件:
select protype_id from product where pro_name like '%索尼%4g手機%';
第二步,找結果:
select * from product_type where protype_id=?;
第三步,連線:
select protype_name from product_type where protype_id=(select protype_id from product where pro_name like '%索尼%4g手機%');
例2:
/*找出所有屬於手機數碼的產品*/
select * from product where protype_id=(select protype_id from product_type where protype_name='手機數碼');
表連線和子查詢可以實現同樣的效果,實際應用中自行選擇用哪種方式。
2.2 使用in子查詢(常用)
in的基本語法形式為:
where 運算元 in (值1,值2, ....)
則in子查詢就是:
where 運算元 in ( 列子查詢 );
含義:
表示該運算元(欄位值) 等於 該子查詢的其中任意一個只,就算滿足條件。
例:
/*找出屬於手機數碼或電腦辦公的產品*/
select * from product where protype_id in (select protype_id from product_type where protype_name='手機數碼' or protype_name='電腦辦公');
3 聯合查詢
聯合查詢的關鍵字是: union。
3.1定義
聯合查詢就是將兩個select語句的查詢結果“層疊”到一起成為一個“大結果”。
兩個查詢結果的能夠進行“聯合”的先覺條件是:結果欄位數相等。
3.2語法形式
select 語句1
union [all | distinct]
select 語句2;
例:
select aname,adesc from app1 union select bname,bdesc from bpp1;
select aid,adesc from app1 union select bname,bdesc from bpp1;(沒意義)
3.3說明:
1)兩個select語句的輸出段(結果欄位)數目一樣,應用中通常型別一樣才有意義。
2)結果集中的欄位以第一個select語句的欄位為準。
3)第一個select語句的欄位可以做別名,但如果做別名,則後續的where,group,order等子句應該用該別名。
4)聯合查詢預設是會消除重複項的(distinct),要想不消除,則必須明確些“all”。
5)如果要對整個聯合結果進行排序或limit,則應該對各自的select語句加括號:
(select 語句1)
union
(select 語句2)
order by ..... limit ....;