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”程序…

新建MAVEN项目--pom.xml报错

使用集成了maven的Eclipse版本新建maven项目后,配置文件pom.xml会在project以及引用的xsd文件处出现错误(第一、二行报错) 其中一个报错例子: Multiple annotations found at this line:- Plugin execution not covered by lifecy…

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);注:该表…

网站appache的ab命令压力测试性能

①:相关不错的博文链接:http://johnnyhg.iteye.com/blog/523818 ②:首先配置好对应的环境上去,有对应的命令 ③:压力测试的指令如下: 1. 最基本的关心两个选项 -c -n例: ./ab -c 100 -n 10000 &…

如何调整自定义标签样式

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

无需部署即可测试JPQL / HQL

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

freemarker页面中文乱码

一、前言 简单的记录freemarker遇到的错误问题&#xff1a;ftl页面中文乱码 由于freemarker整合在ssm框架中&#xff0c;所以笔者直接贴配置代码 <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-ins…

了解ThreadLocal背后的概念

介绍 我知道本地线程&#xff0c;但直到最近才真正使用过它。 因此&#xff0c;我开始深入研究该主题&#xff0c;因为我需要一种传播某些用户信息的简便方法 通过Web应用程序的不同层&#xff0c;而无需更改每个调用方法的签名。 小前提信息 线程是具有自己的调用栈的单个…

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

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

DAO层–救援通用

泛型可以是使用编译时验证&#xff08;类型安全性&#xff09;的功能来创建可重用代码的强大工具。 不幸的是&#xff0c;我感到主流开发人员仍然对此感到恐惧。 但是&#xff0c;比喻海格的蜘蛛&#xff0c;我会说泛型是被严重误解的生物……:-) 我希望以下示例可以证明它们…

ThreadLocal详解(实现多线程同步访问变量)

ThreadLocal翻译成中文比较准确的叫法应该是&#xff1a;线程局部变量。 这个玩意有什么用处&#xff0c;或者说为什么要有这么一个东东&#xff1f;先解释一下&#xff0c;在并发编程的时候&#xff0c;成员变量如果不做任何处理其实是线程不安全的&#xff0c;各个线程都 在操…

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

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

mysql 阿里云 版本_关于阿里云centos版本,mysql5.7的一些注意事项

1.阿里云进去mysql是默认已经安装好了的&#xff0c;只需要修改root用户的密码。关于修改密码&#xff1a;1)登陆阿里云&#xff0c;进入root目录&#xff0c;会有mysql的.sh文件&#xff0c;可以通过运行该文件得到初始密码。此时用初始密码登陆mysql&#xff0c;use mysql 切…

JAXB –不需要注释

似乎存在一个误解&#xff0c;认为在模型上需要使用批注才能使用JAXB&#xff08;JSR-222&#xff09;实现。 事实是&#xff0c;JAXB是例外配置&#xff0c;因此仅当您要覆盖默认行为时才需要注释。 在此示例中&#xff0c;我将演示如何在不提供任何元数据的情况下使用JAXB。 …

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

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

安装mysql5.7.24rpm_centos7安装mysql-5.7.24(rpm安装)

关于mysql的4个rpm包node[rootelk-200 ~]# ls mysql/ -lhtotal 192M-rw-r--r-- 1 root root 25M Aug 26 12:38 mysql-community-client-5.7.24-1.el7.x86_64.rpm-rw-r--r-- 1 root root 275K Aug 26 12:38 mysql-community-common-5.7.24-1.el7.x86_64.rpm-rw-r--r-- 1 root ro…

Java锁实现

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

一键生成APP官网

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

python 字符ab+字符c 2_“ab”+”c”*2 结果是: (1.3分)_学小易找答案

【判断题】药物效应动力学简称药效学,是研究药物对机体的作用?【单选题】以下关于Python语言中“缩进”说法正确的是:‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪…