zoukankan      html  css  js  c++  java
  • 数据库必知必会操作手册—创建高级联结

    • 创建高级联结

    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

  • 相关阅读:
    tomcat进阶操作
    tomcat环境部署
    CentOS 7.2安装lepus数据库监控系统
    常见的Linux系统监控命令
    zabbix使用jmx监控tomcat
    zabbix配置文件详解
    zabbix2.2.22 升级3.0.18
    zabbix日志监控
    zabbix api的使用
    zabbix低级自动发现之mysql多实例
  • 原文地址:https://www.cnblogs.com/yeshengCqupt/p/13497614.html
Copyright © 2011-2022 走看看