第五章 数据查询(下)

目标

  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 

你可能感兴趣的:(第五章 数据查询(下))