接着上一篇博客,我们继续来学习MySQL的语法。本篇重点讲多表查询,包括嵌套多层的查询,大家做好心里准备哈!

废话不多说,我们先来讲第一个语句,union:将查询结果合并在一起并去重。前面我们学了自然连接,是横向增加表的键,那么这个union就是纵向增加结果表的记录。

/*比如我想查询2009年秋季和2010年春季开课的course_id,以及该课上课的房间号*/
(SELECT course_id , room_numberFROM sectionWHERE semester='Fall' AND YEAR = 2009
)
UNION -- union会自动帮我们的结果去重
(SELECT course_id , room_numberFROM sectionWHERE semester = 'Spring' AND YEAR = 2010
);/*将结果合并在一起,但是不去重*/
(SELECT course_idFROM sectionWHERE semester='Fall' AND YEAR=2009
)
UNION ALL
(SELECT course_idFROM sectionWHERE semester='Spring' AND YEAR=2010
);

union查询结果如图

上述我们是找到2009年秋季和2010年春季开课的课程,其实实际是对两个查询结果进行了集合并运算。那假如我现在想找出既在2009年秋季开课,同时也在2010年春季的课程呢?可以发现,我这次是对两个查询结果做了集合交运算。很可惜,MySQL没有一个单词或者语句来直接实现这个操作,但是我们可以通过where条件筛选来实现

/*通过对两个表where来实现集合交运算*/
SELECT T.course_id
FROM(SELECT course_idFROM sectionWHERE  semester='Fall' AND YEAR = 2009) AS T , -- T表储存的是2009年秋季开课的course_id(SELECT course_idFROM sectionWHERE semester='Spring' AND YEAR = 2010) AS S -- S表储存的是2010年春季开课的course_id
WHERE T.course_id = S.course_id;  -- 这里的T中course_id会逐个与S中的course_id进行比较,相等的话就保存到
-- 结果表中

这就是集合交运算,那么同理啊,集合差运算也是类似

/*通过where中not in 操作实现集合差*/
/*这里我们想找出只在2009年秋季开课而不在2010年春季开课的课程*/
SELECT T.course_id
FROM(SELECT course_idFROM sectionWHERE semester='Fall' AND YEAR = 2009) AS T
WHERE T.course_id NOT IN -- 这里用到了not in(SELECT course_idFROM sectionWHERE semester='Spring' AND YEAR = 2010);/*主意啊,上述两个表的顺序一但调换,结果是不同的!!大家可以自己理解一下为什么不同*/
/*这里我们想找出只在2010年春季开课而不在2009年秋季开课的课程*/
SELECT S.course_id
FROM(SELECT course_idFROM sectionWHERE semester='Spring' AND YEAR = 2010) AS S
WHERE S.course_id NOT IN(SELECT course_idFROM sectionWHERE semester='Fall' AND YEAR = 2009);

查询方法与上面类似,当T集合的一条记录在S集合中没有出现,此时就会返回真,并把该记录储存到结果表中。

接下来我们来学一下一些常用函数,这些也为我们后续学习做好基础

/*利用avg或者其他函数求值*/
SELECT AVG(salary) AS avg_salary
FROM instructor
WHERE dept_name = 'Comp. Sci.';/*通常利用这个来查找表中有多少行*/
SELECT COUNT(*) AS numberFROM course;/*还有像max()还有min()函数大家可以自行去练习,这里我就不举例子了*/

学习这些函数有什么作用呢?很大程度是为我们下面要学的命令做铺垫。group by:顾名思义,就是将表的各种记录分组。


接下来给大家举个例子,让大家对group by有个更好的掌握

 /*统计一下2010年春季有各个系的老师有多少人开课*//*group by 后面接的select语句语法比较严格,需要谨慎,一般接函数或者分组的键,比如这里的dept_name*/
SELECT dept_name , COUNT(DISTINCT instructor.ID) AS inst_count
FROM instructor , teaches
WHERE instructor.ID = teaches.ID AND -- 第一个=是找出某个老师上的课的记录semester = 'Spring' AND  -- 第二个=是在上一个=的基础上,找出春季开课,也就是找出该老师春季教的课YEAR = 2010  -- 第三个=在上面的结果中,找出是2010年开的课,可以发现三个=其实一直在做集合交运算
GROUP BY dept_name; -- 注意group by是在where后面的,对结果表进行分组


这是最终的查询结果,可以发现,每一个分组,就只有一个记录,因此select最后必须有代表这个组的键

这个时候给大家一个问题:我能不能select这些组中的name键,如下代码所示:

SELECT dept_name , NAME -- 这样做的意义是什么?
FROM instructor , teaches
WHERE instructor.ID = teaches.ID ANDsemester = 'Spring' ANDYEAR = 2010
GROUP BY dept_name;

事实上我的MySQL是可以执行的,但是这个语句是错误的,大家可以看到,最后select是对不同组的表选择键,比如我可以选择各个组表的dept_name,或者各个组表的平均工资等等。但是要选择老师名字是什么意思?比如计算机系中有三个老师,我该选择哪一个老师的名字呢?可以发现是毫无意义的查询,在Oracle或者其他数据库中这个语句是会报错的!因此:group by 后面接的select语句语法比较严格,需要谨慎,一般接函数或者分组的键,比如这里的dept_name。

上述我们学习了group by语句,那假如我想找出系平均工资大于42000的系呢?这个时候,having语句可以很好的帮我们解决这个问题。having:对gruop by的结果再进行选择

SELECT dept_name,AVG(salary) AS avg_salaryFROM instructorGROUP BY dept_nameHAVING AVG(salary) > 42000; -- 这里是筛选group by之后的结果

学到这里其实我们已经可以做很多查询了,接下来我会给大家一个复杂点的例子。

 /*求出2009年两个学期中有超过两个学生去学习的课程的平均学分*/SELECT course_id,semester,YEAR,sec_id,AVG(tot_cred)
-- FROM takes,student
-- WHERE takes.ID = student.ID AND YEAR = 2009
FROM takes NATURAL JOIN student -- 上面的takes.ID = student.ID相当于NATURAL JOIN,表示找出学生上过的课的记录
WHERE YEAR = 2009
/*这里按如下顺序进行分组*/
GROUP BY course_id,semester,YEAR,sec_id -- 比如当course_id组中按semester又分多个组,如此继续分。
-- 这里给大家思考,如果按主键分组,我们最后可以得到什么,其实就是得到原表的每一条记录!
HAVING COUNT(takes.ID)>=2;

查询结果如图

limit:限定查询结果的记录数目,通常配合一些函数。

/*limit语句用于筛选一定数目的记录,当实际记录少于限定的记录也没关系*/
/*这里找出平均工资前二的系名和该系的平均工资*/
SELECT dept_name,AVG(salary) AS avg_salary
FROM instructor
GROUP BY dept_name
ORDER BY avg_salary DESC
LIMIT 2; -- limit是对结果表的记录进行限制,所以放在一定放在where,group by后面
/*
LIMIT 0,5 -- 表示显示第一到第五条的记录,注意记录是从0下表开始算的。

group by + with rollup:表示在进行分组统计的基础上再次对每一小组进行汇总统计

/*汇总一般是求一个sum*/
SELECT dept_name , SUM(salary) , COUNT(*)
FROM instructor
GROUP BY dept_name WITH ROLLUP;

查询记录如图,最后那一条就是with rollup的字段,但是可以发现,对于无法统计的键dept_name是空值

本篇已经讲解了很多内容,包括集合交,集合差以及一些函数和group by的命令。下一篇博客将继续讲解更多多表查询的语法和命令,包括嵌套使用where和from。

MySQL 语法整理(2)相关推荐

  1. MySQL 语法整理

    最近学了几个星期的MySQL,这篇博客专门来梳理一下MySQL的基本语法,本博客中出现的两个数据库university和world均在我的资源中,大家可以免费下载. 先来看一下MySQL的最基本三大段 ...

  2. MySQL 语句整理 2019-5-3

    MySQL 语句整理 在整理完Oracle的一些常见用语句后,由于MySQL的语法跟Oracle略有不同,随跟PN的MySQL视频进行了间接整理. 查询薪水大于1800, 并且部门编号为20或30的员 ...

  3. 数据库语法整理及WAF绕过方式

    数据库语法整理及WAF绕过方式 原文链接请点击:https://www.cnblogs.com/ruoli-s/p/15355611.html 关系型数据库 关系型数据库:指采用了关系模型来组织数据的 ...

  4. MySQL语法语句大全

    MySQL语法语句大全 一.SQL速成   ; B/ X* Q; t/ W) v" ]结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件(如表 ...

  5. db2和mysql语句区别_db2和mysql语法的区别是什么

    MySQL默认使用大小写敏感的数据库名.表名和列名(可以通过lower_case_table_names参数控制是否大小写敏感),DB2数据库对大小写不敏感. 虽然MySQL与DB2都遵循并符合SQL ...

  6. mongodb和mysql的对比_Mongodb与mysql语法比较

    Mongodb与mysql语法比较 mongodb与mysql命令对比 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据 ...

  7. MySQL语法中有哪些可以利用的漏洞?

    「作者主页」:士别三日wyx 「作者简介」:CSDN top100.阿里云博客专家.华为云享专家.网络安全领域优质创作者 「专栏简介」:此文章已录入专栏<MySQL数据库快速入门> MyS ...

  8. Markdown语法整理(详细版)

    Markdown语法整理 目录 文章目录 1 概述 1.1 Markdown 1.2 Typora 2 标题和目录 2.1 标题 2.2 目录 3 段落和文本 3.1 缩进.对齐 3.3 斜体.粗体 ...

  9. Mysql语法大全(命令行)(简洁、明了、全面)

    Mysql命令行的语法 另外一个Mysql语法大全的版本:点这里 两个Mysql语法大全以及命令行代码!!!基本上学习Mysql没有问题 嘿嘿!学习是一个长期的过程!!!还会继续更新!!! 基本的My ...

最新文章

  1. C++ 笔记(34)— C++ exit 函数
  2. 你住的城市7.5亿年前长啥样?这张互动地图能让你看到
  3. php vbcrlf,我是这样打造自已的“菜刀”的,让一句话飞一会
  4. 30天敏捷生活(9-11):调整30天的节奏
  5. JVM优化系列-Java对象引用与可触及强度
  6. 在ArcEngine中使用Geoprocessing工具-执行工具
  7. 计划doing.....
  8. 江西瑞金计算机网络设计工资多少,瑞金java工资一般多少
  9. TCP/IP、Http、Socket的区别以及面试中关于网络协议常问的考点
  10. _declspec(dllexport)与_declspec(dllimport)
  11. No package ‘mate-settings-daemon‘ found
  12. pywifi安装的一个坑
  13. 有什么变音视频软件?这些软件值得收藏
  14. 物联网小试一下——使用阿里云控制Arduino套件灯的开关
  15. 【第六篇】Qt学习与使用---在qt中打印PDF文件(不是生成PDF)
  16. Linux系统之Xinetd服务
  17. 数据分析小结:使用流计算 Oceanus(Flink) SQL 作业进行数据类型转换
  18. 向上转型与向下转型(超详细)
  19. 虚拟主机怎么搭建网站,虚拟主机怎么使用
  20. Linux下安装SVN工具和连接svn

热门文章

  1. Java设计模式超级详细分析(包含代码)
  2. uboot do_bootm函数详解
  3. VS Code、Atom、​Sublime Text:谁才是真正的编辑器之王?
  4. 小游戏——打鱼还是晒网
  5. 超实用,这是我见过最全面的python入门教程,高中生不要错过
  6. 央视CCTV摄制组进驻领存深入报道
  7. gradle project sync failed.please fix your project and try again-Android Studio3.1.2运行出错
  8. nodejs之简单的爬数据
  9. 阿⾥云Apsara Clouder云计算专项技能认证:云服务器ECS⼊门【 个⼈所得税年度应纳税额抵扣 3600(0成本)】
  10. python数据分析 - numpy | ndarray数组 | numpy常用函数