mysql语句的join用法,用于多表连接读取数据
在一些数据库读取的过程中,如果有时候因为多表关联读取数据,会造成比较忙的情况,我们就需要通过sql的高级语言来实现这一功能,从而进去数据读取的优化,join命令是sql用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
sql的join分为三种,内连接、外连接、交叉连接。
以下先建2张表,插入一些数据,后续理解起来更方便一些。
create table emp(empno int, name char(20),depart int); create table depart(dpno int,dpname char(20)); insert into emp values (1,'bell',1); insert into emp values (2,'smith',2); insert into emp values (3,'jet',3); insert into depart values (1,'design'); insert into depart values (2,'database'); insert into depart values (4,'warehouse');
1. 内连接 inner join 仅列出两表能按照join条件连接起来的信息,其他的信息不显示
select a.*,b.* from emp a inner join depart b on a.depart=b.dpno; empno name depart dpno dpname ---------------------------------------------------------------------- 1 bell 1 1 design 2 smith 2 2 database
和如下语句得到的信息是一样的:
select a.*,b.* from emp a,depart b where a.depart=b.dpno;
2. 外连接 outer join
(1)左外连接 left outer join = left join 显示左表的所有记录,右表符合join条件的信息显示,不符合的置空。
select a.*,b.* from emp a left join depart b on a.depart=b.dpno; empno name depart dpno dpname ---------------------------------------------------------------------- 1 bell 1 1 design 2 smith 2 2 database 3 jet 3
(2)右外连接 right outer join = right join 和left join相反,显示右表的所有记录,左表符合join条件的信息显示,不符合的置空。
select a.*,b.* from emp a right join depart b on a.depart=b.dpno; empno name depart dpno dpname ---------------------------------------------------------------------- 1 bell 1 1 design 2 smith 2 2 database 4 warehouse
(3)全外连接 full outer join = full join ,左右两表的信息都全部显示,符合join条件的信息显示,不符合的置空。
select a.*,b.* from emp a full join depart b on a.depart=b.dpno; empno name depart dpno dpname ---------------------------------------------------------------------- 1 bell 1 1 design 2 smith 2 2 database 4 warehouse 3 jet 3
3.交叉连接,也即生成两表的笛卡尔积。得到的记录相当于两表记录的乘积。
select a.*,b.* from emp a cross join depart b ; empno name depart dpno dpname ---------------------------------------------------------------------- 1 bell 1 1 design 2 smith 2 1 design 3 jet 3 1 design 1 bell 1 2 database 2 smith 2 2 database 3 jet 3 2 database 1 bell 1 4 warehouse 2 smith 2 4 warehouse 3 jet 3 4 warehouse
相当于如下语句:
select a.*,b.* from emp a,depart b;
需要注意的是交叉连接后只能跟where,不可以跟on。
如下语句是错的:
select a.*,b.* from emp a cross join depart b on a.depart=b.dpno;
要修改为这样的才正确:
select a.*,b.* from emp a cross join depart b where a.depart=b.dpno;
一般来讲,在大表关联的时候,建议使用inner join或者left join,不建议使用cross join或者where
比如:
select a.*,b.* from emp a,depart b where a.depart=b.dpno ; A ---不推荐 select a.*,b.* from emp a cross join depart b where a.depart=b.dpno ; B ---不推荐 select a.*,b.* from emp a inner join depart b on a.depart = b.dpno; C ---推荐
这是因为A,B中,sql需要先对两表生成笛卡尔积,然后才根据where后的条件进行判断,而使用C则不需要。所以C较有效率。
本文作者: Liaodeity
本文链接: https://www.jianbaizhan.com/article/199
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!