SQL基礎 聯接 join

2021-10-05 12:44:47 字數 3048 閱讀 3297

理解關係表和關係表的設計。設計關係表的時候,將資訊分散到多個表中,避免在乙個表中存在太多重複資訊。關係錶能更好地擴充套件。

當資訊存在多個表裡時,如何在一條查詢語句裡獲取來自不同表中的資訊。

join就是一種機制,在同乙個條查詢語句中關聯多個表中的資訊。

從關係運算的角度來說,連線運算是從兩個關係的笛卡爾積中選取滿足條件的元組。

一般連線:從兩個關係的笛卡爾積中選取屬性間符合一定條件的元組

等值連線:屬性間的條件為相等

自然連線:屬性間的條件為相等,去掉結果屬性列中的重複項

外連線:在一般連線的基礎上,選取未匹配到的行。左連線即選取左邊未匹配的行,右邊相應的值設為空,右連線同理。

基於兩個表之間的相等性測試的連線,這種連線稱為內連線。

select ta.iten1, tb.item2, tc.item3

form table_a as ta, table_b as tb, table_c as tc

where ta.tb_id = tb.id

and tb.tc_id = tc.id

等價於

select ta.iten1, tb.item2, tc.item3

form table_a as ta inner

join table_b as tb inner

join table_c as tc

on ta.tb_id = tb.id

and tb.tc_id = tc.id

用來代替子查詢的方式

假設乙個場景:某條資料庫中的資料報含字段item1,item2。其中item1的值為text1,item2的值為text2;現要查詢資料中所有與item1=text1時對應的text2相等的資料。

用子查詢的方式:

select t1.item1, t1.item2 from database_demo as t1 where t1.item2 =

(select t2.item2 from database_demo as t2 where t2.item1 =

'text1'

)

改用自聯結的方式為:

select t1.item1, t1.item2 from database_demo as t1, database_demo as t2 where t1.item2 = t2.item2 and t2.item1 =

'text1'

自連線通常用於替換使用子查詢的語句,這些子查詢從與外部語句相同的表中檢索資料。儘管最終結果是相同的,但是許多dbms程序的連線速度要比它們執行子查詢快得多。通常值得嘗試這兩種方法來確定哪一種效能更好。

自然連線只是消除了那些多次出現的情況,因此每個列只返回乙個。進行比較的屬性必須是相同的屬性,比較的條件也是相等條件。

自然連線是只選擇唯一列的連線。這通常在乙個表上使用萬用字元完成

(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 =

'rgan01'

;

在本例中,萬用字元僅用於第乙個表,所有其他列都被顯式列出,這樣就不會檢索到重複的列。

事實是,到目前為止您所建立的每個內部連線實際上都是乙個自然連線,您可能永遠都不需要乙個不是自然連線的內部連線。

下面的查詢語句是乙個簡單的內部聯接。

select customers.cust_id, orders.order_num

from customers inner

join orders

on customers.cust_id = orders.cust_id;

查出的結果:

改用left outer join

檢索所有客戶的列表,包括那些沒有下訂單的客戶

select customers.cust_id, orders.order_num

from customers left

outer

join orders

on customers.cust_id = orders.cust_id;

與將兩個表中的行關聯起來的內部連線不同,外部連線還包括沒有關聯行的行。在使用外部連線時,必須使用right或

left關鍵字指定包含所有行的表(right為外連線右邊表的行,left為左的行)。

請記住,外部連線總是有兩種基本形式—左外部連線和右外部連線。它們之間唯一的區別是它們所關聯的表的順序。換句話說,只需反轉from或where子句中的表順序,左外連線就可以轉換為右外連線。因此,這兩種型別的外部連線可以互換使用,關於使用哪一種連線的決定純粹是基於方便。

外部連線還有另一種變體,即完整的外部連線,它從兩個表中檢索所有行,並將可能相關的行關聯起來。左外連線或右外連線包含來自單個表的不相關行,而完整的外連線包含來自兩個表的不相關行。完整外部連線的語法如下

select customers.cust_id, orders.order_num

from orders full

outer

join customers

on orders.cust_id = customers.cust_id;

mariadb, mysql, open office base,或sqlite等不支援full outer jo

sql基礎語法 聯接查詢

交叉聯接 1.不帶where條件的,將返回兩個表的 行乘積 select c.e.from sales.customers c cross join hr.employees e 2.帶where 條件的,交叉聯接不能使用on select e1.empid,e1.firstname,e1.last...

SQL 三個表聯接的join寫法

select university,difficult level,count qpd.question id count distinct qpd.device id as g answer cnt from question practice detail as qpdleft join use...

Sql 基礎語法join以及多張表join

sql join 用於根據兩個或多個表中的列之間的關係,從這些表中查詢資料。有時為了得到完整的結果,我們需要從兩個或更多的表中獲取結果。我們就需要執行 join。資料庫中的錶可通過鍵將彼此聯絡起來。主鍵 primary key 是乙個列,在這個列中的每一行的值都是唯一的。在表中,每個主鍵的值都是唯一...