多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。

前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。

一个错误

#案例:查询员工的姓名及其部门名称
SELECT last_name, department_name
FROM employees, departments;

这是多表查询菜鸟经常犯的错误和误解的地方,如果employees有3条数据,departements有3条数据,最后查出来的是3*3的条数据

我们把上述多表查询中出现的问题称为:笛卡尔积的错误。

笛卡尔积的错误。

笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中元素个数的乘积数。

SQL92中,笛卡尔积也称为交叉连接,英文是 CROSS JOIN。在 SQL99 中也是使用 CROSS JOIN表示交叉连接。它的作用就是可以把任意表进行连接,即使这两张表不相关

 阿里开发规范:

【强制】对于数据库中表记录的查询和变更,只要涉及多个表,都需要在列名前加表的别名(或表名)进行限定。

说明:对多表进行查询记录、更新记录、删除记录时,如果对操作列没有限定表的别名(或表名),并且操作列在多个表中存在时,就会抛异常。

正例:select t1.name from table_first as t1 , table_second as t2 where t1.id=t2.id;

反例:在某业务中,由于多表关联查询语句没有加表的别名(或表名)的限制,正常运行两年后,最近在 某个表中增加一个同名字段,在预发布环境做数据库变更后,线上查询语句出现出1052 异常:Column 'name' in field list is ambiguous。

 自连接 

当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询。

查询出last_name为 ‘Chen’ 的员工的 manager 的信息。
employees员工表中只有manager的idSELECT m.*
FROM employees e,employees m
WHERE e.manager_id=m.employee_id AND e.last_name="chen"

 内连接(INNER JOIN)的实现

 外连接(OUTER JOIN)的实现

左外连接(LEFT OUTER JOIN)

 右外连接(RIGHT OUTER JOIN)

 . UNION的使用

#中图:内连接 A∩B
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`;
#左上图:左外连接
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;
#右上图:右外连接
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
#左中图:A - A∩B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
#右中图:B-A∩B
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL
#左下图:满外连接# 左中图 + 右上图 A∪B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL  #没有去重操作,效率高
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
#右下图#左中图 + 右中图 A ∪B- A∩B 或者 (A - A∩B) ∪ (B - A∩B)
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department

在正式开始讲连接表的种类时,我们首先需要知道 SQL 存在不同版本的标准规范,因为不同规范下的表连接操作是有区别的。SQL 有两个主要的标准,分别是 SQL92 和 SQL99。92 和 99 代表了标准提出的时间,SQL92 就是 92 年提出的标准规范。

当然除了 SQL92 和 SQL99 以外,还存在 SQL-86、SQL-89、SQL:2003、SQL:2008、SQL:2011 和 SQL:2016 等其他的标准。这么多标准,到底该学习哪个呢?

实际上最重要的 SQL 标准就是 SQL92 和 SQL99。一般来说 SQL92 的形式更简单,但是写的 SQL 语句会比较长,可读性较差。

而 SQL99 相比于 SQL92 来说,语法更加复杂,但可读性更强。我们从这两个标准发布的页数也能看出,SQL92 的标准有 500 页,而 SQL99 标准超过了1000 页。

实际上从 SQL99 之后,很少有人能掌握所有内容,因为确实太多了。就好比我们使用Windows、Linux 和 Office 的时候,很少有人能掌握全部内容一样。我们只需要掌握一些核心的功能,满足日常工作的需求即可

。SQL92 和 SQL99 是经典的 SQL 标准,也分别叫做 SQL-2 和 SQL-3 标准。也正是在这两个标准发布之后,SQL 影响力越来越大,甚至超越了数据库领域。现如今 SQL 已经不仅仅是数据库领域的主流语言,还是信息

mysql多表查询(一口气解决掉:自连接 左右连接 满连接等)相关推荐

  1. mysql锁表原因及解决

    mysql锁表原因及解决 问题如图 锁表发生原因 锁表发生在 insert.update.delete中: 锁表的原理是数据库使用独占式锁机制,当执行上面的语句时,对表进行锁住,直到发生commit或 ...

  2. mysql多表查询详解_MySQL多表查询详解上

    时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由 ...

  3. mysql锁表问题的解决方法_MYSQL锁表问题的解决方法

    本文实例讲述了MYSQL锁表问题的解决方法.分享给大家供大家参考,具体如下: 很多时候!一不小心就锁表!这里讲解决锁表终极方法! 案例一 mysql>show processlist; 参看sq ...

  4. 零基础带你学习MySQL—多表查询笛卡尔集(二十)

    零基础带你学习MySQL-多表查询笛卡尔集(二十) 一.多表查询 多表查询:就是指基于两个和两个以上的表的查询,在实际应用中,单个表并不能满足你的需求,我们经常需要在很多个表之间查询数据 二.笛卡尔集 ...

  5. Mysql多表查询效率的研究(一)

    Mysql多表查询效率的研究(一) 本文探究了mysql InnoDB引擎在多表查询的应用场景下,使用子表.内连接和左联接运行速度的差别,并且比较了索引使用与否对查询效率的影响. 第一部分简略地概括了 ...

  6. 运维高级学习(三):MySQL单表查询作业

    MySQL第三次作业 MySQL单表查询作业 素材如下: DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `cs_id` int(11) ...

  7. java mysql 多表查询_解析Mysql多表查询的实现

    查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看. Mysql多表查询: CREATE TABLE IF NOT EXISTS co ...

  8. mysql教程多表查询_解析Mysql多表查询的实现

    查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看. Mysql多表查询: CREATE TABLE IF NOT EXISTS co ...

  9. mysql 大表查询慢_mysql大表查询慢怎么优化?

    mysql大表查询慢的优化方法:1.合理建立索引,通常查询利用到索引比不用索引更快:2.对关键字段建立水平分区,比如时间字段,若查询条件往往通过时间范围来进行查询,能提升不少性能:3.建立粗粒度数据表 ...

  10. MySQL命令行查询乱码解决方法:

    MySQL命令行查询乱码解决方法: 参考文章: (1)MySQL命令行查询乱码解决方法: (2)https://www.cnblogs.com/aksir/p/7070493.html 备忘一下.

最新文章

  1. linux查看网卡速度
  2. 【UML 建模】UML建模语言入门-视图,事物,关系,通用机制
  3. Ping CAP CTO、Codis作者谈redis分布式解决方案和分布式KV存储
  4. ROS: Ubuntu16.04安装ROS-kinetic
  5. intellij设置scala的sdk
  6. 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](7)
  7. linux+平均磁盘请求数量_Linux 查看磁盘IO并找出占用IO读写很高的进程
  8. oracle 区管理系统,oracle区管理和段空间管理详细介绍
  9. textarea不可拖动
  10. 学习iptables
  11. 学习python: 2.x 和 3.x的区别
  12. linux把test目录打包,linux复制、压缩打包、解压缩等操作
  13. 在eclipse中配置Tomcat时,出现“Cannot create a server using the selected type”的错误。...
  14. 数据库文档 SCREW 一键生成数据库文档
  15. Python中time.sleep(0.001)真的只等待1毫秒吗?
  16. Android-Ble蓝牙通讯开发–扫描,连接,发送和接收数据,分包解包(附源码)
  17. SpringBoot按照restful风格统一异常返回
  18. Spark1.5.2伪分布安装
  19. 科大讯飞语音听写app闪退
  20. 注册测绘师学习笔记(五)

热门文章

  1. Google 字体在前端开发中的使用
  2. 人工神经网络基本构成有哪些,常见的人工神经网络有哪几种
  3. 目录-换热器及其计算基础知识
  4. 转:基于Spark的电影推荐系统(包含爬虫项目、web网站、后台管理系统以及spark推荐系统)
  5. 深度解析,AI如何让创新变得更简单
  6. 方管图纸标注_图样中型材的标注方法
  7. IDEA设置护眼浅绿色背景
  8. IDEA设置背景与字体大小
  9. win10 C盘超过50G?教你如何对C盘瘦身!
  10. SQL盲注中的部分常用函数