数据库必知必会操作手册—创建高级联结

  • 创建高级联结

1.使用表别名:

mysql> SELECT Concat(vend_name, '(', vend_country, ')') AS vend_title FROM Vendors ORDER BY vend_name;
+------------------------+
| vend_title             |
+------------------------+
| ACME(USA)              |
| Anvils R Us(USA)       |
| Furball Inc.(USA)      |
| Jet Set(England)       |
| Jouets Et Ours(France) |
| LT Supplies(USA)       |
+------------------------+
6 rows in set (0.00 sec)

 我们还可以用AS创建别名:

mysql> SELECT cust_name, cust_contact FROM Customers AS C,Orders AS O, OrderItems AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = 'ANV01';
+-------------+--------------+
| cust_name   | cust_contact |
+-------------+--------------+
| Coyote Inc. | Y Lee        |
+-------------+--------------+
1 row in set (0.00 sec)

mysql>

2.自联结

自联结就是自己联结自己的操作。

 

 

SELECT不止一次引用表,如下:

mysql> SELECT cust_id,cust_name,cust_contact FROM Customers WHERE cust_name = (SELECT cust_name FROM Customers WHERE cust_contact = 'Y Lee');
+---------+-------------+--------------+
| cust_id | cust_name   | cust_contact |
+---------+-------------+--------------+
|   10001 | Coyote Inc. | Y Lee        |
+---------+-------------+--------------+
1 row in set (0.00 sec)

标准的联结返回所有数据,相同的列甚至多次出现。自然联结排除多次出现,使每一列只返回一次。

mysql> SELECT C.*, O.order_num,O.order_date,OI.prod_id,OI.quantity,OI.item_price FROM Customers AS C,Orders AS O, OrderItems AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = 'TNT1';
Empty set (0.00 sec)

3.外联结

联结包含了那些在相关表中没有关联行的行。这种联结称为外联结。 

 

首先看看内联结语法,它检索所有顾客及其订单:

mysql> SELECT Customers.cust_id,Orders.order_num FROM Customers INNER JOIN Orders ON Customers.cust_id=Orders.cust_id;
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
|   10001 |     20009 |
|   10003 |     20006 |
|   10004 |     20007 |
|   10005 |     20008 |
+---------+-----------+
5 rows in set (0.00 sec)

外联结的话,是这样的:(检索出了没有订单在内的所有顾客)

mysql> SELECT Customers.cust_id,Orders.order_num FROM Customers LEFT OUTER JOIN Orders ON Customers.cust_id=Orders.cust_id;
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
|   10001 |     20009 |
|   10002 |      NULL |
|   10003 |     20006 |
|   10004 |     20007 |
|   10005 |     20008 |
+---------+-----------+
6 rows in set (0.00 sec)

外联结通过关键字LEFT OUTER JOIN或者RIGHT OUTER JOIN来指定联结类型。(RIGHT 指出的是 OUTER JOIN 右边的表,而 LEFT 指出的是 OUTER JOIN 左边的表)。

 

上面的例子使用 LEFT OUTER JOIN 从 FROM 子句左边的表 (Customers 表)中选择所有行。

下面的例子使用RIGHT OUTER JOIN 从FROM字句右边的表中选择所有行。

mysql> SELECT Customers.cust_id,Orders.order_num FROM Customers RIGHT OUTER JOIN Orders ON Customers.cust_id=Orders.cust_id;
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
|   10001 |     20009 |
|   10003 |     20006 |
|   10004 |     20007 |
|   10005 |     20008 |
+---------+-----------+
5 rows in set (0.00 sec)

 

4.全联结

它检索两个表中的所有行并关联那些可以关联的行。与左外联结或右外联结包含一个表的不关联的行不同,全外联结包含两个表的不关联的行。然而MySql并不支持。

mysql> SELECT Customers.cust_id,Orders.order_num FROM Orders FULL OUTER JOIN Customers ON Orders.cust_id=Customers.cust_id;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OUTER JOIN Customers ON Orders.cust_id=Customers.cust_id' at line 1
mysql>

5.使用带聚集函数的联结

这条 SELECT 语句使用 INNER JOIN 将Customers 和Orders 表互相关联。 GROUP BY 子句按顾客分组数据,因此,函数调用 COUNT(Orders.order_num) 对每个顾客的订单计数,将它作为 num_ord 返回。 

mysql> SELECT Customers.cust_id,COUNT(Orders.order_num) AS num_ord FROM Customers INNER JOIN Orders ON Customers.cust_id = Orders.cust_id GROUP BY Customers.cust_id;
+---------+---------+
| cust_id | num_ord |
+---------+---------+
|   10001 |       2 |
|   10003 |       1 |
|   10004 |       1 |
|   10005 |       1 |
+---------+---------+
4 rows in set (0.00 sec)

再有,用LEFT OUTER JOIN和COUNT函数,左外部联结来包含所有顾客,甚至包含那些没有任何订单的顾客。

mysql> SELECT Customers.cust_id, COUNT(Orders.order_num) AS num_ord FROM Customers LEFT OUTER JOIN Orders  ON Customers.cust_id = Orders.cust_id GROUP BY Customers.cust_id;
+---------+---------+
| cust_id | num_ord |
+---------+---------+
|   10001 |       2 |
|   10002 |       0 |
|   10003 |       1 |
|   10004 |       1 |
|   10005 |       1 |
+---------+---------+
5 rows in set (0.00 sec)

参考:https://blog.csdn.net/weixin_37972723/article/details/79855381

posted @ 2020-08-13 20:34  Yelush  阅读(191)  评论(0编辑  收藏  举报