目标
1.使用like,between,in进行模糊查询
2.在查询中使用聚合函数
3.使用group by进行分组查询
4.进行多表连接查询
查找张姓同学:
select sName as “姓名” from students
where sName like '张%'
思考:
select * from 数据表
where 编号 like ‘00[^8]%[A,C]%’
可能会查询到编号值为(B)
A 98902ACD
B 007_AFF
C 008&DCG
D KK8C
实体界面中怎样设置一个字段属性值为null?
答案:ctrl + 0
备:sql语句
属性值 = null
betwen 把某一字段中内容在特定范围内的记录查询出来
select studentId, score from scort
where score between 60 and 80
相当于:where score >= 60 and score <= 80
in 把某一字段中内容与所列出的查询内容列表匹配的记录查询出来
select sName as '学员姓名', sAddress as '地址’
from students where sAddress in('北京',‘广州’)
相当于:where sAddress = '北京' or sAddress = '广州'
聚合查询
问题:
成绩表中存储了所有学员的成绩,我想知道,学员的总成绩、平均成绩、有成绩的学员总人数,怎么办?
聚合函数:
sum() avg() count() max() min()
select MAX(score)as 最高分,
MIN(score)as 最低分,
SUM(score)as 总分,
AVG(score)as 平均分,
count(studentNo)as 参加考试总人数
from score
where score >= 78
分组查询
问题:
如果不是统计所有人的所有课程的总成绩
而是想求每一门课的平均成绩或者某个人的所有课程的总成绩
怎么办?
select sum(score), studentno from score group by studentno
多列分组
group by one,two
one,two 位置无关,查询出结果一致。
having 放在 group by 后,用于聚合后对(虚表)数据进行条件过滤
select COUNT(*) from score having COUNT(*) > 2
select COUNT(*),score from score group by score having score >=80
备:where 用于对源表数据进行过滤时用
1.where 子句从数据源中去掉不符合其搜索条件的数据
2.group by 子句搜集数据行到各个组中,统计函数为各个组计算统计值
3.having 子句去掉不符合其组搜索条件的各组数据行
where >>> group by >>> having
分组查询 —— 思考 ?
select 部门编号, count(*)
from 员工信息表
where 工资 >= 2000
group by 部门编号
having count(*) > 1
含义:从员工信息表中找出部门员工工资不低于2000块,人数不少于1人的部门编号和部门中员工人数来。
多表联结查询
问题:
学员内部测试成绩查询的每次显示的都是学员的编号信息,
因为该表中只存储了学员的编号;
实际上最好显示学员的姓名,而姓名存储在学员信息表中;
如何同时从这两张表中取得数据?
多表联结查询——分类
1.内联结(inner join) (掌握)
2.外联结
-左外联结(left join)(掌握)
-右外联结(reght join)
-完整外联结(full join)
3.交叉联结(cross join)
内联结:a 表和 b 表都得有特定的列属性值才显示出来结果
select 学生表.sname, courseid, score
from score_dbljcxlx as 成绩表 inner join students_dbljcxlx as 学生表
on 成绩表.studentsid = 学生表.scode
三 (多)表联结查询:
select S.sname as 姓名, CS.CourseName as 课程, C.Score as 成绩
from Students as S
inner join Score as C on S.SCode = C.StudentID
INNER JOIN Course as CS on CS.CourseID = C.CourseID
左外联结(left join)从左表取所有行
select S.SName, C.CourseId,C.Score
from Students as S
left join Score as C
on C.StudentId = S.SCode
案例分析1 —— 要求
在数据库表中,数据行位置并不重要,但是一个单位中要根据技术含和偶数行来汇总,在这个汇总的基础上再得到一个数值,因此,要查询数据库表的奇数行和偶数行的总数
数据库表名:tbl
字段名:a
主键字段:idkey(标识列,种子:1;增量:1)
1
2
4
5
答案:
select a, identity(int,1,1) as id
into temptable
from tbl
select count(a) as 奇数列汇总
from temptable
where id % 2 <> 0
select count(a) as 偶数列汇总
from temptable
where id % = 0
案列分析2 —— 要求
一个家银行发行了新的信用卡,刚开始的时候推广得很好,但是逐渐废卡也越来越多(卡上的余额少于2块,并且用户长时间不使用该卡),因此银行在二月份把这些少于2块的卡从数据库表中删除了,但是很快问题就来了,用户发现他的卡再也不能使用而投诉,因此只能再把这些卡恢复。
insert into S(S.CardID,S.Score)
select M.CardID, 2
from M
left join S
on S.CardID = M.CardID
where S.CountID is null