50个常用的SQL语句练习

合集下载

sql 五十题

sql 五十题

sql 五十题以下是一些SQL练习题,共50题:1. 什么是SQL?2. 什么是关系型数据库?3. 什么是主键?4. 什么是外键?5. 什么是索引?6. 什么是查询?7. 什么是插入操作?8. 什么是更新操作?9. 什么是删除操作?10. 什么是聚合函数?11. 什么是分组操作?12. 什么是排序操作?13. 什么是联接操作?14. 什么是子查询?15. 什么是视图?16. 什么是存储过程?17. 什么是触发器?18. 如何使用WHERE子句进行过滤?19. 如何使用ORDER BY子句进行排序?20. 如何使用GROUP BY子句进行分组?21. 如何使用HAVING子句进行分组过滤?22. 如何使用JOIN操作联接表?23. 如何使用聚合函数SUM、AVG、MIN、MAX?24. 如何使用聚合函数COUNT、COUNT()和COUNT(列名)的区别?25. 如何使用子查询嵌套查询?26. 如何创建视图并查询视图数据?27. 如何创建存储过程并调用存储过程?28. 如何创建触发器并触发触发器?29. 如何使用INSERT INTO语句插入数据?30. 如何使用UPDATE语句更新数据?31. 如何使用DELETE语句删除数据?32. 如何使用TRUNCATE TABLE语句清空表数据?33. 如何使用UNION操作符合并多个查询结果?34. 如何使用UNION ALL操作符合并多个查询结果(包括重复行)?35. 如何使用IN操作符筛选符合条件的多个值?36. 如何使用LIKE操作符进行模糊查询?37. 如何使用NOT操作符进行否定筛选?38. 如何使用BETWEEN操作符筛选范围值?39. 如何使用EXISTS操作符检查子查询结果是否存在?40. 如何使用NOT EXISTS操作符检查子查询结果是否存在(否定筛选)?41. 如何使用CASE语句进行条件判断和值转换?42. 如何使用DISTINCT关键字去除查询结果的重复行?43. 如何使用LIMIT关键字限制查询结果的行数?44. 如何使用JOIN操作连接多个表并筛选数据?45. 如何使用INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN的区别和用法?46. 如何使用视图提高查询效率和维护数据安全性?47. 如何使用存储过程存储复杂的业务逻辑和重复使用的查询语句?48. 如何使用触发器自动执行特定事件或数据修改操作?49. 如何优化SQL查询性能,提高数据库的响应速度?50. 如何安全地管理和维护数据库,确保数据的完整性和可靠性?。

SQL语句练习及答案

SQL语句练习及答案

sql语句练习题1数据库有如下四个表格:student(sno,sname,sage,ssex,sdpt) 学生表系表(dptno,dname)course(cno,cname, gradet, tno) 课程表sc(sno,cno,score) 成绩表teacher(tno,tname) 教师表要求:完成以下操作1.查询姓"欧阳"且全名为三个汉字的学生的姓名。

select sname from student where sname like “欧阳__‟;2.查询名字中第2个字为"阳"字的学生的姓名和学号。

select sname,sno from student where sname like '_阳%';3.查询所有不姓刘的学生姓名。

select sname,sno,ssexfrom studentwhere sname not like “刘%”;4.查询db_design课程的课程号和学分。

select cno,ccredit from coursewhere cname like 'db_design'5.查询以"db_"开头,且倒数第3个字符为i的课程的详细情况。

select * from course where cname like 'db%i_ _';6.某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。

查询缺少成绩的学生的学号和相应的课程号。

select sno,cno from sc where grade is null;7.查所有有成绩的学生学号和课程号。

select sno,cno from sc where grade is not null;8.查询计算机系年龄在20岁以下的学生姓名。

select sname from student where sdept= 'cs' and sage<20;9.查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。

SQL语句练习题及答案

SQL语句练习题及答案

姓名:______________班级:__________________一、请根据以下要求,填写正确的SQL语句。

1.查询“学生”表中所有计算机专业的男生信息。

______________________________________________________________________________ 2.查询“学生”表中姓“李”且2006年出生的学生的学号、姓名、出生日期信息。

______________________________________________________________________________ 3.查询“学生”表中年龄最大的三名学生的学号、姓名、出生日期信息。

______________________________________________________________________________ 4.统计“学生”表中各专业男生人数,显示格式为:专业、人数。

______________________________________________________________________________ 5.查询每名“学生”的平均成绩,按平均成绩降序显示姓名和平均成绩信息。

______________________________________________________________________________ 6.已知“Student1”表结构与“Student”完全相同,现将“Student1”中所有“旅游管理”专业学生的学号、姓名及专业追加到“Student”中。

______________________________________________________________________________ 7.计算Grade等级字段的值。

计算规则为60分及以上为合格,其余为不合格。

MySql语句练习50题

MySql语句练习50题

MySql语句练习50题-- 1、查询"01"课程⽐"02"课程成绩⾼的学⽣的信息及课程分数select st.*,sc.s_score as '语⽂' ,sc2.s_score '数学'from student stleft join score sc on sc.s_id=st.s_id and sc.c_id='01'left join score sc2 on sc2.s_id=st.s_id and sc2.c_id='02'where sc.s_score>sc2.s_score-- 2、查询"01"课程⽐"02"课程成绩低的学⽣的信息及课程分数select st.*,sc.s_score '语⽂',sc2.s_score '数学' from student stleft join score sc on sc.s_id=st.s_id and sc.c_id='01'left join score sc2 on sc2.s_id=st.s_id and sc2.c_id='02'where sc.s_score<sc2.s_score-- 3、查询平均成绩⼤于等于60分的同学的学⽣编号和学⽣姓名和平均成绩select st.s_id,st.s_name,ROUND(AVG(sc.s_score),2) cjScore from student stleft join score sc on sc.s_id=st.s_idgroup by st.s_id having AVG(sc.s_score)>=60SELECT s.s_id,st.s_name,s.`平均成绩` from student st INNER JOIN(SELECT AVG(sc.s_score) as '平均成绩',sc.s_id from score sc GROUP BY sc.s_id HAVING AVG(sc.s_score) >60) son s.s_id=st.s_id-- 4、查询平均成绩⼩于60分的同学的学⽣编号和学⽣姓名和平均成绩-- (包括有成绩的和⽆成绩的)select st.s_id,st.s_name,(case when ROUND(AVG(sc.s_score),2) is null then 0 else ROUND(AVG(sc.s_score)) end ) cjScore from student stleft join score sc on sc.s_id=st.s_idgroup by st.s_id having AVG(sc.s_score)<60 or AVG(sc.s_score) is NULL-- 5、查询所有同学的学⽣编号、学⽣姓名、选课总数、所有课程的总成绩select st.s_id,st.s_name,count(c.c_id),( case when SUM(sc.s_score) is null or sum(sc.s_score)="" then 0 else SUM(sc.s_score) end) from student stleft join score sc on sc.s_id =st.s_idleft join course c on c.c_id=sc.c_idgroup by st.s_id-- 6、查询"李"姓⽼师的数量select t.t_name,count(t.t_id) from teacher tgroup by t.t_id having t.t_name like "李%";-- 7、查询学过"张三"⽼师授课的同学的信息select st.* from student stleft join score sc on sc.s_id=st.s_idleft join course c on c.c_id=sc.c_idleft join teacher t on t.t_id=c.t_idwhere t.t_name="张三"-- 8、查询没学过"张三"⽼师授课的同学的信息-- 张三⽼师教的课select c.* from course c left join teacher t on t.t_id=c.t_id where t.t_name="张三"-- 有张三⽼师课成绩的st.s_idselect sc.s_id from score sc where sc.c_id in (select c.c_id from course c left join teacher t on t.t_id=c.t_id where t.t_name="张三")-- 不在上⾯查到的st.s_id的学⽣信息,即没学过张三⽼师授课的同学信息select st.* from student st where st.s_id not in(select sc.s_id from score sc where sc.c_id in (select c.c_id from course c left join teacher t on t.t_id=c.t_id where t.t_name="张三"))-- 9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息select st.* from student stinner join score sc on sc.s_id = st.s_idinner join course c on c.c_id=sc.c_id and c.c_id="01"where st.s_id in (select st2.s_id from student st2inner join score sc2 on sc2.s_id = st2.s_idinner join course c2 on c2.c_id=sc2.c_id and c2.c_id="02"⽹友提供的思路(厉害呦~):SELECT st.*FROM student stINNER JOIN score sc ON sc.`s_id`=st.`s_id`GROUP BY st.`s_id`HAVING SUM(IF(sc.`c_id`="01" OR sc.`c_id`="02" ,1,0))>1-- 10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息select st.* from student stinner join score sc on sc.s_id = st.s_idinner join course c on c.c_id=sc.c_id and c.c_id="01"where st.s_id not in (select st2.s_id from student st2inner join score sc2 on sc2.s_id = st2.s_idinner join course c2 on c2.c_id=sc2.c_id and c2.c_id="02")-- 11、查询没有学全所有课程的同学的信息-- 太复杂,下次换⼀种思路,看有没有简单点⽅法-- 此处思路为查学全所有课程的学⽣id,再内联取反⾯select * from student where s_id not in (select st.s_id from student stinner join score sc on sc.s_id = st.s_id and sc.c_id="01"where st.s_id in (select st2.s_id from student st2inner join score sc2 on sc2.s_id = st2.s_id and sc2.c_id="02") and st.s_id in (select st2.s_id from student st2inner join score sc2 on sc2.s_id = st2.s_id and sc2.c_id="03"))-- 来⾃⼀楼⽹友的思路,左连接,根据学⽣id分组过滤掉数量⼩于课程表中总课程数量的结果(show me his code),简洁不少。

sql语句练习题完整版

sql语句练习题完整版

1、查询Student表中的所有记录的Sname、Ssex和Class列2、查询教师所有的单位即不重复的Depart列。

3、查询Student表的所有记录。

4、查询Score表中成绩在60到80之间的所有记录。

5、查询Score表中成绩为85,86或88的记录。

6、查询Student表中“95031”班或性别为“女”的同学记录。

7、以Class降序查询Student表的所有记录。

8、以Cno升序、Degree降序查询Score表的所有记录。

9、查询“95031”班的学生人数。

10、查询Score表中的最高分的学生学号和课程号。

11、查询…3-105‟号课程的平均分。

12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。

13、查询最低分大于70,最高分小于90的Sno列。

14、查询所有学生的Sname、Cno和Degree列。

15、查询所有学生的Sno、Cname和Degree列。

16、查询所有学生的Sname、Cname和Degree列。

17、查询“95033”班所选课程的平均分。

18、假设使用如下命令建立了一个grade表:create table grade(low number(3,0),upp number(3),rank char(1));insert into grade values(90,100,‟A‟);insert into grade values(80,89,‟B‟);insert into grade values(70,79,‟C‟)insert into grade values(60,69,‟D‟);insert into grade values(0,59,‟E‟);commit;现查询所有同学的Sno、Cno和rank列。

19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。

20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。

50条数据库sql语句及答案

50条数据库sql语句及答案
(select count(courseid) from tblCourse where teaid = (
select teaid from tblTeacher where teaname = '叶平')))
--练习
select stuid from tblScore where courseid in (
--11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
------运用连接查询
SELECT DISTINCT ST.* FROM tblStudent ST, tblScore SC WHERE ST.STUID = SC.STUID
AND SC.COURSEID IN
select stuid from tblScore GROUP BY STUID HAVING max(SCORE)<60)
--10、查询没有学全所有课的同学的学号、姓名;
--练习
SELECT TS.STUID,TS.STUNAME,COUNT(TSC.SCORE) FROM tblStudent TS
TC.COURSEID INNER JOIN tblTeacher TT ON TC.TEAID = TT.TEAID
WHERE TT.TEANAME ='叶平')
--对
SELECT STUID, STUNAME FROM tblStudent WHERE STUID NOT IN(
where A.SCORE > B.SCORE
--老师讲的方法
SELECT T.* FROM tblScore T WHERE T.COURSEID = 1 AND

SQL经典50题练习

创建表及插⼊数据学⽣表Studentcreate table SC(SId varchar(10),CId varchar(10),score decimal(18,1));insert into SC values('01' , '01' , 80);insert into SC values('01' , '02' , 90);insert into SC values('01' , '03' , 99);insert into SC values('02' , '01' , 70);insert into SC values('02' , '02' , 60);insert into SC values('02' , '03' , 80);insert into SC values('03' , '01' , 80);insert into SC values('03' , '02' , 80);insert into SC values('03' , '03' , 80);insert into SC values('04' , '01' , 50);insert into SC values('04' , '02' , 30);insert into SC values('04' , '03' , 20);insert into SC values('05' , '01' , 76);insert into SC values('05' , '02' , 87);insert into SC values('06' , '01' , 31);insert into SC values('06' , '03' , 34);insert into SC values('07' , '02' , 89);insert into SC values('07' , '03' , 98);练习题⽬1. 查询" 01 "课程⽐" 02 "课程成绩⾼的学⽣的信息及课程分数1.1 查询同时存在" 01 "课程和" 02 "课程的情况1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显⽰为 null )1.3 查询不存在" 01 "课程但存在" 02 "课程的情况2. 查询平均成绩⼤于等于 60 分的同学的学⽣编号和学⽣姓名和平均成绩3. 查询在 SC 表存在成绩的学⽣信息4. 查询所有同学的学⽣编号、学⽣姓名、选课总数、所有课程的总成绩(没成绩的显⽰为 null )4.1 查有成绩的学⽣信息5. 查询「李」姓⽼师的数量6. 查询学过「张三」⽼师授课的同学的信息7. 查询没有学全所有课程的同学的信息8. 查询⾄少有⼀门课与学号为" 01 "的同学所学相同的同学的信息9. 查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息10. 查询没学过"张三"⽼师讲授的任⼀门课程的学⽣姓名11. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩12. 检索" 01 "课程分数⼩于 60,按分数降序排列的学⽣信息13. 按平均成绩从⾼到低显⽰所有学⽣的所有课程的成绩以及平均成绩14. 查询各科成绩最⾼分、最低分和平均分:以如下形式显⽰:课程 ID,课程 name,最⾼分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90要求输出课程号和选修⼈数,查询结果按⼈数降序排列,若⼈数相同,按课程号升序排列15. 按各科成绩进⾏排序,并显⽰排名, Score 重复时保留名次空缺15. 按各科成绩进⾏排序,并显⽰排名, Score 重复时保留名次空缺15.1 按各科成绩进⾏排序,并显⽰排名, Score 重复时合并名次16. 查询学⽣的总成绩,并进⾏排名,总分重复时保留名次空缺16.1 查询学⽣的总成绩,并进⾏排名,总分重复时不保留名次空缺17. 统计各科成绩各分数段⼈数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分⽐18. 查询各科成绩前三名的记录19. 查询每门课程被选修的学⽣数20. 查询出只选修两门课程的学⽣学号和姓名21. 查询男⽣、⼥⽣⼈数22. 查询名字中含有「风」字的学⽣信息23. 查询同名同性学⽣名单,并统计同名⼈数24. 查询 1990 年出⽣的学⽣名单25. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列26. 查询平均成绩⼤于等于 85 的所有学⽣的学号、姓名和平均成绩27. 查询课程名称为「数学」,且分数低于 60 的学⽣姓名和分数28. 查询所有学⽣的课程及分数情况(存在学⽣没成绩,没选课的情况)29. 查询任何⼀门课程成绩在 70 分以上的姓名、课程名称和分数30. 查询不及格的课程31. 查询课程编号为 01 且课程成绩在 80 分以上的学⽣的学号和姓名32. 求每门课程的学⽣⼈数33. 成绩不重复,查询选修「张三」⽼师所授课程的学⽣中,成绩最⾼的学⽣信息及其成绩34. 成绩有重复的情况下,查询选修「张三」⽼师所授课程的学⽣中,成绩最⾼的学⽣信息及其成 绩35. 查询不同课程成绩相同的学⽣的学⽣编号、课程编号、学⽣成绩36. 查询每门功成绩最好的前两名37. 统计每门课程的学⽣选修⼈数(超过 5 ⼈的课程才统计)。

sql语句练习50题

sql语句练习50题Student(Sid,Sname,Sage,Ssex) 学⽣表Course(Cid,Cname,Tid) 课程表SC(Sid,Cid,score) 成绩表Teacher(Tid,Tname) 教师表练习内容:1.查询“某1”课程⽐“某2”课程成绩⾼的所有学⽣的学号;SELECT a.sid FROM (SELECT sid,score FROM SC WHERE cid=1) a,(SELECT sid,score FROM SC WHERE cid=3) b WHEREa.score>b.score AND a.sid=b.sid;此题知识点,嵌套查询和给查出来的表起别名2.查询平均成绩⼤于60分的同学的学号和平均成绩;SELECT sid,avg(score) FROM sc GROUP BY sid having avg(score) >60;此题知识点,GROUP BY 语句⽤于结合合计函数,根据⼀个或多个列对结果集进⾏分组。

group by后⾯不能接where,having代替了where3.查询所有同学的学号、姓名、选课数、总成绩SELECT Student.sid,Student.Sname,count(SC.cid),sum(score)FROM Student left Outer JOIN SC on Student.sid=SC.cid GROUP BY Student.sid,Sname4.查询姓“李”的⽼师的个数;select count(teacher.tid)from teacher where teacher.tname like'李%'5.查询没学过“叶平”⽼师课的同学的学号、姓名;SELECT Student.sid,Student.Sname FROM Student WHERE sid not in (SELECT distinct( SC.sid) FROM SC,Course,Teacher WHERE SC.cid=Course.cid AND Teacher.id=Course.tid AND Teacher.Tname='叶平');此题知识点,distinct是去重的作⽤6.查询学过“```”并且也学过编号“```”课程的同学的学号、姓名;select a.SID,a.SNAME from (select student.SNAME,student.SID from student,course,sc where cname='c++'and sc.sid=student.sid and sc.cid=course.cid) a,(select student.SNAME,student.SID from student,course,sc where cname='english'and sc.sid=student.sid and sc.cid=course.cid) b where a.sid=b.sid;标准答案(但是好像不好使)SELECT Student.S#,Student.Sname FROM Student,SC WHERE Student.S#=SC.S# ANDSC.C#='001'and exists( SELECT * FROM SC as SC_2 WHERE SC_2.S#=SC.S# AND SC_2.C#='002');此题知识点,exists是在集合⾥找数据,as就是起别名7.查询学过“叶平”⽼师所教的所有课的同学的学号、姓名;select a.sid,a.sname from (select student.sid,student.sname from student,teacher,course,scwhere teacher.TNAME='杨巍巍' and teacher.tid=course.tid and course.cid=sc.cid and student.sid=sc.sid) a标准答案:SELECT sid,Sname FROM Student WHERE sid in (SELECT sid FROM SC ,Course ,Teacher WHERE SC.cid=Course.cid AND Teacher.tid=Course.tid AND Teacher.Tname='杨巍巍' GROUP BY sid having count(SC.cid)=(SELECT count(cid) FROM Course,Teacher WHERE Teacher.tid=Course.tid AND Tname='杨巍巍'))8.查询课程编号“”的成绩⽐课程编号“”课程低的所有同学的学号、姓名;select a.sid,a.sname from(select student.SID,student.sname,sc.SCORE from student,sc where student.sid=sc.sid and sc.cid=1) a, (select student.SID,student.sname,sc.score from student,sc where student.sid=sc.sid and sc.cid=2) b where a.score<b.score anda.sid=b.sid标准答案:SELECT sid,Sname FROM (SELECT Student.sid,Student.Sname,score ,(SELECT score FROM SC SC_2 WHERE SC_2.sid=Student.sid AND SC_2.cid=1) score2 FROM Student,SCWHERE Student.sid=SC.sid AND cid=1) S_2 WHERE score2 <score;9.查询所有课程成绩⼩于分的同学的学号、姓名;SELECT sid,Sname FROM Student WHERE sid not in (SELECT Student.sid FROM Student,SC WHERE Student.sid=SC.sid AND score>60);此题知识点,先查出⼤于60分的,然后not in 就是⼩于60分的了10.查询没有学全所有课的同学的学号、姓名;SELECT Student.sid,Student.Sname FROM Student,SCWHERE Student.sid=SC.sid GROUP BY Student.sid,Student.Sname having count(cid) <(SELECT count(cid) FROM Course);11.查询⾄少有⼀门课与学号为“”的同学所学相同的同学的学号和姓名;12.查询⾄少学过学号为“”同学所有⼀门课的其他同学学号和姓名;SELECT student.sid,student.Sname FROM Student,SC WHERE Student.sid=SC.sid AND cid in (SELECT cid FROM SC WHERE sid=1)此题知识点,SELECT sid,Sname FROM Student,SC WHERE Student.sid=SC.sid AND cid in (SELECT cid FROM SC WHEREsid=1)这样写是错误的,因为from后⾯是两个表,不能明确是哪个表⾥⾯的sid和sname所以错误提⽰是“未明确定义列”13.把“SC”表中“叶平”⽼师教的课的成绩都更改为此课程的平均成绩;update sc set score=(select avg(score) from sc,course,teacher where course.cid=sc.cid and course.tid=teacher.tid andteacher.tname='杨巍巍')14.查询和“”号的同学学习的课程完全相同的其他同学学号和姓名;SELECT sid FROM SC WHERE cid in (SELECT cid FROM SC WHERE sid=6) GROUP BY sid having count(*)=(SELECT count(*) FROM SC WHERE sid=6);此题知识点,⽤数量来判断15.删除学习“叶平”⽼师课的SC表记录;delete from sc s where s.cid in (select c.cid from teacher t,course c where t.tid = c.tid and tname='李⼦')此题知识点,嵌套查询可以分布考虑,先查出李⼦⽼师都交了什么课的id,然后再删除那些id的值16.向SC表中插⼊⼀些记录,这些记录要求符合以下条件:没有上过编号“”课程的同学学号、课程的平均成绩;Insert into SC SELECT sid,2,(SELECT avg(score) FROM SC WHERE cid=2) FROM Student WHERE sid not in (SELECT sid FROM SC WHERE cid=2);17.按平均成绩从⾼到低显⽰所有学⽣的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显⽰:学⽣ID,,数据库,企业管理,英语,有效课程数,有效平均分;(没做出来)18.查询各科成绩最⾼和最低的分:以如下形式显⽰:课程ID,最⾼分,最低分;select cid as 课程号,max(score)as 最⾼分,min(score) as 最低分 from sc group by cid标准答案(但是运⾏不好使)SELECT L.cid As 课程ID,L.score AS 最⾼分,R.score AS 最低分FROM SC L ,SC AS RWHERE L.cid = R.cid ANDL.score = (SELECT MAX(IL.score)FROM SC AS IL,Student AS IMWHERE L.cid = IL.cid AND IM.sid=IL.sidGROUP BY IL.cid)AND R.Score = (SELECT MIN(IR.score) FROM SC AS IR WHERE R.cid = IR.cid GROUP BY IR.cid );19.按各科平均成绩从低到⾼和及格率的百分数从⾼到低顺序26.查询每门课程被选修的学⽣数select sc.cid,count(sc.sid) from sc,course where sc.cid=course.cid group by sc.cid27.查询出只选修了⼀门课程的全部学⽣的学号和姓名SELECT SC.sid,Student.Sname,count(cid) AS 选课数 FROM SC ,StudentWHERE SC.sid=Student.sid GROUP BY SC.sid ,Student.Sname having count(cid)=1;32.查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列SELECT Cid,Avg(score) FROM SC GROUP BY cid ORDER BY Avg(score),cid DESC ;37.查询不及格的课程,并按课程号从⼤到⼩排列SELECT cid,sid FROM sc WHERE score <60 ORDER BY cid38.查询课程编号为且课程成绩在分以上的学⽣的学号和姓名;select student.sid,student.sname from sc,student where sc.cid=1 and sc.score>60 and sc.sid=student.sid40.查询选修“叶平”⽼师所授课程的学⽣中,成绩最⾼的学⽣姓名及其成绩select student.sname,sc.score from sc,student,teacher,course c where teacher.tname='李⼦'and teacher.tid=c.tid and c.cid=sc.cid and sc.sid=student.sid and sc.score=(select max(score)from sc where sc.cid=c.cid)41.查询各个课程及相应的选修⼈数select sc.cid ,count(sc.sid)from sc,student where sc.sid=student.sid group by sc.cid43.查询每门功成绩最好的前两名44.统计每门课程的学⽣选修⼈数(超过⼈的课程才统计)。

sql基础50题

sql基础50题1. 什么是SQL?它的作用是什么?2. SQL中的数据类型有哪些?3. SQL中如何创建表格?4. SQL中如何插入数据?5. SQL中如何查询数据?6. SQL中如何更新数据?7. SQL中如何删除数据?8. SQL中如何对数据进行排序?9. SQL中如何对数据进行分组?10. SQL中如何对数据进行过滤?11. SQL中如何进行数据的连接操作?12. SQL中如何使用子查询?13. SQL中如何使用聚合函数?14. SQL中如何使用索引提高查询性能?15. SQL中如何使用视图?16. SQL中如何使用存储过程?17. SQL中如何使用触发器?18. SQL中如何进行事务管理?19. SQL中如何进行数据备份与恢复?20. SQL中如何使用JOIN进行表连接?21. SQL中如何使用UNION进行表合并?22. SQL中如何使用DISTINCT去重?23. SQL中如何使用HAVING进行分组过滤?24. SQL中如何使用LIKE进行模糊查询?25. SQL中如何使用IN进行条件筛选?26. SQL中如何使用BETWEEN进行范围查询?27. SQL中如何使用COUNT函数统计数据数量?28. SQL中如何使用SUM函数求和?29. SQL中如何使用MAX函数获取最大值?30. SQL中如何使用MIN函数获取最小值?31. SQL中如何使用AVG函数计算平均值?32. SQL中如何使用GROUP BY进行分组统计?33. SQL中如何使用ORDER BY进行排序?34. SQL中如何使用LIMIT进行分页查询?35. SQL中如何使用UPDATE进行数据更新?36. SQL中如何使用DELETE进行数据删除?37. SQL中如何使用TRUNCATE进行数据清空?38. SQL中如何使用TRANSACTION进行事务处理?39. SQL中如何使用JOIN进行内连接?40. SQL中如何使用LEFT JOIN进行左连接?41. SQL中如何使用RIGHT JOIN进行右连接?42. SQL中如何使用FULL JOIN进行全连接?43. SQL中如何使用UNION进行多表合并?44. SQL中如何使用CREATE INDEX进行索引创建?45. SQL中如何使用DROP INDEX进行索引删除?46. SQL中如何使用CREATE VIEW进行视图创建?47. SQL中如何使用DROP VIEW进行视图删除?48. SQL中如何使用CREATE PROCEDURE进行存储过程创建?49. SQL中如何使用DROP PROCEDURE进行存储过程删除?50. SQL中如何使用CREATE TRIGGER进行触发器创建?。

Oracle的sql语句练习题含答案

Oracle的sql语句练习题含答案--1、选择部门30中的雇员select * from emp where deptno=30;--2、列出所有办事员的姓名、编号和部门select ename,empno,dname from emp e inner join dept d on e.deptno = d.deptno where job=upper('clerk‟);--3、找出佣金高于薪金的雇员select * from emp where comm>sal;--4、找出佣金高于薪金60%的雇员select * from emp where comm>sal*0.6--5、找出部门10中所有经理和部门20中的所有办事员的详细资料select * from emp where (deptno=10 and job=upper('manager')) or (deptno=20 and job=upper('clerk '));--6、找出部门10中所有经理、部门20中所有办事员,既不是经理又不是办事员但其薪金>=2000的所有雇员的详细资料select * from emp where (deptno=10 and job=upper('manager')) or (deptno=20 and job=upper('clerk ')) or (job<>upper(…manager‟) and job<>upper(…clerk‟) and sal>=2000)--7、找出收取佣金的雇员的不同工作select distinct job from emp where comm>0;--8、找出不收取佣金或收取的佣金低于100的雇员select * from emp where nvl(comm,0)<100;--9、找出各月最后一天受雇的所有雇员select * from emp where hiredate= last_day(hiredate);--10、找出早于25年之前受雇的雇员select * from emp where months_between(sysdate,hiredate)/12>25;select * from emp where hiredate<ADD_MONTHS(SYSDATE,-12*25);< P>--11、显示只有首字母大写的所有雇员的姓名select ename from emp where ename=initcap(ename);--12、显示正好为6个字符的雇员姓名select ename from emp where length(ename)=6--13、显示不带有'R'的雇员姓名Select ename from emp where ename not like …%R%‟;Select ename from emp where instr(ename,‟R‟)=0;--14、显示所有雇员的姓名的前三个字符select substr(ename,1,3) from emp--15、显示所有雇员的姓名,用a替换所有'A'Select replace(ename,‟A‟,‟a‟) from emp--16、显示所有雇员的姓名以及满10年服务年限的日期Select ename,add_months(hiredate,12*10) …服务年限的日期‟ from e mp--17、显示雇员的详细资料,按姓名排序Select * from emp order by ename--18、显示雇员姓名,根据其服务年限,将最老的雇员排在最前面Select ename from emp order by hiredate--19、显示所有雇员的姓名、工作和薪金,按工作的降序顺序排序,而工作相同时按薪金升序Select ename,job,sal from emp order by job desc ,sal asc--20、显示所有雇员的姓名和加入公司的年份和月份,按雇员受雇日所在月排序,将最早年份的项目排在最前面select ename,to_char(hiredate,'yyyy'),to_char(hiredate,'mm') from emp order by hiredate asc--21、显示在一个月为30天的情况下所有雇员的日薪金select ename,sal/30 from emp;--22、找出在(任何年份的)2月受聘的所有雇员select * from emp where to_char(hiredate,'mm')='02';--23、对于每个雇员,显示其加入公司的天数select ename,sysdate-hiredate from emp--24、显示姓名字段的任何位置,包含"A" 的所有雇员的姓名select ename from emp where ename like '%A%';select ename from emp where instr(ename,‟A‟,1)>0;--25、以年、月和日显示所有雇员的服务年限Select months_between(sysdate,hiredate)/12 as “年”,months_between(sysdate,hiredate) as “月”, sysdate-hiredate as “日” from emp--1、列出至少有一个雇员的所有部门select distinct dname from dept where deptno in (select distinct deptno from emp);--2、列出薪金比"SMITH"多的所有雇员select ename,sal from emp where sal>(select sal from emp whereename=upper('smith'));--3、列出所有雇员的姓名及其直接上级的姓名select e.ename,m.ename from emp e,emp m where e.mgr=m.empno(+);--4、列出入职日期早于其直接上级的所有雇员select ename from emp e where hiredate<(select hiredate from emp where empno=e.mgr);--5、列出部门名称和这些部门的雇员,同时列出那些没有雇员的部门select dname,ename from dept d left join emp e on d.deptno=e.deptno;--6、列出所有“CLERK”(办事员)的姓名及其部门名称select ename,dname from emp e left join dept d on e.deptno=d.deptno wherejob=upper('clerk');--7、列出各种工作类别的最低薪金,显示最低薪金大于1500的记录select job,min(sal) from emp group by job having min(sal)>1500;--8、列出从事“SALES”(销售)工作的雇员的姓名,假定不知道销售部的部门编号select ename from emp where deptno = (select deptno from dept wheredname=uppder('SALES'))--9、列出薪金高于公司平均水平的所有雇员select ename from emp where sal>(select avg(sal) from emp);--10、列出与“SCOTT”从事相同工作的所有雇员select ename from emp where job=(select job from emp whereename=upper('scott'));--11、列出某些雇员的姓名和薪金,条件是他们的薪金等于部门30中任何一个雇员的薪金select ename,sal from emp where sal in (select sal from emp where deptno=30);--12、列出某些雇员的姓名和薪金,条件是他们的薪金高于部门30中所有雇员的薪金select ename ,sal from emp where sal>(select max(sal) from emp where deptno=30);--13、列出每个部门的信息以及该部门中雇员的数量select d.deptno,dname,count(ename) from dept d left join emp e on(d.deptno=e.deptno)group by d.deptno,dname--14、列出所有雇员的雇员名称、部门名称和薪金Select e.ename,d.dname,e.sal from emp e left join dept d on (d.deptno=e.deptno)--15、列出从事同一种工作但属于不同部门的雇员的不同组合Select tba.ename,tbb.ename,tba.job,tbb.job,tba.deptno,tba.deptnoFrom emp tba,emp tbbWhere tba.job=tbb.job and tba.deptno<>tbb.deptno--16、列出分配有雇员数量的所有部门的详细信息,即使是分配有0个雇员Select dept.deptno,dname,loc,count(empno)From dept,empWhere dept.deptno=emp.deptno(+)Group by dept.deptno,dname,loc--17、列出各种类别工作的最低工资Select min(sal) from emp group by job--18、列出各个部门的MANAGER(经理)的最低薪金Select deptno,min(sal) from emp where job=upper(…manager‟) group by deptno--19、列出按年薪排序的所有雇员的年薪select (sal+nvl(comm,0))*12 as avn from emp order by avn--20、列出薪金水平处于第四位的雇员Select * from (Select ename,sal, rank() over (order by sal desc) as grade from emp) where grade=4。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基本信息Student(`S#`,Sname,Sage,Ssex) 学生表Course(`C#`,Cname,`T#`) 课程表SC(`S#`,`C#`,score) 成绩表Teacher(`T#`,Tname) 教师表问题:1、查询“001”课程比“002”课程成绩高的所有学生的学号;select a.`S#` from (select `S#`,score from SC where `C#`='001') a,(select `S#`,scorefrom SC where `C#`='002') b where a.score>b.score and a.`S#`=b.`S#`;↑一张表中存在多对多情况的2、查询平均成绩大于60分的同学的学号和平均成绩;答案一:select `S#`,avg(score) from sc group by `S#` having avg(score) >60;↑一对多,对组进行筛选答案二:SELECT s ,scrFROM (SELECT sc.`S#` s,AVG(sc.`score`) scr FROM sc GROUP BY sc.`S#`) rsWHERE rs.scr>60 ORDER BY rs.scr DESC↑嵌套查询可能影响效率3、查询所有同学的学号、姓名、选课数、总成绩;答案一:select Student.`S#`,Student.Sname,count(`C#`),sum(score) from Student left Outer join SC on Student.`S#`=SC.`S#` group by Student.`S#`,Sname↑如果学生没有选课,仍然能查出,显示总分null(边界情况)答案二:SELECT student.`S#`,student.`Sname`,COUNT(sc.`score`) 选课数,SUM(sc.`score`) 总分FROM Student,scWHERE student.`S#`=sc.`S#` GROUP BY sc.`S#`↑如果学生没有选课,sc表中没有他的学号,就查不出该学生,有缺陷!4、查询姓“李”的老师的个数;select count(distinct(Tname)) from Teacher where Tname like '李%';5、查询没学过“叶平”老师课的同学的学号、姓名;select Student.`S#`,Student.Sname from Student where `S#` not in (select distinct(SC.`S#`) from SC,Course,Teacher where SC.`C#`=Course.`C#` and Teacher.`T#`=Course.`T#` and Teacher.Tname='叶平');↑反面思考Step1:先找学过叶平老师课的学生学号,三表联合查询Step2:在用not in 选出没学过的Step3:distinct以防叶平老师教多节课;否则若某同学的几节课都由叶平教,学号就会出现重复6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;select Student.`S#`,Student.Sname from Student,SC where Student.`S#`=SC.`S#` and SC.`C#`='001'and exists( Select * from SC as SC_2 where SC_2.`S#`=SC.`S#` and SC_2.`C#`='002' );↑注意目标字段`S#`关联exists subquery 可以用in subquery代替,如下select Student.`S#`,Student.Sname from Student,Sc where Student.`S#`=SC.`S#` and SC.`C#`='001'and sc.`s#` in ( select sc_2.`s#` from sc as sc_2 where sc_2.`c#`='002' );↑不同之处,in subquery此处就不需要关联了7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;select `S#`,Sname from Studentwhere `S#` in(select `S#` from SC ,Course ,Teacher where SC.`C#`=Course.`C#` and Teacher.`T#`=Course.`T#` and Teacher.Tname='叶平' group by `S#`having count(SC.`C#`)=(select count(`C#`) from Course,Teacher where Teacher.`T#`=Course.`T#` and Tname='叶平'));8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;(太混乱)Select `S#`,Sname from (select Student.`S#`,Student.Sname,score ,(select score from SC SC_2 where SC_2.`S#`=Student.`S#` and SC_2.`C#`='002') score2 from Student,SC where Student.`S#`=SC.`S#` and `C#`='001') S_2 where score2 <score;自己写的另一种方法:SELECT student.`S#`,student.Sname FROM studentWHERE `S#` IN( SELECT a.`S#` FROM(SELECT * FROM sc WHERE `C#`='001') a ,(SELECT * FROM sc WHERE `C#`='002') bWHERE a.score>b.score AND a.`S#`=b.`S#`) ;↑子查询的应用方式与第1题类似,在一对多关系表中,如果多组之间需要比较,可以将不同组抽出为几个子查询,再比较。

这里的“一”指课程编号。

9、查询所有课程成绩小于60分的同学的学号、姓名;↓初始答案(效率最低):select `S#`,Sname from Student where `S#` not in (select Student.`S#` from Student,SC where Student.`S#`=SC.`S#` and score>60); (第二个select根本不需要联合查询)↓改进简化版(效率更高):select `S#`,Sname from Studentwhere `S#` not in(select distinct `S#` from SC where score>60); (从反面思考更简化)↓自己写的另一种方法(效率其次,但有缺陷。

边界情况:没有学任何课程的人,查不出来):SELECT Student.`S#`,Student.Sname FROM StudentWHERE `S#` IN(SELECT `S#` FROM sc GROUP BY `S#` HAVING MAX(score)<60);In 和not in 去构造,有时候查出来的结果并不一样,需要考虑目标字段`S#`是否在几个表中都有10、查询没有学全所有课的同学的学号、姓名;select Student.`S#`,Student.Sname from Student,SC where Student.`S#`=SC.`S#` group by Student.`S#`,Student.Sname having count(`C#`) <(select count(`C#`) from Course);↑有缺陷,没有选任何课的人查不出来。

因为使用了关联查询,若存在关联不上的(一张表有,另一张表没有),就会遗漏。

select student.`s#`,student.sname from studentwhere student.`s#` not in(select `s#` from sc group by `s#` having count(`c#`) = (select count(`c#`) from course));↑可以查出没有选任何课的人,单表查询操作,不涉及关联。

11、查询至少有一门课与学号为“P1001”的同学所学相同的同学的学号和姓名;select DISTINCT Student.`S#`,Sname from Student,SC where Student.`S#`=SC.`S#` and `C#` in (select `C#` from SC where `S#`='P1001') ; (存在性用in即可)↑没有排除自身,↓把结果中的P1001自己去掉12、查询至少学过学号为“P1001”同学所有一门课的其他同学学号和姓名;select distinct SC.`S#`,Sname from Student,SC where Student.`S#`=SC.`S#` and `C#` in (select `C#` from SC where `S#`='001') AND Student.`s#` != 'P1001';←(绿色为补充,排除P1001本身)13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;(有错误,很混乱)update SC set score=(select avg(SC_2.score) from SC SC_2 where SC_2.`C#`=SC.`C#` ) from Course,Teacher where Course.`C#`=SC.`C#` and Course.`T#`=Teacher.`T#` and Teacher.Tname='叶平'); mysql报错,可能其他数据库能这么写题目特点,把一张表的值查出来再插到这张表中,但实际不允许,会报错。

相关文档
最新文档