数据库系统原理-第3章-关系数据库标准语言SQL-2.ppt
《数据库系统原理-第3章-关系数据库标准语言SQL-2.ppt》由会员分享,可在线阅读,更多相关《数据库系统原理-第3章-关系数据库标准语言SQL-2.ppt(98页珍藏版)》请在冰豆网上搜索。
第三章关系数据库标准语言SQL
(2)主讲:
林芳主讲:
林芳第三章关系数据库标准语言SQL3.1SQL概述3.2学生-课程数据库3.3数据定义3.4数据查询3.5数据更新3.6视图3.7小结数据查询语句格式语句格式SELECTALL|DISTINCT,FROM,WHEREGROUPBYHAVINGORDERBYASC|DESC;3.4数据查询3.4.1单表查询3.4.2连接查询3.4.3嵌套查询3.4.4集合查询3.4.5Select语句的一般形式3.4.1单表查询查询仅涉及一个表:
一、选择表中的若干列二、选择表中的若干元组三、ORDERBY子句四、聚集函数五、GROUPBY子句一、选择表中的若干列1.查询指定列例1查询全体学生的学号与姓名。
SELECTSno,SnameFROMStudent;v例2查询全体学生的姓名、学号、所在系。
SELECTSname,Sno,SdeptFROMStudent;-目标列的顺序可以与表中顺序不同2.查询全部列两种方法在SELECT关键字后面列出所有列名将指定为*例3查询全体学生的详细记录。
SELECTSno,Sname,Ssex,Sage,SdeptFROMStudent;或SELECT*FROMStudent;3.查询经过计算的值SELECT子句的可以为:
算术表达式字符串常量函数列别名查询经过计算的值(续)例4查全体学生的姓名及其出生年份。
SELECTSname,2009-SageFROMStudent;-SQLServer2000日期相关函数:
日期相关函数:
-GetDate()取当前日期时间取当前日期时间-Year(日期日期)取年份取年份Month(日期日期)月份月份Day(日期日期)日日SELECTSname,Year(GetDate()-SageFROMStudent;查询经过计算的值(续)例5查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名SELECTSname,YearofBirth:
,2009-Sage,LOWER(Sdept)FROMStudent;查询经过计算的值(续)使用列别名改变查询结果的列标题使用列别名改变查询结果的列标题:
SELECTSnameNAME,YearofBirth:
BIRTH,2009-SageBIRTHDAY,LOWER(Sdept)DEPARTMENTFROMStudent;输出结果:
输出结果:
二、选择表中的若干元组如果没有指定DISTINCT关键词,则缺省为ALL例6查询选修了课程的学生学号。
SELECTSnoFROMSC;等价于:
SELECTALLSnoFROMSC;执行上面的SELECT语句后,结果为:
Sno2002151212002151212002151212002151222002151221.消除取值重复的行指定DISTINCT关键词,去掉表中重复的行SELECTDISTINCTSnoFROMSC;执行结果:
Sno2002151212002151222.查询满足条件的元组查查询询条条件件谓谓词词比比较较=,=,=,!
=,!
,!
;NOT+上述比较运算符上述比较运算符确定范围确定范围BETWEENAND,NOTBETWEENAND确定集合确定集合IN,NOTIN字符匹配字符匹配LIKE,NOTLIKE空空值值ISNULL,ISNOTNULL多重条件(逻辑多重条件(逻辑运算)运算)AND,OR,NOT表表3.4常用的查询条件常用的查询条件
(1)比较大小例例7查询计算机科学系全体学生的名单。
查询计算机科学系全体学生的名单。
SELECTSnameFROMStudentWHERESdept=CS;例例8查询所有年龄在查询所有年龄在20岁以下的学生姓名及其岁以下的学生姓名及其年龄。
年龄。
SELECTSname,SageFROMStudentWHERESage20;例例9查询考试成绩有不及格的学生的学号。
查询考试成绩有不及格的学生的学号。
SELECTDISTINCTSnoFROMSCWHEREGrade60;
(2)确定范围谓词谓词:
BETWEENANDNOTBETWEENAND例例10查询年龄在查询年龄在2023岁(包括岁(包括20岁和岁和23岁)岁)之间的学生的姓名、系别和年龄之间的学生的姓名、系别和年龄SELECTSname,Sdept,SageFROMStudentWHERESageBETWEEN20AND23;例例11查查询询年年龄龄不不在在2023岁岁之之间间的的学学生生姓姓名名、系别和年龄系别和年龄SELECTSname,Sdept,SageFROMStudentWHERESageNOTBETWEEN20AND23;(3)确定集合谓词:
谓词:
IN,NOTIN例例12查询信息系(查询信息系(IS)、)、数学系(数学系(MA)和计算和计算机科学系(机科学系(CS)学生的姓名和性别。
学生的姓名和性别。
SELECTSname,SsexFROMStudentWHERESdeptIN(IS,MA,CS);例例13查查询询既既不不是是信信息息系系、数数学学系系,也也不不是是计计算算机机科学系的学生的姓名和性别。
科学系的学生的姓名和性别。
SELECTSname,SsexFROMStudentWHERESdeptNOTIN(IS,MA,CS);(4)字符匹配谓词:
NOTLIKEESCAPE1)匹配串为固定字符串例14查询学号为200215121的学生的详细情况。
SELECT*FROMStudentWHERESnoLIKE200215121;等价于:
SELECT*FROMStudentWHERESno=200215121;字符匹配(续)2)匹配串为含通配符的字符串%:
代表任意长度(长度可以为0)的字符串_:
代表单个字符v注:
注:
SQLServer2000中一个下划线就可表示一个汉字中一个下划线就可表示一个汉字例15查询所有姓刘学生的姓名、学号和性别。
SELECTSname,Sno,SsexFROMStudentWHERESnameLIKE刘%;例16查询姓欧阳且全名为三个汉字的学生的姓名。
SELECTSnameFROMStudentWHERESnameLIKE欧阳_;字符匹配(续)例例17查询名字中第查询名字中第2个字为个字为阳阳字的学生的姓名和字的学生的姓名和学号。
学号。
SELECTSname,SnoFROMStudentWHERESnameLIKE_阳阳%;例例18查询所有不姓刘的学生姓名。
查询所有不姓刘的学生姓名。
SELECTSname,Sno,SsexFROMStudentWHERESnameNOTLIKE刘刘%;字符匹配(续)3)使用换码字符ESCAPE将通配符转义为普通字符例19查询DB_Design课程的课程号和学分。
SELECTCno,CcreditFROMCourseWHERECnameLIKEDB_DesignESCAPE;-ESCAPE表示“”为换码字符例20查询以DB_开头,且倒数第3个字符为i的课程的详细情况。
SELECT*FROMCourseWHERECnameLIKEDB_%i_ESCAPE;(5)涉及空值的查询谓词:
谓词:
ISNULL或或ISNOTNULL“IS”不能用不能用“=”代替代替例例21某些学生选修课程后没有参加考试,某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。
查询缺少所以有选课记录,但没有考试成绩。
查询缺少成绩的学生的学号和相应的课程号。
成绩的学生的学号和相应的课程号。
SELECTSno,CnoFROMSCWHEREGradeISNULL;例例22查所有有成绩的学生学号和课程号。
查所有有成绩的学生学号和课程号。
SELECTSno,CnoFROMSCWHEREGradeISNOTNULL;(6)多重条件查询逻辑运算符:
AND和OR来联结多个查询条件AND的优先级高于OR可以用括号改变优先级可用来实现多种其他谓词NOTINNOTBETWEENAND多重条件查询(续)例例23查询计算机系年龄在查询计算机系年龄在20岁以下的学生岁以下的学生姓名。
姓名。
SELECTSnameFROMStudentWHERESdept=CSANDSage20;多重条件查询(续)改写改写例例12例例12查询信息系(查询信息系(IS)、)、数学系(数学系(MA)和计算机科学系(和计算机科学系(CS)学生的姓名和性别。
学生的姓名和性别。
SELECTSname,SsexFROMStudentWHERESdeptIN(IS,MA,CS)可改写为:
可改写为:
SELECTSname,SsexFROMStudentWHERESdept=ISORSdept=MAORSdept=CS;三、ORDERBY子句ORDERBY子句可以按一个或多个属性列排序升序:
ASC;降序:
DESC;缺省值为升序当排序列含空值时ASC:
排序列为空值的元组最后显示DESC:
排序列为空值的元组最先显示ORDERBY子句(续)例例24查查询询选选修修了了3号号课课程程的的学学生生的的学学号号及及其其成成绩绩,查询结果按分数降序排列。
查询结果按分数降序排列。
SELECTSno,GradeFROMSCWHERECno=3ORDERBYGradeDESC;例例25查询全体学生情况,查询结果按所在系的查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
系号升序排列,同一系中的学生按年龄降序排列。
SELECT*FROMStudentORDERBYSdept,SageDESC;四、聚集函数聚集函数:
计数vCOUNT(DISTINCT|ALL*)vCOUNT(DISTINCT|ALL)计算总和vSUM(DISTINCT|ALL)计算平均值vAVG(DISTINCT|ALL)最大最小值MAX(DISTINCT|ALL)MIN(DISTINCT|ALL)聚集函数(续)例例26查询学生总人数。
查询学生总人数。
SELECTCOUNT(*)FROMStudent;例例27查询选修了课程的学生人数。
查询选修了课程的学生人数。
SELECTCOUNT(DISTINCTSno)FROMSC;例例28计算计算1号课程的学生平均成绩。
号课程的学生平均成绩。
SELECTAVG(Grade)FROMSCWHERECno=1;聚集函数(续)例例29查询选修查询选修1号课程的学生最高分数。
号课程的学生最高分数。
SELECTMAX(Grade)FROMSCWHERECno=1;例例30查询学生查询学生200215122选修课程的总学分数。
选修课程的总学分数。
SELECTSUM(Ccredit)FROMSC,CourseWHERESno=200215122ANDSC.Cno=Course.Cno;五、GROUPBY子句GROUPBY子句分组,细化聚集函数的作用对象未对查询结果分组,聚集函数将作用于整个查询结果对查询结果分组后,聚集函数将分别作用于每个组作用对象是查询的中间结果表按指定的一列或多列值分组,值相等的为一组注意:
在SQLServer中,使用GroupBy子句后,Select子句的字段列表达式只能是分组依据和聚集函数GROUPBY子句(续)例例31求各个课程号及相应的选课人数。
求各个课程号及相应的选课人数。
SELECTCno,COUNT(Sno)FROMSCGROUPBYCno;查询结果:
查询结果:
CnoCOUNT(Sno)122234344433548GROUPBY子句(续)例例32查查询询选选修修了了3门门以以上上课课程程的的学学生生学号。
学号。
SELECTSnoFROMSCGROUPBYSnoHAVINGCOUNT(*)3;GROUPBY子句(续)HAVING短语与WHERE子句的主要区别是作用对象不同WHERE子句作用于基表或视图,从中选择满足条件的元组HAVING短语作用于组,从中选择满足条件的组。
3.4数据查询3.4.1单表查询3.4.2连接查询3.4.3嵌套查询3.4.4集合查询3.4