您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > 数据库原理及应用(何玉洁)第二版第4章
1第4章数据操作4.1数据查询功能4.2数据更改功能2一、查询语句的基本结构查询语句是从数据库中检索满足条件的数据基本结构可描述为:SELECT目标列名序列--需要哪些列FROM数据源--来自于哪些表[WHERE检索条件表达式]--根据什么条件[GROUPBY分组依据列][HAVING组提取条件][ORDERBY排序依据列]4.1数据查询功能3二、简单查询选择表中若干列1、查询指定的列例.查询全体学生的学号与姓名SELECTSno,SnameFROMStudentSnosname9512101李勇9512102刘晨9512103王敏9521101张立9521102吴宾9521103张海9531101钱小平9531102王大力结果为:42、查询全部列例.查询全体学生的记录SELECTSno,Sname,Ssex,Sage,SdeptFROMStudent等价于:SELECT*FROMStudent结果为:SnoSnameSsexSageSdept9512101李勇男19计算机系9512102刘晨男20计算机系9512103王敏女20计算机系9521101张立男22信息系9521102吴宾女21信息系9521103张海男20信息系9531101钱小平女18数学系9531102王大力男19数学系53、查询经过计算的列SELECT子句中的目标列名序列可以是表中存在的属性列,也可以是表达式、常量或者函数。例.查询全体学生的姓名及其出生年份SELECTSname,2002-SageFROMStudent结果为:Sname(无列名)李勇1982刘晨1981王敏1981张立1979吴宾1980张海1981钱小平1983王大力19826改变列标题的语法格式为:列名|表达式[AS]列标题或:列标题=列名|表达式例如,对于上例可写成:SELECTSname姓名,2002-Sage年份FROMStudent结果为:姓名年份李勇1982刘晨1981王敏1981张立1979吴宾1980张海1981钱小平1983王大力19827选择表中的若干元组1、消除取值相同的行例.在选课表(SC)中查询有哪些学生修了课程,要求列出学生的学号。SELECTSnoFROMSC在这个结果中有许多重复的行。SQL中的DISTINCT关键字可以去掉结果表中的重复行。SELECTDISTICTSnoFROMSC则执行结果为:Sno9512101951210295211029521103953110182、查询满足条件的元组查询满足条件的元组是通过WHERE子句实现的。WHERE子句常用的查询条件如表3-13所示。查询条件谓词比较(比较运算符)=,,=,,=,(或!=)NOT+上述比较运算符确定范围BETWEENAND,NOTBETWEENAND确定集合IN,NOTIN字符匹配LIKE,NOTLIKE空值ISNULL,ISNOTNULL多重条件(逻辑谓词)AND,OR9(1)比较大小例.查询计算机系全体学生的姓名。SELECTSnameFROMStudentWHERESdept='计算机系'结果为:Sname李勇刘晨王敏10SnameSage李勇19钱小平18王大力19注意:取反操作的执行效率比较低例.查询所有年龄在20岁以下的学生的姓名及年龄SELECTSname,SageFROMStudentWHERESage20或:SELECTSname,SageFROMStudentWHERENOTSage=20结果为:11(2)确定范围BETWEEN…AND和NOTBETWEEN…AND是一个逻辑运算符,可以用来查找属性值在或不在指定范围内的元组。BETWEEN…AND…的格式为:列名|表达式[NOT]BETWEEN下限值AND上限值BETWEEN…AND一般用于对数值型数据进行比较。列名或表达式的类型要与下限值或上限值的类型相同。12例.查询年龄在20~23岁之间的学生的姓名、所在系和年龄SELECTSname,Sdept,SageFROMStudentWHERESageBETWEEN20AND23此句等价于:SELECTSname,Sdept,SageFROMStudentWHERESage=20ANDSage=23结果为:SnameSdeptSage刘晨计算机系20王敏计算机系20张立信息系22吴宾信息系21张海信息系2013例.查询年龄不在20~23之间的学生姓名、所在系和年龄。SELECTSname,Sdept,SageFROMStudentWHERESageNOTBETWEEN20AND23此句等价于:SELECTSname,Sdept,SageFROMStudentWHERESage20ORSage23结果为:SnameSdeptSage李勇计算机系19钱小平数学系18王大力数学系1914(3)确定集合IN是一个逻辑运算符,可以用来查找属性值属于指定集合的元组。使用IN的格式为:列名[NOT]IN(常量1,常量2,…常量n)IN的含义为:当列中的值与IN中的某个常量值相等时,则结果为True,表明此记录为符合查询条件的记录;NOTIN的含义正好相反:当列中的值与某个常量值相同时,则结果为False,表明此记录为不符合查询条件的记录;15例.查询信息系、数学系和计算机系学生的姓名和性别。SELECTSname,SsexFROMStudentWHERESdeptIN('信息系','数学系','计算机系')此句等价于:SELECTSname,SsexFROMStudentWHERESdept='信息系'ORSdept='数学系'ORSdept='计算机系'16(4)字符匹配LIKE用于查找指定列名与匹配串常量匹配的元组。通配符用于表示任意的字符或字符串。在LIKE运算符前边也可以使用NOT运算符,表示对结果取反。LIKE运算符的一般形式为:列名[NOT]LIKE匹配串匹配串中可包含如下四种通配符:_:匹配任意一个字符;%:匹配0个或多个字符;[]:匹配[]中的任意一个字符;[^]:不匹配[]中的任意一个字符。17例.查询姓‘张’的学生的详细信息。SELECT*FROMStudentWHERESnameLIKE'张%'结果为:SnoSnameSsexSageSdept9521101张立男22信息系9521103张海男20信息系18例.查询学生表中姓‘张’、姓‘李’和姓‘刘’的学生的情况。SELECT*FROMStudentWHERESnameLIKE'[张李刘]%'结果为:SnoSnameSsexSageSdept9512101李勇男19计算机系9512102刘晨男20计算机系9521101张立男22信息系9521103张海男20信息系19例.查询名字中第2个字为‘小’或‘大’字的学生的姓名和学号。SELECTSname,SnoFROMStudentWHERESnameLIKE'_[小大]%'结果为:SnameSno钱小平9531101王大力953110220(5)涉及空值的查询空值(NULL)在数据库中有特殊的含义,它表示不确定的值。判断某个值是否为NULL值,不能使用普通的比较运算符(=、!=等),而只能使用专门的判断NULL值的子句来完成。判断取值为空的语句格式为:列名ISNULL判断取值不为空的语句格式为:列名ISNOTNULL例.查询无考试成绩的学生的学号和相应的课程号SELECTSno,CnoFROMSCWHEREGradeISNULL21(6)多重条件查询在WHERE子句中可以使用逻辑运算符AND和OR来组成多条件查询。用AND连接的条件表示必须全部满足所有的条件的结果才为True,用OR连接的条件表示只要满足其中一个条件结果即为True。例.查询计算机系年龄在20岁以下的学生姓名。SELECTSnameFROMStudentWHERESdept='CS'ANDSage2022对查询结果进行排序排序子句的格式为:ORDERBY列名[ASC|DESC][,…n]其中列名为排序的依据列,可以是列名或列的别名。当指定多个排序依据列时,首先按排在最前面的列进行排序,如果排序后存在两个或两个以上列值相同的记录,则对这些值相同的记录再依据排在第二位的列进行排序,…,依此类推。23例.将学生按年龄的升序排序。SELECT*FROMStudentORDERBYSage例.查询全体学生的信息,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列。SELECT*FROMStudentORDERBYSdept,SageDESC24使用聚合函数汇总数据计算函数也称为集合函数或聚合函数、聚集函数,其作用是对一组值进行计算并返回一个单值。SQL提供的计算函数有:COUNT(*):统计表中元组个数;COUNT(列名):统计本列列值个数;SUM(列名):AVG(列名):MAX(列名):MIN(列名):上述函数中除COUNT(*)外,其他函数在计算过程中均忽略NULL值。25例.统计学生总人数。SELECTCOUNT(*)FROMStudent例.统计选修了课程的学生的人数。SELECTCOUNT(DISTINCTSno)FROMSC例.查询选修了’C01’号课程的学生的最高分和最低分。SELECTMAX(Grade),MIN(Grade)FROMSCWHERECno='C01'注意:计算函数不能出现在WHERE子句中。例:查询年龄最大的学生的姓名,如下写法是错误的:SELECTSnameFROMStudentWHERESage=MAX(Sage)26对查询结果进行分组计算GROUPBY分组的目的是细化计算函数的作用对象。在一个查询语句中,可以使用任意多个列进行分组。需要注意的是:如果使用了分组子句,则查询列表中的每个列必须要么是分组依据列(groupby后边的列),要么是计算函数。使用GROUPBY时,如果在SELECT的查询列表中包含计算函数,则是针对每个组计算出一个汇总值,从而实现对查询结果的分组统计。分组语句的一般形式为:GROUPBY分组依据列[,…n][HAVING组提取条件]27使用GROUPBY例.统计每门课程的选课人数,列出课程号和人数。SELECTCnoas课程号,COUNT(Sno)as选课人数FROMSCGROUPBYCno查询结果为:课程号选课人数c013C024c042c053c06228使用HAVINGHAVING子句用于对分组后的结果再进行过滤,它的功能有点像WHERE子句,但它用于组而不是对单个记录。在HAVING子句中可以使用计算函数,但在WHERE子句中则不能。HAVING通常与GROUPBY子句一起使用。例.查询修了3门以上课程的学生的学号。SELECTSnoFROMSCGROUPBYSnoHAVINGCOUNT(*)3结果为:Sno952110229三、多表连接查询内连接只有满足连接条件的元组才能作为结果输出内连接的格式为:FROM表1[INNER]JOIN表2ON连接条件连接条件的一般格式为:[表名1.][列名1]比较运算符[表名2.][列名2]注意:两个表的连接列必须是可比较的,即必须是语义相同的列,否则比较将是无意义的。当比较运算符为等号(=)时,称为等值连接,使用其他运算符的连接称为非等值连接。30例.查询每个学生及其修课的情况。SELECT*FROMStudentINNERJOINSCONStudent.Sno=SC.SnoSnoSnameSsexSageSdeptSnoCnoGradeXKLB9512101李勇男19计算机系9512101c0190必修9512101李勇男19计算机系9512101c0286选修9512101李勇男19计算机系9512101c06NULL必修9512102刘晨男20计算机系9512102c0278选修9512102刘晨男20计算机系95
本文标题:数据库原理及应用(何玉洁)第二版第4章
链接地址:https://www.777doc.com/doc-4139248 .html