Mysql学习6——连表查询

2019-04-24  本文已影响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;
上一篇 下一篇

猜你喜欢

热点阅读