2023年6月21日发(作者:)
数据库知识点——SQL查询⼀、学⽣⼀、-课程数据库数据⽰例(⼀)学⽣表学号(Sno)2姓名(Sname)李勇刘晨王敏张⽴性别(Ssex)男⼥⼥男年龄(Sage)20191819所在系(Sdept)CSCSMAIS
(⼆)课程表课程号(Cno)1234567课程名(Cname)数据库数学信息系统操作系统数据结构数据处理PASCAL语⾔先⾏课(Cpno)5
167
6学分(Ccredit)4243424
(三)选课表学号(Sno)2200215122课程号(Cno)12323成绩(Grade)9285889080
⼆、查询(⼀)单表查询1、选择表中的若⼲列(对列操作)(1)查询指定列(2)查询全部列(3)查询经过计算的值【例1】查询全体学⽣的姓名、出⽣年份和所在的院系,要求⽤⼩写字符表⽰所有系名。SQL语句:SELECT Sname,'Year of Birth',2004-Sage,LOWER(Sdept) FROM student;查询结果:
2、选择表中的若⼲元组(对⾏操作)(1)消除取值重复的⾏两个本来并不完全相同的元组,投影到指定的某些列以后,可能变成相同的⾏了,可以使⽤DISTINCT取消重复的元组。格式如下:selectdistinct Sno form SC;【例2】查询选修了课程的学⽣学号,要求不重复出现。SQL语句:SELECT DISTINCT Sno FROM sc;查询结果:
(2)查询满⾜条件的元组(where条件查询)查询条件⽐较确定范围确定集合谓词=, >, <, >=, <=, !=, <>, !>, !<, NOT+上述⽐较运算符between and(a<=x<=b),not between andin,not inlike,not like%:任意长度(可为0)字符串字符匹配注意:字符集为ASCII时,⼀个汉字需要两个‘_’;字符集为GBK时,⼀个汉字需要⼀个‘_’如果⽤户要查询的字符串本⾝含有通配符,使⽤转义字符’’空值多重条件(逻辑运算)is NULL,is not NULL(判空不能⽤=)and,or,not_:任意单个字符
【例3】查询年龄不在20-23岁之间的学⽣姓名、系别和年龄。SQL语句:SELECT Sname,Sdept,Sage FROM student WHERE Sage NOT BETWEEN 20 AND 23;查询结果:
【例4】查询计算机科学系(CS)、数学系(MA)学⽣的姓名和性别。SQL语句:SELECT Sname,Ssex FROM student WHERE Sdept IN ('CS','MA');查询结果:
【例5】查询所有姓刘的学⽣的全部信息。SQL语句:SELECT * FROM student where Sname LIKE '刘%';查询结果:
【例6】查询所有以“数据”开头且课程名为四个字的课程全部信息。SQL语句:SELECT * FROM course where Cname LIKE '数据__';查询结果:
【例7】查询没有先修课程的课程全部信息。SQL语句:SELECT * FROM course where Cpno IS NULL;查询结果:
3、ORDER BY⼦句⽤户可以使⽤ORDER BY⼦句对查询结果按照⼀个或多个属性列的升序(ASC)或者降序(DESC)排列,缺省值为升序。如果是按照多个属性列进⾏排序,则⾸先按照第⼀个属性排序,当第⼀个属性相同时,再按照第⼆个属性列排序,以此类推。ORDER BY⼦句放在WHERE条件的后⾯。例如:select *from Student where Ssex=’男’ order by Sno,Sage desc;【例8】查询选修了3号课程的所有信息,查询结果按照分数的降序排列。SQL语句:SELECT * FROM sc WHERE Cno=3 ORDER BY Grade DESC;查询结果:
4、聚集函数在聚集函数中遇到空值时,除了COUNT(*) 外,都跳过空值⽽只处理⾮空值。注意,WHERE⼦句中不能使⽤聚集函数作为条件表达式的。如果指定DISTINCT短语,则表⽰在计算时要取消指定列中的重复值。聚集函数COUNT([DISTINCT|ALL]*)COUNT([DISTINCT|ALL]<列名>)SUM([DISTINCT|ALL]<列名>)AVG([DISTINCT|ALL]<列名>)MAX([DISTINCT|ALL]<列名>)MIN([DISTINCT|ALL]<列名>)含义统计元组个数统计⼀列中值的个数计算⼀列值的总和(必须是整型)计算⼀列值的平均值(必须是整型)求⼀列值中的最⼤值求⼀列值中的最⼩值
【例9】计算1号课程的学⽣平均成绩。SQL语句:SELECT AVG(Grade) average FROM sc WHERE Cno=1;查询结果:
5、GROUP BY ⼦句GROUP BY ⼦句将查询结果按某⼀列或多列的值分组,值相等的为⼀组。对查询结果分组的⽬的是为了细化聚集函数的作⽤对象。如果未对查询结果分组,聚集函数将作⽤于整个查询结果,分组后聚集函数将作⽤于每个组,即每⼀组都有⼀个函数值。如果分组后还要求按⼀定的条件对这些组进⾏筛选,最终只输出满⾜指定条件的组,则可以使⽤HAVING短语指定筛选条件。例如:SELECT * FROM sc GROUP BY Sno HAVING Count(*)>=2;(查询选修了2门及以上课程的学⽣学号)。WHERE⼦句和HAVING短语的区别在于作⽤对象不同。WHERE⼦句作⽤于基本表或视图,从中选择满⾜条件的元组。HAVING短语作⽤于元组,从中选择满⾜条件的元组。【例10】查询各个课程号及相应的选课⼈数。SQL语句:SELECT Cno,COUNT(Sno) num FROM sc GROUP BY Cno;查询结果:
【例11】查询选修了2门及以上课程的学⽣学号。SQL语句:SELECT Sno FROM sc GROUP BY Cno HAVING COUNT(*)>=2;查询结果: (⼆)连接查询1、等值与⾮等值连接WHERE⼦句中⽤来连接两个表的条件称为连接条件或连接谓词,其⼀般格式为:[<表名1>.]<列名1> <⽐较运算符> [<表名2>.]<列名2>。此外,连接谓词还可以使⽤下⾯形式:[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>。当连接运算符为“=”时,称为等值连接,使⽤其他运算符称为⾮等值连接。如果属性名在参加连接的各表中是唯⼀的,则可以省略表名前缀。若在等值连接中把⽬标列中重复的属性列去掉则为⾃然连接。【例12】查询每个学⽣及其选课情况。SQL语句:SELECT student.*,sc.* FROM student,sc WHERE = ;查询结果:
2、⾃⾝连接连接操作不仅可以在两个表之间进⾏,也可以是⼀个表与其⾃⼰进⾏连接,称为表的⾃⾝连接。例如:, FROM Course FIRST,COURSE SECOND WHERE =;(查询每⼀门课的间接先修课,即先修课的先修课)【例13】查询每⼀门课的间接先修课(即先修课的先修课)。SQL语句:SELECT , from course FIRST,course SECOND WHERE `FIRST`.Cno = `SECOND`.Cno;查询结果:
3、外连接外连接是以⼀个表为主体列列出需要查询的元组信息,如果别的表中的列没有相应的属性值则为空值。左外连接列出左边关系中所有元组,右外连接列出右边关系中所有的元组。例如表A LEFT OUTER JOIN 表B,则代表以表A为主体列;表A RIGHT OUTER JOIN 表B,则代表以表B为主体列。【例14】以Student表为主体,查询每个学⽣的基本情况及选课情况。SQL语句:SELECT ,Sname,Sage,Ssex,Sdept,Cno,Grade FROM student LEFT OUTER JOIN sc ON ( =);查询结果: 4、复合条件连接WHERE⼦句中可以有多个连接条件,称为复合条件连接。连接操作除了可以是两表连接,⼀个表与其⾃⾝连接外,还可以是两个以上的表进⾏连接,后者通常称为多表连接。【例15】查询每个学⽣的学号、姓名、选修的课程名及成绩。SQL语句:SELECT ,Sname,Cname,Grade FROM student,course,sc WHERE = =;查询结果:
(三)嵌套查询⼦查询的SELECT语句中不能使⽤ORDER BY⼦句,ORDER BY⼦句只能对最终查询结果排序。1、带有IN谓词的⼦查询在嵌套查询中,⼦查询的结果往往是⼀个集合,所以谓词IN是嵌套查询中最常⽤的谓词。例如:查询与“刘晨”在同⼀个系学习的学⽣全部信息。SELECT * FROM Student WHERE Sdept IN(SELECT Sdept FROM Student WHERE Sname=’刘晨’);【例16】查询与“刘晨”在同⼀个系的学⽣。SQL语句:SELECT Sno,Sname,Sdept FROM student WHERE Sdept IN (SELECT Sdept FROM student where Sname='刘晨');查询结果:
2、带有⽐较运算符的⼦查询带有⽐较运算符的⼦查询是指⽗查询与⼦查询之间⽤⽐较运算符进⾏连接。当⽤户能确切知道内层查询返回的是单值时,可以⽤⽐较运算符。需要注意的是,在Oracle中⼦查询⼀定要跟在⽐较运算符后⾯。例如找出每个学⽣超过他选修课程平均成绩的课程号:SELECT Sno,Cno FROM SC x WHERE Grade >= (SELECT AVG(Grade)FROM SC y WHERE =);【例17】找出每个学⽣超过他选修课程平均成绩的课程号。SQL语句:SELECT Sno,Cno FROM sc x WHERE Grade > (SELECT AVG(Grade) FROM sc y WHERE = );查询结果: 3、带有ANY(SOME)或ALL谓词的⼦查询⼦查询返回单指时可以⽤⽐较运算符,但返回多值时要⽤ANY(有的系统⽤)或ALL谓词修饰符。⽽使⽤ANY或ALL谓词时则必须同时使⽤⽐较运算符。其中,ANY的意思是查询结果中的某个值,ALL的意思是查询结果中的所有值。例如:查询其他系中⽐计算机科学系某⼀学⽣年龄⼩的学⽣的所有信息记录。SELECT * FROM Student WHERE Sage < ANY(SELECTSage FROM Student WHERE Sdept != ‘CS’);【例18】查询其他系中⽐计算机科学系某⼀学⽣年龄⼩的学⽣的所有信息记录。SQL语句:SELECT * FROM Student WHERE Sage < ANY(SELECT Sage FROM Student WHERE Sdept != ‘CS’);查询结果:
4、带有EXISTS谓词的⼦查询EXISTS代表存在量词。带有EXISTS谓词的⼦查询不返回任何数据,只产⽣逻辑真值true或逻辑假值false。使⽤存在量词EXISTS后,若内层查询结果⾮空,则外层的WHERE⼦句返回真值,否则返回假值。由EXISTS引出的⼦查询,其⽬标列表达式通常⽤*,因为带EXISTS的⼦查询只返回真假值,给出列名⽆实际意义。与EXISTS谓词对应的是NOT EXISTS谓词。使⽤存在量词NOT EXISTS后,若内层查询结果为空,则外层的WHERE⼦句返回真值,否则返回假值。⼀些带EXISTS或NOT EXISTS谓词的⼦查询不能被其他形式的⼦查询等价替换,但所有带IN谓词、⽐较运算符、ANY和ALL谓词的⼦查询都能⽤带EXISTS谓词的⼦查询等价替换。【例19】查询没有选修1号课程的学⽣姓名。SQL语句:SELECT Sname FROM student WHERE NOT EXISTS (SELECT * FROM sc WHERE Sno= AND Cno=1);查询结果:
【例20】查询⾄少选修了学⽣200215122选修的全部课程的学⽣号码(P111)。SQL语句:SELECT DISTINCT Sno FROM sc scx WHERE NOT EXISTS (SELECT * FROM sc scy ='200215122' AND NOT EXISTS (SELECT * FROM sc scz WHERE = AND =));查询结果:
(四)集合查询集合查询操作主要包括并操作INION、交操作INTERSECT和差操作EXCEPT。注意,参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同。【例21】查询计算机科学系的学⽣及年龄不⼤于19岁的学⽣。SQL语句:SELECT * FROM student WHERE Sdept='CS' UNION SELECT * FROM student WHERE Sage<=19;查询结果:
2023年6月21日发(作者:)
数据库知识点——SQL查询⼀、学⽣⼀、-课程数据库数据⽰例(⼀)学⽣表学号(Sno)2姓名(Sname)李勇刘晨王敏张⽴性别(Ssex)男⼥⼥男年龄(Sage)20191819所在系(Sdept)CSCSMAIS
(⼆)课程表课程号(Cno)1234567课程名(Cname)数据库数学信息系统操作系统数据结构数据处理PASCAL语⾔先⾏课(Cpno)5
167
6学分(Ccredit)4243424
(三)选课表学号(Sno)2200215122课程号(Cno)12323成绩(Grade)9285889080
⼆、查询(⼀)单表查询1、选择表中的若⼲列(对列操作)(1)查询指定列(2)查询全部列(3)查询经过计算的值【例1】查询全体学⽣的姓名、出⽣年份和所在的院系,要求⽤⼩写字符表⽰所有系名。SQL语句:SELECT Sname,'Year of Birth',2004-Sage,LOWER(Sdept) FROM student;查询结果:
2、选择表中的若⼲元组(对⾏操作)(1)消除取值重复的⾏两个本来并不完全相同的元组,投影到指定的某些列以后,可能变成相同的⾏了,可以使⽤DISTINCT取消重复的元组。格式如下:selectdistinct Sno form SC;【例2】查询选修了课程的学⽣学号,要求不重复出现。SQL语句:SELECT DISTINCT Sno FROM sc;查询结果:
(2)查询满⾜条件的元组(where条件查询)查询条件⽐较确定范围确定集合谓词=, >, <, >=, <=, !=, <>, !>, !<, NOT+上述⽐较运算符between and(a<=x<=b),not between andin,not inlike,not like%:任意长度(可为0)字符串字符匹配注意:字符集为ASCII时,⼀个汉字需要两个‘_’;字符集为GBK时,⼀个汉字需要⼀个‘_’如果⽤户要查询的字符串本⾝含有通配符,使⽤转义字符’’空值多重条件(逻辑运算)is NULL,is not NULL(判空不能⽤=)and,or,not_:任意单个字符
【例3】查询年龄不在20-23岁之间的学⽣姓名、系别和年龄。SQL语句:SELECT Sname,Sdept,Sage FROM student WHERE Sage NOT BETWEEN 20 AND 23;查询结果:
【例4】查询计算机科学系(CS)、数学系(MA)学⽣的姓名和性别。SQL语句:SELECT Sname,Ssex FROM student WHERE Sdept IN ('CS','MA');查询结果:
【例5】查询所有姓刘的学⽣的全部信息。SQL语句:SELECT * FROM student where Sname LIKE '刘%';查询结果:
【例6】查询所有以“数据”开头且课程名为四个字的课程全部信息。SQL语句:SELECT * FROM course where Cname LIKE '数据__';查询结果:
【例7】查询没有先修课程的课程全部信息。SQL语句:SELECT * FROM course where Cpno IS NULL;查询结果:
3、ORDER BY⼦句⽤户可以使⽤ORDER BY⼦句对查询结果按照⼀个或多个属性列的升序(ASC)或者降序(DESC)排列,缺省值为升序。如果是按照多个属性列进⾏排序,则⾸先按照第⼀个属性排序,当第⼀个属性相同时,再按照第⼆个属性列排序,以此类推。ORDER BY⼦句放在WHERE条件的后⾯。例如:select *from Student where Ssex=’男’ order by Sno,Sage desc;【例8】查询选修了3号课程的所有信息,查询结果按照分数的降序排列。SQL语句:SELECT * FROM sc WHERE Cno=3 ORDER BY Grade DESC;查询结果:
4、聚集函数在聚集函数中遇到空值时,除了COUNT(*) 外,都跳过空值⽽只处理⾮空值。注意,WHERE⼦句中不能使⽤聚集函数作为条件表达式的。如果指定DISTINCT短语,则表⽰在计算时要取消指定列中的重复值。聚集函数COUNT([DISTINCT|ALL]*)COUNT([DISTINCT|ALL]<列名>)SUM([DISTINCT|ALL]<列名>)AVG([DISTINCT|ALL]<列名>)MAX([DISTINCT|ALL]<列名>)MIN([DISTINCT|ALL]<列名>)含义统计元组个数统计⼀列中值的个数计算⼀列值的总和(必须是整型)计算⼀列值的平均值(必须是整型)求⼀列值中的最⼤值求⼀列值中的最⼩值
【例9】计算1号课程的学⽣平均成绩。SQL语句:SELECT AVG(Grade) average FROM sc WHERE Cno=1;查询结果:
5、GROUP BY ⼦句GROUP BY ⼦句将查询结果按某⼀列或多列的值分组,值相等的为⼀组。对查询结果分组的⽬的是为了细化聚集函数的作⽤对象。如果未对查询结果分组,聚集函数将作⽤于整个查询结果,分组后聚集函数将作⽤于每个组,即每⼀组都有⼀个函数值。如果分组后还要求按⼀定的条件对这些组进⾏筛选,最终只输出满⾜指定条件的组,则可以使⽤HAVING短语指定筛选条件。例如:SELECT * FROM sc GROUP BY Sno HAVING Count(*)>=2;(查询选修了2门及以上课程的学⽣学号)。WHERE⼦句和HAVING短语的区别在于作⽤对象不同。WHERE⼦句作⽤于基本表或视图,从中选择满⾜条件的元组。HAVING短语作⽤于元组,从中选择满⾜条件的元组。【例10】查询各个课程号及相应的选课⼈数。SQL语句:SELECT Cno,COUNT(Sno) num FROM sc GROUP BY Cno;查询结果:
【例11】查询选修了2门及以上课程的学⽣学号。SQL语句:SELECT Sno FROM sc GROUP BY Cno HAVING COUNT(*)>=2;查询结果: (⼆)连接查询1、等值与⾮等值连接WHERE⼦句中⽤来连接两个表的条件称为连接条件或连接谓词,其⼀般格式为:[<表名1>.]<列名1> <⽐较运算符> [<表名2>.]<列名2>。此外,连接谓词还可以使⽤下⾯形式:[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>。当连接运算符为“=”时,称为等值连接,使⽤其他运算符称为⾮等值连接。如果属性名在参加连接的各表中是唯⼀的,则可以省略表名前缀。若在等值连接中把⽬标列中重复的属性列去掉则为⾃然连接。【例12】查询每个学⽣及其选课情况。SQL语句:SELECT student.*,sc.* FROM student,sc WHERE = ;查询结果:
2、⾃⾝连接连接操作不仅可以在两个表之间进⾏,也可以是⼀个表与其⾃⼰进⾏连接,称为表的⾃⾝连接。例如:, FROM Course FIRST,COURSE SECOND WHERE =;(查询每⼀门课的间接先修课,即先修课的先修课)【例13】查询每⼀门课的间接先修课(即先修课的先修课)。SQL语句:SELECT , from course FIRST,course SECOND WHERE `FIRST`.Cno = `SECOND`.Cno;查询结果:
3、外连接外连接是以⼀个表为主体列列出需要查询的元组信息,如果别的表中的列没有相应的属性值则为空值。左外连接列出左边关系中所有元组,右外连接列出右边关系中所有的元组。例如表A LEFT OUTER JOIN 表B,则代表以表A为主体列;表A RIGHT OUTER JOIN 表B,则代表以表B为主体列。【例14】以Student表为主体,查询每个学⽣的基本情况及选课情况。SQL语句:SELECT ,Sname,Sage,Ssex,Sdept,Cno,Grade FROM student LEFT OUTER JOIN sc ON ( =);查询结果: 4、复合条件连接WHERE⼦句中可以有多个连接条件,称为复合条件连接。连接操作除了可以是两表连接,⼀个表与其⾃⾝连接外,还可以是两个以上的表进⾏连接,后者通常称为多表连接。【例15】查询每个学⽣的学号、姓名、选修的课程名及成绩。SQL语句:SELECT ,Sname,Cname,Grade FROM student,course,sc WHERE = =;查询结果:
(三)嵌套查询⼦查询的SELECT语句中不能使⽤ORDER BY⼦句,ORDER BY⼦句只能对最终查询结果排序。1、带有IN谓词的⼦查询在嵌套查询中,⼦查询的结果往往是⼀个集合,所以谓词IN是嵌套查询中最常⽤的谓词。例如:查询与“刘晨”在同⼀个系学习的学⽣全部信息。SELECT * FROM Student WHERE Sdept IN(SELECT Sdept FROM Student WHERE Sname=’刘晨’);【例16】查询与“刘晨”在同⼀个系的学⽣。SQL语句:SELECT Sno,Sname,Sdept FROM student WHERE Sdept IN (SELECT Sdept FROM student where Sname='刘晨');查询结果:
2、带有⽐较运算符的⼦查询带有⽐较运算符的⼦查询是指⽗查询与⼦查询之间⽤⽐较运算符进⾏连接。当⽤户能确切知道内层查询返回的是单值时,可以⽤⽐较运算符。需要注意的是,在Oracle中⼦查询⼀定要跟在⽐较运算符后⾯。例如找出每个学⽣超过他选修课程平均成绩的课程号:SELECT Sno,Cno FROM SC x WHERE Grade >= (SELECT AVG(Grade)FROM SC y WHERE =);【例17】找出每个学⽣超过他选修课程平均成绩的课程号。SQL语句:SELECT Sno,Cno FROM sc x WHERE Grade > (SELECT AVG(Grade) FROM sc y WHERE = );查询结果: 3、带有ANY(SOME)或ALL谓词的⼦查询⼦查询返回单指时可以⽤⽐较运算符,但返回多值时要⽤ANY(有的系统⽤)或ALL谓词修饰符。⽽使⽤ANY或ALL谓词时则必须同时使⽤⽐较运算符。其中,ANY的意思是查询结果中的某个值,ALL的意思是查询结果中的所有值。例如:查询其他系中⽐计算机科学系某⼀学⽣年龄⼩的学⽣的所有信息记录。SELECT * FROM Student WHERE Sage < ANY(SELECTSage FROM Student WHERE Sdept != ‘CS’);【例18】查询其他系中⽐计算机科学系某⼀学⽣年龄⼩的学⽣的所有信息记录。SQL语句:SELECT * FROM Student WHERE Sage < ANY(SELECT Sage FROM Student WHERE Sdept != ‘CS’);查询结果:
4、带有EXISTS谓词的⼦查询EXISTS代表存在量词。带有EXISTS谓词的⼦查询不返回任何数据,只产⽣逻辑真值true或逻辑假值false。使⽤存在量词EXISTS后,若内层查询结果⾮空,则外层的WHERE⼦句返回真值,否则返回假值。由EXISTS引出的⼦查询,其⽬标列表达式通常⽤*,因为带EXISTS的⼦查询只返回真假值,给出列名⽆实际意义。与EXISTS谓词对应的是NOT EXISTS谓词。使⽤存在量词NOT EXISTS后,若内层查询结果为空,则外层的WHERE⼦句返回真值,否则返回假值。⼀些带EXISTS或NOT EXISTS谓词的⼦查询不能被其他形式的⼦查询等价替换,但所有带IN谓词、⽐较运算符、ANY和ALL谓词的⼦查询都能⽤带EXISTS谓词的⼦查询等价替换。【例19】查询没有选修1号课程的学⽣姓名。SQL语句:SELECT Sname FROM student WHERE NOT EXISTS (SELECT * FROM sc WHERE Sno= AND Cno=1);查询结果:
【例20】查询⾄少选修了学⽣200215122选修的全部课程的学⽣号码(P111)。SQL语句:SELECT DISTINCT Sno FROM sc scx WHERE NOT EXISTS (SELECT * FROM sc scy ='200215122' AND NOT EXISTS (SELECT * FROM sc scz WHERE = AND =));查询结果:
(四)集合查询集合查询操作主要包括并操作INION、交操作INTERSECT和差操作EXCEPT。注意,参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同。【例21】查询计算机科学系的学⽣及年龄不⼤于19岁的学⽣。SQL语句:SELECT * FROM student WHERE Sdept='CS' UNION SELECT * FROM student WHERE Sage<=19;查询结果:
发布评论