2017年07月03号课堂笔记

2017年07月03号 星期一  多云 空气质量:轻度污染~中度污染

内容:MySQL第四节课

in和not in;两个表的内连接;exists和not exsits的使用;all,any和some;

使用子查询的注意事项;sql优化(使用exists 代替 in);group by;两道mysql面试题

一、in和not in

1、in
-- 使用in替换 等于(=)的子查询语句!
-- in后面的子查询可以返回多条记录!

1)例题1
-- 查询年级编号是1或者2 的 所有学生列表

SELECT * FROM student WHERE gradeId IN(1,2)
2)例题2
-- 查询 年级名称是 大一或者大二的所有学生信息

-- 分析:学生表中没有 年级名称 但是有年级编号

-- 01.根据 年级名称 查询出 年级编号
SELECT gradeID FROM grade WHERE gradeName IN('大一','大二');

-- 02.再根据 年级编号 查询学生信息
SELECT * FROM student WHERE
gradeID
IN (SELECT gradeID FROM grade WHERE gradeName IN('大一','大二'))

3)例题3(使用where ... =)
-- 查询参加最近一次 高等数学-1 考试的学生 成绩的最高分和最低分

-- 01. 发现成绩表中 没有 编号 只有科目名称!根据名称取编号

SELECT SubjectNo FROM `subject` WHERE
subjectName='高等数学-1'

-- 02.查询最近一次 高等数学-1 考试的时间

SELECT MAX(ExamDate) FROM result
WHERE
SubjectNo=(SELECT SubjectNo FROM `subject` WHERE
subjectName='高等数学-1')

-- 02(2).所有最近考试的成绩(老师上课演示用,可以不写)
SELECT * FROM result
WHERE ExamDate='2013-11-11 16:00:00'

-- 03.开始获取最高分和 最低分
SELECT MAX(studentResult) AS 最高分,
MIN(studentResult) AS 最低分
FROM result
WHERE SubjectNo=(SELECT SubjectNo FROM `subject` WHERE
subjectName='高等数学-1')
AND ExamDate=
(SELECT MAX(ExamDate) FROM result
WHERE
SubjectNo=(SELECT SubjectNo FROM `subject` WHERE
subjectName='高等数学-1'))

4)例题4(使用where ... in)
-- 查询 高等数学-1 考试成绩是 60 分的 学生信息

-- 01.根据 科目名称 获取 科目编号
SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等数学-1'

-- 02.根据科目编号 和 考试成绩条件 查询所有的学生编号
SELECT studentNo FROM result
WHERE SubjectNo=(SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等数学-1')
AND StudentResult=60; -- 成绩=60

-- 03.根据符合条件学生编号 查询对应的学生信息
SELECT * FROM student
WHERE studentNo IN
(SELECT studentNo FROM result
WHERE SubjectNo=(SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等数学-1')
AND StudentResult=60)


2、not in
-- not in :不在某个范围之内

1)例题1
-- 查询未参加 “高等数学-1” 课程最近一次考试的在读学生名单

-- 01.根据 科目名称 获取 科目编号
SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等数学-1'

-- 02根据科目编号 获取该科目最近一次考试时间
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=
(SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等数学-1')

-- 03.查询没参加该科目 最近一次考试的 学生编号,学生姓名
SELECT studentNo,StudentName FROM student
WHERE studentNo NOT IN
(
SELECT StudentNo FROM result
WHERE SubjectNo=
(SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等数学-1')
AND ExamDate=
(SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=
(SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等数学-1'))
)

 

二、高级查询

1、笛卡尔乘积

1)概念:笛卡尔乘积是指在数学中,两个集合XY的笛卡尓积(Cartesian product),又称直积,表示为X × Y
第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
假设集合A={a, b},集合B={0, 1, 2},
则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。
A表示所有声母的集合,B表示所有韵母的集合,那么A和B的笛卡尔积就为所有可能的汉字全拼。

2)老师mysql举例: SELECT * FROM `grade`INNER JOIN `student`
笛卡尔积 :两个表数据的乘积!

 

2、两个表的内连接
SELECT * FROM `grade`INNER JOIN `student`
ON grade.`GradeID`=student.`GradeId`

on 两个表通过那一列建立关联关系

 

3、exists的使用

1)语法和作用

-- 01. 用于检测表,数据库等等 是否存在

-- 02.检查子查询中是否会返回一行数据!其实子查询并不返回任何数据!
只返回 true或者false!

SELECT * FROM Student WHERE EXISTS(SELECT NULL)
SELECT * FROM Student WHERE EXISTS(SELECT 9*9)
SELECT * FROM Student WHERE EXISTS(SELECT StudentName FROM student)

图示如下:

 

2)exists例题1  exists和in的转换写法

-- 01.exists的写法

SELECT * FROM Student

WHERE EXISTS(SELECT studentName FROM Student WHERE studentName='张三')

-- 02.in的写法

SELECT * FROM Student WHERE studentName IN(SELECT studentName FROM Student)

-- 03.in 效果等同于 =any
SELECT * FROM Student WHERE
studentName =ANY(SELECT studentName FROM Student)

 

3)all,any和some
-- 01.all 大于子查询语句中的 最大值   >(1,2,3) >3
SELECT * FROM student
WHERE studentNo>ALL
(SELECT studentNo FROM student WHERE studentNo IN(1003,1004,1005))

-- 02.any 大于子查询语句中的 最小值   >(1,2,3) >1
SELECT * FROM student
WHERE studentNo>ANY
(SELECT studentNo FROM student WHERE studentNo IN(1003,1004,1005))

-- 03.some 和any功能一样
SELECT * FROM student
WHERE studentNo>SOME
(SELECT studentNo FROM student WHERE studentNo IN(1003,1004,1005))

 

4)exists例题2
-- 检查“高等数学-1” 课程最近一次考试成绩
-- 如果有 80分以上的成绩,显示分数排在前5名的学员学号和分数


-- ① 不使用exists

-- 01.查询“高等数学-1” 课程 对应的编号
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1'

-- 02.查询最近的考试成绩
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1')

-- 03. 在02的基础上 加条件 成绩大于80
SELECT * FROM result
WHERE ExamDate=
(SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1'))
AND StudentResult>80

-- 04.显示分数排在前5名的学员学号和分数
SELECT studentNo,StudentResult FROM result
WHERE ExamDate=
(SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1'))
AND StudentResult>80
ORDER BY StudentResult DESC
LIMIT 0,5

 

同样题目:

-- 检查“高等数学-1” 课程最近一次考试成绩
-- 如果有 80分以上的成绩,显示分数排在前5名的学员学号和分数

-- ② 使用exists

-- 01.查询“高等数学-1” 课程 对应的编号
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1'

-- 02.查询最近的考试时间
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1')


-- 03.查询学号和成绩
SELECT StudentNo,StudentResult FROM result
WHERE EXISTS
(
SELECT * FROM result
WHERE subjectNo=(
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1'
)
AND ExamDate=(
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1')
)
AND StudentResult>80
)
AND subjectNo=(
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1'
)
AND ExamDate=(
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1')
)
ORDER BY StudentResult DESC
LIMIT 0,5

 

5)exists例题3
-- 如果有 年级名称是大二 的学生,就 查询出 年级名称是大一的 所有学生信息

-- 01.先查询出 对应的年级编号
SELECT GradeId FROM grade WHERE GradeName='大一'
SELECT GradeId FROM grade WHERE GradeName='大二'

-- 02.在学生表中是否存在 年级名称是大二 的学生
SELECT * FROM student WHERE gradeID=(
SELECT GradeId FROM grade WHERE GradeName='大二'
)

-- 03.如果有查询出 年级名称是大一的 所有学生信息
SELECT * FROM student
WHERE EXISTS
(
SELECT * FROM student WHERE gradeID=(
SELECT GradeId FROM grade WHERE GradeName='大二'
)
)
AND GradeId=(
SELECT GradeId FROM grade WHERE GradeName='大一'
)

 

6)not exists
例题如下:
-- 检查“高等数学-1”课程最近一次考试成绩
-- 如果全部未通过考试(60分及格),认为本次考试偏难,计算的该次考试平均分加5分

-- 01.查询“高等数学-1” 课程 对应的编号
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1'

-- 02.查询最近的考试成绩
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1')

-- 03.查询成绩大于60的 (逆向思维)
SELECT StudentResult FROM result
WHERE StudentResult>60
AND SubjectNo=(
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1'
)
AND ExamDate=(
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1')
)

-- 04. 如果全部未通过考试,考试平均分加5分
SELECT AVG(StudentResult)+5 FROM result
WHERE NOT EXISTS
(
SELECT StudentResult FROM result
WHERE StudentResult>60
AND SubjectNo=(
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1'
)
AND ExamDate=(
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1')
)
)
AND SubjectNo=(
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1'
)
AND ExamDate=(
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等数学-1')
)

 

7) 使用子查询的注意事项
-- 01.任何允许使用表达式的地方都可以使用子查询
-- 02.只出现在子查询中但是没有在父查询中出现的列,结果集中的列不能包含

 

4、sql优化(使用exists 代替 in)

1)使用exists 代替 in
使用not exists 代替not in

exists 只返回true或者false.不返回结果集
in 返回结果集

-->exists性能更高!

2)例题1
-- 查询姓李的学生信息 % 代表0或者多个字符 _代表一个字符

-- 01.使用like
SELECT * FROM student WHERE StudentName LIKE '李%'
SELECT * FROM student WHERE StudentName LIKE '李_'

-- 02.使用in完成上述代码
SELECT * FROM student WHERE StudentName IN(
SELECT studentName FROM student WHERE StudentName LIKE '李%')
-- in(多条数据--》返回结果集)

-- 03.使用exists替换
SELECT * FROM student WHERE EXISTS(
SELECT studentName FROM student)
AND StudentName LIKE '李%'
-- exists(有没有数据)

 

5. GROUP BY 列名 分组   having 分组之后的条件
1)例题1
-- 统计每门课程平均分各是多少
SELECT subjectno,AVG(studentresult) FROM result
GROUP BY subjectno

2)例题2
-- 查询出课程平均分大于60的课程编号 和 平均分
SELECT subjectno,AVG(studentresult) FROM result
GROUP BY subjectno
HAVING AVG(studentresult)>60 -- 分组之后的条件

3)例题3
-- 01.统计每门课程平均分各是多少 降序排列
SELECT subjectno,AVG(studentresult) FROM result
GROUP BY subjectno
ORDER BY AVG(studentresult) DESC

-- 02.如果成绩相同 再按照 课程编号 升序排序
SELECT subjectno,AVG(studentresult) FROM result
GROUP BY subjectno
ORDER BY AVG(studentresult) DESC,subjectno

4)例题4
-- 分组统计每个年级的 男女人数

SELECT gradeid 年级编号,sex 性别,COUNT(sex) 人数
FROM student
GROUP BY gradeid,sex

 

6、面试题
1)面试题1

老师代码:(数据不完全对应题目,领会解题方法)

-- 创建表
CREATE TABLE IF NOT EXISTS examTest(
id INT(2) NOT NULL,
sex VARCHAR(20)
)

-- 同时新增多条数据
INSERT INTO examTest VALUES(1,'男'),(2,'男'),(3,'女'),(4,NULL);

01.使用where
SELECT sex AS '性别',COUNT(sex) AS '人数' FROM examTest
WHERE sex IS NOT NULL
GROUP BY sex
ORDER BY COUNT(sex) DESC

02.使用having
SELECT sex AS '性别',COUNT(sex) AS '人数' FROM examTest
GROUP BY sex
HAVING sex IS NOT NULL
ORDER BY COUNT(sex) DESC

03.使用where和in(取巧)
SELECT sex AS '性别',COUNT(sex) AS '人数' FROM examTest
WHERE sex IN('男','女')
GROUP BY sex
ORDER BY COUNT(sex) DESC


2)面试题2

作业,待解答

下次课确认答案后补上

老师代码:

 

 

 

三、作业

1、复习之前所讲的mysql课程(老师txt文件里的),预习事务,下节课考试

2、面试题第二题

四、老师辛苦了!

 

 

转载于:https://www.cnblogs.com/wsnedved2017/p/7111032.html

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

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

相关文章

excel文件被写保护怎么解除_u盘被写保护怎么解除,看完你就知道了

在平常我们使用U盘存储资料过程中,有时会发现U盘出现无法正常读写的现象,具备表现为U盘被写保护,无法正常执行读写操作。对于小编给大家提供以下解决方法,希望对大家能有所帮助。对U盘执行重置操作01上网搜索并下载“USBOOT”程序…

OSGi案例研究:模块化vert.x

OSGi使Java代码可以清晰地划分为多个模块,这些模块称为捆绑软件 ,可以访问由每个捆绑软件的类加载器控制的代码和资源。 OSGi 服务提供了一种附加的分离机制:接口的用户不需要依赖于实现类,工厂等。 以下案例研究旨在使OSGi捆绑包…

mysql一些常用操作_表的一些常用操作_MySQL

bitsCN.com-创建表(也就是创建表结构):create table tbl_name(列结构,即有哪些属性)[表选项]; 如:班级的信息:(班级编号,开班日期)create table java_class(class_num varchar(10),date_start date);注:该表…

如何调整自定义标签样式

用chromeF12,查看网页代码在自定义标签上加class,写样式:例如:JSP文件:来自为知笔记(Wiz)转载于:https://www.cnblogs.com/anobugworld/p/7112116.html

无需部署即可测试JPQL / HQL

您是否曾经想在不完全部署应用程序的情况下测试JPQL / HQL? 我们今天在这里看到的是适用于任何JPA实现的简单解决方案:Hibernate,OpenJPA,EclipseLink等。 这篇文章中找到的基本源代码来自于本书:“ Pro JPA 2&#xf…

python加密模块教程_Python加密模块的hashlib,hmac模块使用解析

这篇文章主要介绍了Python加密模块的hashlib,hmac模块使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下在写搬砖脚本中,碰到一个加密的信号标签文件无法运行。import hashlibimport timem ha…

SCREEN屏幕编程时候必须保证SCREN中词典的字段格式必须和数据表中字段的类型长度一致!...

此时任意操作都会出现如下问题 /h调试 回车调试被激活任意操作 执行到第23行时候报错“请输入一个数值”,检查数据表中字段参考数据元素以及对应的域均是char类型,此时检查screen屏幕设置字段类型,/n退出程序 重新进入程序 单击 点击屏幕9000…

zabbix 3.0.3 (nginx)安装过程中的问题排错记录

特殊注明:安装zabbix 2.4.8和2.4.6遇到2个问题,如下:找了很多解决办法,实在无解,只能换版本,尝试换(2.2.2正常 | 3.0.3正常)都正常,最后决定换3.0.31、Error connecting …

Java锁实现

我们都使用第三方库作为开发的正常部分。 通常,我们无法控制其内部。 JDK随附的库是一个典型示例。 这些库中的许多库都使用锁来管理竞争。 JDK锁具有两种实现。 人们使用原子CAS样式指令来管理索赔过程。 CAS指令往往是最昂贵的CPU指令类型,并且在x86上…

一键生成APP官网

只需要输入苹果下载地址,安卓市场下载地址,或者内测下载地址,就能一键生成APP的官网,方便在网上推广。 好推APP官网 www.hotapp.cn/app 转载于:https://www.cnblogs.com/likwo/p/6223889.html

Quartz 2 Scheduler示例

Quartz是一个开源作业调度框架。 它可用于管理和计划应用程序中的作业。 步骤1:建立已完成的专案 创建一个Maven项目,如下所示。 (可以使用Maven或IDE插件来创建它)。 步骤2:图书馆 Quartz依赖项已添加到Maven的po…

如何通过网线连接两台电脑快速传输数据?

介绍 我们经常需要拷贝文件会用到类似U盘等工具,但我们有时在传输大文件时又苦于没有,那么大内存的转存工具。这时候我们就可以通过一条小小的网线连接两台电脑,形成一个小的局域网传输数据,因为是通过网线传输,所以传…

2012年I / O之后

从注册到赠品,每年的I / O疯狂都在不断发展。 在今年20分钟内被出售,并没有阻止Google赠送更多的东西。 以这种速度并有望在明年发布Google Glass,明年注册很可能会变得更加混乱! 因此,Google,请停止提供免…

h5启动原生APP总结

许久没有写博客了,最近有个H5启动APP原生页面的需求,中间遇上一些坑,看了些网上的实现方案,特意来总结下 一、需要判断客户端的平台以及是否在微信浏览器中访问 1、客户端判断 在启动APP时,Android和IOS系统处理的方式…

什么时候使用Apache Camel?

Apache Camel是JVM / Java环境中我最喜欢的开源框架之一。 它可以轻松集成使用多种协议和技术的不同应用程序。 本文介绍了何时使用Apache Camel以及何时使用其他替代方法。 问题:企业应用程序集成(EAI) 由于新产品和新应用,几乎…

软工个人总结

目录 一、个人提升二、写下属于自己的人月神话三、对下一届、后来人、自己的建议四、我的团队——Clover五、关于代码质量六、学过软件工程?七、自我介绍八、个性发挥一、个人提升 1. 开学初的目标 希望通过团队合作领会团队合作的内在精神,希望在分工完…

排序算法之(7)——堆排序

【堆排序的思路】 堆排序主要是利用了堆的性质。对于大顶堆:堆中的每一个节点的值都不小于它的孩子节点的值,具体可參考我的还有一篇博客http://blog.csdn.net/adminabcd/article/details/46880591,那么大顶堆的堆顶元素就是当前堆中全部元素…

重新登录:重新登录

嗨,我再次回到日志中来,这是任何应用程序设计和开发的固有部分。 我是坚强的基础知识的忠实拥护者,在我的拙见中,日志记录是任何企业级应用程序中经常被忽略但基本的关键要素之一。 我已经写在此之前这里 。 为了理解当前文章&…

分治1--二分查找

分治1--二分查找 一、心得 二、题目和分析 三、代码和结果 1 #include <iostream>2 using namespace std;3 int a[10]{1,2,4,5,7,8,9,10,13,20};4 5 6 //非递归 7 int find(int i){8 int l0,r9;9 int mid(lr)/2; 10 while(l<r){ 11 mid(lr)/2; 12…

Spring自定义命名空间

Spring自定义命名空间提供了一种很好的方式来简化用于描述Spring应用程序上下文的bean定义的xml文件。 这是一个相当古老的概念&#xff0c;最初是在Spring 2.0中引入的&#xff0c;但值得不时地进行审查。 考虑一种情况&#xff0c;必须为没有自定义名称空间的Spring MVC应用程…