SQL初级第三课(下)
我们续用第三课(上)的表
辅助表
Student Course Score Teacher
Sno Cno Sno Tno
Sname Cname Cno Tname
Ssex Tno Degree Tsex
Sbirthday Tbirthday
class Prof
Depart
Having
Having:在分组的基础进一步筛选,没有group by子句时,不能使用Having子句,因为having字句是针对group by子句的
例:查询score中选学多门课程的同学中分数为非最高分成绩的记录。
这里有两个筛选条件比较绕,选多门课程的同学和非最高分。首先我想到的是查询语句中应该有 count(*)>1 和 not in (最高分)
选多门课程意味着sno重复出现至少两次,那么我们就应该按照sno分组。
按照题意:select * from score where sno in (select sno from group by sno having count(*)>1) --括号里是以sno列分组后行数大于1的sno
这里返回的是学生号码sno,按照得到的学生号码再score表里对应写出信息,我们就得到了选多门课程的成绩信息。
那么我们要在这个基础上再筛选出最高分的成绩Max(degree)那么,
select * from score where sno in (select sno from group by sno having count(*)>1)
and
degree not in(select max(degree) from score group by sno having count(*)>1 )--括号里子查询返回了一个被两个人或以上选修的课程的最高分。我们用去除这个最高分剩下的成绩就是非最高分得的记录。
相关子查询
还是关于这个题,查询除了每门课最高分之外的其他学生信息。
仿佛可以这样写: select * from score where degree not in (select max(degree) from score group by cno )
这个语句乍一看仿佛是对的因为子查询括号里可以得到 根据课程号码cno分组的最高分,但问题就出在这,这个值根据课程号码cno分组多少来得到多少个值并
返回。因为是现分组再计算出最大值,加入有其它组的分数与其中一组的最高分相等,那么这个分数也将被删除,因为
select * from score where degree not in()只执行将得出的几个值删除。
思路:我们设两个score表a,b内容一样的表score,但是他们是两个不同的表,那么我们通过子查询在score b中把cno列分组,然后在分好的组中查找degree的每组最大值,得出数据。
步骤1: select * from score where degree () --括号里应写入每门课的最高分;
步骤2: select * from score where degree not in (select max(degree) from score group by cno) --按照cno分组求出最高分,然后not in 去除,但是这样如果其他课的分数跟某门课的最高分一样,这样他一样会被错误去除,为了避免我们要有个having条件限制;
步骤3: select* from score a where degree not in (select max(degree) from score b group by cno having b.cno=a.cno);
--这样我们按照cno求出每门课最高分,score a和score b是内容与score相同的两个不同子表,只有score b表求出的最高分的b.cno与a.cno相同时这样我们才能够在
score a表中删除degree;
再练一个,例:查询成绩比该课程平均成绩低的同学的成绩表。
先分解:查询成绩表
步骤1: select * from score
比平均分低
步骤2: select * from score degree <(select avg(degree) from score) --求出课程平均分,但是求的是所有课程平均分,但这次我们不分组了
直接带入条件,where筛选循环依次带入来查找
步骤3:select * from score a degree <(select avg(degree) from score b where b.cno=a.cno) --根据课程依次带入cno,然后根据cno求出平均分,
在b表里求出的这个平均分,在b.cno=a.cno相同的时候可以影响a表,但是啊a,b表内容一样所以不影响结果。
第一种方法是先分组,group by-having
第二种方法是循环,where
如果这两种方法对于你都不好理解,那我我还有第三种方法--背过样子,做时判断!
首先判断这个题是否用到相关子查询,然后格式很简单 设a,b表然按照什么分组你就 where a. 分组=b.分组。
要判断是否是相关子查询要满足几个必要的条件;
1:要求一项内容但是按照表的其他条件分组。
2:一般会有聚合函数配合使用。
无论这3种方法掌握哪一种都一样吃饭。
------------------------------------------------------------------我是华丽的分割线------------------------------------------------------------------
连结
例:查询所有“女”教师和“女”同学的name、sex和birthday;
select sname,ssex,sbirthday from Student where ssex='女'
union
select tname,tsex,tbirthday from Teacher where Tsex='女'
--用union把两个表中查询的数据连结,要注意被union的两个表要包括相同的查询列数,查询的数据类型。第一个表先显示,按照第一个表的列名显示
------------------------------------------------------------------ 我是华丽的分割线 ------------------------------------------------------------------
模糊查询
查询Student表中不姓“王”的同学记录;
select * from student where sname not like '王%'
--用like 和 %表示模糊查询,%代表无限位其他内容
------------------------------------------------------------------ 我是华丽的分割线 ------------------------------------------------------------------
例:查询Student表中每个学生的姓名和年龄。
select sname,year(getdate())-year(sbirthday) as 年龄 from student;--year()-括号里是一个datetime类型的列,然后截取年份返回一个int类型的值;
详情请访问 CSDN或MSDN
常见命令
Left
select left('abcder',2) 总左往右截取2个字符
right 从右往左
select LOWER('ABC') 转换大小写
select UPPER('abc')
select LEN('abcd') 返回int 类型值 长度多少
select LTRIM (' fdfc')去左空格
select RTRIM(' sdf sfsd ')
print substring('abdfregsfdfsdfsd',1,2) 索引从1开始 从第2个 截取几个
select replace('dsfgregwgfsfd','f','popopopopo') 目标数据源,你在这个目标里找什么,替换成什么
select REPLICATE('傻逼',20) 复制,指定内容 复制几次
print str(123.46,5,1) 转换字符串,目标,显示几位,小数点几位
select PATINDEX('%123%','adf215123dfgergre25') 返回目标在字符串中的索引
select STUFF ('sdfsdfsdfsdf'4,2,'zzzzzzz') 插入zzzzzzzz在第4位还得删除后两位
转换函数 cast convert
select cast ('123' as int) +12
select cast (123 as varchar(50))+'123'
select CONVERT(int,123)+13
------------------------------------------------------------------ 我是华丽的分割线 ------------------------------------------------------------------
小结:
*Having要跟group by连用,一般加上一个聚合函数作为条件;
*通过联系培养思维习惯,遇到复杂的题要分解,都是白话文,先打出最终输出——根据筛选条件写出代码用()设为子查询——连接使用;
*当子查询跟随在 =、!=、<、<=、>、>= 之后, 子查询的返回值只能是一个, 否则应在外层where子句中用一个in限定符,即要返回多个值,要用in或者not in;
*SQL有自己的脾气,表为内嵌,命令选中执行,建表顺序,先主键再外键;如果有修改先执行删除重新insert;
*字符串别忘了用 ''引用起来;
SQL初级第三课(下)的更多相关文章
- SQL初级第三课(上)
先建立一个表 create table Student --学生(Sno char(3) primary key , --学生学号Sname ...
- shellKali Linux Web 渗透测试— 初级教程(第三课)
shellKali Linux Web 渗透测试— 初级教程(第三课) 文/玄魂 目录 shellKali Linux Web 渗透测试—初级教程(第三课) 课程目录 通过google hack寻找测 ...
- 【第三课】ANR和OOM——贪快和贪多的后果(下)
Out of Mana,法力耗尽. 内存就像法力,耗尽了就什么都不能做了.有时候一个应用程序占用了太大的内存,超过了Android系统为你规定的限制,那么系统就会干掉你,以保证其他app有足够的内存. ...
- 【Web探索之旅】第二部分第三课:框架和内容管理系统
内容简介 1.第二部分第三课:框架和内容管理系统 2.第二部分第四课预告:数据库 第二部分第三课:框架和内容管理系统 上一课我们介绍了服务器端的编程语言,有PHP,Java,Python,Ruby ...
- 20175221 曾祥杰 数据库MySQL(课下作业,必做)
数据库MySQL(课下作业,必做) 题目要求: 1. 下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECDB ...
- 你真的会玩SQL吗?三范式、数据完整性
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- CodeIgniter框架入门教程——第三课 URL及ajax
本文转载自:http://www.softeng.cn/?p=74 这节课讲一下CI框架的路由规则,以及如何在CI框架下实现ajax功能. 首先,先介绍CI框架的路由规则,因为CI框架是在PHP的基础 ...
- NeHe OpenGL教程 第三课:颜色渲染
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- BeagleBone Black 板第三课:Debian7.5系统安装和远程控制BBB板
BBB板第三课:Debian7.5系统安装和远程控制BBB板 由于BBB板系统是Debian 7.4.据说使用Debian系统能够实现非常多BBB板的无缝连接.能够更好的学习和控制BBB板,所以就决定 ...
随机推荐
- 一个简单的代码计算行数demo编写
最近手头的项目基本上已经完结,历经了5个月的开发和迭代,各种的需求调整,想对自己的代码量进行一个客观的计算,于是抽了点时间写下了这个小demo,朋友们有需要的可以看看,很简单. 基本的思想就是:根目录 ...
- iOS工程师Mac上的必备软件
原文链接 前言 iOS工程师一直都是那么的高逼格,用的是Mac电脑,耍的是iPhone手机,哇咔咔~~ 但是,作为一名iOS开发工程师,我们除了高逼格外,还必须是全能的.你不会点UI设计 ...
- JUnit笔记
- python基础语法(二)
本文主要包括以下内容 函数 切片 迭代 列表生成式 生成器 迭代器 函数 定义函数 定义函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块 ...
- 第二课 less的学习以及移动端需要注意的问题
一.LESS的学习笔记: 1.less介绍:一种动态样式语言.less将css赋予了动态语言的特性,如变量,继承,运算,函数,less既可以在客户端上运行(支持IE6+,webkit,firefox) ...
- CI重定向:php(codeigniter)中如何重定向
Q: 在保存完数据之后需要重定向,防止数据重复提交. 我使用$this->方法名();跳转,发现不能达到重定向的效果(地址栏没变) 请教高手重定向怎么用 A: $this->load-&g ...
- 攻城狮在路上(叁)Linux(十一)--- 用户与用户组、文件权限、目录配置
一.用户与用户组: 3个概念:文件所有者(user).用户组(group).其他人(others). /etc/passwd <==存放所有的用户名 /etc/shadow <==存放 ...
- 攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题
一.多个事务并发运行时的并发问题: 总结为第一类丢失更新.脏读.虚读.不可重复读.第二类丢失更新. 1.第一类丢失更新: 撤销一个事务时,把其他事务已提交的更新数据覆盖. 2.脏读: 一个事务读到另一 ...
- html5 三角形
html5 三角形 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...
- RTP、RTCP及媒体流同步
转自:http://blog.163.com/liu_nongfu/blog/static/19079414220139169225333/ 一.流媒体简介 流媒体是指在internet中使用流媒体技 ...