一:MySQL別名
1.介紹
使用MySQL別名來提高查詢的可讀性。
MySQL支持兩種別名,稱為列別名和表別名。
有時,列的名稱是一些表達式,使查詢的輸出很難理解。要給列一個描述性名稱,可以使用列別名。
用法:
SELECT [column_1 | expression] AS descriptive_name FROM table_name;
要給列添加別名,可以使用AS
關鍵詞后跟別名。 如果別名包含空格,則必須引用以下內容:
SELECT [column_1 | expression] AS `descriptive name` FROM table_name;
因為AS
關鍵字是可選的,可以在語句中省略它。
2.列別名
查詢選擇員工的名字和姓氏,並將其組合起來生成全名。 CONCAT_WS
函數用於連接名字和姓氏。
SELECT CONCAT_WS(', ', lastName, firstname) AS `Full name` FROM employees;
3.子句對別名的使用
在MySQL中,可以使用ORDER BY,GROUP BY和HAVING子句中的列別名來引用該列。
以下查詢使用ORDER BY
子句中的列別名按字母順序排列員工的全名:
SELECT CONCAT_WS(' ', lastName, firstname) `Full name` FROM employees ORDER BY `Full name`;
以下語句查詢總金額大於60000
的訂單。它在GROUP BY
和HAVING
子句中使用列別名。
SELECT orderNumber `Order no.`, SUM(priceEach * quantityOrdered) total FROM orderdetails GROUP BY `Order no.` HAVING total > 60000;
4.注意點
請注意,不能在WHERE子句中使用列別名。原因是當MySQL評估求值WHERE
子句時,SELECT
子句中指定的列的值可能尚未確定。
5.表的別名
可以使用別名為表添加不同的名稱。使用AS
關鍵字在表名稱分配別名,如下查詢語句語法:
table_name AS table_alias
兩個表都具有相同的列名稱:customerNumber
。如果不使用表別名來指定是哪個表中的customerNumber
列:
SELECT customerName, COUNT(o.orderNumber) total FROM customers c INNER JOIN orders o ON c.customerNumber = o.customerNumber GROUP BY customerName HAVING total >=5 ORDER BY total DESC;
二:INNER JOIN內連接
1.介紹
INNER JOIN
子句將一個表中的行與其他表中的行進行匹配,並允許從兩個表中查詢包含列的行記錄。
INNER JOIN
子句是SELECT
語句的可選部分,它出現在FROM子句之后。
在使用INNER JOIN
子句之前,必須指定以下條件:
- 首先,在FROM子句中指定主表。
- 其次,表中要連接的主表應該出現在
INNER JOIN
子句中。理論上說,可以連接多個其他表。 但是,為了獲得更好的性能,應該限制要連接的表的數量(最好不要超過三個表)。 - 第三,連接條件或連接謂詞。連接條件出現在
INNER JOIN
子句的ON
關鍵字之后。連接條件是將主表中的行與其他表中的行進行匹配的規則。
使用語法:
原理:
對於t1
表中的每一行,INNER JOIN
子句將它與t2
表的每一行進行比較,以檢查它們是否都滿足連接條件。當滿足連接條件時,INNER JOIN
將返回由t1
和t2
表中的列組成的新行。
2.避免列的問題
如果連接具有相同列名稱的多個表,則必須使用表限定符引用SELECT
和ON
子句的列,以避免列錯誤。
例如,如果t1
和t2
表都具有名為c
的一個相同列名,則必須在SELECT
和ON
子句中使用表限定符,如使用t1.c
或t2.c
指定引用是那個表中的c
列。
3.兩種相同的做法
語句返回相同的結果集,但是使用此語法,不必使用表的別名
4.GROUP BY子句
相同的結果:
5.使用=以外的運符
也可以使用大於(>
),小於(<
)和不等於(<>
)運算符的其他運算符來形成連接謂詞。
以下查詢使用少於(<
)連接來查找低於代碼為S10_1678
的產品的銷售價格的制造商建議零售價(MSRP
)的所有產品。
三:MySQL左連接(LEFT JOIN)
1.簡介
LEFT JOIN
子句允許您從匹配的左右表中查詢選擇行記錄,連接左表(t1
)中的所有行,即使在右表(t2
)中找不到匹配的行也顯示出來,但使用NULL
值代替。
2.示例
3.使用MySQL LEFT JOIN子句來查找不匹配的行
四:MySQL交叉連接(CROSS JOIN)
1.簡介
CROSS JOIN
子句從連接的表返回行的笛卡兒乘積。
假設使用CROSS JOIN
連接兩個表。 結果集將包括兩個表中的所有行,其中結果集中的每一行都是第一個表中的行與第二個表中的行的組合。 當連接的表之間沒有關系時,會使用這種情況。
語法:
CROSS JOIN
子句不具有連接條件。
如果添加了WHERE
子句,如果T1
和T2
有關系,則CROSS JOIN
的工作方式與INNER JOIN
子句類似,如以下查詢所示:
2.一些問題的解決
有些問題需要使用笛卡爾這種,但是在子句中可以使用一些判斷條件
五:自連接
1.介紹
在同一張表上自己連接自己。
當您想將表中行與同一表中的其他行組合時,可以使用自連接。要執行自聯接操作必須使用表別名來幫助MySQL在單個查詢中區分左表與同一張表的右表。
2.要獲得整個組織結構
以使用employeeNumber
和reportsTo
列將employees
表連接自身。employees
表有兩個角色:一個是經理,另一個是直接報告者(即,下屬員工)。