1. 程式人生 > >sql常用操作(三)多表查詢

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 ....;