MySQL必知必會 13MySQL高階聯結

2021-07-28 00:12:19 字數 4329 閱讀 2604

使用表別名

select

cust_name

,

cust_contact

from

customers as c

,

orders as o

,

orderitems as oi

where

c

.cust_id =o

.cust_id

and oi

.order_num =o

.order_num

and prod_id

='tnt2'

;

表別名不僅能用於where子句,它還可以用於select的列表、order by子句以及語句的其他部分。

與表別名不一樣,表別名不反饋到客戶機。

連線:第一種:內部聯結或等值聯結

第二種:自聯結

第三種:自然聯結

第四種:外部聯結

自聯結

使用子查詢的方式

select

vend_id

,

prod_id

,

prod_name

from

products

where

vend_id

=(

select

vend_id

from

products

where

prod_id

='dtntr'

);

使用自聯結的方式,

select

p1

.vend_id

,

p1

.prod_id

,

p1

.prod_name

from

products as p1

,

products as p2

where

p1

.vend_id =p2

.vend_id

and p2

.prod_id

='dtntr'

;

自聯結通常作為外部語句來替代從相同表中檢索資料時使用的子查詢語句。雖然最終的結果是相同的,但有時候處理聯結遠比處理子查詢快得多。

通常用於解決相同錶子查詢的問題。

自然聯結

無論何時對錶進行聯結,應該至少有乙個列出現在不止乙個表中(被聯結的列)。標準的聯結返回所有資料,甚至相同的列多次出現。自然鏈結排除多次出現,使每個列只返回一次。

自然聯結是這樣一種聯結,其中你對選擇那些唯一的列。這一般是通過對標使用萬用字元(select *),對所有其他表的列使用明確的子集來完成。

select

c

.*,o

.order_num

,

o

.order_date

,

oi

.prod_id

,

oi

.quantity

,

oi

.item_price

from

customers as c

,

orders as o

,

orderitems as oi

where

c

.cust_id =o

.cust_id

and oi

.order_num =o

.order_num

and prod_id

='fb'

;

我們建立的每個內部聯結都是自然聯結,很可能永遠都不會用到不是自然聯結的內部聯結。

外部聯結

聯結中包含那些相關表中沒有關聯的行。這種型別的聯結稱為外部聯結。

即匹配的列出來,沒有匹配的也列出來。

select

customers

.cust_id

,

orders

.order_num

from

customers

left outer join orders on customers

.cust_id

=orders

.cust_id

;

在使用outer join語法時,必須使用right或left關鍵字指定包括其所有行的表(right指出的是outer join右邊的表,而left指出的是outer join左邊的表)

左外部聯結和右外部聯結只是順序上不同而已。兩種型別的外部鏈結可互換使用,而究竟使用哪一種純粹是根據方便而定。

使用帶聚集函式的聯結

select

customers

.cust_name

,

customers

.cust_id

,

count

(orders

.order_num

)as num_ord

from

customers

inner join orders on customers

.cust_id

=orders

.cust_id

group by

customers

.cust_id

;

此select語句使用inner join將customers和orders表互相關聯。

group by子句按客戶分組資料,因此,函式呼叫count(orders.order_num)對每個客戶的訂單計數,將它作為num_ord返回。

這個例子使用左外部聯結來包含所有客戶,甚至包含哪些沒有任何下訂單的客戶。

select

customers

.cust_name

,

customers

.cust_id

,

count

(orders

.order_num

)as num_ord

from

customers

left outer join orders on customers

.cust_id

=orders

.cust_id

group by

customers

.cust_id

;

乙個聯結中可以包含多個表,甚至對於每個聯結都可以採用不同的聯結型別。

mysql必知必會 mysql必知必會(四)

十四 理解子查詢 1 通過子查詢過濾 這本書在所有的章節都關連到了資料庫表,訂單資料是儲存在兩個表中,orders表儲存著 訂單號碼 顧客id和訂單日期。個人的訂單列表關連著orderitems表,訂單表沒有儲存顧客資訊,它只是儲存著顧客id,這實際的顧客資訊是儲存在customers表中。現在假設...

mysql的必知必會 mysql 必知必會 筆記

好久沒有寫了。1 show columns from table 等同於describe table顯示的是表的結構。而select from table 則顯示的是整個表中插入的資料。2 select distinct c1,c2 from table除非列不相同,否則所有行將被檢索出來,即不能對...

mysql必知必會

一周了,總想寫點什麼,有的時候進步真的很難在一周顯示出來,週三的時候,我跟我的領導說,好快啊,又週三了,不知不覺,他說是啊,現在對於他來說,有時候他過一天可能跟我過一周的感覺差不多,每天都在忙,時間過的特別快,也沒有感覺做出來點什麼,當然實際肯定是怎麼做了一些東西的,是否我以後也會如此呢?說說技術把...