-
数据库SQLyog之多表查询
2020-10-02 09:45:51我们先创建三个表,之后的查询均以这三个表为例 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NbltapwW-1601602301029)(en-resource://database/1787:1)] 根据如图所示的字段及属性建立...创建表
我们先创建三个表,之后的查询均以这三个表为例
根据如图所示的字段及属性建立三张表,建立过程省略。注意sno,cno,在每张表中的格式要一致,就是我们所说的学号和课程号是固定的,一个学生只能有一个学号,一个课程只能有一个课程号。
插入后的数据格式如下(可以自行改变):
course:
score表:
student表:
表和表之间的对应关系
- 一对一
在一对一关系中,关系表的每一边都只能存在一条记录,每个数据表中的关键字在 对应的关系表中只能存在一条记录或者没有对应的记录。这种关系类似于现实生活中配 偶的关系,如果一个人已经结婚,那么只有一个配偶,如果没有结婚,那么没有配偶。
假设我们已经创建如图所示的两张表
从图6.1中可以看到,user表和user_text表是一对一的关系。此处使用一对一的意 义实际上是数据库优化,用户备注字段utext–般有比较多的文字,属于大文本字段,但 这个字段又不是每次都要用到,如果存放到user表中,在查询用户数据的时候会影响user表的查询效率,因此将utext字段单独拆分出来,放到从表中,当需要utext字段时 进行两张表的关联查询即可。
- 一对多和多对一
在一对多关系中,主键数据表中只能含有一个记录,而在其关系表中这条记录可以 与一个或者多个记录相关,也可以没有记录与之相关。这种关系类似于现实生活中父母 与子女的关系,每个孩子都有一个父亲,但一个父亲可能有多个孩子,也可能没有孩子。 多对一是从不同的角度来看问题,例如从孩子的角度来看,一个孩子只能有一个父亲, 多个孩子也可能是同一个父亲。
假设创建如图所示的表:
从图6.2中可以看到,student表和score表是一对多的关系,每个学生可能有多个 成绩,但一个成绩只能属于一个学生,这就是一对多的关系。如果从score表来看问题, 多个成绩可以属于一个学生,但一个成绩不能属于多个学生,这就是多对一的关系。
- 多对多的关系
在多对多关系中,两个数据表里的每条记录都可以和另一个数据表里任意数量的记 录相关。这种关系类似于现实生活中学生与选修课的关系,一个学生可以选择多门选修 课,一门选修课也可以供多个学生选择。
假设已创建如下图所示的表:
从图6.3中可以看到,teacher表和stu表都与中间表tea stu关联,且都是一对多的关系,因此teacher表和stu表是多对多的关系,即一个老师可以有多个学生,一个学生 也可以有多个老师,这就是多对多关系的应用场景。
合并结果集
- 使用UNION关键字合并
在多表查询中,有时可能需要将两条查询语句的结果合并到一起,MySQL提供了 UNION关键字用于合并结果集。
(注意:UNION只能合并两个表中相同的字段及类型,对于两个表中不同的字段UNION将无法使用)
例:
SELECT tname FROM student UNION SELECT tname FROM course
结果:
由合并结果可知,两表中均有小明和小胡,但是合并后自动过滤掉了重复的数据。
- 使用UNION ALL 合并
前面学习了 UNION关键字的用法,UNION ALL关键字与之类似,但使用UNION ALL关键字查询出两张表的数据合并结果集后不会过滤掉重复的数据。
例:
SELECT tname FROM student UNION ALL SELECT tname FROM course
可以看到并没有过滤掉重复部分。
连接查询
在关系型数据库中建立数据表时不必确定各个数据之间的关系,通常将每个实体的 所有信息存放在一个表中。当两个或多个表中存在相同意义的字段时,便可以通过这些 字段对不同的表进行连接查询。
- 笛卡尔积
笛卡儿积在SQL中的实现方式是交叉连接(cross join),所有连接方式都会先生成 临时笛卡儿积表。笛卡儿积是关系代数里的一个概念,表示两个表中的每一行数据任意 组合。接下来通过一个案例演示笛卡儿积问题,此处使用交叉査询来演示,其语法格式 如下。
SELECT 査询所属表字段 FROM 表 1 CROSS JOIN 表 2;
例:
SELECT s.Sno,s.Sname,ss.Cno,ss.Degree FROM score ss CROSS JOIN student s
(score ss,是给score字段起别名,方便书写用的)
通过查询我们可以查询到两个表的数据组合,但这并没有实际意义,因为得到的数据是随意排列的。
只有加上限制条件才会有实际意义。
例:SELECT s.Sno,s.Sname,ss.Cno,ss.Degree FROM score ss CROSS JOIN student s WHERE ss.sno=s.sno
需要两个表中有相同的字段类型,这样才能建立关系来加上限制条件。
结果如图:
可以看到此时查询的数据已经有了对应关系
内连接
内连接的连接杳询结果集中仅包含满足条件的行,在MySQL中默认的连接方式就是内连接。前面学习了交叉连接的语法,但该语法并不是SQL标准中的查询方式,可以 理解为方言。SQL标准中的内连接的语法格式如下。
SELECT 査询所属表字段 FROM 表 1 [INNER] JOIN 表 2 ON表1.关系字段=表2 .关系字段 WHERE查询条件;
在以上语法格式中,INNER JOIN用于连接两个表,其中INNER可以省略,因为 MySQL默认的连接方式就是内连接,ON用来指定连接条件,类似于WHERE关键字。
例:查询一名学生的课程名、课程号、成绩。SELECT c.Cno,c.Cname,s.Degree FROM course c JOIN score s ON c.`Cno`=s.Cno
分析,该查询 要求查询课成名,课称号以及成家,分别分布在score表和course表中,通过观察两个表中有相同字段CNO,这样我们就可以建立关系来实现内连接。
查询结果:
外连接
检面讲解了内连接的查询,返回的结果只包含符合査询条件和连接条件的数据,然 而有时还需要包含没有关联的数据,返回的查询结果中不仅包含符合条件的数据,还包 含左表或右表或两个表中的所有数据,此时就需要用到外连接查询。外连接查询包括左 外连接和右外连接两种查询类型,接下来进行详细讲解。
- 左外连接
左外连接是以左表中的数据为基准,若左表中有数据且右表中没有数据,则显示左表中的数据,右表中的数据显示为空。左外连接的语法格式如下。
SELECT 查询字段 FROM 表 1 LEFT [OUTER] JOIN 表 2 ON表1.关系字段=表2 .关系字段WHERE查询条件;
例:
查询学生的姓名,学号,成绩,所学课程的课程号SELECT stu.Sno,stu.Sname,s.Degree,s.Cno FROM student stu LEFT JOIN score s ON stu.Sno=s.Sno
结果:
其中student为左表,所以最后一行显示左表的数据而右表的数据为空。
- 右外连接,和左外连接相似,只是右外连接显示多余的右表中的数据,左表中没有的数据显示为空。
格式:
SELECT 查询字段 FROM 表 1 RIGHT [OUTER] JOIN 表 2 ON表1.关系字段=表2 .关系字段WHERE查询条件;
例:
SELECT stu.Sno,stu.Sname,s.Degree,s.Cno FROM student stu RIGHT JOIN score s ON stu.Sno=s.Sno
结果:
多表连接
前面学习了内连接和外连接,它们都是两张表之间的连接查询。实际上随着业务的 复杂,可能需要连接更多的表(3张、4张甚至更多),但表若连接过多会严重影响查询 效率,因此连接查询一般不超出7张表的连接。多表连接的语法格式如下。
SELECT査询字段FROM表1 [别名] JOIN表2 [别名]ON 表1 .关系字段=表2 .关系字段 JOIN 表 m ON—;
多表的连接方式可以类比内连接,内连接的建立需要两个表中有相同的字段及类型这样才能建立关系。而多表,比如3个表中,若要建立起关系,就需要三个表有相同的字段或者至少有一个表包含其他两个表的字段。
比如我们的例子中,score表中既有student表的Sno,又有course表中的cno,所有就可以通过score这个表将三个表联系起来。
例:
查询一个学生的姓名、出生年月、所学课程名称、成绩。SELECT stu.Sname,stu.Sbirthday,s.Degree,c.Cname FROM student stu JOIN score s ON stu.Sno=s.Sno JOIN course c ON s.Cno=c.Cno
结果:
自然连接
前面学习了表的连接查询,需要指定表与表之间的连接字段。在SQL标准中还有一种自然连接,不需要指定连接字段,表与表之间列名和数据类型相同的字段会被自动匹 配。自然连接默认按内连接的方式进行查询,语法格式如下。
SELECT查询字段FROM表1 [别名]NATURAL JOIN表2 [别名];
在以上语法格式中,通过NATURAL关键字使两张表进行自然
连接,默认按内连接 的方式进行查询。
例:SELECT stu.Sname,stu.Sbirthday,s.Cno FROM student stu NATURAL JOIN score s
结果:
子查询
子查询就是嵌套査询,即在SELECT中包含SELECT,子查询可以在WHERE关键字后面作
为査询条件,也可以在FROM关键字后面作为表来使用。
例1:
查询学生出生日期大于1997年的所有信息:SELECT * FROM student WHERE YEAR(Sbirthday)> YEAR((SELECT Sbirthday FROM student WHERE YEAR(Sbirthday)=1997))
该语句会先执行括号里的语句,及查询出生日期在1997年----的学生,然后利用year函数转化为整型后再执行下一个查询语句并执行where条件。
结果:
例2:查询和姓名为“li”同学同一个班级同学的所有信息
SELECT * FROM student WHERE class= (SELECT class FROM student WHERE Sname ='li')
子查询作为表
前面讲解了将子查询作为査询条件来使用,子査询还可以作为表来使用,即把 SELECT子句放在FROM关键字的后面。在执行查询语句时,首先会执行子查询中的语句,然后将返回结果作为外层查询的数据源使用。
例:
查询学号为103学生的姓名,性别,成绩,以及所学课程的课程号SELECT stu.Sname ,stu.Ssex,s.Cno,s.Degree FROM student stu,(SELECT Cno,Sno, Degree FROM score) s WHERE stu.Sno=s.Sno AND stu.Sno='103'
结果:
但是这样不如直接用内连接方便,其实原理是是相似的
- 一对一
-
学生学籍管理信息系统
2009-05-28 14:51:27① 数据添加功能:对于新生报到,系统必须具有班级的建立,课程的设置,如果新增专业,则能添加新专业,期末学生的考试成绩信息必须能够录入; ② 数据修改功能: 当上述资料发生变化或有错误信息输入时,应能够及时... -
C语言程序设计-学生综合测评系统
2020-06-08 11:11:18提示:先输入将插入的学生信息,然后再打开源文件并建立新文件,把源文件和输入的信息合并到新文件中(保持按学号有序)若存在该同学则将新记录内容替换源内容。 (3)删除学生信息 提示:输入将删除学号,读出该... -
数据结构课设
2013-01-03 02:51:252) 从键盘或文件输入各记录,不少于30个,以电话号码为关键字建立散列表; 3) 采用链地址的方法解决冲突; 4) 查找并显示给定电话号码的记录; 5、排序算法比较 任务 :利用随机函数产生10个样本(其中之一已为... -
Excel数据处理与分析实战技巧精粹 附书源码
2010-10-10 19:46:37全书分为6篇25章,介绍了Excel数据处理与分析方面的应用技巧,内容涉及Excel工作环境和基本操作、数据的输入和导入、数据整理和编辑、数据查询、分类汇总和合并计算等方面的使用技巧,以及数据透视表、模拟运算表、... -
完美学校网站系统全站源代码学校网站模板下载
2011-01-10 12:23:08学生成绩查询,专题报道,图片新闻,学校互动论坛,学校办公OA系统,学校信息,教务公开,学校动态,学校规章制度,政策法规,和家长学生互动,学校信息,校园风光网上介绍,名师风采,办学成就介绍,校园刊物网上电子版,学校的教学... -
iPhone开发秘籍(第2版)--源代码
2012-12-11 13:51:22该资料是《iPhone开发秘籍:第2版》的源代码 对应的书籍资料见: iPhone开发秘籍:第2版(iphone开发必备佳作,在第一版的基础上进行了全面修订和大量扩充) 基本信息 原书名: The iPhone Developer's Cookbook: ... -
校园导航系统(实现简单查询)
2011-05-24 15:27:30其中包含三个功能,一个是直接进入导航系统,利用主函数中已有的数据,进行查询:一个是进行创建数据,本程序中初始数据为农大的导航数据,如果需要也可以自己建立一个;最后一个是退出功能。设计该函数的目的是为了... -
数据结构(C++)有关练习题
2008-01-02 11:27:18从键盘输入数据,建立数据文件student.dat,然后,利用C++编程完成如下处理: (1)对学生姓名或学号进行查询,显示其信息 。 (2)对所有学生,按班级计算每一科平均成绩。 (3)分别按英语、数学、程序设计... -
[大数据-互联网大规模数据挖掘与分布式处理]完整中文扫描版.part2.rar
2015-11-07 09:48:334.1.2 流数据源的例子 4.1.3 流查询 4.1.4 流处理中的若干问题 4.2 流当中的数据抽样 4.2.1 一个富于启发性的例子 4.2.2 代表性样本的获取 4.2.3 一般的抽样问题 4.2.4 样本规模的变化 4.2.5 习题 4.3 流... -
[大数据-互联网大规模数据挖掘与分布式处理]完整中文扫描版.part1.rar
2015-11-07 09:44:034.1.2 流数据源的例子 4.1.3 流查询 4.1.4 流处理中的若干问题 4.2 流当中的数据抽样 4.2.1 一个富于启发性的例子 4.2.2 代表性样本的获取 4.2.3 一般的抽样问题 4.2.4 样本规模的变化 4.2.5 习题 4.3 流... -
ASP.NET开发实战1200例(第2卷).(清华出版.房大伟.吕双).part1
2016-06-12 09:54:23书名:《ASP.NET开发实战1200例(第II卷)》(清华大学出版社.房大伟.吕双) PDF格式扫描版,全书分为15章,共825页。2011年6月出版。 全书压缩打包成2部分,这是第1部分 ...第9章 高效的数据源文件XML... -
C#开发实战1200例(第2卷.完整版)(清华出版.王小科.王军).part2
2016-06-17 07:56:52实例243 使用存储过程查询多表中的数据 实例244 使用存储过程向表中添加数据 实例245 使用存储过程删除表中的数据 6.24 having语句应用 实例246 利用having子句过滤分组数据 实例247 having子句应用在多表查询中 第7... -
Java Web开发实战1200例(第2卷)(完整版).(清华出版.卢瀚.王春斌).part1
2016-06-13 20:03:04实例097 查询SQL Server数据表中的前3条数据 实例098 查询SQL Server数据表中的后3条数据 实例099 查询MySQL数据表中的前3条数据 实例100 查询MySQL数据表中的后3条数据 4.2 排序与分组函数的应用 实例101 按照字母... -
Java开发实战1200例.第2卷.part3
2013-05-08 22:46:34实例098 查询SQL Server数据表中的后3条数据 175 实例099 查询MySQL数据表中的前3条数据 176 实例100 查询MySQL数据表中的后3条数据 177 4.2 排序与分组函数的应用 178 实例101 按照字母顺序对留学生表进行排序 178 ... -
Java开发实战1200例.第2卷.part2
2013-05-08 22:45:35实例098 查询SQL Server数据表中的后3条数据 175 实例099 查询MySQL数据表中的前3条数据 176 实例100 查询MySQL数据表中的后3条数据 177 4.2 排序与分组函数的应用 178 实例101 按照字母顺序对留学生表进行排序 178 ... -
Java开发实战1200例.第2卷.part1
2013-05-08 22:44:13实例098 查询SQL Server数据表中的后3条数据 175 实例099 查询MySQL数据表中的前3条数据 176 实例100 查询MySQL数据表中的后3条数据 177 4.2 排序与分组函数的应用 178 实例101 按照字母顺序对留学生表进行排序 178 ... -
SQL Server 2008实战(SQL Server程序员和DBA不可或缺的权威参考手册)--详细书签版
2013-02-06 11:52:191.8 从多个数据源查询 24 1.8.1 使用内联结 25 1.8.2 使用外联结 26 1.8.3 使用交叉联结 27 1.8.4 在同一查询中多次引用同一个表 27 1.8.5 使用衍生表 28 1.8.6 使用UNION组合结果集 29 1.9 使用... -
程序开发范例宝典>>
2012-10-24 10:41:28表技术、硬件相关开发技术、网络开发技术、Web编程、加密、安全与软件注册、数据结构与算法、C#高级开发、实用工具、程序打包等共21章,572个实例。 本书附有配套光盘。光盘提供了书中所有实例的源代码,全部源... -
书 名:程序开发范例宝典>>【中卷】(分三卷上传完本书案例)
2010-04-05 21:59:37表技术、硬件相关开发技术、网络开发技术、Web编程、加密、安全与软件注册、数据结构与算法、C#高级开发、实用工具、程序打包等共21章,572个实例。 本书附有配套光盘。光盘提供了书中所有实例的源代码,全部源... -
书 名:程序开发范例宝典>>【下卷】(分三卷上传完本书案例)
2010-04-05 03:24:09表技术、硬件相关开发技术、网络开发技术、Web编程、加密、安全与软件注册、数据结构与算法、C#高级开发、实用工具、程序打包等共21章,572个实例。 本书附有配套光盘。光盘提供了书中所有实例的源代码,全部源... -
oracle数据库经典题目
2011-02-17 15:05:2019.视图是一个表示表的数据的数据库对象,它允许用户从一个表或一组表中通过一定的查询语句建立一个“虚表”。 20.序列是一种可被多个用户使用的用于产生一系列唯一数字的数据库对象。尤其适合多用户环境中,可以... -
Excel函数活用范例大辞典(全新版).何先军.2015-2(带书签高清文字版).pdf
2018-12-18 16:27:31203 为办公物资采购表建立归类标签 391 204 在有学生全部缺考的情况下计算学生的平均成绩 392 Chapter 07 查找和引用函数应用实例 394 ◎查找函数 395 205 查询指定员工缺勤次数 395 206 根据考核成绩评定... -
c++运动会评分系统
2011-06-10 10:40:172.1 结构功能以结构数组来存储比赛数据,其基本操作为写入数据和查找数据。2.2本程序系统模块(1)主程序模块:main ( ) { 初始化; while(“命令”=“输入”){ 接受输入数据;处理数据; } while (“命令”=... -
深入理解MySQL(MySQL核心开发人员力作)--详细书签版
2018-08-06 09:37:19本书分为三个部分,每个部分对—组彼此相关的问题进行探讨,内容从MySQL和开源运动的发展,到扩展和定制MySQL系统,甚至还讲述了如何建立一个实验性查询优化器和执行引擎来替代MySQL查询引擎等。 第一部分 ... -
C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载
2018-02-20 01:26:55实例107 使用哈希表对XML文件进行查询 127 实例108 计算两个矩形矩阵的乘积 129 第5章 面向对象编程技术 131 5.1 属性和方法 132 实例109 使用属性存储用户编号和姓名 132 实例110 通过定义方法求一个数的平方 133 ... -
C#开发实战1200例(第一卷+第二卷)+源码下载地址.txt
2019-05-17 09:24:24实例107 使用哈希表对XML文件进行查询 127 实例108 计算两个矩形矩阵的乘积 129 第5章 面向对象编程技术 131 5.1 属性和方法 132 实例109 使用属性存储用户编号和姓名 132 实例110 通过定义方法求一... -
ASP.NET开发实战1200例(第1卷).part2
2016-06-11 20:12:37实例215 GridView数据源为空时显示表头和提示信息 341 实例216 创建表头固定、表体可滚动的GridView控件 342 实例217 可拖动列、可排序、可改变宽度的GridView控件 344 实例218 使用“…”优化GridView控件中的超长... -
ASP.NET开发实战1200例(第1卷).part1
2016-06-11 20:07:19实例215 GridView数据源为空时显示表头和提示信息 341 实例216 创建表头固定、表体可滚动的GridView控件 342 实例217 可拖动列、可排序、可改变宽度的GridView控件 344 实例218 使用“…”优化GridView控件中的超长... -
ASP.NET开发实战1200例(第1卷).part3
2016-06-11 20:19:00实例215 GridView数据源为空时显示表头和提示信息 341 实例216 创建表头固定、表体可滚动的GridView控件 342 实例217 可拖动列、可排序、可改变宽度的GridView控件 344 实例218 使用“…”优化GridView控件中的超长...
-
C/C++反汇编解密
-
LeetCode 1589. 所有排列中的最大和(差分)
-
准规则LDPC码软扩频方法
-
IEEE754与二进制补码表示形式的精度比较
-
龙芯生态应用开发基础:C语言精要
-
整理web前端架构师应会必会的技术栈
-
批量生成二维码与条形码8.1版.rar
-
通带发射参考脉冲群UWB通信中的相位噪声分析
-
Visual Assist X(2019).zip
-
jQuery Callback 方法
-
ABAP语法:ADD-CORRESPONDING用法;内表赋值MOVE
-
C语言零基础入门(详细讲解)
-
小程序(wx.checkSession:检验当前用户的session_key是否有效)
-
GDAL+Python将影像像素深度由16位转为8位
-
jpa
-
机械工程材料——铁碳合金.ppt
-
PDFreaders.rar
-
2021年软考系统规划与管理师-下午历年真题解析视频课程
-
一个简单的登录页面测试用例
-
LINQ的演变及其对C#设计的影响