DQL数据查询习题与知识总结Word格式文档下载.docx
《DQL数据查询习题与知识总结Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《DQL数据查询习题与知识总结Word格式文档下载.docx(30页珍藏版)》请在冰豆网上搜索。
31.查询查询售价最高的图书的名称
32.查询售价比平均售价高的图书的名称
33.查询与“数据库原理”在同一出版社的图书信息
34.查询王旭所借图书的图书编号
35.查询“王旭”所借的图书的名称
36.查询价格最低的图书信息
37.查询书价最高的图书的信息
38.查询已经借阅了图书的读者的姓名
39.已经被借出的图书的信息
40.查询2005年1月20日所借出的图书的信息
41.查询每个读者所借的图书的信息,要求显示读者姓名,图书名称,借出日期
42.查询’王旭’所借图书的书名
43.显示所有读者的借阅情况(包括没借书的读者),显示读者编号,读者姓名,图书编号
44.显示所有读者的借阅情况(包括没借书的读者和没被借的图书),显示读者编号、读者姓名、图书编号、书名和借阅日期。
45.所有图书的价格打8折
46.所有“清华大学出版社”的图书加价15%
47.将王旭所借图书的日期更改为2009-5-1
48.创建一个新表‘清华大学出版图书表’并将清华大学出版社出版的图书添加到此表中。
49.删除王旭的借阅纪录
50.删除价格大于100元的图书
51.删除Book表中的全部数据
52.并查询:
查询清华大学出版社出版的和价格高于25的图书信息。
53.查询出版图书平均价格多余25元的出版社
54.查询出版社之间最低的平均价格
数据查询练习题:
一、针对列名列表:
5.查询全体学生的学号与姓名
6.查询全体学生的姓名、学号、所在系
7.查询全体学生的详细记录
8.查询全体学生的姓名及出生年份
9.查询全体学生的姓名、出生年份、所在系,且要求用小写字母表示所有系名
selectsname,’yearofbirth’,2005-sage,islower(sdept)fromstudent
selectsnameNAME,‘yearofbirth’,BIRTH,2005-sageBIRTHDAY,islower(sdept)DEPARTMENTfromstudent
6.(消除重复行)查询选修了课程的学生学号
二、针对Where子句
7.查询计算机系所有学生
8.查询所有年龄在20岁以下的学生姓名及其年龄
9.查询考试成绩不及格的学生学号
10.查询年龄在20-23岁之间的学生的姓名、年龄和系别
11.查询年龄不在20-23岁之间的学生姓名、年龄和系别
12.查询信息系、数学系和计算机系的学生的姓名和性别
13.查询既不是信息系、数学系,也不是计算机系的学生的姓名和性别
14.查询学号为95001的学生的详细情况(可用like做)
15.查询所有姓刘的学生的姓名、学号和性别
16.查询姓李且全名为三个汉字的学生的姓名
17.查询名字中第二个字为阳字的学生的姓名和学号
18.查询所有不姓刘的学生姓名
19.查询DB_Design课程的课程号和学分
selectCno,CcreditfromCoursewhereCnamelike‘DB\_Design’ESCAPE’\’
20.查询以“DB_”开头,且倒数第3个字符为i的课程的详细情况
select*fromcoursewhereCnamelike‘DB\_%i__’ESCAPE’\’
21.查询缺少成绩的学生的学号和相应的课程号
22.查询所有有成绩的学生的学号和课程号
23.查询计算机系年龄20岁以下的学生姓名
三、排序子句
24.查询选修了3号课程的学生的学号及成绩,查询结果按分数的降序排列。
25.查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
四、集函数
26.查询学生的总人数
27.查询选修了课程的学生人数
28.计算1号课程的学生平均成绩
29.查询选修1号课程的学生最高分数和最低分数。
五、分组子句
15.查询清华大学出版社出版的书的平均价格
16.查询每个出版社的平均价格
30.求各个课程号及相应的选课人数。
31.查询每名学生的选课门数和平均成绩。
32.查询选修了3门以上课程的学生学号。
33.查询选课门数等于或大于4门的学生的平均成绩和选课门数
六、多表连接查询
34.查询每个学生及其选修课程的情况
35.去掉重复列
36.查询选修2号课程且成绩在90分以上的所有学生
37.查询每个学生的学号、姓名、选修的课程及成绩
38.查询计算机系学生的选课情况,要求列出学生的名字、所修课的课程号和成绩
selectstudent.sno,cno,gradefromstudentjoinsconstudent.sno=sc.sno
wheresdept=’计算机系’
39.查询信息系选修VB课程的学生的成绩,要求列出学生姓名、课程号和成绩
selectsname,o,gradefromstudentsjoinscons.sno=sc.snojoincoursecono=owheresdept=’信息系’andcname=’VB’
40.查询所有选修了VB课程的学生的情况,要求列出学生姓名和所在的系
selectsname,sdeptfromstudentsjoinscons.sno=sc.snojoincoursecono=owherecname=’VB’
41.(自连接)查询与刘晨在同一系学习的学生的姓名和所在的系
selects2.sname,s2.sdeptfromstudents1joinstudents2ons1.sdept=s2.sdeptwheres1.sname=’刘晨’ands2.sname!
=’刘晨’
42.(外连接)查询学生的选课情况,包括选修课程的学生和没有选修课程的学生
selectstudent.sno,sname,cno,gradefromstudentleftjoinsconstudent.sno=sc.sno
43.(左外连接)显示20岁学生的基本信息和选课信息(课程名,分数)
七、子查询
43.(基于集合的测试)查询与刘晨在同一系的学生
selectsno,sname,sdeptfromstudentwheresdeptin
(selectsdeptfromstudentwheresname=’刘晨’)
44.查询成绩大于90分的学生的学号和姓名。
Selectsno,snameformstudentwheresnoin
(selectsnofromscwheregrade>
90)
45.查询选修了“数据库基础”课程的学生的学号和姓名
selectsno,snameformstudentwheresnoin
(selectsnofromscwherecnoin
(selectcnofromcoursewherecname=’数据库基础’))
或:
selectstudent.sno,snamefromstudentjoinsconstudent.sno=sc.snojoincourseono=owherecname=’数据库基础’
46.(使用子查询进行比较测试)查询选修了课程‘C02’且成绩高于此课程的平均成绩的学生的学号和成绩
selectsno,gradefromscwherecno=’c02’andgrade>
(selectavg(grade)fromscwherecno=’c02’)
47.(使用子查询进行存在性测试)查询选修了课程“C01”的学生姓名
selectsnamefromstudent
whereexists
(select*fromscwheresno=student.snoandcno=’c01’)
selectsnamefromstudentjoinsconsc.sno=student.sno
wherecno=’c01’
48.查询没有选修课程‘c01‘的学生姓名和所在系
selectsname,sdeptfromstudent
wherenotexists
综合练习
1.查询成绩在70-80分之间的学生的学号、课程号和成绩
2.查询计算机系年龄在18-20之间且性别为“男”的学生的姓名和年龄
3.查询课程号为“c01”的课程的最高分数
4.查询计算机系学生的最大年龄和最小年龄
5.统计每个系的学生人数
6.统计每门课程的选课人数和考试最高分
7.统计每个学生的选课门数和考试总成绩,并按选课门数的升序显示结果。
8.查询总成绩超过200分的学生,要求列出学号、总成绩
9.查询选修了课程“c02”的学生的姓名和所在系
10.查询成绩在80分以上的学生的姓名、课程号和成绩,并按成绩的降序排列结果
11.查询哪些课程没有人选修,要求列出课程号和课程名
12.查询选修了课程“c01”的学生的姓名和所在系
13.查询数学系成绩在80分以上的学生的学号、姓名
14.查询计算机系考试成绩最高的学生的姓名
15.查询成绩是95分的学生姓名
16.查询图书价格最低的书名
17.求选修“c02”课程分数比该门课平均分高的学生姓名
18.查询选修了“数据库基础”的学生姓名
19.查询平均价格高于“机械工业出版社”书的平均价格的出版社信息
selectpublishfrombookgroupbypublishhavingavg(price)>
(selectavg(price)frombookwherepublish=’机械工业出版社’)
20.查询所有不及格科目的学生姓名
selectsnamefromstudentwheresnoin(selectsnofromscwheregrade<
60
groupbysnohavingcount(cno)>
=1)
21.查询只有一科不及格的学生姓名
selectsnamefromstudentwheresnoin(selectsnofromscwheregrade<
60groupbysnohavingcount(cno)=1)
22.求比计算机系所有学生年龄都大的数学系学生的姓名
23.求平均分最高的学生姓名
24.显示学生的基本信息和选课信息(其中包括没有选课的学生)。
25.显示20岁学生的基本信息和选课信息(课程名和分数),若没有选课,也要将基本信息显示出来
…………………………………………………………………………………………………
数据查询语句:
select
[distinct
]列名列表from表名
where条件
groupby字段
having条件
orderby字段
1、选择表中的若干列——针对列名列表
①选择表中若干列:
列名列表为表中部分列名
②查询全部列:
列名列表为表中全部列或*代替
③查询计算的列:
常量值、计算所得列,
如:
selectsname,’Yearofbirth’,2005-sagefromstudent
④给列起别名:
列名|表达式[as]列标题(其中|表示或者)
2、选择表中的若干元组——针对distinct子句和where子句
(1)distinct:
消除查询结果集中的重复行(整行相同,并非某几个字段相同);
(2)where子句:
查询满足条件的元组,其中条件有如下几种情况:
1比较大小:
列名比较运算符(包括=、>
、>
=、<
、<
>
或!
=)常量值或表达式
※注意:
在SQL语句中,不仅数值类型的数据可以比较大小,字符串和日期时间类型的数据同样可以比较大小。
字符串数据是按照字典顺序进行排序比较的(汉字则按照汉字的中文拼音的字典顺序进行比较);
而日期时间类型是越晚的日期越大。
②确定范围:
列名between…and…或列名notbetween…and…
③确定集合:
列名in(值的集合)或列名notin(值的集合)
④字符匹配:
列名like匹配的字符串或列名notlike匹配的字符串
其中匹配的字符串中可含有如下通配符:
_:
匹配任意一个字符;
%:
匹配0个或任意多个字符;
ESCAPE‘\’:
表示换码字符。
例:
wherecnamelike‘DB\_%i__’ESCAPE‘\’
[]:
指定范围或集合中的任何单个字符;
例:
[abc]或[a-z]
[^]:
不属于指定范围或集合中的任何单个字符;
⑤空值查询:
列名isNULL或列名isnotNULL;
⑥多重条件查询:
and和or,and表示只有在全部满足所有的条件时结果才为true,or表示只要满足其中一个条件结果即为true;
3、对查询结果进行排序——orderby子句
orderby字段1ASC|DESC,字段2ASC|DESC,……(其中|表示或者)
表示先按照字段1进行排序,字段1相同的元组再按照字段2进行排序,依此类推……
(注:
对于空值,若按升序排,含空值的元组将最先显示。
若按降序排,空值的元组将最后显示。
)
4、使用计算函数汇总数据
计算函数有:
①count(*):
统计表中所有元组个数(包括值为NULL的行);
②count(列名):
统计本列列值不为NULL的元组个数;
③sum(列名):
计算列值总和;
④avg(列名):
计算列值平均值;
⑤max(列名):
求列值最大值;
⑥min(列名):
求列值最小值;
注:
(1)计算函数又称聚集函数(集函数,列函数),它们是对某一列的值进行统计,返回一个统计值。
(2)count(*)函数之外,空值Null不参与集函数。
(3)函数中的列名前可加distinct关键字,表示统计时先根据该列distinct(消除重复行),再统计其值;
如下例:
selectcount(distinctpublish)frombook;
--查询共有多少个出版社
5、对查询结果进行分组计算——groupby子句和having子句
groupby子句:
1groupby后出现的字段是分组的依据,该字段值相等的记录作为一组。
先执行groupby,再执行select
②分组与集函数通常配合使用,集函数是针对每个组内的数据进行统计,单独用集函数表示将整张表作为一大组。
③若使用了groupby分组,则在select子句中出现的列名,要么出现在groupby子句中,要么被集函数所引用。
④若未使用列函数,而只进行分组,则相当于消除重复行(distinct)
having子句:
对分组后的结果再进行过滤,通常与集函数一起使用,与where条件的区别如下:
where条件:
对原始表格中每一行进行判断,不可使用列函数;
having条件:
对分组查询后的结果进行筛选(常使用列函数),有having子句,则必有groupby子句;
6、子查询:
一个select…from…句子称为一个查询块;
在where子句和having子句的条件中可以出现查询块。
这种插入到where或having子句中的查询块称为子查询,而其外面的查询就是主查询。
首先确定哪个为子查询;
注意内外的字段一定要对应上,要求必须是相关字段;
第一种讲解:
相等的情况:
“=”一般可以用in代替,当子查询返回的是值的集合时,必须用in;
不等的情况:
“<
”一般用notin代替;
大小比较的情况:
“>
=”,如果子查询返回的是值的集合时,后加
all——表示所有
any|some——表示其中任意一个
第二种讲解:
子查询返回一个值时:
=、>
符号直接比较;
子查询返回多个值时:
=换为in;
<
换为notin;
=后加all或any。
EXISTS(子查询):
判断是否存在结果,当子查询存在结果时,EXISTS(子查询)返回值为true,否则返回值为false。
………………………………………………………………………………………………
7、多表连接查询:
在非ANSI标准的实现中,连接操作是在where子句中执行的(即在where子句指定多表连接条件),称为theta连接;
在ANSISQL-92和99中,连接是在JOIN子句中执行的,称为ANSI连接。
(1)若一个查询涉及到两个或两个以上的表,则称之为多表连接查询;
(2)多表连接的原则:
相连接的多个表必须有内部联系,即要有相关字段;
若有n张表参与连接,则必须有n-1个连接条件,即有相关字段,字段名可不同,但字段含义必须相同
(3)包括两种连接方式:
内连接和外连接,内连接包括等值连接与非等值连接;
外连接包括做外连接、右外连接、全外连接。
◆内连接——将两张表中满足条件的元组连接作为结果输出
select……from表1,表2where连接条件()
select……from表1[inner]join表2on连接条件
连接条件一般格式为:
表1.字段1比较运算符表2.字段2
其中:
比较运算符是“=”时,称为等值连接;
否则称为非等值连接;
可以为表起别名:
原表名as表别名,之后使用原表名之处都可以用其别名代替。
自连接:
连接的两张表为同一张表。
此时必须为两张表起别名。
●WHERE用来过滤数据行,也可以定义连接条件。
只有满足WHERE条件的数据才会返回。
●ON用于定义连接条件。
它们将数据行分为两类:
要连接的和不连接的,而不是从结果集中排除数据。
◆外连接:
只限制其中一张表中的数据必须满足连接条件,而另一张表不需满足条件。
(1)左外连接:
AleftouterjoinBon连接条件
含义:
表A的记录全部显示,表B中能够和表A的记录匹配上的,就显示对应的记录,不能匹配上的,就显示空值NULL;
(2)右外连接:
ArightouterjoinBon连接条件(了解)
含义:
表B的记录全部显示,表A中能够和表B的记录匹配上的,就显示对应的记录,不能匹配上的,就显示空值NULL;
(3)全外连接:
AfullouterjoinBon连接条件(了解)
表A、B的记录全部都显示,表A中能够和表B中的元组匹配上的,就显示对应的记录,不能匹配上的,就显示空值NULL,反之,表B中能够和表A中的元组匹配上的,就显示对应的记录,不能匹配上的,就显示空值NULL。
多表连接与子查询的关系。
(1)一般情况下可以通用,即一道题可以用两种方法的任一种求解;
(2)当查询的列名列表涉及到多张表的列名时,只能用多表连接;
(3)当查询中涉及到集合函数或统计信息的比较时,最好用子查询做;
8.复杂查询:
(1)UNION[ALL]
使用UNION语句可以合并两个或多个查询的结果。
UNION语句用第二个查询结果合并第一个查询结果。
它不显示两个查询中的重复的行。
UNION的语法格式:
SELECT<
目标列名序列>
FROM<
数据源>
[WHERE<
检索条件表达式>
]
[GROUPBY<
分组依据列>
[HAVING<
组提取条件>
]
UNION[ALL]
[ORDERBY<
排序依据列>
注意:
如果使用使用ORDERBY字句进行排序,则该子句只出现最后一个查询的后面,如果不希望去除重复的元组,可以使用关键字ALL
练习:
使用UNION查询‘C语言’和’清华大学出版社‘出版的图书信息
(2)派生关系:
SQL允许FROM子句中使用子查询表达式。
如果使用这样的表达式,那么我们必须给表达式产生的关系命名,而其属性也可以重命名。
我们可以用as子句完成重命名。
查询出版图书平均价格多余25元的出版社
查询出版社之间最低的平均价格
每本书最早借阅的读者的信息
Select*fromreaderwherereader_idin(
Selectreader_idfromborrowjoin(
selectbook_id