跳轉至內容

十一級資訊學實踐(CBSE)/連線與子查詢

來自華夏公益教科書,開放書籍,開放世界

SQL 最重要的方面是其關係特性。您可以查詢、比較和計算兩個具有完全不同結構的不同表。連線和子選擇是連線表的兩種方法。兩種連線表的方法應該給出相同的結果。在大多數 SQL 平臺上,自然連線更快。

在下面的例子中,一個學生試圖學習印地語中數字的叫法。

CREATE TABLE english (Tag int, Inenglish varchar(255));
CREATE TABLE hindi (Tag int, Inhindi varchar(255));
INSERT INTO english (Tag, Inenglish) VALUES (1, 'One');
INSERT INTO english (Tag, Inenglish) VALUES (2, 'Two');
INSERT INTO english (Tag, Inenglish) VALUES (3, 'Three');
INSERT INTO hindi (Tag, Inhindi) VALUES (2, 'Do');
INSERT INTO hindi (Tag, Inhindi) VALUES (3, 'Teen');
INSERT INTO hindi (Tag, Inhindi) VALUES (4, 'Char');
 從英文中選擇 * 從印地語中選擇 *
標籤英文標籤印地語
1 2
2 3 青少年
3 4

笛卡爾積連線

[編輯 | 編輯原始碼]

笛卡爾積連線是指將一個表中的每一行與另一個表中的每一行連線起來。

SELECT * FROM english, hindi

它也被稱為交叉連線,可以這樣寫

SELECT * FROM english CROSS JOIN hindi
標籤英文標籤 印地語
1 2
2 3 青少年
3 4

內部連線

[編輯 | 編輯原始碼]
SELECT hindi.Tag, english.Inenglish, hindi.Inhindi
FROM english, hindi
WHERE english.Tag = hindi.Tag
標籤 英文 印地語
2
3 青少年

您也可以將相同的查詢寫成

SELECT hindi.Tag, english.Inenglish, hindi.Inhindi
FROM english INNER JOIN hindi
ON english.Tag = hindi.Tag

使用“using”的自然連線(相容:MySQL 4+;但在 MySQL 5 中已更改)以下使用“USING”方法的語句將顯示相同的結果。

SELECT hindi.tag, hindi.Inhindi, english.Inenglish
FROM hindi NATURAL JOIN english
USING (Tag)

外部連線

[編輯 | 編輯原始碼]
標籤 英文 標籤 印地語
1   
2 2
3 3 青少年
    4

左連線/左外部連線

[編輯 | 編輯原始碼]

語法如下

SELECT field1, field2 FROM table1 LEFT JOIN table2 ON field1=field2
SELECT e.Inenglish as English, e.Tag, '--no row--' as Hindi
FROM english AS e LEFT JOIN hindi AS h
ON e.Tag=h.Tag 
WHERE h.Inhindi IS NULL
English  tag   Hindi
One      1     --no row-

右外部連線

[編輯 | 編輯原始碼]
SELECT '--no row--' AS English, h.tag, h.Inhindi AS Hindi
FROM english AS e RIGHT JOIN hindi AS h
ON e.Tag=h.Tag
WHERE e.Inenglish IS NULL

英文標籤印地語--無行--4 炭

  • 確保您在兩個表中具有相同的名稱和相同的資料型別。
  • 關鍵字 LEFT 和 RIGHT 不是絕對的,它們僅在給定語句的上下文中起作用:我們可以顛倒表的順序並顛倒關鍵字,結果將相同。
  • 如果沒有指定連線型別為內部或外部,則將執行為內部連線。

全外部連線

[編輯 | 編輯原始碼]

對於 v5.1,MySQL 不提供 FULL OUTER JOIN。您可以使用一系列聯合的 SELECT 語句來模擬它。

多重連線

[編輯 | 編輯原始碼]

可以連線兩個以上的表

SELECT ... FROM a JOIN (b JOIN c on b.id=c.id) ON a.id=b.id

以下來自 *薩凡納* 的示例

mysql> SELECT group_type.type_id, group_type.name, COUNT(people_job.job_id) AS count 
       FROM group_type
        JOIN (groups JOIN people_job ON groups.group_id = people_job.group_id) 
        ON group_type.type_id = groups.type
       GROUP BY type_id ORDER BY type_id
+---------+--------------------------------------+-------+
| type_id | name                                 | count |
+---------+--------------------------------------+-------+
|       1 | Official GNU software                |   148 |
|       2 | non-GNU software and documentation   |   268 |
|       3 | www.gnu.org portion                  |     4 |
|       6 | www.gnu.org translation team         |     5 |
+---------+--------------------------------------+-------+
4 rows in set (0.02 sec)

子查詢

[編輯 | 編輯原始碼]

(相容:Mysql 4.1 及更高版本...*粗體文字*)

  • SQL 子查詢允許您將一個查詢的結果用作另一個查詢的一部分。
  • 子查詢通常是編寫語句的自然方式。
  • 允許您將查詢分解成片段並組裝起來。
  • 允許某些其他方式無法構建的查詢。不使用子查詢,您必須分兩步完成。
  • 子查詢始終出現在 WHERE(或 HAVING)子句中。
  • 子查詢 SELECT 中只能有一個欄位。這意味著子查詢只能生成一列資料作為其結果。
  • 不允許使用 ORDER BY;這沒有意義。
  • 通常引用子查詢中主表列的名稱。
  • 這定義了正在執行子查詢的主表的當前行。這被稱為外部引用。

例如,如果 RepOffice=Offices 表中的 OfficeNbr,列出銷售配額超過單個銷售人員配額總和的辦公室

SELECT City FROM Offices WHERE Target > ???

??? 是銷售人員配額的總和,即

SELECT SUM(Quota)
FROM SalesReps 
WHERE RepOffice = OfficeNbr

我們將這些結合起來得到

SELECT City FROM Offices 
WHERE Target > (SELECT SUM(Quota) FROM SalesReps 
WHERE RepOffice = OfficeNbr)

顯示所有有訂單或信用額度 > 50,000 美元的客戶。使用 DISTINCT 詞語僅列出客戶一次。

SELECT DISTINCT CustNbr 
FROM Customers, Orders 
WHERE CustNbr = Cust AND (CreditLimit>50000 OR Amt>50000);
華夏公益教科書