4.1 別名 有時,列的名稱是一些表達(dá)式,使查詢的輸出很難理解。要給列一個描述性名稱,可以使用列別名。 以下語句說明了如何使用列別名: SELECT
[column_1 | expression] AS descriptive_name SQL 要給列添加別名,可以使用 SELECT
[column_1 | expression] AS `descriptive name` SQL 因為 我們來看看示例數(shù)據(jù)庫(yiibaidb)中的 以下查詢選擇員工的名字和姓氏,并將其組合起來生成全名。 SELECT
CONCAT_WS(', ', lastName, firstname) SQL 執(zhí)行上面代碼,得到以下結(jié)果 - mysql> SELECT
CONCAT_WS(', ', lastName, firstname)
FROM
employees;
--------------------------------------
| CONCAT_WS(', ', lastName, firstname) |
--------------------------------------
| Murphy, Diane |
| Patterson, Mary |
| Firrelli, Jeff |
| Patterson, William |
| Bondur, Gerard |
| Bow, Anthony |
| Jennings, Leslie |
| Thompson, Leslie |
| Firrelli, Julie |
| Patterson, Steve |
| Tseng, Foon Yue |
| Vanauf, George |
| Bondur, Loui |
| Hernandez, Gerard |
| Castillo, Pamela |
| Bott, Larry |
| Jones, Barry |
| Fixter, Andy |
| Marsh, Peter |
| King, Tom |
| Nishi, Mami |
| Kato, Yoshimi |
| Gerard, Martin |
--------------------------------------
23 rows in set Shell 在上面示例中,列標(biāo)題很難閱讀理解??梢詾檩敵龅臉?biāo)題分配一個有意義的列別名,以使其更可讀,如以下查詢: SELECT
CONCAT_WS(', ', lastName, firstname) AS `Full name` SQL 執(zhí)行上面代碼,得到以下結(jié)果 - mysql> SELECT
CONCAT_WS(', ', lastName, firstname) AS `Full name`
FROM
employees;
--------------------
| Full name |
--------------------
| Murphy, Diane |
| Patterson, Mary |
| Firrelli, Jeff |
... ...
| King, Tom |
| Nishi, Mami |
| Kato, Yoshimi |
| Gerard, Martin |
--------------------
23 rows in set Shell 在MySQL中,可以使用ORDER BY,GROUP BY和HAVING子句中的列別名來引用該列。 以下查詢使用 SELECT
CONCAT_WS(' ', lastName, firstname) `Full name` SQL 執(zhí)行上面代碼,得到以下結(jié)果 - mysql> SELECT
CONCAT_WS(' ', lastName, firstname) `Full name`
FROM
employees
ORDER BY
`Full name`;
-------------------
| Full name |
-------------------
| Bondur Gerard |
| Bondur Loui |
| Bott Larry |
| Bow Anthony |
| Castillo Pamela |
| Firrelli Jeff |
| Firrelli Julie |
| Fixter Andy |
| Gerard Martin |
| Hernandez Gerard |
| Jennings Leslie |
| Jones Barry |
| Kato Yoshimi |
| King Tom |
| Marsh Peter |
| Murphy Diane |
| Nishi Mami |
| Patterson Mary |
| Patterson Steve |
| Patterson William |
| Thompson Leslie |
| Tseng Foon Yue |
| Vanauf George |
-------------------
23 rows in set Shell 以下語句查詢總金額大于 SELECT
orderNumber `Order no.`,
SUM(priceEach * quantityOrdered) total SQL 執(zhí)行上面查詢語句,得到以下結(jié)果 -
MySQL表的別名可以使用別名為表添加不同的名稱。使用 table_name AS table_alias SQL 該表的別名稱為表別名。像列別名一樣, 一般在包含INNER JOIN,LEFT JOIN,self join子句和子查詢的語句中使用表別名。 下面來看看客戶( 兩個表都具有相同的列名稱: Error Code: 1052. Column 'customerNumber' in on clause is ambiguous Shell 為避免此錯誤,應(yīng)該使用表別名來限定 SELECT
customerName,
COUNT(o.orderNumber) total SQL 執(zhí)行上面查詢語句,得到以下結(jié)果 - 上面的查詢從客戶( 如果您不在上述查詢中使用別名,則必須使用表名稱來引用其列,這樣的會使得查詢?nèi)唛L且可讀性較低,如下 - SELECT
customers.customerName,
COUNT(orders.orderNumber) total 4.2 INNER JOIN MySQL
在使用
SELECT column_list SQL 假設(shè)使用 SELECT column_list SQL 對于 請注意, 以下維恩圖說明了 在MySQL INNER JOIN中避免列錯誤如果連接具有相同列名稱的多個表,則必須使用表限定符引用 例如,如果 為了節(jié)省書寫表限定符的時間,可以在查詢中使用表別名。 例如,可以長名稱 MySQL INNER JOIN示例下面來看看示例數(shù)據(jù)庫(yiibaidb)中的產(chǎn)品( 在上面圖中, 通常,連接具有外鍵關(guān)系的表,如產(chǎn)品線(
為此,需要通過使用 SELECT
productCode,
productName,
textDescription SQL 執(zhí)行上面查詢,得到下面的結(jié)果(部分)- 由于兩個表的連接列是使用相同一個列: SELECT
productCode,
productName,
textDescription SQL 上面語句返回相同的結(jié)果集,但是使用此語法,不必使用表的別名。 MySQL INNER JOIN GROUP BY子句 請參閱以下訂單和訂單詳細(xì)表, 可以使用具有GROUP BY子句的 SELECT
T1.orderNumber,
status,
SUM(quantityOrdered * priceEach) total SQL 執(zhí)行上面查詢,結(jié)果如下所示(部分) - 類似地,以下語句查詢與上述得到結(jié)果相同: SELECT
orderNumber,
status,
SUM(quantityOrdered * priceEach) total SQL MySQL INNER JOIN使用等于以外的運(yùn)算符 到目前為止,您已經(jīng)看到連接謂詞使用相等的運(yùn)算符( 以下查詢使用少于( SELECT
orderNumber,
productName,
msrp,
priceEach SQL 執(zhí)行上面查詢語句,得到以下輸出結(jié)果 - mysql> SELECT
orderNumber,
productName,
msrp,
priceEach
FROM
products p
INNER JOIN
orderdetails o ON p.productcode = o.productcode
AND p.msrp > o.priceEach
WHERE
p.productcode = 'S10_1678';
------------- --------------------------------------- ------ -----------
| orderNumber | productName | msrp | priceEach |
------------- --------------------------------------- ------ -----------
| 10107 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 81.35 |
| 10121 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 86.13 |
| 10134 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 90.92 |
| 10145 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 76.56 |
| 10159 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 81.35 |
| 10168 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 94.74 |
| 10399 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 77.52 |
| 10403 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 85.17 |
... ...
| 10417 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 79.43 |
------------- --------------------------------------- ------ -----------
26 rows in set 4.3 LEFT JOIN MySQL 我們假設(shè)要從兩個表 SELECT
t1.c1, t1.c2, t2.c1, t2.c2 SQL 當(dāng)使用 如果左表中的行與右表中的行不匹配,則還將選擇左表中的行并與右表中的“假”行組合?!?em>假”行對于 換句話說, 下圖可幫助您可視化 請注意,如果這些子句在查詢中可用,返回的行也必須與WHERE和HAVING子句中的條件相匹配。 2. MySQL LEFT JOIN示例2.1 使用MySQL LEFT JOIN子句來連接兩個表 我們來看看在示例數(shù)據(jù)庫(yiibaidb)中的兩個表:訂單表和客戶表,兩個表的 ER 圖如下所示 - 在上面的數(shù)據(jù)庫圖中:
要查詢每個客戶的所有訂單,可以使用 SELECT
c.customerNumber,
c.customerName,
orderNumber,
o.status SQL 執(zhí)行上面查詢語句,得到以下結(jié)果(部分) - mysql> SELECT
c.customerNumber,
c.customerName,
orderNumber,
o.status
FROM
customers c
LEFT JOIN orders o ON c.customerNumber = o.customerNumber;
---------------- ------------------------------------ ------------- ------------
| customerNumber | customerName | orderNumber | status |
---------------- ------------------------------------ ------------- ------------
| 103 | Atelier graphique | 10123 | Shipped |
| 103 | Atelier graphique | 10298 | Shipped |
... 省略部分 ...
| 477 | Mit Vergngen & Co. | NULL | NULL |
| 480 | Kremlin Collectables, Co. | NULL | NULL |
| 481 | Raanan Stores, Inc | NULL | NULL |
| 484 | Iberia Gift Imports, Corp. | 10184 | Shipped |
| 484 | Iberia Gift Imports, Corp. | 10303 | Shipped |
| 486 | Motor Mint Distributors Inc. | 10109 | Shipped |
| 486 | Motor Mint Distributors Inc. | 10236 | Shipped |
---------------- ------------------------------------ ------------- ------------
350 rows in set Shell 左表是 因為我們使用相同的列名( SELECT
c.customerNumber,
customerName,
orderNumber,
status SQL 在上面查詢語句中,下面的子句 - USING (customerNumber) SQL 相當(dāng)于 - ON c.customerNumber = o.customerNumber SQL 如果使用INNER JOIN子句替換 2.2 使用MySQL LEFT JOIN子句來查找不匹配的行 當(dāng)您想要找到右表中與不匹配的左表中的行時, 例如,要查找沒有下過訂單的所有客戶,請使用以下查詢: SELECT
c.customerNumber,
c.customerName,
orderNumber,
o.status SQL 執(zhí)行上面查詢語句,得到以下結(jié)果 - mysql> SELECT
c.customerNumber,
c.customerName,
orderNumber,
o.status 3. WHERE子句與ON子句中的條件請參見以下示例。 SELECT
o.orderNumber,
customerNumber,
productCode SQL 在本示例中,我們使用 但是,如果將條件從 SELECT
o.orderNumber,
customerNumber,
productCodeFROM
orders o LEFT JOIN
orderDetails d ON o.orderNumber = d.orderNumber SQL 想想上面代碼將會輸出什么結(jié)果 - 4.4 CROSS JOIN (笛卡爾積)
假設(shè)使用 要特別注意的是,如果每個表有 下面說明連接兩個表: SELECT
* SQL 請注意,與INNER JOIN或LEFT JOIN子句不同, 如果添加了 SELECT
* SQL MySQL CROSS JOIN子句示例下面我們將使用以下幾個表來演示 CREATE DATABASE IF NOT EXISTS testdb; SQL 上面語句中,創(chuàng)建了三個表:
假設(shè)有三個產(chǎn)品: INSERT INTO products(product_name, price) SQL 要獲得每個商店和每個產(chǎn)品的總銷售額,您可以計算銷售額,并按商店和產(chǎn)品分組如下: SELECT
store_name,
product_name,
SUM(quantity * price) AS revenue SQL 執(zhí)行上面查詢,得到以下結(jié)果 - mysql> SELECT
store_name,
product_name,
SUM(quantity * price) AS revenue
FROM
sales
INNER JOIN
products ON products.id = sales.product_id
INNER JOIN
stores ON stores.id = sales.store_id
GROUP BY store_name , product_name;
------------ -------------- ------------
| store_name | product_name | revenue |
------------ -------------- ------------
| North | iPad | 8985.0000 |
| North | iPhone | 13980.0000 |
| North | Macbook Pro | 32475.0000 |
| South | iPad | 20965.0000 |
| South | iPhone | 20970.0000 |
------------ -------------- ------------
5 rows in set Shell 現(xiàn)在,如果你想知道哪個商店中的哪些產(chǎn)品的沒有銷售怎么辦? 上面的查詢無法回答這個問題。 要解決這個問題,可以使用 首先,使用 SELECT
store_name, product_name SQL 執(zhí)行上面查詢語句,得到以下結(jié)果 - mysql> SELECT
store_name, product_name
FROM
stores AS a
CROSS JOIN
products AS b;
------------ --------------
| store_name | product_name |
------------ --------------
| North | iPhone |
| South | iPhone |
| North | iPad |
| South | iPad |
| North | Macbook Pro |
| South | Macbook Pro |
------------ --------------
6 rows in set Shell 接下來,將上述查詢的結(jié)果與按商店和產(chǎn)品返回總銷售額的查詢相結(jié)合。以下查詢說明了這個想法: SELECT
b.store_name,
a.product_name,
IFNULL(c.revenue, 0) AS revenue SQL 請注意,如果收入為 通過這樣使用 |
|