第九章查询查询:从数据库中获得所需要的数据。查询利用SELECT语句实现。语句格式SELECT[ALLDIsTINCT]<目标列表达式>[,<目标列表达式>]..[INTO 新表名]FROM<表名>[,<表名>].【WHERE<条件表达式>】[GROUP BY<列名 1>[,<列名2>][HAVING<条件表达式>][ORDERBY<列名3>[AsC|DEsC] [,<列名4>[AsC|DEsC]]SELECT子句:指定要显示的属性列INTO子句:将查询到的结果集形成一个新表FROM子句:指定查询对象(表)WHERE子句:指定查询条件GROUPBY子句:对查询结果按指定列进行分组,该属性列值相等的元组为一个组。HAVING子句:筛选出只有满足指定条件的组ORDERBY子句:对查询结果表按指定列值的升序或降序排序数据库的查询包括:■单表查询■连接查询■嵌套查询示例数据库school数据库student(sno,sname,ssex,sbirthday,class)teacher(tno,tname,tsex,tbirthday,prof,depart)course(cno,cname,tno)score(sno,cno,degree)9.1单表查询查询仅涉及一个表,是一种最简单的查询操作一、选择表中的若干列二、选择表中的若干行三、对查询结果排序四、使用集函数五、对查询结果分组六、HAVING子句一、选择表中的若干列1查询指定列例1】查询全体学生的学号与姓名。SELECT sno,snameFROM student【例2]查询全体学生的姓名、学号、班号
第九章 查询 查询:从数据库中获得所需要的数据。 查询利用 SELECT 语句实现。 语句格式 SELECT [ALL|DIsTINCT] <目标列表达式>[,<目标列表达式>] . [INTO 新表名] FROM <表名>[, <表名> ] . [ WHERE <条件表达式> ] [ GROUP BY <列名 1> [,<列名 2>]] [ HAVING <条件表达式> ] [ ORDER BY <列名 3> [ AsC|DEsC ] [,<列名 4>[ AsC|DEsC ] ]] SELECT 子句:指定要显示的属性列 INTO 子句:将查询到的结果集形成一个新表 FROM 子句:指定查询对象(表) WHERE 子句:指定查询条件 GROUP BY 子句:对查询结果按指定列进行分组,该属性列值相等的元组为一个组。 HAVING 子句:筛选出只有满足指定条件的组 ORDER BY 子句:对查询结果表按指定列值的升序或降序排序 数据库的查询包括: ◼ 单表查询 ◼ 连接查询 ◼ 嵌套查询 示例数据库 school 数据库 student(sno,sname,ssex,sbirthday,class) teacher(tno,tname,tsex,tbirthday,prof,depart) course(cno,cname,tno) score(sno,cno,degree) 9.1 单表查询 查询仅涉及一个表,是一种最简单的查询操作 一、选择表中的若干列 二、选择表中的若干行 三、对查询结果排序 四、使用集函数 五、对查询结果分组 六、HAVING 子句 一、选择表中的若干列 1 查询指定列 例 1] 查询全体学生的学号与姓名。 SELECT sno,sname FROM student [例 2] 查询全体学生的姓名、学号、班号
SELECT sname,sno,classFROM student2查询全部列[例3]查询全体学生的详细记录。SELECTsno,sname,ssex,sage,sdeptFROM student或SELECT*FROM student3修改查询结果中的列标题【例4】查询student表中所有记录,结果中各列的标题分别指定为学号、姓名、性别、出生日期、班号。SELECTsnoAS学号,snameAS姓名ssexAS性别,lauAS出生日期,classAS班号SDTFROM student学号=sno或sno学号4替换查询结果中的数据CASEWHEN条件1THEN表达式1WHEN条件2THEN表达式2ELSE表达式nEND【例5】查询score表sno,sname,degree列,对degree列按以下规则进行转换;若degree为90~100,替换为"优秀”,若degree为80~89,替换为"良好”,若degree在70~79之间,替换为"中等”,若degree为60~69之间,替换为"及格”,若degree为0~59之间,替换为"不及格",列标题更改为"evaluation。SELECT sno,cno,evaluation=CASEWHENdegree>=90ANDdegree<-100THEN'优秀WHEN degree>=80 and degree<=89 THEN'良好”WHEN degree>=70 and degree<=79 THEN"中等WHEN degree>=60 and degree<=69 THEN'及格"ELSE不及格ENDFROMscore5查询经过计算的值SELECT子句的<目标列表达式>为表达式■算术表达式
SELECT sname,sno,class FROM student 2 查询全部列 [例 3] 查询全体学生的详细记录。 SELECT sno,sname,ssex,sage,sdept FROM student 或 SELECT * FROM student 3 修改查询结果中的列标题 【例 4】 查询 student 表中所有记录,结果中各列的标题分别指定为学号、姓名、性别、 出生日期、班号。 SELECT sno AS '学号', sname AS '姓名',ssex AS'性别', sbirthday AS '出生日期',class AS '班号' FROM student 4 替换查询结果中的数据 CASE WHEN 条件 1 THEN 表达式 1 WHEN 条件 2 THEN 表达式 2 . . . ELSE 表达式 n END 【例 5】查询 score 表 sno,sname,degree 列,对 degree 列按以下规则进行转换;若 degree 为 90~100,替换为“优秀”,若 degree 为 80 ~ 89,替换为“良好”,若 degree 在 70 ~ 79 之 间,替换为“中等”,若 degree 为 60 ~ 69 之间,替换为“及格”,若 degree 为 0~ 59 之间, 替换为“不及格”,列标题更改为“evaluation”。 SELECT sno, cno, evaluation= CASE WHEN degree>=90 AND degree<=100 THEN '优秀' WHEN degree>=80 and degree<=89 THEN '良好' WHEN degree>=70 and degree<=79 THEN '中等' WHEN degree>=60 and degree<=69 THEN '及格' ELSE '不及格' END FROM score 5 查询经过计算的值 SELECT 子句的<目标列表达式>为表达式 ◼ 算术表达式 '学号'=sno 或 sno '学号
■字符串常量■函数【例6]查全体学生的姓名及其年龄。SELECT sname,'age:,2000-DATEPART(yy,sbirthday)FROM student二、选择表中的若干行1消除结果集中的重复ALL与DISTINCT【例7]查询选修了课程的学生学号。(1) SELECT snoFROMscore或(默认 ALL)SELECTALL snoFROMscore(2)SELECTDISTINCT snOFROMscore2限制结果集的返回行数可使用TOP选项限制查询结果集返回的行数。其基本格式为:TOP n[PERCENT][例8]SELECTTOP4*FROMscoreSELECTTOP4OPERCENT*FROMscore3查询满足条件的行WHERE子句常用的查询条件谓词查询条件比较=,>≤>BETWEENN...AND.... NOT BETWEEN... AND...确定范围IN. NOT IN确定集合C,NOTLIKE字符匹配LIKE空值IS NULL, IS NOT NULLAND,多重条件OR(1)表达式比较在WHERE子句的<比较条件>中使用比较运算符 =, >, <, >=, <=, I=或 , [>, <,■逻辑运算符NOT+比较运算符[例9]】查询所有在'1975-01-01"后出生的学生学号及其姓名。SELECT sno,sname
◼ 字符串常量 ◼ 函数 [例 6] 查全体学生的姓名及其年龄。 SELECT sname,'age:',2000-DATEPART(yy,sbirthday) FROM student 二、选择表中的若干行 1 消除结果集中的重复 ALL 与 DISTINCT [例 7] 查询选修了课程的学生学号。 (1) SELECT sno FROM score 或(默认 ALL) SELECT ALL sno FROM score (2) SELECT DISTINCT sno FROM score 2 限制结果集的返回行数 可使用 TOP 选项限制查询结果集返回的行数。其基本格式为: TOP n [PERCENT] [例 8] SELECT TOP 4 * FROM score SELECT TOP 40 PERCENT * FROM score 3 查询满足条件的行 WHERE 子句常用的查询条件 查询条件 谓 词 比 较 =,>,<,>=,<=,!=,<>,!>,!<; 确定范围 BETWEEN .AND.,NOT BETWEEN. AND. 确定集合 IN ,NOT IN 字符匹配 LIKE ,NOT LIKE 空 值 IS NULL ,IS NOT NULL 多重条件 AND ,OR 查询条件 谓 词 比 较 =,>,<,>=,<=,!=,<>,!>,!<; 确定范围 BETWEEN .AND.,NOT BETWEEN. AND. 确定集合 IN ,NOT IN 字符匹配 LIKE ,NOT LIKE 空 值 IS NULL ,IS NOT NULL 多重条件 AND ,OR (1)表达式比较 在 WHERE 子句的<比较条件>中使用比较运算符 ◼ =,>,<,>=,<=,!= 或 <>,!>,!<, ◼ 逻辑运算符 NOT + 比较运算符 [例 9] 查询所有在’1975-01-01’后出生的学生学号 及其姓名。 SELECT sno,sname
FROMstudent或WHEREsbirthday>'1975-01-01'SELECTsno,snameFROMstudentWHERE NOT sbirthday <='1975-01-01'(2)指定范围M使用谓词BETWEEN...ANDNOTBETWEENAND【例10]查询成绩在60~80(包括60分和80分)之间的所有记录。SELECT * FROM scoreWHEREdegreeBETWEEN60AND80[例11]查询成绩不在60~80之间的所有记录。SELECT*FROMscoreWHEREdegreeNOTBETWEEN60AND80(3)确定集合IN<取值表>,NOTIN<取值表><取值表>:用逗号分隔的一组取值[例12]查询成绩为85、86或88的记录。SELECT*FROMscoreWHERE degree IN(85,86,88)[例13]查询成绩既不是85、86,也不是88的记录。SELECT*FROMscoreWHERE degree NOT IN(85,86,88)(4)字符匹配■[NOT]LIKE“<匹配串>”[ESCAPE‘<换码字符>"]<匹配串>:固定字符串或含通配符的字符串当匹配串为固定字符串时:可以用=运算符取代LIKE谓词用!=或<>运算符取代NOTLIKE谓词1)匹配串为固定字符串例14]查询学号为101的学生的详细情况。SELECT*FROMstudentWHEREsnoLIKE101
FROM student WHERE sbirthday>’1975-01-01’ 或 SELECT sno,sname FROM student WHERE NOT sbirthday <= '1975-01-01' (2) 指定范围 ◼ 使用谓词 BETWEEN . AND . NOT BETWEEN . AND . [例 10] 查询成绩在 60~80(包括 60 分和 80 分)之间的所有记录。 SELECT * FROM score WHERE degree BETWEEN 60 AND 80 [例 11] 查询成绩不在 60~80 之间的所有记录。 SELECT * FROM score WHERE degree NOT BETWEEN 60 AND 80 (3) 确定集合 IN <取值表>, NOT IN <取值表> <取值表>:用逗号分隔的一组取值 [例 12]查询成绩为 85、86 或 88 的记录。 SELECT * FROM score WHERE degree IN(85,86,88) [例 13] 查询成绩既不是 85、86,也不是 88 的记录。 SELECT * FROM score WHERE degree NOT IN(85,86,88) (4) 字符匹配 ◼ [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’] <匹配串>:固定字符串或含通配符的字符串 当匹配串为固定字符串时: 可以用 = 运算符取代 LIKE 谓词 用 != 或 < >运算符取代 NOT LIKE 谓词 1) 匹配串为固定字符串 [例 14] 查询学号为 101 的学生的详细情况。 SELECT * FROM student WHERE sno LIKE ‘101
等价于:SELECT*FROMstudentWHEREsn0=“101'·%(百分号)代表任意长度(长度可以为0)的字符串■1例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab等都满足该匹配串★(下划线)代表任意单个字符-例:ab表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串2)匹配串为含通配符的字符串[例15]查询所有姓王学生的姓名、学号和性别。SELECTsname,sno,ssexFROMstudentWHEREsnameLIKE'王%【例16]查询姓“李”且全名为二个汉字的学生的姓名。SELECT snameFROMstudentWHEREEsnameLIKE李【例17]查询名字中第2个字为"阳"字的学生的姓名和学号。SELECT sname,snoFROM studentWHEREsnameLIKE'阳%【例18]查询所有不姓李的学生姓名。SELECTsnameFROM studentWHEREsnameNOTLIKE李%■当用户要查询的字符串本身就含有%或时,要使用ESCAPE<换码字符>短语对通配符进行转义。3)使用换码字符将通配符转义为普通字符[例19]查询课程名为DB_Design课程的课程号和任课教师。SELECTcno,tnoFROMcourseWHEREcnameLIKE'DBIDesign'ESCAPE"使用换码字符将通配符转义为普通字符(续)[例20]查询以"DB"开头,且倒数第3个字符为i的课程的详细情况。SELECT*FROMcourse
等价于: SELECT * FROM student WHERE sno = ‘101' % (百分号) 代表任意长度(长度可以为 0)的字符串 ◼ 例:a%b 表示以 a 开头,以 b 结尾的任意长度的字符串。如 acb,addgb,ab 等都满足该匹配串 _ (下划线) 代表任意单个字符 ◼ 例:a_b 表示以 a 开头,以 b 结尾的长度为 3 的任意字符串。如 acb,afb 等 都满足该匹配串 2) 匹配串为含通配符的字符串 [例 15] 查询所有姓王学生的姓名、学号和性别。 SELECT sname,sno,ssex FROM student WHERE sname LIKE '王%' [例 16] 查询姓“李”且全名为二个汉字的学生的姓名。 SELECT sname FROM student WHERE sname LIKE '李_' [例 17] 查询名字中第 2 个字为"阳"字的学生的姓名和学号。 SELECT sname,sno FROM student WHERE sname LIKE '_阳%' [例 18] 查询所有不姓李的学生姓名。 SELECT sname FROM student WHERE sname NOT LIKE ‘李%' ◼ 当用户要查询的字符串本身就含有 % 或 _ 时,要使用 ESCAPE '<换码字符>' 短语 对通配符进行转义。 3) 使用换码字符将通配符转义为普通字符 [例 19] 查询课程名为 DB_Design 课程的课程号和任课教师。 SELECT cno,tno FROM course WHERE cname LIKE 'DB\_Design' ESCAPE '\' 使用换码字符将通配符转义为普通字符(续) [例 20] 查询以"DB_"开头,且倒数第 3 个字符为 i 的课程的详细情况。 SELECT * FROM course