4.1 别名 有时,列的名称是一些表达式,使查询的输出很难理解。要给列一个描述性名称,可以使用列别名。 以下语句说明了如何使用列别名: SELECT
[column_1 | expression] AS descriptive_name SQL 要给列添加别名,可以使用 SELECT
[column_1 | expression] AS `descriptive name` SQL 因为 我们来看看示例数据库(yiibaidb)中的 以下查询选择员工的名字和姓氏,并将其组合起来生成全名。 SELECT
CONCAT_WS(', ', lastName, firstname) SQL 执行上面代码,得到以下结果 - 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 在上面示例中,列标题很难阅读理解。可以为输出的标题分配一个有意义的列别名,以使其更可读,如以下查询: SELECT
CONCAT_WS(', ', lastName, firstname) AS `Full name` SQL 执行上面代码,得到以下结果 - 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 执行上面代码,得到以下结果 - 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 执行上面查询语句,得到以下结果 -
MySQL表的别名可以使用别名为表添加不同的名称。使用 table_name AS table_alias SQL 该表的别名称为表别名。像列别名一样, 一般在包含INNER JOIN,LEFT JOIN,self join子句和子查询的语句中使用表别名。 下面来看看客户( 两个表都具有相同的列名称: Error Code: 1052. Column 'customerNumber' in on clause is ambiguous Shell 为避免此错误,应该使用表别名来限定 SELECT
customerName,
COUNT(o.orderNumber) total SQL 执行上面查询语句,得到以下结果 - 上面的查询从客户( 如果您不在上述查询中使用别名,则必须使用表名称来引用其列,这样的会使得查询冗长且可读性较低,如下 - SELECT
customers.customerName,
COUNT(orders.orderNumber) total 4.2 INNER JOIN MySQL
在使用
SELECT column_list SQL 假设使用 SELECT column_list SQL 对于 请注意, 以下维恩图说明了 在MySQL INNER JOIN中避免列错误如果连接具有相同列名称的多个表,则必须使用表限定符引用 例如,如果 为了节省书写表限定符的时间,可以在查询中使用表别名。 例如,可以长名称 MySQL INNER JOIN示例下面来看看示例数据库(yiibaidb)中的产品( 在上面图中, 通常,连接具有外键关系的表,如产品线(
为此,需要通过使用 SELECT
productCode,
productName,
textDescription SQL 执行上面查询,得到下面的结果(部分)- 由于两个表的连接列是使用相同一个列: SELECT
productCode,
productName,
textDescription SQL 上面语句返回相同的结果集,但是使用此语法,不必使用表的别名。 MySQL INNER JOIN GROUP BY子句 请参阅以下订单和订单详细表, 可以使用具有GROUP BY子句的 SELECT
T1.orderNumber,
status,
SUM(quantityOrdered * priceEach) total SQL 执行上面查询,结果如下所示(部分) - 类似地,以下语句查询与上述得到结果相同: SELECT
orderNumber,
status,
SUM(quantityOrdered * priceEach) total SQL MySQL INNER JOIN使用等于以外的运算符 到目前为止,您已经看到连接谓词使用相等的运算符( 以下查询使用少于( SELECT
orderNumber,
productName,
msrp,
priceEach SQL 执行上面查询语句,得到以下输出结果 - 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 我们假设要从两个表 SELECT
t1.c1, t1.c2, t2.c1, t2.c2 SQL 当使用 如果左表中的行与右表中的行不匹配,则还将选择左表中的行并与右表中的“假”行组合。“假”行对于 换句话说, 下图可帮助您可视化 请注意,如果这些子句在查询中可用,返回的行也必须与WHERE和HAVING子句中的条件相匹配。 2. MySQL LEFT JOIN示例2.1 使用MySQL LEFT JOIN子句来连接两个表 我们来看看在示例数据库(yiibaidb)中的两个表:订单表和客户表,两个表的 ER 图如下所示 - 在上面的数据库图中:
要查询每个客户的所有订单,可以使用 SELECT
c.customerNumber,
c.customerName,
orderNumber,
o.status SQL 执行上面查询语句,得到以下结果(部分) - 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 相当于 - ON c.customerNumber = o.customerNumber SQL 如果使用INNER JOIN子句替换 2.2 使用MySQL LEFT JOIN子句来查找不匹配的行 当您想要找到右表中与不匹配的左表中的行时, 例如,要查找没有下过订单的所有客户,请使用以下查询: SELECT
c.customerNumber,
c.customerName,
orderNumber,
o.status SQL 执行上面查询语句,得到以下结果 - 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 想想上面代码将会输出什么结果 - 4.4 CROSS JOIN (笛卡尔积)
假设使用 要特别注意的是,如果每个表有 下面说明连接两个表: SELECT
* SQL 请注意,与INNER JOIN或LEFT JOIN子句不同, 如果添加了 SELECT
* SQL MySQL CROSS JOIN子句示例下面我们将使用以下几个表来演示 CREATE DATABASE IF NOT EXISTS testdb; SQL 上面语句中,创建了三个表:
假设有三个产品: INSERT INTO products(product_name, price) SQL 要获得每个商店和每个产品的总销售额,您可以计算销售额,并按商店和产品分组如下: SELECT
store_name,
product_name,
SUM(quantity * price) AS revenue SQL 执行上面查询,得到以下结果 - 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 现在,如果你想知道哪个商店中的哪些产品的没有销售怎么办? 上面的查询无法回答这个问题。 要解决这个问题,可以使用 首先,使用 SELECT
store_name, product_name SQL 执行上面查询语句,得到以下结果 - 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 接下来,将上述查询的结果与按商店和产品返回总销售额的查询相结合。以下查询说明了这个想法: SELECT
b.store_name,
a.product_name,
IFNULL(c.revenue, 0) AS revenue SQL 请注意,如果收入为 通过这样使用 |
|