MySQL数据库,多表查询

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

前提条件:这些一起查询的表之间是有关系的(一对一,一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。

若有以下两张数据库的表:

表emp:

表dept:

比如:以deptno为关联字段,进行多表查询,查询emp中的员工姓名、薪资和dept中的所在地。

SELECT ename , sal  , loc

FROM emp , dept

WHERE emp.deptno = dept.deptno;

 

WHERE语句作为两个表的连接条件,即员工的emp表中的记录只会和dept表中和emp的deptno记录相同的进行匹配。如果没有WHERE语句做连接条件,emp中的记录会和的deptno的每一条记录都匹配,就会出现不应该的重复记录,比如以上代码若没有WHERE语句,会产生60条(15(emp中的记录数) * 4(deptno中的记录数))记录,此错误被称为笛卡尔积的错误。

笛卡尔积错误的出现原因:

  • 省略多个表的连接条件(或关联条件)

  • 连接条件无效

  • 所有表中的所有行相互连接(即上文说的相互匹配)

注:

  • 如果查询语句中出现了多个表中相同名的字段,为防止冲突,需指明此字段所在的表(表名.字段)

  • 从SQL优化的角度,建议多表查询时,每个字段前指明其所在的表

  • 由于有时表名过长,指明字段的所在表时,会使可读性变差,可以使用给表起别名的方式解决。但是,给表起别名后,使用表名时,就不能使用表的原名,只能使用表的别名

  • 如果有n个表要多表查询,则至少要n - 1个连接条件,防止出现笛卡尔积的错误。

多表查询的分类:

角度一:等值连接、非等值连接

等值连接:用表之间的字段值相等作为连接条件,比如上文的多表查询:

SELECT ename , sal  , loc

FROM emp , dept

WHERE emp.deptno = dept.deptno;

非等值连接:并不是以用表之间的字段值相等作为连接条件,可能是表的字段以某个区间作为连接条件

比如:要查询员工的薪资等级,以下为薪资等级的表:

表job_grades:

SELECT e.ename , e.sal , j.grade_level

FROM emp e , job_grades j

WHERE e.sal > j.low_sal AND e.sal <= j.hig_sal

员工的emp表的薪资与job_grades表的薪资等级的low_sal到hig_sal的区间做匹配,能保证一一对应,不会出现不应该的重复。

角度二:自连接、非自连接

自连接:一个表用自己的字段和自己的另一个字段的值相等作为连接条件,即自己的字段和自己的另外一个字段做匹配。

比如,查询emp表中员工和员工的管理者的id和姓名:

SELECT e1.ename , e1.sal , e1.mgr , e2.ename

FROM emp e1 , emp e2

WHERE e1.mgr = e2.empno;

自连接的实质上还是多表查询,只不过是多个同样的表。

非自连接即未使用自连接。

角度三:内连接、外连接

内连接:合并具有具有同一列的俩个以上的表的行,结果集中不包含结果集中不包含一个表与另一个表中不匹配的行。

外连接:两个表在连接过程中除了返回满足连接条件的行之外还返回左/右表中不满足条件(即不匹配)的行(未匹配到的字段值的结果返回的是NULL),这种连接称为左/右外连接。如果左表和右表都有不匹配的行,并都返回其不匹配的行(未匹配到的字段值的结果返回的是NULL),这种连接称为满外连接。

如果是左外连接,则连接条件中左边的表称为主表,右边的表称为从表。

如果是右外连接,则连接条件中右边的表称为主表,左边的表称为从表。

SQL92:使用(+)实现外连接。在SQL92中,采用(+)代表从表所在的位置,即表名后标明了(+)的代表此表是从表。但是,MySQL中不支持此SQL92中的语法,在一些其他的DBMS中比如oracle中支持。

JOIN ON

SQL99语法中使用JOIN ……ON的方式实现多表查询的问题。

SQL99中JOIN ……ON的方式处理内连接:

SELECT e1.ename , e1.sal , e1.mgr , e2.ename

FROM emp e1 JOIN emp e2

ON e1.mgr = e2.empno;

JOIN 表

ON 连接条件

JION……

ON……

……

在FROM语句中,用JOIN表示表与表之间的连接(内连接使用的其实是INNER JOIN,写为JOIN即默认为INNER JOIN),连接条件写在ON后,如果有很多个表连接,采用多个JOIN …… ON …… 的方式。

SQL99中处理外连接:

查询所有的员工的姓名、薪资、管理者、管理者姓名(左外连接)

SELECT e1.ename , e1.sal , e1.mgr , e2.ename

FROM emp e1 LEFT OUTER JOIN emp e2

ON e1.mgr = e2.empno;

在JOIN前加上 LEFT OUTER 即表明使用左外连接,OUTER可以省略,表示为LEFT JOIN。

右外连接即将LEFT替换为RIGHT

满外连接:

即FULL OUTER JOIN,但是MySQL中不支持此SQL99中的语法,在一些其他的DBMS中比如oracle中支持。

UNION的使用:

合并查询结果

利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。

UNION操作符:UNION操作符返回两个查询的结果集的并集,去除重复记录

UNION ALL操作符:返回两个查询的结果集中的并集。对于两个结果集的重复部分,不去除重复部分

注:执行UNION ALL语句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率

SQL99中七种JOIN的操作:

由于MySQL不支持FULL OUTER JOIN的方式,所以左下图与右下图要使用UNION的方式

满外连接(左下图)

方式①:左上图UNION ALL右中图:

SELECT (字段列表)

FROM 表A

LEFT JOIN 表B

ON A.key = b.key

UNION ALL

SELECT (字段列表)

FROM 表A

LEFT JOIN 表B

ON A.key = b.key

WHERE A.key = NULL;

方式②:左中图 UNION ALL 右上图:

SELECT (字段列表)

FROM 表A

LEFT JOIN 表B

ON A.key = b.key

WHERE B.key = NULL

UNION ALL

SELECT (字段列表)

FROM 表A

RIGHT  JOIN 表B

ON A.key = b.key;

右下图:

左中图 UNION ALL 右中图

SELECT (字段列表)

FROM 表A

LEFT JOIN 表B

ON A.key = b.key

WHERE B.key = NULL

UNION ALL

SELECT (字段列表)

FROM 表A

LEFT JOIN 表B

ON A.key = b.key

WHERE A.key = NULL

自然连接:

自然连接是SQL99的新特性,用NATURAL JOIN表示自然连接,使用自然连接之后,可以自动查询两张连接表中所有的相同的字段,然后进行等值连接

如:若emp表中和dep表中都有字段dep_id 和 mgr_id,要输出员工的相应的部门和管理者的信息(即emp表要和dep表的mgr_id字段和dep_id字段都匹配。)

SELECT e.emp_id , e.emp_name , e.dep_id , d.dep_name

FROM emp e JOIN dep d

ON e.dep_id = d.dep_id AND e.mgr_id = d.mgr_id; 

可以使用自然连接,写作:

SELECT e.emp_id , e.emp_name , e.dep_id , d.dep_name

FROM emp e NATURAL JOIN dep d;

USING连接:

例:

SELECT ename , sal  , loc

FROM emp JOIN dept

ON emp.deptno = dept.deptno;

等同于

SELECT ename , sal  , loc

FROM emp , dept

USING (deptno);

USING指定了具体的相同的字段名称,需要在USING后面的括号中填入要做相同匹配的字段。要求两个关联字段名称一致,而且只能做等值匹配

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/219722.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

介绍一款在线文件格式转换工具

原因: 今天要将一个pdf格式的文件转为docx格式,结果我用破解版的WPS无法再不登录的情况下转换,所以就搜索了一款在线工具实现功能。 网站地址: Convertio — 文件转换器 使用流程: 1)选择要转换的文件 2)选择要转换的格式 3)点击转换 4)等待上传 5)等待转换 6)下载到本地

银行测试:什么是银行数据治理?如何进行有效的银行领域的实际应用?

在数字化时代&#xff0c;数据已经成为银行的重要资产&#xff0c;而数据治理则是确保数据质量、安全性和可用性的关键。那么&#xff0c;什么是银行数据治理&#xff1f;为什么我们需要银行数据治理&#xff1f;又如何进行有效的银行数据治理呢&#xff1f;又有哪些数据治理技…

互联网医院系统|互联网医院打开线上医疗新方向

我们的互联网医院系统采用了最先进的互联网开发技术&#xff0c;包括云计算、大数据、人工智能等。通过这些技术的应用&#xff0c;我们能够为患者和医疗机构提供更加高效、便捷、安全的在线医疗服务。同时&#xff0c;我们的系统还采用了最先进的网络安全技术&#xff0c;保障…

centos 7.9 二进制部署 kubernetes v1.27.7

文章目录 1. 预备条件2. 基础配置2.1 配置root远程登录2.2 配置主机名2.3 安装 ansible2.4 配置互信2.5 配置hosts文件2.6 关闭防firewalld火墙2.7 关闭 selinux2.8 关闭交换分区swap2.9 修改内核参数2.10 安装iptables2.11 开启ipvs2.12 配置limits参数2.13 配置 yum2.14 配置…

Facebook引流怎么做?写个脚本就好!

在当今的数字化时代&#xff0c;流量对于任何一个网站或应用程序来说都至关重要&#xff0c;Facebook&#xff0c;作为全球最大的社交网络平台&#xff0c;无疑是一个获取流量的绝佳场所&#xff0c;但是&#xff0c;如何有效地从Facebook引流呢?写个脚本就好了! 在本文中&am…

java开发之个微机器人的开发

简要描述&#xff1a; 初始化通讯录列表 请求URL&#xff1a; http://域名地址/initAddressList 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选…

12月5日作业

以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&…

【Element-ui】Layout与Container组件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Layout 布局1.1 基础布局1.2 分栏间隔1.3 混合布局1.4 分栏偏移1.5 对齐方式1.6 响应式布局1.7 el-col中的 push和pull 二、Container 布局容器2.1 Contain…

CETN03 - The Evolution of Computers

文章目录 I. IntroductionII. First Modern Digital Computer: ENIAC (1946)III. First Generation ComputerIV. Second Generation ComputerV. Third Generation ComputerVI. Fourth Generation ComputerVII. ConclusionI. 引言II. 第一台现代数字计算机&#xff1a;ENIAC&…

Mybatis 的操作(要结合上个博客一起)续集

Mybatis 是一款优秀的 持久性 框架,用于简化 JDBC 的开发 持久层 : 指的就是持久化操作的层,通常指数据访问层(dao),是用来操作数据库的 简单来说 Mybatis 是更简单完成程序和数据库交互的框架 Mybatis 的写法有两种 : 1.xml 2.注解 这两者各有利弊,后面进行总结 Mybati…

预测算法|高斯过程回归GPR算法原理及其优化实现

目前&#xff0c;常用的机器学习方法主要有支持向量机&#xff08;support vector machine&#xff0c;SVM)、反向传播神经网络&#xff08;backpropagation neural network&#xff0c;BPNN)等非概率方法以及高斯过程回归(gaussian process regression&#xff0c;GPR)等概率方…

keil5 兼容keil4 程序 并修改为ST-Link下载器 (按图操作即可)

1.下载keil4 程序支持包 安装到keil5目录 &#xff08;一般会自动识别目录&#xff09; 2.上述兼容包下载ok后&#xff0c;重启keil5 点击魔术棒设置ST-Link 完成以上操作 即可正常编译烧录

C语言-字符串

字符数组 char word[] {‘H’, ‘e’, ‘I’, ‘I’, ‘o’, ‘!’}; 这不是C语言的字符串&#xff0c; 因为不能用字符串的方式做计算&#xff1a; 字符串 char word[] {‘H’, ‘e’, ‘I’, ‘I’, ‘o’, ‘!’, ‘\0’}; 这是C语言的字符串&#xff1a; 以0&#xf…

今日问题:解决最新Chrome和chromedriver版本对不上的问题

from selenium import webdriver #from .chrome.webdriver import WebDriver as Chrome from selenium.webdriver.common.by import By from time import sleep driver webdriver.Chrome()driver.get("https://www.baidu.com/") driver.maximize_window()#窗口最大化…

Spring boot -- 学习HttpMessageConverter

文章目录 1. Json格式数据获取2. 为什么返回Json格式的数据2.1 注解SpringBootAppliaction2.1.1 SpringBootConfiguration2.1.2 ComponentScan2.1.3 EnableAutoConfiguration2.1.3.1 HttpMessageConvertersAutoConfiguration2.1.3.2 WebMvcAutoConfiguration 2.2 注解RestContr…

ValueError: not enough values to unpack (expected 3, got 2)

我在使用cv2.findContours函数中遇到以上错误&#xff0c;经查询找到该错误原因&#xff1a; 在 OpenCV 4.X 中&#xff0c;函数 cv2.findContours()仅有两个返回值&#xff0c; 其语法格式为&#xff1a; contours, hierarchy cv2.findContours( image, mode, method) 若不…

Git介绍与安装使用

目录 1.Git初识 1.1提出问题 1.2如何解决--版本控制器 1.3注意事项 2.Git安装 2.1Linux-centos安装 2.2Linux-ubuntu安装 2.3Windows安装 3.Git基本操作 3.1创建Git本地仓库 3.2配置Git 4.认识⼯作区、暂存区、版本库 1.Git初识 1.1提出问题 不知道你工作或学习时…

大文本限制录入文字后通过输入法鼠标单击还可继续超限额录入问题

textInpEl.on(keyup propertychange, "textarea", function () { var realMaxLength $(this).parent().parent().find(".maxNum").text(); //真实的最大长度 var endFontLen $(this).val().length; if (endFontLen < rea…

OpenCV-python:图像像素类型转换与归一化

目录 1.图像像素类型转换 2. 图像像素转换适用情形 3.图像归一化 4.归一化方法支持 5.归一化函数 6.知识笔记 1.图像像素类型转换 图像像素类型转换是指将图像的像素值从一种类型转换为另一种类型。常见的像素类型包括无符号整数类型&#xff08;如8位无符号整数、16位无符…

面向注解编程—Spring 注解看这一篇就够了(2)

面向注解编程—Spring注解大全&#xff08;AOP篇&#xff09; AOP英文全称&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实说白 了&#xff0c;面向切面编程就是面向特定方法编程。 AOP的作用&#xff1a;在程序…