SQL的数据查询操作数据查询语句是SQL的核心,是SQL数据操纵功能的重要组成部分。SQL的查询语句使用非常灵活,功能十分强大,可以实现:简单查询连接查询嵌套查询查询语句的一般形式查询语句的一般形式是:SELECT目标列FROM基本表名或视图名[WHERE条件表达式][GROUPBY列名1[HAVING条件表达式]][ORDERBY列名2[次序]]SELECT子句指明要查询的项目FROM子句指明被查询的基本表或视图WHERE子句指明查询的条件GROUPBY子句指明如何将查询结果进行分组ORDERBY子句指明查询结果如何排序3.4.1单表查询简单查询:实现在单个基本表上的投影、选择和经过计算等的查询,暂不涉及多个基本表的连接查询和嵌套查询等复杂的情况。查询指定列〖例1〗在基本表S中查询全体学生的学号与姓名。〖例2〗查询全体学生的姓名、学号、所在系SELECTSno,SnameFROMStudentSELECTSname,Sno,SdeptFROMStudent;注:目标列表达式中各个列的先后顺序可以与表中的顺序不一致。可以根据需要去改变列的显示顺序简单查询—选择表中的列(续)查询全部列在基本表S中查询全体学生的详细信息。①SELECT*FROMStudent由于是查询S表的全部属性,所以在SELECT的后面使用符号“*”。该查询语句等价于:②SELECTSno,Sname,Ssex,Sage,SdeptFROMStudent简单查询—选择表中的列(续)3.查询经过计算的值例4查全体学生的姓名及其出生年份selectSname,2011-SagefromStudentSname2011-Sage李勇1991刘晨1992王敏1993张立1992简单查询—选择表中的列(续)例5查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。Sname‘YearofBirth:’李勇YearofBirth:1991cs刘晨YearofBirth:1992is王敏YearofBirth:1993ma张立YearofBirth:1992isselectSname,'YearofBirth:',2011-Sage,LOWER(sdept)fromStudent简单查询—选择表中的列(续)用户可以通过指定别名来改变查询结果的列标题。NAMEBIRTHBIRTHDAYDEPARTMENT李勇YearofBirth:1985cs刘晨YearofBirth:1986is王敏YearofBirth:1987ma张立YearofBirth:1986isselectSnameNAME,'YearofBirth:'BIRTH,2005-SageBIRTHDAY,LOWER(sdept)DEPARTMENTfromStudent;选择表中的若干元组例6查询选修了课程的学生学号结果消除重复的行=默认为all选择表中的若干元组2查询满足条件的元组常用的查询条件查询条件谓词比较(比较运算符)=、、=、、=、(!=)、NOT确定范围BETWEENAND,NOTBETWEENAND确定集合IN,NOTIN字符匹配LIKE,NOTLIKE空值ISNULL,ISNOTNULL多重条件AND,OR选择表中的若干元组一比较大小例7查询计算机系全体学生的名单SelectSnamefromstudentwhereSdept='CS';例9查询考试成绩有不及格的学生的学号SelectdistinctSnofromCoursewhereGrade60;例8查询所有年龄在20岁以下的学生姓名及其年龄SelectSname,SagefromstudentwhereSage20;选择表中的若干元组二确定范围谓词:between…and…和notbetween…and…selectSname,Sdept,SagefromStudentwhereSagenotbetween20and23;例11查询年龄不在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄selectSname,Sdept,SagefromStudentwhereSagebetween20and23;例10查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄等价形式选择表中的若干元组三确定集合谓词in用来查找属性值属于指定集合的元组例12查询信息系(IS)、数学系(MA)和计算机系(CS)学生的姓名和性别。SelectSname,SsexfromStudentwhereSdeptin('IS','MA','CS')例13查询既不是信息系(IS)、数学系(MA)也不是计算机系(CS)学生的姓名和性别。SelectSname,SsexfromStudentwhereSdeptnotin('IS','MA','CS')选择表中的若干元组四字符匹配谓词like可以用来进行字符串的匹配。语法格式如下:[not]like‘匹配串’[escape‘换码字符’]含义:查找指定的属性列值与匹配串相匹配的元组。匹配串可以是一个完整的字符串,也可以含有通配符%和_。其中:%代表任意长度(长度可以为0)的字符串。例如a%b表示以a开头,以b为结尾的任意长度的字符串。_(下划线)代表任意单个字符。选择表中的若干元组例14查询学号为200215121的学生的详细情况select*fromstudentwhereSnolike'200215121';等价于select*fromstudentwhereSno='200215121';例15查询所有姓刘的学生的姓名、学号和性别selectSname,Sno,SsexfromStudentwhereSnamelike'刘%'例16查询姓“欧阳”且全名为三个汉字的学生的姓名selectSnamefromStudentwhereSnamelike‘欧阳_’;选择表中的若干元组例17查询名字中第2个字为“阳”字的学生的姓名和学号例18查询所有不姓刘的学生姓名例19查询DB_Design课程的课程号和学分例20查询以“DB_”开头,且倒数第3个字符为i的课程的详细情况selectSname,SnofromStudentwhereSnamelike'_阳%';selectSname,Sno,SsexfromstudentwhereSnameNOTLIKE'刘%'selectCno,CcreditfromCoursewhereCnameLIKE'DB\_design'escape'\'Select*fromCoursewhereCnamelike'DB\_%i__'escape'\'选择表中的若干元组五涉及空值的查询例21某些学生选修课程后没有参加考试,所有有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。selectSno,CnofromSCwhereGradeISNULL例22查询所有有成绩的学生学号和课程号selectSno,CnofromSCwhereGradeisnotnull“is”不能用“=”来表示选择表中的若干元组六多重条件查询用逻辑运算符and和or可用来联结多个查询条件,但and的优先级要高于or,可以用括号来改变优先级例23查询计算机系年龄在20岁以下的学生姓名selectSnamefromStudentwhereSdept='CS'ANDSage20;对查询结果进行排序关键词:orderby可以用orderby对查询结果按照一个或多个属性列的升序ASC或降序DESC排序,缺省值为ASC例24查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列selectSno,GradefromSCwhereCno='3'orderbyGradeDESC注:对于空值,若按升序排,含空值的元组将最前显示。若按降序排,空值的元组将最后显示例25查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。select*fromStudentorderbySdept,SageDESC;四、使用集函数5类主要集函数计数COUNT([DISTINCT|ALL]*)COUNT([DISTINCT|ALL]列名)计算总和SUM([DISTINCT|ALL]列名)计算平均值AVG([DISTINCT|ALL]列名)使用集函数(续)求最大值MAX([DISTINCT|ALL]列名)求最小值MIN([DISTINCT|ALL]列名)DISTINCT短语:在计算时要取消指定列中的重复值ALL短语:不取消重复值ALL为缺省值使用集函数(续)[例26]查询学生总人数。[例27]查询选修了课程的学生人数。用DISTINCT以避免重复计算学生人数使用集函数(续)[例28]计算1号课程的学生平均成绩。[例29]查询选修1号课程的学生最高分数。五、对查询结果分组使用GROUPBY子句分组细化集函数的作用对象未对查询结果分组,集函数将作用于整个查询结果对查询结果分组后,集函数将分别作用于每个组使用GROUPBY子句分组[例30]求各个课程号及相应的选课人数。对查询结果分组(续)GROUPBY子句的作用对象是查询的中间结果表分组方法:按指定的一列或多列值分组,值相等的为一组使用GROUPBY子句后,SELECT子句的列名列表中只能出现分组属性和集函数使用HAVING短语筛选最终输出结果[例31]查询选修了3门以上课程的学生学号。例题[例32]查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数使用HAVING短语筛选最终输出结果只有满足HAVING短语指定条件的组才输出HAVING短语与WHERE子句的区别:作用对象不同WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。题目:公司员工上班,来一天有一天的记录,请写出查询公司员工最后一天来的记录.Worker(Wno,Wname,Wdate)SelectWno,max(wdate)fromworkergroupbyWno