数据库中的多表查询总结[通俗易懂]

数据库中的多表查询总结[通俗易懂]数据库在单个表里操作其实很简答,但是涉及在多张表里寻找数据的时候,难度会大大增加,这里解释一些多表联合查询常用的操作。一、join操作在数据库的查询中,多表连接查询是一大难点,也是多表查询里的重点。连接主要有以下四种情况:INNERJOIN(内连接):如果表中有至少一个匹配,则返回行【在语法中可以省略INNER关键字】LEFTJOIN(左连接):从左表返回所有的行,如果右表中…

大家好,又见面了,我是你们的朋友全栈君。

数据库在单个表里操作其实很简答,但是涉及在多张表里寻找数据的时候,难度会大大增加,这里解释一些多表联合查询常用的操作。

一、join操作

在数据库的查询中,多表连接查询是一大难点,也是多表查询里的重点。连接主要有以下四种情况:

  • INNER JOIN(内连接):如果表中有至少一个匹配,则返回行 【在语法中可以省略INNER关键字】
  • LEFT JOIN(左连接):从左表返回所有的行,如果右表中没有匹配,对应的列返回Null
  • RIGHT JOIN(右连接):从右表返回所有的行 ,如果左表中没有匹配,对应的列返回Null
  • FULL JOIN(全连接):只要其中一个表中存在匹配,则返回行(即结合左连接和右连接的结果)

这里主要要理清两个问题:1)以哪个表为基础(从哪个表返回);2)遇到没有匹配的怎么处理。

以下是各个连接方式的关系图:
这里写图片描述

对于学生表,课程表两张表来说,分别进行四种连接方式,结果如下:
在这里插入图片描述

注:

  1. 实际中,最常用的是inner join
  2. 在有些语句里应用了“,”隔开两张表,它的作用相当于inner join

二、union操作

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

这是在展示结果的时候使用。
比如,还是上边的两张表,可以这样操作:
SELECT 学号 FROM 学生表 UNION SELECT 学号 FROM 课程表
返回结果:
100 200 300

SELECT 学号 FROM 学生表 UNION ALL SELECT 学号 FROM 课程表

这样会允许重复值,返回结果:

100 200 300 100 100 200

三、关于多表查询我的一些小技巧:

先附上一个挺全的数据库题,再以这个题为例说明一些多表查询的技巧:SQL数据库查询练习题及答案(四十五道题)

1、顺藤摸瓜法

以23题为例:

第二十三题 查询“张旭“教师任课的学生成绩。

通过给出的数据表,我完全可以写出这样一个关系式:
因为给出的条件是张旭老师的名字,那么我就要从Teacher表中查找Tno,然后再通过Tno在Course表中找Cno,最后在通过Cno在Score表中找到条件符合的成绩。
那么,关系就是这样的。知道了这条线,就可以从后往前写出查询语句:

select Sno,Cno,Degree from Score where Cno in (select Cno from Course where Tno in (select Tno from Teacher where Tname=‘张旭’))

#### 2、合起来搞事情法
根据上边的分析,我可以看到要想完成题目要求,需要用到三个表:Score,Course,Teachet。
那么我把三个表按照对应的联系联合起来即可,格式如下。

select Degree from Score,Teacher,Course where Teacher.Tname=‘张旭’ and Teacher.Tno=Course.Tno and Course.Cno=Score.Cno

总之,多表查询最重要的是对着给定的数据库表查一遍,只要能根据已知数据倒推回去,那么就可以倒着写出其查询语句。

当然,会和一些统计语句进行结合,但是思路不变:

第二十四题 查询选修某课程的同学人数多于5人的教师姓名。

同样可以屡出这样一条线:(【】代表在箭头上边)
count(cno)>5 →【Score】→Cno→【Course】→Tno→【Teacher】→Tname。
最后可以写出查询语句:

select Tname from Teacher where Tno in (select Tno from Course where
Cno in (select Cno from Score group by Cno having COUNT(*)>5) )

附:关于统计类函数的使用:

1、group by函数

GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
其实只要分组处理,一般就会求出这个组里的一些统计值,下边列出一些常用的统计函数:

  • AVG() :求平均数
  • MAX() :返回指定列的最大值。
  • MIN() :返回指定列的最小值。
  • SUM() :返回数值列的总和
  • COUNT():返回行数
  • SQL MID() :从文本字段中提取字符
  • SQL LEN() :返回文本字段的长度
  • SQL ROUND() :用于把数值字段舍入为指定的小数位数。
  • SQL NOW() :返回系统当前时间

2、having函数

这个函数其实用一句话就可以说清楚:它是聚合函数中的 where 函数。也就是说只是因为group by和where两个函数“一山不容二虎”,所以才出现的having函数进行补充。具体的使用方法和where函数没有什么区别。
例如:

第三十六题 查询至少有2名男生的班号。

select Class FROM student where Ssex=‘男’ group by Class having
COUNT(*)>1

我们意图选择count(*)>1的班级,本来可以用group by class where (数量条件)即可,只是因为where不能用在这里,所以使用having就行。

【待:补充一些全连接,左右连接的应用实例】

参考资料:

  1. SQL教程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135183.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 10v转16v_颜色代码转rgb

    10v转16v_颜色代码转rgb/*  NV12ToARGBcolorspaceconversionCUDAkernel  ThissampleusesCUDAtoperformasimpleNV12(YUV4:2:0planar)  sourceandconvertstooutputinARGBformat*/#include

  • java注解拦截_轻松实现java拦截器+自定义注解

    java注解拦截_轻松实现java拦截器+自定义注解本文将用简洁的代码构建一个springboot的拦截器。拦截器的使用很简单,定义一个自己的拦截器,向配置中添加一下就可以使用。为了方便,之后又引入了注解。目录和概述概述假设需求:访问项目的controller是都要进行”token验证”,除了某些像登录之类的方法。项目结构:TokenInterceptor.java自定义拦截器InterceptorConfig.java添加拦截器进入项目NoN…

  • Linux利用OneinStack搭建环境

    Linux利用OneinStack搭建环境

    2021年10月23日
  • 移动端开发流程[通俗易懂]

    移动端开发流程[通俗易懂]一、确定项目技术栈vue2.0+vue-cli3/4+vue-router+axios+vuex+vant+rem+sass+webpack二、搭建推荐使用yarnyarn,npm(cnpm)包管理工具yarnaddaxios-Scnpminstallaxios-S-S:–save-dev生产环境的依赖(dependencies)-D:–dev开发环境的依赖(devDependencies)从0开始搭建首先我们要创建一

  • latex中如何画表格_时态结构总结表格

    latex中如何画表格_时态结构总结表格三线表表格的合并三线表在写论文的时候我们常常会用到三线表,三线表的基本语法就是下面这个样子的。如果是在双栏的环境里,如果我们的表格比较大,我们一般需要在表格的环境中加星号,如果是表格只占一栏,这个时候我们就不需要加星号,我们假设我们使用表格的情况是占双栏的。三线表的精华就是那三根线了啦,用的命令就是\toprule,\midrule,\bottomrule这…

  • mysql econnreset_MySQL在node.js服务器上的空闲时间后给出“ read ECONNRESET”错误「建议收藏」

    mysql econnreset_MySQL在node.js服务器上的空闲时间后给出“ read ECONNRESET”错误「建议收藏」我正在运行通过node-mysql模块连接到MySQL的Node服务器。连接和查询MySQL最初运行良好,没有任何错误,但是,将Node服务器闲置几个小时后的第一个查询会导致错误。错误是熟悉的readECONNRESET,来自node-mysql模块的内部。堆栈跟踪(请注意,跟踪的三个条目属于我的应用程序的错误报告代码):Erroratexports.Error.utils.createClas…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号