美文网首页
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——连表查询

    连表查询:Join连接(默认为内部链接:INNER JOIN) 基本语句: 直接全部查询 从上面的返回结果看出,返...

  • mysql连表查询

    1. 交叉连接 (cross join) 假设有t1和t2两张表,交叉连接最简单的即是select * from ...

  • mysql_连表查询

    连表查询 连接查询包括合并、内连接、外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要。只有真正了解它们...

  • MySQL学习笔记二之单表查询与多表查询

    title: MySQL学习笔记二之单表查询与多表查询tags: MySQL 数据库categories: MyS...

  • MySQL in 走不走索引?

    1. 连表查询或采用临时表会走索引 参考:解决MySQL中IN子查询会导致无法使用索引问题 2. 如果 in ...

  • sql _ 连表查询 & 授权

    一,连表查询 1)连表 简单查询_where 2) 连表 多种方式查询 3)子查询 综合以上查询示例 二,DCL数...

  • 2019-02-22

    mySQL Navicat for mySQL 关系型数据库:用表传数据 如何建表:查询→新建查询 注释: -- ...

  • 2021-01-20

    Mysql查询excel表

  • MySQL join连表查询示例

    先给出一些数据库表,方便大家直观感受。当前需求:在后台展示 某俱乐部在某时间段的玩家个人信息以及消耗信息。 Clu...

  • MySQL连表查询之索引

    MySQL一次连表查询索引优化 新上线的功能出问题,发现是慢SQL,测试环境执行语句如图一所示,需要43秒。图一:...

网友评论

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

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