SQL- join多表关联问题

 更新时间:2022年12月22日 08:30:35   作者:MinggeQingchun  
这篇文章主要介绍了SQL- join多表关联问题,具有很好的参考价值,希望对大家有所帮助。

一、SQL 连接(JOIN)

1、笛卡尔积

(1)当多张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是多张表条数的乘积

如A表15条(行)数据,B表20条(行)数据,结果查询两张表时,会产生 15 * 20 = 300条(行)数据

select empname,deptname from emp, dept;

(2)避免笛卡尔积现象

select 
		empname,deptname 
	from 
		emp, dept
	where
		emp.deptno = dept.deptno;
 
	
// 或者
	select 
		e.empname,d.deptname 
	from 
		emp e, dept d
	where
		e.deptno = d.deptno; //SQL92语法

最终得出结果会减少,但是查询次数依然是两张表行数的乘积

因此:通过笛卡尔积现象得出,表的连接次数越多效率越低,尽量避免表的连接次数

2、SQL JOIN 子句

用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段(跨表查询

  • SQL92:1992年的SQL语法
  • SQL99:1999年的SQL语法

从一张表中单独查询,称为单表查询

下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法

3、SQL JOIN 类型

(1)INNER JOIN:内连接

【1】等值连接,返回两个表中连接字段相等的行(条件是等量关系)

【2】非等值连接,条件不是一个等量关系

【3】自连接,同一张表看成多张表

注:

  • INNER 可以省略
  • 两张表没有主次关系;平等

(2)OUTER JOIN :外连接

  • LEFT (OUTER) JOIN:左(外)连接,即使右表中没有匹配,也从左表返回所有的行(将join关键字左边的表看成主表,主要是为了将左表的数据全部查询出来,捎带着关联查询右边的表)
  • RIGHT (OUTER) JOIN:右(外)连接,即使左表中没有匹配,也从右表返回所有的行(将join关键字右边的表看成主表,主要是为了将右表的数据全部查询出来,捎带着关联查询左边的表)
  • FULL (OUTER) JOIN :全(外)连接

外连接,只要其中一个表中存在匹配,则返回;即返回两个表中的行:left join + right join

注:

  • OUTER 可以省略
  • 在外连接当中,两张表连接,产生了主次关系

(3)交叉连接

CROSS JOIN: 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数

4、SQL INNER JOIN

INNER JOIN 关键字在表中存在至少一个匹配时返回行

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
 
或者
 
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;
INNER JOIN 与 JOIN 是相同的

(1)等值连接

SQL92语法:
	select 
		e.ename,d.dname
	from
		emp e, dept d
	where
		e.deptno = d.deptno;
//sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。
 
SQL99语法:
	select 
		e.ename,d.dname
	from
		emp e
	join
		dept d
	on
		e.deptno = d.deptno;
	
 
	//inner可以省略(带着inner可读性更好!!!一眼就能看出来是内连接)
	select 
		e.ename,d.dname
	from
		emp e
	inner join
		dept d
	on
		e.deptno = d.deptno; // 条件是等量关系,所以被称为等值连接。
//sql99优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where

 inner可以省略,带着inner可读性更好

  • sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面
  • sql99优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where

(2)非等值连接

select 
	e.ename, e.sal, s.grade
from
	emp e
join
	salgrade s
on
	e.sal between s.losal and s.hisal; // 条件不是一个等量关系,称为非等值连接。
 
 
select 
	e.ename, e.sal, s.grade
from
	emp e
inner join
	salgrade s
on
	e.sal between s.losal and s.hisal;

(3)自连接

一张表看成两张表

select 
	a.ename as '员工名', b.ename as '领导名'
from
	emp a
join
	emp b
on
	a.mgr = b.empno; //员工的领导编号 = 领导的员工编号

 INNER JOIN 与 JOIN 是相同的

5、SQL LEFT JOIN

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL

将join关键字左边的表看成主表,主要是为了将左表的数据全部查询出来,捎带着关联查询右边的表

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
 
或
 
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN

如下: 

select 
	e.ename,d.dname
from
	dept d 
left (outer) join 
	emp e
on
	e.deptno = d.deptno;

在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN

关键字 on  

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户

在使用 left jion 时,on 和 where 条件的区别如下:

(1) on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。

(2)where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

假设有两张表:

 两条 SQL:

select * from tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name='AAA'
 
select * from tab1 left join tab2 on (tab1.size = tab2.size and tab2.name='AAA')

 

以上结果的关键原因就是 left join、right join、full join 的特殊性,不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。 而 inner jion 没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。

【6】SQL RIGHT JOIN

RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL

将join关键字右边的表看成主表,主要是为了将右表的数据全部查询出来,捎带着关联查询左边的表

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
 
或
 
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;
在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN

如下: 

select 
	e.ename,d.dname
from
	emp e 
right (outer) join 
	dept d
on
	e.deptno = d.deptno;

在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN

【7】SQL FULL OUTER JOIN

FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行

FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果(MySQL中不支持 FULL OUTER JOIN)

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

总结如下:

  • A inner join B 取交集。
  • A left join B 取 A 全部,B 没有对应的值为 null。
  • A right join B 取 B 全部 A 没有对应的值为 null。
  • A full outer join B 取并集,彼此没有对应的值为 null

如: "user" 表中的 "deptId" 列指向 "dept" 表中的字段 "id";上面这两个表是通过 "deptId" 列联系起来的

select u.id,d.id,d.name,d.number 
from user u left join dept d 
on u.deptId = d.id;
 
或
 
select u.id,u.name,d.id,d.name,d.number 
from user u inner join dept d 
on u.deptId = d.id;

查询结果相同

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySql数据库中的子查询与高级应用浅析

    MySql数据库中的子查询与高级应用浅析

    这篇文章主要给大家介绍了关于MySql数据库中子查询与高级应用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • MySQL 案例分析讲解外连接语法

    MySQL 案例分析讲解外连接语法

    数据库的一个难题是无法将SQL语句的执行结果转换为想要的格式。本节,我们将通过学习格式转换中具有代表性的行列转换和嵌套式侧栏的生成方法,深入理解一下其中有重要作用的外连接
    2022-04-04
  • 关于Mysql-connector-java驱动版本问题总结

    关于Mysql-connector-java驱动版本问题总结

    这篇文章主要介绍了Mysql-connector-java驱动版本问题,本文给大家介绍的很详细,通过原因说明问题小结个人建议给大家展示的很好,需要的朋友可以参考下
    2021-06-06
  • MySQL进阶查询、聚合查询和联合查询

    MySQL进阶查询、聚合查询和联合查询

    这篇文章主要介绍了MySQL数据库的进阶查询,聚合查询及联合查询,文中有详细的代码示例,需要的朋友可以参考阅读
    2023-04-04
  • 浅谈订单重构之 MySQL 分库分表实战篇

    浅谈订单重构之 MySQL 分库分表实战篇

    这篇文章主要介绍了 MySQL 分库分表方法的相关资料,需要的朋友可以参考下面文章内容,希望能帮助到你
    2021-09-09
  • mysql的计划任务与事件调度实例分析

    mysql的计划任务与事件调度实例分析

    这篇文章主要介绍了mysql的计划任务与事件调度,结合实例形式分析了mysql计划任务与事件调度相关概念、原理、用法与操作注意事项,需要的朋友可以参考下
    2019-12-12
  • 如何正确、安全地关闭MySQL

    如何正确、安全地关闭MySQL

    当需要停止或关闭MySQL实例时,很多人并不清楚如何做到正确、安全地关闭MySQL,会对数据的安全性和稳定性造成很大的威胁,本文将从多个方面详细阐述如何正确关闭MySQL,包括关闭MySQL的基本方法、关闭MySQL前的准备工作、优雅地关闭MySQL以及遇到MySQL无法正常关闭的情况
    2023-09-09
  • 多次执行mysql_fetch_array()的指针归位问题探讨

    多次执行mysql_fetch_array()的指针归位问题探讨

    多次执行mysql_fetch_array(),在第二次执行的时候,如果不加处理,就不会输出任何内容,这种情况下只需要对循环指针进行复位即可,感兴趣的朋友可以了解下啊,或许对你有所帮助
    2013-01-01
  • MySQL备份原理详解

    MySQL备份原理详解

    备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低
    2016-05-05
  • 在CentOS上安装phpMyAdmin的教程

    在CentOS上安装phpMyAdmin的教程

    这篇文章主要介绍了在CentOS上安装phpMyAdmin的教程,phpMyAdmin是一款借助PHP脚本来操作MySQL的工具,非常具有人气,需要的朋友可以参考下
    2015-06-06

最新评论