zoukankan      html  css  js  c++  java
  • MySQL连接表

    一:MySQL别名

    1.介绍

      使用MySQL别名来提高查询的可读性。

      MySQL支持两种别名,称为列别名和表别名。

      有时,列的名称是一些表达式,使查询的输出很难理解。要给列一个描述性名称,可以使用列别名。

      用法:

      SELECT 
       [column_1 | expression] AS descriptive_name
      FROM table_name;

      要给列添加别名,可以使用AS关键词后跟别名。 如果别名包含空格,则必须引用以下内容:

      SELECT 
       [column_1 | expression] AS `descriptive name`
      FROM table_name;

      因为AS关键字是可选的,可以在语句中省略它。

    2.列别名

      查询选择员工的名字和姓氏,并将其组合起来生成全名。 CONCAT_WS函数用于连接名字和姓氏。

    SELECT
     CONCAT_WS(', ', lastName, firstname) AS `Full name`
    FROM
     employees;

      

    3.子句对别名的使用

      在MySQL中,可以使用ORDER BYGROUP BYHAVING子句中的列别名来引用该列。

      以下查询使用ORDER BY子句中的列别名按字母顺序排列员工的全名:

    SELECT
     CONCAT_WS(' ', lastName, firstname) `Full name`
    FROM
     employees
    ORDER BY
     `Full name`;

       

     

      以下语句查询总金额大于60000的订单。它在GROUP BYHAVING子句中使用列别名。

    SELECT
     orderNumber `Order no.`,
     SUM(priceEach * quantityOrdered) total
    FROM
     orderdetails
    GROUP BY
     `Order no.`
    HAVING
     total > 60000;

      

    4.注意点

      请注意,不能在WHERE子句中使用列别名。原因是当MySQL评估求值WHERE子句时,SELECT子句中指定的列的值可能尚未确定。

    5.表的别名

      可以使用别名为表添加不同的名称。使用AS关键字在表名称分配别名,如下查询语句语法:

       table_name AS table_alias

      两个表都具有相同的列名称:customerNumber。如果不使用表别名来指定是哪个表中的customerNumber列:

      

    SELECT
     customerName,
     COUNT(o.orderNumber) total
    FROM
     customers c
    INNER JOIN orders o ON c.customerNumber = o.customerNumber
    GROUP BY
     customerName
    HAVING total >=5
    ORDER BY
     total DESC;

       

    二:INNER JOIN内连接

    1.介绍 

      INNER JOIN子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录。

      INNER JOIN子句是SELECT语句的可选部分,它出现在FROM子句之后。  

      在使用INNER JOIN子句之前,必须指定以下条件:

    • 首先,在FROM子句中指定主表。
    • 其次,表中要连接的主表应该出现在INNER JOIN子句中。理论上说,可以连接多个其他表。 但是,为了获得更好的性能,应该限制要连接的表的数量(最好不要超过三个表)。
    • 第三,连接条件或连接谓词。连接条件出现在INNER JOIN子句的ON关键字之后。连接条件是将主表中的行与其他表中的行进行匹配的规则。

       使用语法:

      

      原理:

      对于t1表中的每一行,INNER JOIN子句将它与t2表的每一行进行比较,以检查它们是否都满足连接条件。当满足连接条件时,INNER JOIN将返回由t1t2表中的列组成的新行。

      

    2.避免列的问题  

      如果连接具有相同列名称的多个表,则必须使用表限定符引用SELECTON子句的列,以避免列错误。

      例如,如果t1t2表都具有名为c的一个相同列名,则必须在SELECTON子句中使用表限定符,如使用t1.ct2.c指定引用是那个表中的c列。

    3.两种相同的做法

      语句返回相同的结果集,但是使用此语法,不必使用表的别名

      

      

    4.GROUP BY子句

      

      

      

      相同的结果:

      

    5.使用=以外的运符  

      也可以使用大于(>),小于(<)和不等于(<>)运算符的其他运算符来形成连接谓词。

      以下查询使用少于(<)连接来查找低于代码为S10_1678的产品的销售价格的制造商建议零售价(MSRP)的所有产品。

      

      

     三:MySQL左连接(LEFT JOIN)

    1.简介

      LEFT JOIN子句允许您从匹配的左右表中查询选择行记录,连接左表(t1)中的所有行,即使在右表(t2)中找不到匹配的行也显示出来,但使用NULL值代替。

        

    2.示例

      

      

    3.使用MySQL LEFT JOIN子句来查找不匹配的行

      

    四:MySQL交叉连接(CROSS JOIN)

    1.简介  

      CROSS JOIN子句从连接的表返回行的笛卡儿乘积。

      假设使用CROSS JOIN连接两个表。 结果集将包括两个表中的所有行,其中结果集中的每一行都是第一个表中的行与第二个表中的行的组合。 当连接的表之间没有关系时,会使用这种情况。

      语法:

      

      CROSS JOIN子句不具有连接条件。

      如果添加了WHERE子句,如果T1T2有关系,则CROSS JOIN的工作方式与INNER JOIN子句类似,如以下查询所示:

      

      

    2.一些问题的解决

      有些问题需要使用笛卡尔这种,但是在子句中可以使用一些判断条件

    五:自连接

    1.介绍

      在同一张表上自己连接自己。

      当您想将表中行与同一表中的其他行组合时,可以使用自连接。要执行自联接操作必须使用表别名来帮助MySQL在单个查询中区分左表与同一张表的右表。

    2.要获得整个组织结构

      以使用employeeNumberreportsTo列将employees表连接自身。employees表有两个角色:一个是经理,另一个是直接报告者(即,下属员工)。

      

  • 相关阅读:
    android websocket推送
    proguardgui.bat来混淆已有的jar包
    android raw与assets区别
    Eclipse开发Android报错Jar mismatch! Fix your dependencies
    gc overhead limit exceeded
    如何签名apk,并让baidu地图正常显示
    Eclipse--Team--SVN--URL修改
    监听EditText
    android 注销
    从Android手机中取出已安装的app包,导出apk
  • 原文地址:https://www.cnblogs.com/juncaoit/p/7820254.html
Copyright © 2011-2022 走看看