连表查询: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;
网友评论