當前位置:首頁 » 編程語言 » sql等值連接

sql等值連接

發布時間: 2022-11-02 06:00:59

1. sql中join和left join的區別

簡單點說:
逗號表示兩個表都存在的記錄才顯示出來;
left join 表示只要左邊表裡面有符合條件的數據就可以查找出來
你可以參考一下資料庫的幾個範式說明

為什麼用","的時候,不加where也可以用。
不加where條件可以用,但是這樣的數據查出來有什麼用嗎。

2. sql 內連接和外連接的是什麼意思

內連接又分為等值連接、自然連接和不等連接三種。

外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN)、右外連接(RIGHT OUTER JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOIN或FULL JOIN)三種。與內連接不同的是,外連接不只列出與連接條件相匹配的行,而是列出左表(左外連接時)、右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數據行。

交叉連接(CROSS JOIN)沒有WHERE 子句,它返回連接表中所有數據行的笛卡爾積,其結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。

連接操作中的ON (join_condition) 子句指出連接條件,它由被連接表中的列和比較運算符、邏輯運算符等構成。

無論哪種連接都不能對text、ntext和image數據類型列進行直接連接,但可以對這三種列進行間接連接。例如:

SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

(一) 內連接

內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。內連接分三種:

1、等值連接:在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重復列。

2、不等連接: 在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!& lt;和<>。

3、自然連接:在連接條件中使用等於(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連接表中的重復列。

例,下面使用等值連接列出authors和publishers表中位於同一城市的作者和出版社:

SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city

又如使用自然連接,在選擇列表中刪除authors 和publishers 表中重復列(city和state):

SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city

(二) 外連接

內連接時,返回查詢結果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和連接條件的行。而採用外連接時,它返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行。

如下面使用左外連接將論壇內容和作者信息連接起來:

SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username

下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:

SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username

(三) 交叉連接

交叉連接不帶WHERE 子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。

例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數將等於6*8=48 行。

SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type

介紹了表連接,更確切的說是inner joins內連接.
內連接僅選出兩張表中互相匹配的記錄.因此,這會導致有時我們需要的記錄沒有包含進來。
為更好的理解這個概念,我們介紹兩個表作演示。蘇格蘭議會中的政黨表(party)和議員表 (msp)。

party(Code,Name,Leader)
Code: 政黨代碼
Name: 政黨名稱
Leader: 政黨領袖

msp(Name,Party,Constituency)
Name: 議員名
Party: 議員所在政黨代碼
Constituency: 選區

3. MySQL 中的各種 JOIN

本文主要介紹 SQL 標准中定義的各種連接的意義和區別,例如,交叉連接( CROSS JOIN )、內連接( INNER JOIN )、外連接( OUTER JOIN )、自然連接( NATURAL JOIN )等,並結合例子講解這些連接在 MySQL 中的語法和表現。

從網上的資料看, JOIN 更多翻譯為連接,本文中凡是出現中文「連接」的地方都是指 JOIN 。

本文中用到的所有例子涉及兩張表—— customers 用戶表和 orders 訂單表,其中訂單表中的 cust_id 欄位表示用戶的唯一 ID,也就是用戶表的主鍵 cust_id 。兩張表的數據如下:

註:兩張表都經過了簡化,實際業務中這兩張表肯定還包括其他欄位。

英文維基網路 JOIN 詞條 對連接的定義如下:

翻譯過來就是,「連接可以根據一張(自連接)或多張表中的共同值將這些表的列數據合並為一個新的結果集,標准 SQL 定義了五種連接:內連接、左外連接、右外連接、全外連接和交叉連接。」

也就是說,連接是 SQL 標准中定義的一種組合多張表的方式,當然一張表自身也可以和自身組合,稱為自連接。連接後得到的結果集的每一列其實都來自用於連接的多張表,不同的連接類型只是區分了這些列具體從哪張表裡來,列里填充的是什麼數據。

其實英文維基網路的 JOIN 詞條已經把各種連接的類型解釋地非常清楚了,非常值得去看一下。

我們來看一下 SQL 標准中定義的各種連接類型,理解各種連接最好的方法就是把需要連接的表想像成集合,並畫出可以反映集合的交與並的情況的圖——韋恩圖,例如下圖就畫出了 SQL 中定義的幾種主要連接。

請先仔細查看一下圖中的內容,你可以從中歸納出幾種連接類型呢?

雖然圖中畫了 7 種集合的交並情況,但是總結起來,主要是兩種連接類型在起作用——內連接( INNER JOIN )和外連接( OUTER JOIN ),其中外連接又分為了左外連接( LEFT OUTER JOIN )、右外連接( RIGHT OUTER JOIN )和全外連接( FULL OUTER JOIN )。

下面先簡單介紹一下 SQL 標准中各種連接的定義,然後在「MySQL 中的連接」一節再用例子來演示 MySQL 中支持的各種連接。

連接既然是用來合並多張表的,那麼要定義一個連接就必須指定需要連接的表,並指定可選的連接條件。例如,一個典型的 SQL 連接語句如下:

我們用表 A 和表 B 指代需要連接的兩張表,經過 內連接 後得到的結果集 包含所有滿足 連接條件 的數據;而經過 外連接 後得到的數據集 不僅 包含滿足 連接條件 的數據,還包含其他數據,具體的差別是:

在上面「SQL 標準定義的主要連接」一圖中並沒有列出交叉連接,交叉連接會對連接的兩張表做笛卡爾積,也就是連接後的數據集中的行是由第一張表中的每一行與第二張表中的每一行配對而成的,而不管它們 邏輯上 是否可以搭配在一起。假設交叉連接的兩張表分別有 m 和 n 行數據,那麼交叉連接後的數據集就包含 m 乘以 n 行數據。

連接根據連接的條件不同,又可以區分為等值連接和非等值連接,「SQL 標準定義的主要連接」圖中畫出的連接的連接條件都是比較兩個欄位是否相等,它們都是等值連接。

自然連接是等值連接的一種特殊形式,自然連接會自動選取需要連接的兩張表中欄位名相同的 所有 列做相等比較,而不需要再指定連接條件了。

註:以下內容全部基於 MySQL 5.7 版本,所有例子只保證在 MySQL 5.7 上是可以正確執行的。

MySQL 中支持的連接類型和關鍵字如下:

上面的表示方法摘自 MySQL 5.7 版本 官方文檔 ,其中 | 表示兩者皆可出現, [] 表示的是可選的, {} 表示的是必選的,例如 NATURAL LEFT JOIN 和 NATURAL JOIN 都是合法的。

可以看到,除了全外連接( FULL OUTER JOIN )以外, MySQL 基本支持了 SQL 標准中定義的各種連接。在 MySQL 中全外連接可以通過 UNION 合並的方式做到,當然前提是你知道自己為什麼需要這么做,具體參見: Full Out Join in MySQL 。

MySQL 語法中還支持一個並不在 SQL 標准中的 STRAIGHT_JOIN ,它在 表現上 和內連接或者交叉連接並無區別,只是一種給 MySQL 優化器的一個提示, STRAIGHT_JOIN 提示 MySQL 按照語句中表的順序載入表,只有在你明確清楚 MySQL 伺服器對你的 JOIN 語句做了負優化的時候才可能用到它。

還有一點需要說明的是,根據 官方文檔 ,在 MySQL 中, JOIN 、 CROSS JOIN 和 INNER JOIN 實現的功能是一致的,它們在語法上是等價的。從語義上來說, CROSS JOIN 特指無條件的連接(沒有指定 ON 條件的 JOIN 或者沒有指定 WHERE 連接條件的多表 SELECT ), INNER JOIN 特指有條件的連接(指定了 ON 條件的 JOIN 或者指定了 WHERE 連接條件的多表 SELECT )。當然,如果你非要寫 ... CROSS JOIN ... ON ... 這樣的語法,也是可以執行的,雖然寫著交叉連接,實際上執行的是內連接。

下面我們就用例子來看一看 MySQL 中支持的幾種連接的例子。

註:下面的例子都沒有指定 ORDER BY 子句,返回結果的順序可能會因為數據插入順序的不同而略有不同。

MySQL 的交叉連接或內連接有兩種寫法,一種是使用 JOIN 並用 ON 或者 USING 子句指定連接條件的寫法,一種是普通的 SELECT 多表,並且用 WHERE 子句指定連接的鍵的寫法。

下面的例子是一個交叉連接:

上面的寫法等價於:

當然,第二種寫法中如果將 CROSS JOIN 替換成 JOIN 或者 INNER JOIN 也是可以正確執行的。上面兩條語句的執行結果如下:

可以看到共返回了 30 行結果,是兩張表的笛卡爾積。

一個內連接的例子如下:

上面的寫法等價於:

在連接條件比較的欄位相同的情況下,還可以改用 USING 關鍵字,上面的寫法等價於:

上面三條語句的返回結果如下:

可以看到只返回了符合連接條件 customers.cust_id = orders.cust_id 的 6 行結果,結果的含義是所有有訂單的用戶和他們的訂單。

左外連接和右外連接的例子如下,其中的 OUTER 關鍵字可以省略:

其中右外連接的返回與內連接的返回是一致的(思考一下為什麼),左外連接的返回結果如下:

可以看到一共返回了 8 行數據,其中最後兩行數據對應的 order_id 的值為 NULL ,結果的含義是所有用戶的訂單,不管這些用戶是否已經有訂單存在了。

根據前面介紹的自然連接的定義,自然連接會自動用參與連接的兩張表中 欄位名相同 的列做等值比較,由於例子中的 customers 和 orders 表只有一列名稱相同,我們可以用自然連接的語法寫一個與上面的內連接的例子表現行為一樣的語句如下:

可以看到,使用自然連接就不能再用 ON 子句指定連接條件了,因為這完全是多餘的。

當然,自然連接同樣支持左外連接和右外連接。

下面用一個 customers 表自連接的例子再來說明一下自然連接,語句如下:

因為是自連接,因此必須使用 AS 指定別名,否則 MySQL 無法區分「兩個」 customers 表,運行的結果如下:

可以看到結果集和 customers 表完全一致,大家可以思考一下為什麼結果是這樣的。

文章之前也提到了,MySQL 還支持一種 SQL 標准中沒有定義的「方言」, STRAIGHT_JOIN , STRAIGHT_JOIN 支持帶 ON 子句的內連接和不帶 ON 子句的交叉連接,我們來看一個 STRAIGHT_JOIN 版本的內連接的例子:

返回結果與前面內連接的例子是一致的,如下:

STRAIGHT_JOIN 的表現和 JOIN 是完全一致的,它只是一種給 MySQL 優化器的提示,使得 MySQL 始終按照語句中表的順序讀取表(上面的例子中,MySQL 在執行時一定會先讀取 customers 表,再讀取 orders 表),而不會做改變讀取表的順序的優化。關於 MySQL 優化器的話題這里不做展開,需要說明的是除非你非常清楚你在做什麼,否則不推薦直接使用 STRAIGHT_JOIN 。

你能理解上面的語句是在檢索什麼數據嗎?

本文主要介紹了 SQL 標准里定義的各種連接的概念,以及 MySQL 中的實現,並通過各種例子來介紹了這些連接的區別。這些連接不一定都能在實際開發中用到,但是做到心中有知識也還是很有必要的。

那麼,現在再回憶一下,什麼是內連接、外連接、自連接、等值連接和自然連接?他們的區別是什麼?

最後,給大家留一個思考題,為什麼 MySQL 中沒有左外連接或者右外連接版本的 STRAIGHT_JOIN ?

4. sql語句中join、left join 、right join有什麼區別

left join :左連接,返回左表中所有的記錄以及右表中連接欄位相等的記錄。
right join :右連接,返回右表中所有的記錄以及左表中連接欄位相等的記錄。

5. sql語句中join、left join 、right join有什麼區別

join等價於inner
join內連接,是返回兩個表中都有的符合條件的行。
left
join左連接,是返回左表中所有的行及右表中符合條件的行。
right
join右連接,是返回右表中所有的行及左表中符合條件的行。
full
join全連接,是返回左表中所有的行及右表中所有的行,並按條件連接。
通常情況下,left
join肯定比inner
join返回的行數多。

6. SQL的等值連接與內連接有什麼不同

等值連接
select * from 作者,借書表 where 作者.編號=借書表.編號 and 借書表.借閱次數>50
內連接
select * from 作者 join 借書表 on 作者.編號=借書表.編號 where 借閱次數>50

內連接時,返回查詢結果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和連接條件的行。而採用外連接時,它返回到查詢結果集合中的不僅包含符合連 接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連 接)中的所有數據行。

7. SQL的等值連接與內連接有什麼不同

從左表中取出每一條記錄,去右表中與所有的記錄進行匹配:匹配必須是某個條件在左表中與右表中相同最終才會保留結果,否則不保留。

語法一:select 列名 from 表1 inner join 表2 on 表1.公共欄位=表2.公共欄位

語法二:select 列名 from 表1,表2 where 表1.公共欄位=表2.公共欄位 # 又叫等值連接

其中,on表示連接條件,公共欄位表示具有相同的含義的欄位。

欄位別名以及表別名的使用: 在查詢數據的時候,不同表有同名欄位,這個時候需要加上表名才能區分,而表名太長,通常可以使用別名。

內連接可以沒有連接條件: 沒有on之後的內容,這個時候系統會保留所有結果(笛卡爾積)。

等值連接:內連接還可以使用where代替on關鍵字,此方法又叫等值連接。從集合論角度看,等值連接是內連接的子集。但此方法執行效率比較低,盡量不用。

8. 資料庫基礎篇(二)—— SQL之數據查詢

接下來,我們將使用員工相關的四張樣本數據表,來學習SQL,建議你在學習過程中多動手練習,理解才會更深刻。表和欄位含義,如下圖:

如何利用SQL語句來操作以上數據呢?我們必須將樣本數據導入MySQL客戶端(如:Navicat)中。可以在客戶端操作數據,或者在終端窗口。工作中經常在客戶端操作,所以本文所有SQL語句將在Navicat中學習。
首先將sql腳本保存到桌面(獲取方式:關注"Python之每日一課"公眾號,後來回復"sql基礎數據",即可。),導入SQL腳本的具體操作流程如下:

現在數據准備完成。這里是導入sql腳本;導出同理,選擇」轉儲SQL「文件。當然了,Navicat也支持將當前表或查詢結果導出Excel、CSV等文件類型。

下面可以寫SQL語句了(每個sql腳本可以保存,下次直接使用),如下:

類似於Python中 :print(要列印的東西)

①通過select查詢完的結果 ,是一個虛擬的表格,不是真實存在

② 要查詢的東西 可以是常量值、表達式、欄位、也可以是函數

補充:可以給欄位起別名,好處是提高可讀性,更方便理解;多表連接時,區分欄位。用AS 或 空格來實現。如下:

2、 條件查詢

條件查詢:根據條件過濾原始表的數據,查詢到想要的數據

1)語法

2)分類

①條件表達式

②邏輯表達式

③模糊查詢

⭐ 注意:where 一定要放到 from 後面。NULL 不是假,也不是真,而是"空";任何運算符,判斷符碰到NULL,都得NULL;NULL的判斷只能用is null,is not null;NULL 影響查詢速度,一般避免使值為NULL。exists查詢可以與in型子查詢互換,它們之間區別以後語句優化時會詳細講解。

3、 排序查詢

1)語法

2)舉栗

⭐ 注意:order by 一定要放到 語句最後(limit前面)

4、分組查詢
1)語法

2)特點

①可以按單個欄位分組

②和分組函數一同查詢的欄位最好是分組後的欄位

③分組篩選(where 和 having區別)

④可以按多個欄位分組,欄位之間用逗號隔開

⑤可以支持排序

⑥having後可以支持別名

3)舉栗

⭐ 注意:關鍵字順序是where —>group by—>having—>order by—>limit( having不能單獨使用,需結合group by ,表示對分組後的結果進行篩選;而 group by 必須結合分組聚合函數一起使用 ,比如:count()、max()等)

5、 常見函數

1)單行函數

2)分組函數

3)分組函數特點

①以上五個分組函數都忽略null值,除了count(*)

②sum和avg一般處理數值型,max、min、count可以處理任何數據類型

③都可以搭配distinct使用,用於統計去重後的結果

④count的參數可以支持:欄位、*、常量值,一般放1

6、連接查詢(多表查詢)

單個表不能滿足需求時,需要結合多張表,去除有關聯的數據。這時就需要用連接查詢,連接查詢有三種,通常join使用的最多。

①等值連接的結果 = 多個表的交集

②多個表不分主次,沒有順序要求

③一般為表起別名,提高閱讀性和性能

①語法

②好處

語句上,連接條件和篩選條件實現了分離,簡潔。

⭐ 注意:左右連接可互換 A left join B 等價於B right join A;內連接是左</pre>

右連接的交集;mysql沒有外連接。

自連接相當於等值連接,但是等值連接涉及多個表,而自連接僅僅是它自己。如下:在員工信息表裡,查詢員工名和直接上級的名。

7、子查詢

一條查詢語句中又嵌套了另一條完整的select語句,其中被嵌套的select語句,稱為子查詢或內查詢。在外面的查詢語句,稱為主查詢或外查詢。

①子查詢都放在小括弧內

②子查詢可以放在from後面、select後面、where後面、having後面,但一般放在條件的右側

③子查詢優先於主查詢執行,主查詢使用了子查詢的執行結果

④子查詢根據查詢結果的行數不同分為以下兩類:

2)舉栗

8、分頁查詢 (可選)
實際web開發中,當顯示的數據,一頁顯示不完時,需要分頁提交sql請求。

2)特點

①起始條目索引默認從0開始

②limit子句放在查詢語句的最後

③公式:select * from 表 limit (page-1)*sizePerPage,

3)舉栗

9、union聯合查詢

union用於把涉及多個表的SELECT語句的結果組合到一個結果集合中。適用於查詢條件較多,多個表之間沒有連接關系的場景。</pre>

2)特點

①多條查詢語句的查詢的列數必須是一致的

②多條查詢語句的查詢的列的類型幾乎相同

③union 代表去重,union all 代表不去重

3)舉栗

UNION 和 UNION ALL 運行結果的區別如下:

⭐ 注意:在多個 SELECT 語句中,第一個 SELECT 語句中被使用的欄位名稱將被用於結果的欄位名稱。當使用 UNION 時,MySQL 會把結果集中重復的記錄刪掉,而使用 UNION ALL ,MySQL 會把所有的記錄返回,且效率高於 UNION

好,今天學習到這里。工作中用的最多就是查詢。如果能消化本文涉及到的所有內容,大概能解決80%的工作需求。本文更多的是原理介紹,例子不多,只有先知道是什麼,才能知道怎麼學。那麼,接下來最重要的是要多練習實踐。因為實際的業務場景要復雜很多,給大家推薦兩個刷題的網站,力扣和牛客網,裡面有大量的sql面試題。能進一步提高我們sql的水平。這篇文章主要是SQL的常用查詢。明天繼續學習SQL的DML增刪改。一起加油!

9. sql server 等值連接和自然連接的 用法

這是2012年的提問嘛,現在是2019年6月13日,我給你詳細解答。

內連接里分為等值連接和不等連接,自然連接屬於特殊的等值連接。這是他們二者的關系。

這是我建立的兩個表 a和b

相比上圖,少了一個B,對吧

懂了嗎,不懂追問吧

熱點內容
安卓hostapd源在哪裡 發布:2025-01-10 02:31:53 瀏覽:568
二級c語言證書查詢 發布:2025-01-10 02:20:25 瀏覽:457
大眾車的鍵盤鎖密碼是多少 發布:2025-01-10 02:20:24 瀏覽:240
如何將資料庫加密碼 發布:2025-01-10 02:14:46 瀏覽:952
阿里雲怎麼買游戲伺服器 發布:2025-01-10 02:01:51 瀏覽:847
dota和英雄聯盟哪個吃配置 發布:2025-01-10 02:00:33 瀏覽:181
華為雲伺服器怎麼登錄 發布:2025-01-10 01:59:48 瀏覽:127
東南大學知網伺服器地址 發布:2025-01-10 01:54:40 瀏覽:933
安卓手機剪映怎麼修改成4k幀率 發布:2025-01-10 01:08:21 瀏覽:951
微信哪個版本不要求配置 發布:2025-01-10 01:07:31 瀏覽:405