页数:56页文件大小:250.6 KB来源: 数据库原理与应用(SQLServer版)ppt课件
本课件系统讲解 SELECT 语句的子句构成与执行过程,覆盖条件查询、排序、分组统计、聚合函数、连接查询与子查询等常用写法,并给出大量针对学生选课数据库的查询示例。
第6章数据查询
查询:SELECT语句
SELECT语句的主要子句
SELECT语句的主要子句:SELECT [ALL|DISTINCT][TOP n|expression [PERCENT] [WITH TIES]][INTO new_table][FROM {} [,…n]][WHERE ][GROUP BY [ALL] group_by_expression[,…n][WITH {CUBE|ROLLUP }][HAVING ]ORDER BY order_expression [ASC|DESC]]COMPUTE {{AVG|COUNT|MAX|MIN|SUM}(expression)}[,…n]BY expression [,…n]] 说明:SELECT子句用于指定
CUBE与ROLLUP
SELECT语句的执行过程
基本的SELECT语句
投影查询
例3:查询前5条记录
例3,查询表StuInfo中的前5条记录中的学生姓名SNAME和专业Major,要求在显示列标题的时候将SNAME和Major分别显示为姓名和专业。Select top 5 sname as姓名, major as专业from StuInfo 如果要查询表StuInfo中的前50%条信息则可以用命令:Select top 50 percent * from StuInfo例4:查询scoreInfo
例4 从scoreInfo中查询有哪些课程被选择。Select distinct cid from scoreinfo条件查询
通配符使用的例子
Where name like ‘smith_’可以找到所有6个字母的、以smith开头的名字Where name like ‘%smith’可以找到以smith结尾的名字Where name like ‘[JT]im’可以找到3个字母的、以im结尾并以J或T开始的名字Where name like ‘m[^i]%’可以找到以m开始,第二个字符不为‘i’的所有人的名字
例5:查询姓李的老师
例5, 查询所有姓李的老师的TID和TName。SELECT TID, TName FROM TchInfoWHERE TName LIKE '李%'例6:表ScoreInfo中查询
例7:表ScoreInfo中查询
例8,between…and…
例8,between…and… 查询成绩在70分到80分之间的学生的学号SID和成绩Score。SELECT SID, Score FROM ScoreInfoWHERE Score between 70 AND 80 如果要查询成绩除成绩70分到80分以外的学生的学号SID和成绩Score。SELECT SID, Score FROM ScoreInfoWHERE Score not between 70 AND 80例9:查询在所有选课的学生中
例9, 查询在所有选课的学生中,既没有选修课程‘00000001’,也没有选修‘00100002’的学生的学号、课程号和成绩。 方法一:SELECT SID,CID,Score FROM ScoreInfoWHERE CID!= '00000001' AND CID!= '00100002' 方法二:SELECT SID,CID,Score FROM ScoreInfoWHERE CID NOT IN ( '00000001','00100002')例10----空值查询
例11----查询的排序
例11 查询的排序 在scoreInfo表中查询选修课程‘00100002’的学生的学号和成绩,并按成绩降序排列。Select sid,score from scoreInfoWhere cid='00100002'Order by score desc分组查询
聚合函数和GROUP BY子句
常用的聚合函数功
能函数名称求一列中的最小值MIN求一列中的最大值MAX按列计算值总和SUM按列计算值的平均值AVG按列值计个数COUNT返回表中的所用行数COUNT(*)
例12:求总分与平均分
例12, 通过查询表scoreInfo求学号sid为‘00100001’的学生的总分和平均分。Select sum(score) as总分,avg(score) as平均分From scoreInfo where sid= '05000001‘ 可以用GROUP BY子句查询所有学生的总分和平均分。例13:求各科最高最低分
例14:查询每位学生的学号及其选课
GROUP BY与HAVING
例15:求各专业男生人数
例15, 通过查询表StuInfo求各专业中的男生人数.Select major as专业,count(*) as专业_男生数from StuInfoWhere sex='男'group by major例16:从表scoreinfo中查询
排序查询
例17:多列排序查询
例17, 查询表ScoreInfo中选修了“00000001”课程的学生的学号SID,成绩Score和学年Schyear,并按学年Schyear升序、按成绩的降序进行排序。use teachingData select SID, Score, Schyear from ScoreInfowhere cid='00000001'order by Schyear, Score DESC联结查询
联结条件的一般格式
例18:查询每个教师的信息及其主讲课
例18查询每个教师的信息及其主讲课程的信息。分析:教师情况存放在TchInfo表中,教师主讲课程情况存放在ScoreInfo表中,所以本查询实际上涉及TchInfo、ScoreInfo两个表。这两个表之间的联系是通过公共属性TID实现的。
用自然联结来实现
SELECT TchInfo.TID, Tname,Sex,Birthday,Title,Dept,CID,SID,Score,Schyear,TermFROM TchInfo,ScoreInfoWHERE TchInfo.TID=ScoreInfo.TID
复合条件联结
使用:JOIN和ON的的联结查
使用JOIN和ON的的联结查询在FROM子句中,使用JOIN联结不同的表,使用ON给出两个表之间的联结条件。例如输入如下命令:SELECT StuInfo.Sname, ScoreInfo.CID,ScoreInfo.ScoreFROM StuInfo JOIN ScoreInfo ON StuInfo.SID= ScoreInfo.SIDWHERE ScoreInfo.Score>70自身联结
例20:相同成绩课程查询
例20,在ScoreInfo表中,查询具有相同成绩的课程信息,给出学号、课程号和成绩。在查询中,我们需要为表ScoreInfo指定两个别名s1和s2。USE teachingdataSELECT DISTINCT S1.SID,s1.CID,S2.scoreFROM ScoreInfo s1 JOIN ScoreInfo s2 ons1.Score=s2.ScoreWHERE s1.CID<>S2.CID查询同时选修了课程‘
查询同时选修了课程‘00000001’和课程‘00100002’的学生的学号。select distinct s1.sidfrom scoreinfo s1 join scoreinfo s2 ons1.sid=s2.sidwhere s1.cid='00000001' ands2.cid='00100002'外联结
左外联结
例21:左外连接查询
左外连接查询示例
SELECT *FROM StuInfo LEFT OUTER JOIN ScoreInfo ONStuInfo.SID= ScoreInfo.SID右外联结右外联结
例22:右外连接查询
右外连接查询示例
select *from scoreinforight join tchinfo on scoreinfo.tid=tchinfo.tid嵌套查询
例23:查询选修了00000001号
例23, 查询选修了00000001号课程的学生姓名。SELECT Sname FROM StuInfo‘外层查询/父查询WHERE SID IN(SELECT SID FROM ScoreInfoWHERE CID= '00000001')‘内层查询/子查询子查询的执行过程分析
嵌套查询
嵌套查询的语句格式如下:SELECT [ ALL | DISTINCT ][TOP expression [PERCENT] [WITH TIES ]]< select_list >[FROM { | }[WHERE表达式[NOT] IN|EXISTS|比较运算符[ANY|ALL](子查询)] 例24:查询与王晓红老师职称相同教师
例24, 查询与王晓红老师职称相同教师的工号TID、姓名TName和职称Title。USE TeachingDataSELECT TID,TName, title FROM TchInfoWHERE Title=(SELECT Title FROM TchInfoWHERE TName='王晓红')and tname!='王晓红'例25:查询同时选修了课程‘0000
例25, 查询同时选修了课程‘00000001’和课程‘00100002’的学生的姓名和班级。select sname,class from stuinfowhere sid in(select distinct s1.sid from scoreinfo s1join scoreinfo s2 on s1.sid=s2.sidwhere s1.cid='00000001' and s2.cid='00100002')注意等号和in的区别例26:查询同时选修了课程‘高等数学’
例26,查询同时选修了课程‘高等数学’和课程‘电子商务’的学生的姓名和班级。select sid,snamefrom stuinfo where sid in (select distinct s1.sidfrom scoreinfo s1 join scoreinfo s2 on s1.sid=s2.sidwhere s1.cid=(select cid from courseinfo wherecname='高等数学') and s2.cid=(select cid fromcourseinfo where cname='电子商务'))例27:查询没有上任何课程的教师的姓
例27, 查询没有上任何课程的教师的姓名和所在部门。select sname,deptfrom tchinfowheretid not in (selecttid from scoreinfo)小结:投影查询
作业:完成第6章所有例题
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}