数据库必知必会操作手册—创建高级联结
- 创建高级联结
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.****.net/weixin_37972723/article/details/79855381