数据库原理及MySQL应用 | 多表查询

news2024/11/25 16:24:56

在实际应用中,多表查询应用相对较多,根据多表之间的相关列,可以从多个表中检索出所需数据。 

在实际应用中,单表查询应用范围相对较少,因为用户需要的数据往往存储在多个不同的表中,这时需要进行多表查询。多表查询是通过多表之间的相关列,从多个表中检索出所需数据。一个数据库中的多个表之间一般存在着某种内在联系或是相关属性,用户通过连接运算就可以把多张表连接成一张表,这样又回到了之前的简单查询,从而查询的范围可以扩展到多表。

多表查询的基本语法格式如下所示。

语法说明如下。

  • JOIN_TYPE是连接运算符,用于指定连接类型,包括内连接(INNER JOIN或JOIN)、外连接(OUTER JOIN)和交叉连接(CROSS JOIN)。

  • ON用于设置连接条件,join_condition是连接条件表达式。

  • 由于连接查询涉及多个表,所以列的引用必须明确,重复的列名必须使用表名加以限定。为了增加可读性,建议使用表名限定列名,格式为“表名.列名”。

1. 连接条件

连接条件是通过两张表的相关属性(一般情况下是外键)来实现的,多表连接需要两两连接。从下面两个方面实现连接查询。

● 找到要连接的表中用于连接的列。典型的连接条件是:找到两张表是否存在主外键关系,即一张表有与另一张表的主键存在参照关系的外键。

● 指定用于比较各列值的逻辑运算符(如=或<>),其中等值连接比较常见。

2. 连接的类型

连接查询是关系数据库中多表查询的主要形式,分为三种类型:交叉连接、内连接和外连接。为了便于理解各种类型的连接运算,假设两个表R和S,R和S中存储的数据如图7-20所示。

■ 图7-20表R和表S的数据

1) 交叉连接

交叉连接是指返回连接的两个表的笛卡儿积,即结果集中包含两个表中所有行的全部组合。

交叉连接的运算符是CROSS JOIN。表R和表S进行交叉连接的结果集如图7-21所示。

■ 图7-21表R和表S交叉连接的结果集

2) 内连接

内连接是指用比较运算符设置连接条件,返回符合连接条件的数据行。内连接包括三种类型:等值连接、自然连接和不等值连接。

● 等值连接:在连接条件中使用等号(=)比较连接的列,返回符合连接条件的行。结果集中包括重复列,显示两次连接列。

● 自然连接:与等值连接的运算规则相同。但结果集中不包括重复列,只显示一次连接列。自然连接的连接列符合典型的连接条件,是具有内在连接的主键和外键列。

● 不等值连接:在连接条件中使用除去等号以外的其他运算符(>、<、>=、<=、!=)比较连接的列。

内连接运算符是INNER JOIN或JOIN。表R和表S进行内连接的结果集如图7-22所示。

■ 图7-22表R和表S内连接的结果集

3) 外连接

外连接是指返回的结果集除了包括符合连接条件的行以外,还返回至少一个连接表的其他行。外连接包括三种类型:左外连接、右外连接和全外连接。

● 左外连接:是指通过左向外连接返回左表的所有行,右表中不符合连接条件的行设置为NULL。运算符是LEFT OUTER JOIN或LEFT JOIN。

● 右外连接:是指通过右向外连接返回右表的所有行,左表中不符合连接条件的行设置为NULL。运算符是RIGHT OUTER JOIN或RIGHT JOIN。

● 全外连接:是指返回两个表的所有行,两个表中不符合连接条件的行分别设置为NULL。

表R和表S进行外连接的结果集如图7-23所示。

■ 图7-23表R和表S外连接的结果集

01、内连接

内连接是一种常见的连接查询。内连接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,即只返回满足连接条件的数据行。两个表连接时,连接列的名称可以不同,但要求连接列必须具有相同的数据类型、长度和精度,且表达同一意义。一般情况下,连接列是数据表的主键和外键。内连接查询的基本语法格式如下所示。

语法说明如下。

  • 内连接有两种语法格式,分别是:在FROM子句中定义连接、在WHERE子句中定义连接。

  • 内连接是默认连接,可以省略INNER关键字。

  • 内连接包括三种类型:等值连接、自然连接和不等值连接。等值连接的比较运算符是“=”;不等值连接的比较运算符是“>、>=、<、<=、!=”;自然连接是不包含重复列的特殊等值连接。

【例7-42】在图书销售数据库booksale中查询图书表books中所有图书的信息。

执行结果如图7-24所示。

■ 图7-24内连接查询

如果要连接的表的连接条件中列名是同名,可以将ON条件换成USING()子句;

【例7-43】在图书销售数据库booksale中查询图书表books中所有图书的信息。

输出的列如果是两个表中都有的列,则必须在输出的列名前加上表名进行区分,用“表名.列名”,如上面命令中的b.bookid;其他输出列都是表中不重复的列,所以直接写列名即可。多表连接时,先将两表连接成一张表,再拿连接成的这张表和下一张表连接,以此类推。

02、外连接

内连接只返回满足连接条件和查询条件的数据行。但在实际应用中,有时需要以某一个表为参考表,显示和这个表连接的多个表的信息,参考表需要显示所有行。需要全记录显示的这个表可以是左表(左外连接)、右表(右外连接)或两个表(全外连接)。外连接查询的基本语法格式如下所示。

语法说明如下。

  • LEFT JOIN是左外连接,查询记录时以LEFT JOIN左边的表为参考表,查询结果包含参考表里所有的记录,如果左表的某行在右表里没有匹配的行,则在右表的输出列上显示空值。

  • RIGHT JOIN是右外连接,查询记录时以RIGHT JOIN右边的表为参考表,查询结果包含参考表里所有的记录,如果右表的某行在左表里没有匹配的行,则在左表的输出列上显示空值。

  • 可将相同两个表的左外连接和右外连接使用UNION关键字进行合并连接,间接实现全外连接。

【例7-44】在图书销售数据库booksale中查询图书表books中所有图书的销售情况。

执行结果如图7-25所示。

■ 图7-25左外连接查询

这个查询为左外连接查询。books是左边的表,所以books表中所有记录都会显示,orderitems是右边的表,当没有匹配内容时显示空值NULL。

【例7-45】在图书销售数据库booksale中查询图书表books中所有图书的评价情况。

执行结果如图7-26所示。

■ 图7-26右外连接查询

这个查询为右外连接查询。books是右边的表,所以books表中所有记录都会显示,comments是左边的表,当没有匹配内容时显示空值NULL。

03、交叉连接

交叉连接是在没有WHERE子句的情况下,被连接的两个表中所有数据行的笛卡儿积。两个表进行交叉连接时,结果集大小为两个表数据行之积,数据列之和。交叉连接在实际应用中极少使用。交叉连接查询的基本语法格式如下所示。

【例7-46】在图书销售数据库booksale中对图书表books和类别表categories进行交叉查询。

books表有8列10条记录,categories表有2列4条记录,因此查询结果为10列40条记录。

04、合并连接

在MySQL中可以通过UNION关键字将两个同结构的数据表进行合并。合并查询的基本语法格式如下所示。

【例7-47】在图书销售数据库booksale中将图书表books中姓“张”的作者出版的图书和生活类图书信息合并显示。

(1) 带UNION ALL的合并连接。

当使用UNION ALL时,MySQL会把所有的记录返回,不会去掉重复记录。其效率高于UNION。

(2) 带UNION的合并连接。

当使用UNION时,MySQL会把结果集中重复的记录删掉,其效率不如UNION ALL。

 

05、自连接

自连接是一个表和其自身进行连接,就是同一个表在FROM子句中出现两次。这是一种特殊的等值连接,也是一种特殊的内连接。为了区分,必须对表指定不同的别名,列名前也要加上表的别名进行区分。自连接查询的基本语法格式如下所示。

【例7-48】在图书销售数据库booksale中查询图书表books中和“Java编程思想”同一类型的图书的编号、书名和图书类型代码。

因为自连接是内连接的特例,所以有两种语法格式。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

oracle的pkg改为hivesql

1. oracle的() 改为hive左右连接 oracle ()学习_cclovezbf的博客-CSDN博客最近工作需要将oracle的存储过程转化为hive的sql脚本。遇到很多不一样的地方&#xff0c;例如oracle连接中有()号的用法。借鉴这篇文章&#xff0c;但是这个排版比较烂。。。先建表和插入数据首先说明…

笔试强训(四十六)

目录一、选择题二、编程题2.1 简单错误记录2.1.1 题目2.1.2 题解一、选择题 &#xff08;1&#xff09;一台刚接入互联网的WEB服务器第一次被访问到时&#xff0c;不同协议的发生顺序是下面中的&#xff08;A&#xff09; A.ARP->DNS->HTTP B.ARP->HTTP->DNS C.DN…

怎么提取伴奏?有什么实用的提取软件?

由于我喜欢唱歌&#xff0c;所以在读书时期偶尔会参加学校的一些歌唱比赛或是文艺汇演。而一开始的我没什么经验&#xff0c;练习时都是放着原声带跟唱&#xff0c;但是到了舞台上发现只有伴奏&#xff0c;一时间卡不到开唱的点&#xff0c;甚是尴尬。所以后来我吸取了教训&…

蓝桥杯嵌入式 cubeMX生成代码解读

文章目录前言一、代码风格二、为什么要这些注释&#xff1f;三、生成的独立模块的代码总结前言 本篇文章讲介绍一下cubeMX生成代码的风格。 一、代码风格 在main.c中可以看到非常多的注释代码&#xff0c;很多人都不知道这些是用来干嘛的&#xff0c;现在就给大家介绍一下这…

你了解Java中的ForkJoin吗?

什么是ForkJoin? ForkJoin 从字面上看Fork是分岔的意思&#xff0c;Join是结合的意思&#xff0c;我们可以理解为将大任务拆分成小任务进行计算求解&#xff0c;最后将小任务的结果进行结合求出大任务的解&#xff0c;这些裂变出来的小任务&#xff0c;我们就可以交给不同的线…

新智慧杂志新智慧杂志社新智慧编辑部2022年第30期目录

杏坛潮_热点关注 特色劳动教育模式探究——基于“劳动周”项目的设计与实践 王胜; 1-3《新智慧》投稿&#xff1a;cn7kantougao163.com “双减”背景下小学数学大单元深度学习的实践与探索——以小学高年级为例 王晓雪; 4-6 杏坛潮_创新教育 问题教学法在高中物理教…

20221215英语学习

今日新词&#xff1a; rich adj.富有的, 富裕的, 油腻的 luck n.运气, 幸运, 好运, 侥幸 live adj.活的, 现场直播的, 实况转播的, 现场演出的 tutor n.家庭教师&#xff1b;私人教师&#xff1b;导师&#xff1b;助教 swipe v.挥拳打, 扬起巴掌打, 挥起&#xff08;物体&…

刷屏的AI 绘画,你成功驯服了吗?其背后的AIGC模型你可能还不知道

文章目录前言基于 CLIP Latents 的条件文本图像生成BLIPHugging Face奇点智源中文-CLIP百度昆仑万维之AI绘画前言 随着人工智能技术的发展与完善&#xff0c;AIGC&#xff08;AI generated content&#xff09;在内容的创作上为人们的工作和生活带来前所未有的帮助&#xff0c…

SpringCloud(7)— ElasticSearch基础

SpringCloud&#xff08;7&#xff09;— Elasticsearch基础 一 初识Elasticsearch elasticserach是一个强大的开源搜索引擎&#xff0c;可以从海量数据中迅速找到想要的内容。 elasticsearch结合了 Kibana, Logstach, Beats,也就是 elastic stack。主要应用于日志数据分析&…

【信管4.1】范围与需求

范围与需求范围其实说白了就是我们要做的东西都包括哪些内容&#xff0c;这些内容的边界在哪里&#xff0c;范围其实从另一个角度来说的话&#xff0c;也可以看成是一个产品的约束。为什么要有一个约束呢&#xff1f;你见过一个即是电商&#xff0c;又是社交&#xff0c;还能兼…

Python还好就业吗?30多岁转行晚吗?

最近不少人在微信问我现在Python还好就业不好就业&#xff1f;发展前景怎么样&#xff1f;我30多岁了&#xff0c;还能不能转行编程&#xff1f;Python该怎么学&#xff1f;如果做Python到底该做爬虫还是数据分析还是web&#xff1f;…等等这样的问题&#xff0c;现在逐一谈下我…

将市场部与整个组织联系起来,协调每个人的利益,来达成业务目标

让我们来谈谈业务目标&#xff0c;以及这些目标如何将营销部门与整个组织联系起来&#xff0c;并帮助协调每个人的利益。什么是有效的目标&#xff0c;什么是无效的目标?举一两个例子就好了。 当然。我们目前在高管层看到的情况是——甚至在新冠疫情之前我们就已经看到了——首…

【软件测试】你遇到的随机的bug?出现的原因......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 随机性bug? 为什么…

学习过程中遇到的问题总结(持续更新~~~)

问题总结问题1&#xff1a;Access denied for user 1234localhost (using password: YES)问题2&#xff1a;启动tomcat问题&#xff0c;报错Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:run (default-cli) on project springMvc_03_request_mapp…

Linux 6.2:华为代码加速核心功能 715 倍!

整理 | 王启隆出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;作为送给全球开发者的圣诞礼物&#xff0c;Linux 在前日发布了 Linux 6.1 内核的稳定版&#xff0c;并开启了 Linux 6.2 的合并窗口。这次更新不仅为广大用户带来了不少新功能与改进&#xff0c;还让许…

竣达技术 | 智能机房动力环境监控主机、多功能监控服务器

专为现代各类计算机及网络通信机房、通信行业基站而设计的远程多功能监控服务器&#xff0c;系统具备3个RS485通讯接口可监控机房环境温湿度、门禁、烟雾、漏水、市电断电等各类传感器检测对应的告警状态&#xff0c;同时支持15个开关量检测。6路继电器输出控制&#xff0c;支持…

MySQL——表数据删了一半了,表文件大小还是不变

本篇文章针对 InnoDB 引擎展开讨论。一个 InnoDB 表包含两部分&#xff0c;即&#xff1a;表结构定义和数据。在 MySQL 8.0 版本以前&#xff0c;表结构是存在以.frm 为后缀的文件里。而 MySQL 8.0 版本&#xff0c;则已经允许把表结构定义放在系统数据表中了。因为表结构定义占…

Windows安装Jenkins

文章目录1.下载Jenkins2.安装Jenkins1.下载Jenkins 进入jenkins官网下载 https://www.jenkins.io/download/ 要下载不同版本的话可以去下面链接看看 https://mirrors.tuna.tsinghua.edu.cn/jenkins/ 2.安装Jenkins 1.点击下载下来的 jenkins.msi 文件 进行安装 2.选择第…

【Python爬虫实战】找工作太难?职场套路太深?来来来小编教你做人啊—这里的老板都跑到街上招人了,月薪1万够不够?

导语 哈喽大家好&#xff01;我是木子吖~ 上一期给大家已经介绍了爬虫的一些功能步骤等等&#xff0c;这一期想着还是给大家更新一些爬虫的案 例吧&#xff01;这里有我给大家准备的精心准备的爬虫案例代码&#xff0c;当然如果基础有点儿差的小伙伴儿也 不用担心哈&#x…

【Spring】——15、使用@PropertySource加载配置文件

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…