美文网首页
Mysql学习6——连表查询

Mysql学习6——连表查询

作者: _码奴 | 来源:发表于2019-04-24 11:46 被阅读0次

    连表查询:Join连接(默认为内部链接:INNER JOIN)

    基本语句:

    select 需要查找的内容 from 表格名 join 链接的另一个表格 ON 判断条件;
    // ON 可以省略,省略的话会返回所有记录,并按照笛卡尔积的方式组合:M*N
    

    直接全部查询

    // 方式一:
    select student.* , school.* from student join school;
    
    // 方式二:
    select * from student join school;
    // 这两种方式返回的结果相同
    
    +-----------+-------+---------+----+----+----------+--------------+------+-----------+
    | school_id | class | id_card | id | id | name     | address      | type | type_desc |
    +-----------+-------+---------+----+----+----------+--------------+------+-----------+
    |         1 | 1.2   |       2 |  1 |  1 | school_1 | beijig       | Q    | aa        |
    |         1 | 1.2   |       2 |  1 |  2 | school_1 | 北京大学     | Q    | aa        |
    |         2 | 1.2   |       1 |  2 |  1 | school_1 | beijig       | Q    | aa        |
    |         2 | 1.2   |       1 |  2 |  2 | school_1 | 北京大学     | Q    | aa        |
    +-----------+-------+---------+----+----+----------+--------------+------+-----------+
    

    从上面的返回结果看出,返回结果按照笛卡尔积的方式组合,但是这种结果通常不是我们想要的,所以需要使用 ON 关键字,添加筛选条件。

    使用 ON 添加判断条件:INNER JOIN ... ON ...
    我们使用student. school_id = school.id 作为判断条件

    select student.* , school.* from student join school on student.school_id = school.id;
    

    查询结果:

    +-----------+-------+---------+----+----+----------+--------------+------+-----------+
    | school_id | class | id_card | id | id | name     | address      | type | type_desc |
    +-----------+-------+---------+----+----+----------+--------------+------+-----------+
    |         1 | 1.2   |       2 |  1 |  1 | school_1 | beijig       | Q    | aa        |
    |         2 | 1.2   |       1 |  2 |  2 | school_1 | 北京大学     | Q    | aa        |
    +-----------+-------+---------+----+----+----------+--------------+------+-----------+
    

    内部链接:INNER JOIN

    两张表的内部链接上面已经给出这里就不再重复,直接给出多张表格的写法:

    SELECT 查询内容
    FROM ((Orders
    INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
    INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);
    
    SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
    FROM ((Orders
    INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
    INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);
    

    注意这种写法似乎又问题,只能查出第一级连表的内容,有待探究学习。

    自然链接:NATURAL JOIN

    这种自然连接不用指定连接列,也不能使用ON语句,它默认比较两张表里相同的列,
    语法:

    mysql> SELECT*FROM 表名 NATURAL JOIN 关联表名;
    

    这种方式会自动匹配两个表格实际的链接关系,并且检测重复出现的项,只查询出主表对应的列

    mysql> SELECT*FROM student NATURAL JOIN people
    
    +----+-----------+-------+---------+----------+------+--------+--------+-------------+---------+------+
    | id | school_id | class | id_card | name     | sex  | weight | height | phone       | address | age  |
    +----+-----------+-------+---------+----------+------+--------+--------+-------------+---------+------+
    |  1 |         1 | 1.2   |       2 | xiaoming | NULL |   NULL |   NULL | NULL        | NULL    | NULL |
    |  2 |         2 | 1.2   |       1 | xiaoming | M    |     50 |   NULL | 12345678912 | NULL    | NULL |
    +----+-----------+-------+---------+----------+------+--------+--------+-------------+---------+------+
    

    people中的id和student中的id_card为关联字段,所以people中的id字段就不会被查询出来

    自链接:

    自连接查询就是当前表与自身的连接查询,关键点在于虚拟化出一张表给一个别名
    语法:
    内链接

    SELECT column_name(s)
    FROM table1 别名1, table1 别名2
    WHERE condition;
    

    左链接

    SELECT T1.column,T2. column ...
         from table_name T1
         LEFT JOIN table_name T2
         ON T1. column_1 = T2. column_2;
    

    例如:查询员工以及他的上司的名称,由于上司也是员工,所以这里虚拟化出一张上司表

    // 这里注意 e 和 b 为表格别名
    SELECT e.empName,b.empName
         from t_employee e
         LEFT JOIN t_employee b
         ON e.bossId = b.id;
    

    查询结果:按照匹配关系,按照连表结构查询出数据

    左链接:LEFT JOIN (完整写法:LEFT OUTER JOIN )

    语法:

    
    SELECT 查询内容
    from 表格1
    LEFT OUTER JOIN 链接表格
    ON 链接判断条件
    

    表格1(也就是左表)为基准表,链接表格(右表)为从表,用基准表的数据去匹配右表的数据,所以左表的记录是全部会查询出来的,如果右表没有记录对应的话就显示null

    事例:

    SELECT e.empName,d.deptName
    from t_employee e
    LEFT OUTER JOIN t_dept d 
    on d.id = e.dept;
    

    在这里,t_employee就是左表,也就是基准表,用基准表的数据去匹配右表的数据,所以左表的记录是全部会查询出来的,如果右表没有记录对应的话就显示null

    右链接:RIGHT JOIN(完整写法:RIGHT OUTER JOIN)

    右外连接是同理的,只是基准表的位置变化了而已,右表为基准表,左表为从表

    语法:

    SELECT 查询内容
    from 表格1
    RIGHT JOIN 链接表格
    on 查询限制条件;
    

    链接表(也就是右表)为基准表,表格1(左表)为从表,用基准表的数据去匹配左表的数据,所以右表的记录是全部会查询出来的,如果右表没有记录对应的话就显示null

    事例:

    SELECT e.empName,d.deptName
    from t_employee e
    RIGHT OUTER JOIN t_dept d 
    on d.id = e.dept;
    

    完外连接 UNION 与 FULL OUTER JOIN 两种方式

    顾名思义,把两张表的字段都查出来,没有对应的值就显示null,但是注意:mysql是没有全外连接的(mysql中没有full outer join关键字),想要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接。
    UNION 方式:
    语法:

    select 查询内容
         FROM 左表 
         left JOIN 右表
         ON 查询限制条件
    UNION
    select 查询内容
         FROM 左表 
         RIGHT JOIN 右表
         ON 查询限制条件;
    

    如果在oracle中,直接就使用full outer join关键字连接两表就行了

    事例:

    select e.empName,d.deptName
         FROM t_employee e 
         left JOIN t_dept d
         ON e.dept = d.id
    UNION
    select e.empName,d.deptName
         FROM t_employee e 
         RIGHT JOIN t_dept d
         ON e.dept = d.id;
    

    FULL OUTER JOIN方式:
    语法:

    SELECT column_name(s)
    FROM table1
    FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
    

    事例代码

    SELECT Customers.CustomerName, Orders.OrderID
    FROM Customers
    FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID
    ORDER BY Customers.CustomerName;
    

    相关文章

      网友评论

          本文标题:Mysql学习6——连表查询

          本文链接:https://www.haomeiwen.com/subject/gnavgqtx.html