自連接sql
⑴ sql 自身連接和外連接,有什麼區別 自身連接,就是inner join 嗎
inner join是內連接,left join 和 right join是外連接,自連接則不需要join。
From 後面跟著褲鋒遲胡李多個表名(用逗號隔開)是什麼連接?
==》這多個表名基並應該是同一個表吧?如果是的,那就是自連接了。
⑵ SQL中的自然連接是什麼意思啊
1.
指通過對參與表關系中所有同名的屬性對取等(即相等比拆銷枯較)來完成的,故無須旅洞自己添加連接條件,例:select
*
from
student
natual
join
teacher。
2.
同屬於join操作,還包括外連接斗缺和內連接。
⑶ sql自連接的原理
自連接是指在同一張表的連接查詢
就是把同一張表 當作兩張表使用.
如:顯示某個員工的上級領導的姓名?
比如顯示員工『FORD』的上級
SELECT worker.ename, boss.ename FROM emp worker,emp boss WHERE worker.mgr = boss.empno AND worker.ename = 'FORD';
⑷ 數據分析人必掌握的資料庫語言-SQL指南第六期
本篇文章繼續圍繞SQL的語法重點為大家介紹 連接 和 高級連接 的使用,以及 使用連接的注意事項 。
SQL最強大的功能之一就是能在數據查詢的執行中 連接(join)表 。連接是利用SQL的SELECT語句能執行的最重要的操作,很好地理解連接及其語法是學習SQL的極為重要的一點。在能夠有效地使用連接前,我們必須了解 關系表 以及 關系資料庫 設計的一些基礎知識。下面的介紹並不能涵蓋這一主題的所有內容,但作為入門已經夠了。
連接
理解關系表,最好是來看個例子。
有一個包含產品目錄的資料庫表,其中每類物品佔一行。
對於每一種物品,要存儲的信息包括產品描述、價格,以及生產該產品的供應商。
現在有同一供應商生產的多種物品,那麼在何處存儲供應商名、地址、聯系方法等供應商信息呢?將這些數據與產品信息分開存儲的理由是:
① 同一供應商生產的每個產品,其供應商信息都是相同的,對每個產品重復此信息既浪費時間又浪費存儲空間;
② 如果供應商信息發生變化,例如供應商遷址或電話號碼變動,只需修改一次即可;
③ 如果有重復數據(即每種產品都存儲供應商信息),則很難保證每次輸入該數據的方式都相同。不一致的數據在報表中就很難利用。虛飢
關鍵是, 相同的數據出現多次不是一件好事 ,這是關系資料庫設計的基礎。
關系表的設計就是要 把信息分解成多個表 , 一類數據一個表 。各表通過某些共同的值互相關聯(所以才叫關系資料庫)。在這個例子中可建立兩個表:一個存儲供應商信息,另一個存儲產品信息。Vendors表包含所有供應商信息,每個供應商佔一行,具有唯一的標識。此標識稱為 主鍵 (primary key),可以是供應商ID或任何其他唯一值。Procts表只存儲產品信息,除了存儲供應商ID(Vendors表的主鍵)外,它不存儲其他有關供應商的信息。Vendors表的主鍵將Vendors表與Procts表關聯,利用供應商ID能從Vendors表中找出相應供應商的詳細信息。
這樣做的 好處 是:
① 供應商信息不重復,不會浪費時間和空間;
② 如果供應商信息變動,可以只更新Vendors表中的單個記錄,相關表中的數據不用改動;
③ 由於數據不重復,使得處理數據和生成報表更簡單。
總之,關系數據可以有效地存儲,方便地處理。因此,關系資料庫的可伸縮性遠比非關系資料庫要好。
為什麼使用連接
連明譽攔接將數據分解為多個表實現 更有效 地存儲、 更方便 地處理,且 可伸縮性更好 。
可伸縮性:能夠適應不斷增激胡加的工作量而不失敗。
連接作為一種機制,能在一條SELECT語句中用來關聯表。使用特定的語法,可連接多個表返回一組輸出。
創建連接
分析 :上述SELECT語句中與之前的語句相同,都是指定檢索的列, 區別 在於該語句指定的兩列(prod_name,prod_price)在一個表中,而第一列(vend_name)在另一個表中。
FROM子句也有所區別。該FROM子句列出了兩個表:Vendors,Procts。這兩個表由SELECT語句的WHERE子句連接。WHERE子句指示DBMS將Vendors表中的vend_id與Procts表中的vend_id匹配起來。
這里使用了 完全限定列名 將Vendors.vend_id和Procts.vend_id兩列匹配。最終輸出了兩個不同表中的數據。
高級連接部分將介紹 如何使用表別名,另外的一些連接 ,以及 如何對被連接的表使用聚集函數 。
使用表別名
之前的文章已經給大家介紹了如何使用別名引用被檢索的表列。
SQL還可以 給表名起別名 ,目的是:
① 縮短SQL語句。
② 允許在一條SELECT語句中多次使用相同的表。
分析 :上述語句中的FROM子句的三個表都有別名。如此 省略了許多字元 。表別名還可以用於SELECT的列表、ORDER BY子句以及其他語句部分。
需要注意的是: 表別名只在查詢執行中使用 。與列別名不同,表別名不返回到客戶端。
使用不同類型的連接
接下來將給大家介紹四種其他類型的連接: 自連接 、 自然連接 、 內連接 和 外連接 。
①自連接
分析: 這是使用了 子查詢 的方案。對內部的SELECT語句做了一個簡單的檢索,返回Jim Jones工作公司的cust_name。該數據用於外部查詢的WHERE子句中,以檢索出為該公司工作的所有雇員。
下面看看使用了 連接 的方案。
分析:上述語句需要的兩個表實際上是相同的表,所以Customers表在FROM子句中出現了兩次。但這對於Customers的引用具有歧義,因為沒有指示DBMS引用的是哪個Customers表。
於是需要使用表別名解決該問題。Customers表 第一次出現為別名c1 , 第二次為c2 ,然後再將這些別名用作表名。如SELECT語句使用c1前綴明確給出所需列的全名。如果不這么做,DBMS將返回錯誤,因為名為cust_id、cust_name、cust_contact的列各有兩個。DBMS不知需要哪一列,即使它們都是同一列。
WHERE首先連接兩個表,再按第二個表中的cust_contact過濾數據,返回所需的數據。
②自然連接
內連接 返回所有的數據,其中 相同的列可多次出現 。而 自然連接排除多次出現 ,使每一列只返回一次。
一般通過對一個表使用通配符(SELECT *),而對其他的列使用明確的子集來實現自然連接。
分析: 上述語句中,通配符只對第一個表使用,而所有其他列都明確列出來,所以沒有出現重復的列被檢索出來。
③內連接
目前為止使用的連接稱為等值連接,是基於兩個表之間的相等測試。該連接也稱為內連接。
對該種連接還可以使用不同的語法,明確指定連接的類型。
分析 :該語句中的SELECT與之前的區別在於FROM 子句。此處兩個表之間的關系是以 INNER JOIN 指定的部分FROM子句,因此需要使用特定的 ON子句 而不是WHERE子句。但傳遞給ON的實際條件與WHERE相同。
④外連接
許多連接將一個表中的行與另一個表中的行相關聯,但有時候 需要包含沒有關聯的行 。例如,可能需要使用連接完成以下工作:
對每個顧客下的訂單進行計數,包括那些至今尚未下訂單的顧客;
列出所有產品以及訂購數量,包括沒有人訂購的產品;
計算平均銷售規模,包括那些至今尚未下訂單的顧客。
在上述例子中,連接包含了那些在相關表中沒有關聯行的行。這種連接稱為外連接,外連接分為 左外連接 和 右外連接 。
左外連接:取左邊的表的全部,而右邊的表按照條件顯示,不符合條件的顯示NULL。
右外連接:取右邊的表的全部,而左邊的表按照條件顯示,不符合條件的顯示NULL。
下面先給出一個簡單的 內連接 ,再給出 左外連接 ,大家對比著理解。
分析 :兩個語句都使用了 JOIN 關鍵字來指定連接類型,與內連接不同的是,左外連接包括沒有關聯行的行。因此在使用JOIN語法時,還需使用RIGHT或LEFT關鍵字來指定包括其所有行的表(RIGHT指出的是OUTER JOIN右邊的表,而LEFT指出的是OUTER JOIN左邊的表)。
上述左外連接語句使用了LEFT OUTER JOIN 從FROM子句左邊的表(Customers)中選擇所有行。
若要從右邊的表選擇所有行,即使用 右外連接 ,則語句如下:
注意 :兩種基本的外連接形式,左外連接和右外連接。兩者的唯一差別是所關聯的表的順序。
此外,還有一種外連接,即 全外連接 。該連接檢索兩個表中的所有行並關聯可關聯的行。與左外連接或右外連接包含一個表的不關聯的行不同,全外連接包含兩個表的不關聯的行。
自連接、自然連接、內連接和外連接的區別
①自連接: 通常用於 兩張結構和數據內容完全一樣的表 ,在做數據處理時,對它們分別 重命名 來加以區分,然後再進行關聯。
②自然連接 :特點是要求兩個關系表中進行連接的必須是 相同屬性列 (名字相同),無需添加連接條件,且 在結果中消除了重復的屬性列 。
③內連接 :與自然連接相似,區別在於內連接 不要求兩屬性列同名 ,可以用 using或on 來指定某兩列欄位相同的連接條件。
④外連接 :可以解決自然連接時某些屬性不同導致這些元組被舍棄的問題,起到了 保留要舍棄的結果 的作用。
使用帶聚集函數的連接
之前給大家介紹過使用 聚集函數 來匯總數據,殊不知這些函數也可以與連接一起使用。
分析: 上述語句使用了 COUNT函數 。該語句使用INNER JOIN將Customers和Orders表相互關聯。GROUP BY子句按顧客分組,因此,函數調用COUNT(Orders.order_num)對每個顧客的訂單計數,將其作為num_ord返回。
分析: 上述語句使用 左外連接 包含所有顧客,包括了那些沒有任何訂單的顧客。
WHERE子句的重要性
需記住的是,在一條SELECT語句中連接幾個表時,相應的關系是在運行中構造的,因為在資料庫表中的定義沒有指示DBMS如何對表進行連接的內容。
要連接多個表,需要將它們並列於from之後, 關鍵 是要設置WHERE子句,確保它們之間的 關聯關系 必須給出,否則,查詢結果會成為笛卡爾積。
笛卡爾積:由沒有連接條件的表關系返回的結果為笛卡兒積。
分析 :上述語句輸出的結果便是 笛卡爾積 。返回的數據用每個供應商匹配了每個產品,包括了供應商不正確的產品(即使該供應商沒有產品)。
連接及其使用的要點
① 注意所使用的連接類型。一般我們使用內連接,但使用外連接也有效。
② 關於確切的連接語法,應該查看具體的文檔,看相應的DBMS支持何種語法(大多數DBMS使用這兩課中描述的某種語法)。
③ 保證使用正確的連接條件(不管採用哪種語法),否則會返回不正確的數據。
④ 應該總是提供連接條件,否則會得出笛卡兒積。
⑤ 在一個連接中可以包含多個表,甚至可以對每個連接採用不同的連接類型。雖然這樣做是合法的,一般也很有用,但應該在測試它們前分別測試每個連接。這會使故障排除更為簡單。
以上就是本次介紹的連接和高級連接啦~
下一期將給大家介紹 組合查詢 、 插入數據 及 更新和刪除數據。
我們下期見!
⑸ 用SQL語言實現表的自連接
--測試數據:
--createtablea(column1char(1),column2char(2))
--insertintoavalues('a','b')
--insert蘆褲intoavalues('a','c')
--insertintoa做州values('a','e')
--insertintoavalues('a','f')
select*froma
--自純嘩蔽身連接查詢語句:
selectdistincta1.column1,a1.column2,a2.column2fromaa1crossjoinaa2
wherea1.column2<a2.column2
結果:
⑹ SQL的自連接,比如要查詢每科的前三名,查詢語句是
SELECT*FROMscorea
WHERE搏返激基襪(SELECT世困count(*)FROMscorebWHEREb.subjects=a.subjects)<3
⑺ SQL自連接怎麼避免建立臨時表
直接把#temp換成上面第一個sql語句用括弧括起來就行了(去掉into #temp)
⑻ SQL一個表能否和自身進行連接說明理由
可以啊,這叫自連接。但是from子句後面都是同一個表,所以必須給這個表取兩個不同的別名然後進行連接。
⑼ SQL的查詢語句中有一個「自連接查詢」怎麼理解能舉個例子就更好了!
假設在【成績表】有【主鍵ID】【學生姓名】【課程名稱】【成績】等欄位。
現在要查詢 「語文成績>=數學成績」的學生姓名,這時就可以使用自連接查詢:
select 【學生姓名】
from 【成績表】 AS a,【成績表】 AS b
where a.【主鍵ID】=b.【主鍵ID】
and a.【成績】>=b.【成績】
and a.【課程名稱】='語文'
and b.【課程名稱】='數學'
自連接是指使用表的別名實現表與其自身連接的查詢方法。