一般所說的左連接,外連接是指左外連接,右外連接。做個簡單的測試你看吧。
先說左外連接和右外連接:
[TEST1@orcl#16-12月-11] SQL>select * from t1;
ID NAME
---------- --------------------
1 aaa
2 bbb
[TEST1@orcl#16-12月-11] SQL>select * from t2;
ID AGE
---------- ----------
1 20
3 30
左外連接:
[TEST1@orcl#16-12月-11] SQL>select * from t1 left join t2 on t1.id=t2.id;
ID NAME ID AGE
---------- -------------------- ---------- ----------
1 aaa 1 20
2 bbb
右外連接:
[TEST1@orcl#16-12月-11] SQL>select * from t1 right join t2 on t1.id=t2.id;
ID NAME ID AGE
---------- -------------------- ---------- ----------
1 aaa 1 20
3 30
從上面的顯示你可以看出:左外連接是以左邊的表為基準。通俗的講,先將左邊的表全部顯示出來,然後右邊的表id與左邊表id相同的記錄就「拼接」上去,比如說id為1的記錄。如果沒有匹配的id,比如說t1中id為2的t2中就沒有。那邊就以null顯示。
右外連接過程正好相反。
再看內連接:
[TEST1@orcl#16-12月-11] SQL>select * from t1 inner join t2 on t1.id=t2.id;
ID NAME ID AGE
---------- -------------------- ---------- ----------
1 aaa 1 20
看到沒有? 只有一條記錄。內連接就是只取出符合過濾條件的記錄 也就是t1.id=t2.id 那麼符合t1.id=t2.id的記錄只有id=1這一條,所以只顯示一條。 不像外連接,是將你作為基準的表(左外連接就是左邊表為基準,右外連接就是右邊表為基準)的所有行都顯示出來。
綜上所述,你應該能明白了吧?如果不明白請留言。
Ⅱ 關於MYSQL資料庫的連接語句~~麻煩大家幫幫忙
首先你多了個},再有$_SESSION那兩句一定要放在echo那句的前面,另外如果你這個函數在類裡面的就沒問題,否則$this->name、$this->pwd可能得不到值
Ⅲ 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 ?