十一級資訊學實踐(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);