sql查询语句练习(解析版)

sql查询语句练习(解析版)BY DD表情况Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表create table Student(S# varchar2(20),Sname varchar2(10),Sage int,Ssex varchar2(2)) ;create table Course(C# varchar2(20),Cname varchar2(10),score varchar2(4)) ;create table SC(S# varchar2(20),C# varchar2(20),score varchar2(4)) ;create table Teacher(T# varchar2(20),Tname varchar2(10)) ;insert into Student(S#,Sname,Sage,Ssex) values('1001','李五','15','男');insert into Student(S#,Sname,Sage,Ssex) values('1002','张三','16','女');insert into Student(S#,Sname,Sage,Ssex) values('1003','李四','15','女');insert into Student(S#,Sname,Sage,Ssex) values('1004','陈二','14','男');insert into Student(S#,Sname,Sage,Ssex) values('1005','小四','15','男');问题:1、查询“001”课程比“002”课程成绩高的所有学生的学号;select a.S# from (select s#,score from SC where C#='001') a,(select s#,scorefrom SC where C#='002') bwhere a.score>b.score and a.s#=b.s#;解析:(select s#,score from SC where C#='001') a//从SC中查询C#=001的学生学号和分数,并定义为a表。

(select s#,score from SC where C#='002') b //从SC中查询C#=002的学生学号和分数,并定义为b表。

where a.score>b.score and a.s#=b.s# 条件,a表与b表中学号相同且分数比b中的高。

2、查询平均成绩大于60分的同学的学号和平均成绩;select S#,avg(score) rom scgroup by S# having avg(score) >60;解析: group by S# having avg(score) >60 这里是指平均分数大于60分的学号。

使用HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句,根据一个或多个列对结果集进行分组。

3、查询所有同学的学号、姓名、选课数、总成绩;select Student.S#,Student.Sname,count(SC.C#),sum(score)from Student left Outer join SC on Student.S#=SC.S#group by Student.S#,Sname解析: Student left Outer join SC on Student.S#=SC.S# 左外连接,从student表返回所有的行放于左表中,从SC中返回的与左表匹配的行放于右表。

Student表中有但SC表中没有的在右表中对应行留空。

group by Student.S#,Sname 以 Student.S#,Sname分组。

4、查询姓“李”的老师的个数;select count(distinct(Tname))from Teacherwhere Tname like'李%';解析:distinct(Tname) 在表中,可能会包含重复值。

DISTINCT 用于返回唯一不同的值,这里的作用就是防止返回的Tname出现重复值。

where Tname like '李%' 模糊查询,"%"代表一或多个字符。

5、查询没学过“叶平”老师课的同学的学号、姓名;Select Student.S#,Student.Snamefrom Studentwhere S# not in(select distinct(SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平');解析:not in 题目是查询没学过“叶平”老师课的同学的学号、姓名,这里使用not in 就表示所要查询的S#不在后面的结果中。

(select distinct(SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平');这段语句是查询学过“叶平”老师课的同学的学号,这里其实查询的SC表,但可看到查的表是SC,Course,Teacher表,根据后面的条件语句,用来关联查询的。

三个条件要同时满足,从而查询出“叶平”老师课的同学的学号SC.C#=Course.C#,Teacher.T#=Course.T# 由于SC与Teacher并无直接联系,这里将SC与Teacher表联系起来, Teacher.Tname='叶平':教师名为叶平,从而对应到SC表。

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');解析:select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001' 这一句查询到的是学过“001”课程的同学的学号、姓名;and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');使用 exists关键字,用来判断是否存在的,当exists(查询)中的查询结果存在时则返回真,否则返回假。

这里指查询学过002课程的同学,使用 and则将得到的结果与上一句匹配得上就都为真,返回结果。

若不匹配,则不返回结果。

7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;select S#,Snamefrom 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='叶平'));解析:这一道题与第5题接近,只是答案后面多了:group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname='叶平')。

Group by...having..的句式我们已经知道是因为WHERE 关键字无法与合计函数一起使用。

合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句,根据一个或多个列对结果集进行分组。

接下来就是理解count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname='叶平')的含义了,count(SC.C#)是基于前面条件叶平老师在SC表中课程号的数量,select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname='叶平',是从Course中查询叶平老师的所有课程号数量。

这里条件是说course中叶平老师的课程数与成绩表中的课程数相等。

(SB我也不知为什么这么写)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') score2from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score;解析:1.select score as score2 from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002';2.select Student.S#,Student.Sname,score , score2 as S_2 from Student,SC where Student.S#=SC.S# and C#='001';3.Select S#,Sname from S_2 where score2 <score;Score2在C#='001'的条件中可select,Score包含Score2?9、查询所有课程成绩小于60分的同学的学号、姓名;select S#,Snamefrom Studentwhere S# not in(select Student.S# from Student,SC where S.S#=SC.S# and score>60);不解析!10、查询没有学全所有课的同学的学号、姓名;select Student.S#,Student.Sname from Student,SCwhere Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);解析: having count(C#) <(select count(C#) from Course); 基于上面条件Student.S#=SC.S# 课程数量小于course表中所有课程数。

合集下载

SQL查询语句练习及结果

SQL查询语句练习及结果

1 单表查询1.1 查询订购日期在1996年7月1日至1996年7月15日之间的订单的订购日期、订单ID、客户ID和雇员ID等字段的值查询语句:select 订单ID客户ID雇员ID订购日期from 订单WHERE 订购日期BETWEEN '1996-7-1' AND '1996-7-15';1.2 查询供应商的ID、公司名称、地区、城市和电话字段的值。

条件是“地区等于华北”并且“联系人头衔等于销售代表”。

查询语句:select 供应商ID公司名称地区城市电话from `供应商`WHERE 地区 = '华北'AND 联系人职务 = '销售代表';1.3 查询供应商的ID、公司名称、地区、城市和电话字段的值。

其中的一些供应商位于华东或华南地区,另外一些供应商所在的城市是天津查询语句:select 供应商ID公司名称地区城市电话from `供应商`WHERE 地区 in('华东''华南') or 城市 = '天津';1.4 查询位于“华东”或“华南”地区的供应商的ID、公司名称、地区、城市和电话字段的值查询语句:select 供应商ID公司名称地区城市电话 from `供应商` WHERE 地区 in('华东''华南');2 多表查询2.1查询订购日期在1996年7月1日至1996年7月15日之间的订单的订购日期、订单ID、相应订单的客户公司名称、负责订单的雇员的姓氏和名字等字段的值,并将查询结果按雇员的“姓氏”和“名字”字段的升序排列,“姓氏”和“名字”值相同的记录按“订单ID”的降序排列查询语句:select 订购日期订单ID公司名称姓氏名字from 订单 aleft join 客户 b on a.客户ID = b.客户IDleft join 雇员 c on a.雇员ID = c.雇员IDWHERE 订购日期 BETWEEN '1996-7-1' AND '1996-7-15'order by 姓氏名字订单ID2.2 查询“10248”和“10254”号订单的订单ID、运货商的公司名称、订单上所订购的产品的名称查询语句:select 订购日期订单ID公司名称姓氏名字from 订单 aleft join 客户 b on a.客户ID = b.客户IDleft join 雇员 c on a.雇员ID = c.雇员IDWHERE 订购日期 BETWEEN '1996-7-1' AND '1996-7-15'order by 姓氏名字订单ID2.3 查询“10248”和“10254”号订单的订单ID、订单上所订购的产品的名称、数量、单价和折扣查询语句:select a.订单IDc.产品名称b.单价b.数量b.折扣from 订单 aleft join 订单明细 b on a.订单ID = b.订单IDleft join 产品 c on c.产品ID = b.产品IDwhere a.订单ID in('10248''10254')2.4 查询“10248”和“10254”号订单的订单ID、订单上所订购的产品的名称及其销售金额销售金额=单价*数量*(1-折扣)查询语句:select a.订单IDc.产品名称 round(b.单价*b.数量*(1-b.折扣)2) as 销售金额from 订单 aleft join 订单明细 b on a.订单ID = b.订单IDleft join 产品 c on c.产品ID = b.产品IDwhere a.订单ID in('10248''10254')3 综合查询3.1 查询所有运货商的公司名称和电话查询语句:select 公司名称电话 from 运货商3.2 查询所有客户的公司名称、电话、传真、地址、联系人姓名和联系人头衔查询语句:select 公司名称电话传真地址联系人姓名联系人职务from 客户3.3 查询单价介于10至30元的所有产品的产品ID、产品名称和库存量查询语句:select 产品ID产品名称库存量from 产品where 单价 BETWEEN 10 and 303.4 查询单价大于20元的所有产品的产品名称、单价以及供应商的公司名称、电话查询语句:select a.产品名称a.单价b.公司名称b.电话from 产品 aleft join 供应商 b on a.供应商ID = b.供应商IDwhere 单价 > 203.5 查询上海和北京的客户在1996年订购的所有订单的订单ID、所订购的产品名称和数量查询语句:select a.订单IDd.产品名称c.数量from 订单 aleft join 客户 b on a.客户ID = b.客户IDleft join 订单明细 c on a.订单ID = c.订单IDleft join 产品 d on c.产品ID =d.产品IDwhere b.城市 in('上海''北京')3.6 查询华北客户的每份订单的订单ID、产品名称和销售金额查询语句:select a.订单IDd.产品名称 round(c.单价*c.数量*(1-c.折扣)2) as 销售金额from 订单 aleft join 客户 b on a.客户ID = b.客户IDleft join 订单明细 c on a.订单ID = c.订单IDleft join 产品 d on c.产品ID =d.产品IDwhere b.地区 = '华北'3.7 按运货商公司名称,统计1997年由各个运货商承运的订单的总数量查询语句:select b.公司名称count(a.订单ID) as 订单总数量from 订单 aleft join 运货商 b on a.运货商 = b.运货商IDwhere year(a.订购日期) = 1997group by b. 公司名称3.8 统计1997年上半年的每份订单上所订购的产品的总数量查询语句:select b.公司名称sum(c.数量) as 产品总数量from 订单 aleft join 运货商 b on a.运货商 = b.运货商IDleft join 订单明细 c on a.订单ID = c.订单IDwhere 订购日期 between '1997-01-01' and '1997-06-30'group by b.公司名称3.9 统计各类产品的平均价格查询语句:select 类别名称round(sum(a.单价*a.数量*(1-a.折扣))/sum(a.数量)2) as 平均价格from 订单明细 aleft join 产品 b on a.产品ID = b.产品IDleft join 类别 c on b.类别ID = c.类别IDgroup by c.类别名称3.10 统计各地区客户的总数量查询语句:select 地区count(客户ID) as 客户总数from 客户group by 地区。

数据库常用SQL语句练习(含答案)

数据库常用SQL语句练习(含答案)

Emp(员工表)和Dept(部门表)简单题1. 案例:查询没有上级领导的员工的编号,姓名,工资select empno,ename,sal from emp where mgr is null;2. 案例:查询emp表中没有奖金的员工的姓名,职位,工资,以及奖金select ename,job,sal,comm from emp where comm is null or comm=0;既可以是null,也可以是03. 案例:查询emp表中含有奖金的员工的编号,姓名,职位,以及奖金select ename,job,sal,comm from emp where comm>0;4. 案例:查询含有上级领导的员工的姓名,工资以及上级领导的编号select ename,sal,mgr from emp where mgr is not null;5. 案例:查询emp表中名字以‘S’开头的所有员工的姓名select ename from emp where ename like 's%'6. 案例:查询emp表中名字的最后一个字符是'S'的员工的姓名select ename from emp where ename like '%s'7. 案例:查询倒数的第2个字符是‘E’的员工的姓名select ename from emp where ename like '%e_'8. 案例:查询emp表中员工的倒数第3个字符是‘N’的员工姓名select ename from emp where ename like '%n__'9. 案例:查询emp表中员工的名字中包含‘A’的员工的姓名select ename from emp where ename like '%a%'10. 案例:查询emp表中名字不是以'K'开头的员工的所有信息select * from emp where ename not like 'k%';11. 案例:查询emp表中名字中不包含‘A’的所有员工的信息select * from emp where ename not like '%a%'12. 案例:做文员的员工人数(job= CLERK 的)select count(*) from emp where job='clerk';13. 案例:销售人员job: SALESMAN 的最高薪水select max(sal) from emp where job='salesman';14. 案例:最早和最晚入职时间select min(hiredate),max(hiredate) from emp;15. 案例:查询emp表中员工的编号,姓名,职位,工资,并且工资在1000~2000之间。

sql练习题及答案

sql练习题及答案

sql练习题及答案SQL练习题及答案SQL(Structured Query Language)是一种用于管理和操作关系型数据库的语言。

在数据库管理系统中,SQL被广泛应用于数据的查询、插入、更新和删除等操作。

掌握SQL语言对于数据库开发和数据分析非常重要。

在这篇文章中,我们将提供一些SQL练习题及其答案,帮助读者巩固和提升SQL的应用能力。

1. 查询员工表中所有员工的姓名和工资。

答案:```sqlSELECT 姓名, 工资 FROM 员工表;```2. 查询员工表中工资大于5000的员工的姓名和工资。

答案:```sqlSELECT 姓名, 工资 FROM 员工表 WHERE 工资 > 5000;```3. 查询员工表中工资在3000到5000之间的员工的姓名和工资。

答案:```sqlSELECT 姓名, 工资 FROM 员工表 WHERE 工资 BETWEEN 3000 AND 5000;```4. 查询员工表中姓"张"的员工的姓名和工资。

```sqlSELECT 姓名, 工资 FROM 员工表 WHERE 姓名 LIKE '张%';```5. 查询员工表中工资最高的员工的姓名和工资。

答案:```sqlSELECT 姓名, 工资 FROM 员工表 WHERE 工资 = (SELECT MAX(工资) FROM 员工表);```6. 查询员工表中每个部门的员工数量。

答案:```sqlSELECT 部门, COUNT(*) AS 员工数量 FROM 员工表 GROUP BY 部门;```7. 查询员工表中每个部门的平均工资。

答案:```sqlSELECT 部门, AVG(工资) AS 平均工资 FROM 员工表 GROUP BY 部门;```8. 查询员工表中工资高于部门平均工资的员工的姓名和工资。

答案:SELECT 姓名, 工资 FROM 员工表 WHERE 工资 > (SELECT AVG(工资) FROM 员工表 GROUP BY 部门);```9. 查询员工表中没有分配部门的员工的姓名和工资。

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查询习题课解答

经典SQL查询习题课解答

经典SQL查询题解答create database cstp;use cstp;/*1:建立学生表*/create table student (学号char(3) primary key,姓名char(4),性别char(2),年龄int,班级char(5));insert into student values('108','曾华','男',19,'95033');insert into student values('105','匡明','男',20,'95031');insert into student values('107','王丽','女',20,'95033');insert into student values('101','李军','男',19,'95033');insert into student values('109','王芳','女',22,'95031');insert into student values('103','陆君','男',20,'95031');/*2:建立教师表*/create table teacher(教师号char(3) primary key,姓名char(4),性别char(2),年龄int ,级别char(6),专业char(8));insert into teacher values('804','李成','男',42,'副教授','计算机系'); insert into teacher values('856','张旭','男',35,'讲师','电子工程'); insert into teacher values('825','王萍','女',28,'助教','计算机系');insert into teacher values('831','刘冰','女',25,'助教','电子工程'); /*3:建立课程表*/create table course (课程号char(5) primary key,课程名char(10),教师号char(3),foreign key(教师号) references teacher(教师号));insert into course values('3-105','计算机导论','825');insert into course values('3-245','操作系统','804');insert into course values('6-166','数字电路','856');insert into course values('9-888','高等数学','831');/*4:建立选课表*/create table sc(学号char(3),课程号char(5),primary key(学号,课程号),成绩int,foreign key(学号) references student(学号),foreign key(课程号) references course(课程号));insert into sc values('103','3-245',86);insert into sc values('105','3-245',75);insert into sc values('109','3-245',68);insert into sc values('103','3-105',92);insert into sc values('105','3-105',88);insert into sc values('109','3-105',76);insert into sc values('101','3-105',64);insert into sc values('107','3-105',91);insert into sc values('108','3-105',78);insert into sc values('101','6-166',85); insert into sc values('107','6-166',79); insert into sc values('108','6-166',81); /*5:所有表内容*/select * from student;select * from course;select * from teacher;select * from sc;所有表信息如下:student(学生)表course(课程)表teacher(教师)表sc(选课)表作业题:1.查询选修课程'3-105'且成绩在60到80之间的所有记录。

SQL查询习题及答案

SQL查询习题及答案

36.设教学用的四个基本表(S,C,T,SC)(2)查询年龄大于23岁的女同学的学号和姓名select 姓名,学号from swhere 性别='女' and 年龄>23(3)查询至少选修了刘老师所讲授课程中的一门课程的女同学姓名select s.姓名from s,scwhere s.性别='女'and s.学号=sc.学号and sc.课程编号in(select c.课程编号from c,twhere c.教师编号=t.教师编号and t.姓名='刘%')(4)查询至少选修了2门课程的学生学号select sc.学号from scgroup by 学号having count(课程编号)>2(5)查询全部学生都选修的课程号与课程名select c.课程编号,c.课程名称from c,scwhere sc.课程编号=c.课程编号and sc.学号=(select distinct s.学号from s)(6)计算机系每个教师讲授的课程号select t.教师编号,课程编号from c,twhere t.所在系='计算机系(7)查询没有选修过任何一门课程的学生的学号select s.学号from swhere s.学号not in(select distinct sc.学号from sc)(10)统计个系教师的人数select count (教师编号)from tgroup by 所在系(11)统计出教师人数超过10人的系的名称select t.所在系from tgroup by 所在系having count(教师编号)>10(12)在选课表SC中查询成绩为NULL的学生的学号和课程号select 学号课程编号from scwhere 成绩='NULL'(13)姓王的同学的年龄、姓名、选课名称、成绩select 年龄,姓名,课程名称,成绩from s,c,scwhere s.学号=sc.学号and c.课程编号=sc.课程编号and s.姓名='王%'(14)查询年龄大于女同学平均年龄的男同学姓名和年龄select 姓名,年龄from swhere 性别='男' and 年龄>(select avg(年龄)from swhere 性别='女')37.在数据库{USER、ORDER}中,用户需要查询“所有于2009年5月25日下订单的女顾客姓名”。

sql习题及答案

sql习题及答案SQL习题及答案SQL(Structured Query Language)是一种用于管理和操作关系型数据库的语言。

它是许多软件开发人员和数据分析师必备的技能之一。

在学习SQL的过程中,练习是非常重要的,因为它可以帮助我们更好地理解和掌握这门语言。

以下是一些常见的SQL习题及答案,供大家练习和参考:1. 查询所有学生的信息```sqlSELECT * FROM students;```2. 查询所有学生的姓名和年龄```sqlSELECT name, age FROM students;```3. 查询所有学生的姓名和年龄,并按年龄从小到大排序```sqlSELECT name, age FROM students ORDER BY age;```4. 查询所有学生的平均年龄```sqlSELECT AVG(age) FROM students;```5. 查询所有学生的姓名和其所在班级的名称```sqlSELECT , c.class_nameFROM students sJOIN classes c ON s.class_id = c.class_id;```6. 查询所有学生的姓名和其所在班级的名称,如果没有班级则显示“未分配班级”```sqlSELECT , COALESCE(c.class_name, '未分配班级')FROM students sLEFT JOIN classes c ON s.class_id = c.class_id;```7. 查询每个班级的学生数量```sqlSELECT class_id, COUNT(*) AS student_countFROM studentsGROUP BY class_id;```以上是一些常见的SQL习题及答案,希望能够帮助大家更好地理解和掌握SQL 语言。

通过不断的练习和实践,相信大家一定能够成为SQL的高手!。

sql查询题目及答案

1、查询所有数学系学生的信息。

--select * from s where 系='数学系'2、查询李老师所教的课程号、课程名--select 课程号,课程名from c where 教师like '李%'3、查询年龄大于20岁的女同学的学号和姓名。

--select 学号,姓名from s where year(getdate())-year(出生日期)+1>20 and 性别='女'4、查询学号为‘H0301’所选修的全部课程成绩。

--select 成绩from sc where 学号= 'H0301'5、查询平均成绩都在80分以上的学生学号及平均成绩。

--select 学号,AVG(成绩) from sc group by 学号having AVG(成绩)>=806、查询至少有6人选修的课程号。

--select 课程号from sc group by 课程号having count(*)>67、查询C02号课程得最高分的学生的学号--select 学号from sc where 课程号='c02' and 成绩=(select max(成绩) from sc where 课程号='c02')8、查询学号为’J0101’的学生选修的课程号和课程名--select 课程号,课程名from c,sc where 学号='j0101' and c.课程号=sc.课程号9、‘李小波’所选修的全部课程名称。

--Select c.课程名from s,c,sc where s.学号=sc.学号and c.课程号=sc.课程号and 姓名='李小波'10、所有成绩都在70分以上的学生姓名及所在系。

--select 姓名,系from s,sc where s.学号=sc.学号group by 学号having min(成绩)>=7011、英语成绩比数学成绩好的学生--select sc2.学号from c c1,c c2,sc sc1,sc sc2 where c1.课程名='英语'--and c2.课程名='数学' and sc1.成绩>sc2.成绩and sc1.学号=sc2.学号--and c1.课程号=sc1.课程号and c2.课程号=sc2.课程号12、至少选修了两门课及以上的学生的姓名和性别select 姓名,性别from s,sc--where s.学号=sc.学号group by 学号having count(*)>=213、选修了李老师所讲课程的学生人数--select count(*) from C,sc where 教师like '李%' and c.课程号=sc.课程号group by sc.课程号14、‘操作系统’课程得最高分的学生的姓名、性别、所在系--select 姓名,性别,系from s,sc--where s.学号=sc.学号and 成绩=--(select max(成绩) from c,sc where sc.课程号=c.课程号and 课程名='操作系统')15、显示所有课程的选修情况。

SQL高级查询——50句查询(含答案)

SQL⾼级查询——50句查询(含答案)--⼀个题⽬涉及到的50个Sql语句--(下⾯表的结构以给出,⾃⼰在数据库中建⽴表.并且添加相应的数据,数据要全⾯些. 其中Student表中,SId为学⽣的ID)------------------------------------表结构----------------------------------------学⽣表tblStudent(编号StuId、姓名StuName、年龄StuAge、性别StuSex)--课程表tblCourse(课程编号CourseId、课程名称CourseName、教师编号TeaId)--成绩表tblScore(学⽣编号StuId、课程编号CourseId、成绩Score)--教师表tblTeacher(教师编号TeaId、姓名TeaName)-----------------------------------------------------------------------------------问题:--1、查询“001”课程⽐“002”课程成绩⾼的所有学⽣的学号;Select StuId From tblStudent s1Where (Select Score From tblScore t1 Where t1.StuId=s1.stuId And t1.CourseId='001')>(Select Score From tblScore t2 Where t2.StuId=s1.stuId And t2.CourseId='002')--2、查询平均成绩⼤于60分的同学的学号和平均成绩;Select StuId,Avg(Score) as AvgScore From tblScoreGroup By StuIdHaving Avg(Score)>60--3、查询所有同学的学号、姓名、选课数、总成绩;Select StuId,StuName,SelCourses=(Select Count(CourseId) From tblScore t1 Where t1.StuId=s1.StuId),SumScore=(Select Sum(Score) From tblScore t2 Where t2.StuId=s1.StuId)From tblStudent s1--4、查询姓“李”的⽼师的个数;Select Count(*) From tblTeacher Where TeaName like '李%'--5、查询没学过“叶平”⽼师课的同学的学号、姓名;Select StuId,StuName From tblStudentWhere StuId Not In(Select StuID From tblScore scInner Join tblCourse cu ON sc.CourseId=cu.CourseIdInner Join tblTeacher tc ON cu.TeaId=tc.TeaIdWhere tc.TeaName='叶平')--6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;Select StuId,StuName From tblStudent stWhere (Select Count(*) From tblScore s1 Where s1.StuId=st.StuId And s1.CourseId='001')>0 And(Select Count(*) From tblScore s2 Where s2.StuId=st.StuId And s2.CourseId='002')>0--7、查询学过“叶平”⽼师所教的所有课的同学的学号、姓名;Select StuId,StuName From tblStudent st Where not exists(Select CourseID From tblCourse cu Inner Join tblTeacher tc On cu.TeaID=tc.TeaIDWhere tc.TeaName='叶平' And CourseID not in(Select CourseID From tblScore Where StuID=st.StuID))--8、查询课程编号“002”的成绩⽐课程编号“001”课程低的所有同学的学号、姓名;Select StuId,StuName From tblStudent s1Where (Select Score From tblScore t1 Where t1.StuId=s1.stuId And t1.CourseId='001')> (Select Score From tblScore t2 Where t2.StuId=s1.stuId And t2.CourseId='002')--9、查询所有课程成绩⼩于60分的同学的学号、姓名;Select StuId,StuName From tblStudent stWhere StuId Not IN(Select StuId From tblScore sc Where st.StuId=sc.StuId And Score>60)--10、查询没有学全所有课的同学的学号、姓名;Select StuId,StuName From tblStudent stWhere (Select Count(*) From tblScore sc Where st.StuId=sc.StuId)<(Select Count(*) From tblCourse)--11、查询⾄少有⼀门课与学号为“1001”的同学所学相同的同学的学号和姓名;------运⽤连接查询Select DistInct st.StuId,StuName From tblStudent stInner Join tblScore sc ON st.StuId=sc.StuIdWhere sc.CourseId IN (Select CourseId From tblScore Where StuId='1001')------嵌套⼦查询Select StuId,StuName From tblStudentWhere StuId In(Select Distinct StuId From tblScore Where CourseId In (Select CourseId From tblScore Where StuId='1001'))--12、查询⾄少学过学号为“1001”同学所有课程的其他同学学号和姓名;Select StuId,StuName From tblStudentWhere StuId In(Select Distinct StuId From tblScore Where CourseId Not In (Select CourseId From tblScore Where StuId='1001')--13、把“SC”表中“叶平”⽼师教的课的成绩都更改为此课程的平均成绩; (从⼦查询中获取⽗查询中的表名,这样也⾏)--创建测试表Select * Into Sc From tblScoregoUpdate Sc Set Score=(Select Avg(Score) From tblScore s1 Where s1.CourseId=sc.CourseId)Where CourseId IN(Select CourseId From tblCourse cs INNER JOIN tblTeacher tc ON cs.TeaID=tc.TeaID WHERE TeaName ='叶平')--14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;Select StuID,StuName From tblStudent stWhere StuId <> '1002'AndNot Exists(Select * From tblScore sc Where sc.StuId=st.StuId And CourseId Not In (Select CourseId From tblScore Where StuId='1002')) AndNot Exists(Select * From tblScore Where StuId='1002' And CourseId Not In (Select CourseId From tblScore sc Where sc.StuId=st.StuId))--15、删除学习“叶平”⽼师课的SC表记录;Delete From tblScore Where CourseId IN(Select CourseId From tblCourse cs INNER JOIN tblTeacher tc ON cs.TeaId=tc.TeaId Where tc.TeaName='叶平')--16、向SC表中插⼊⼀些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、'002'号课的平均成绩;Insert Into tblScore (StuId,CourseId,Score)Select StuId,'002',(Select Avg(Score) From tblScore Where CourseId='002') From tblScore WhereStuId Not In (Select StuId From tblScore Where CourseId='003')--17、按平均成绩从⾼到低显⽰所有学⽣的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显⽰:学⽣ID,,数据库,企业管理,英语,有效课程数,有效平均分Select StuId,数据库=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='数据库' And sc.StuID=st.StuId),企业管理=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='企业管理' Andsc.StuID=st.StuId),英语=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='英语' Andsc.StuID=st.StuId),有效课程数=(Select Count(Score) From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where (CourseName='数据库' or CourseName='企业管理' or CourseName='英语') And sc.StuID=st.StuId),有效平均分=(Select Avg(Score) From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where (CourseName='数据库' or CourseName='企业管理' or CourseName='英语') And sc.StuID=st.StuId)From tblStudent stOrder by 有效平均分 Desc--18、查询各科成绩最⾼和最低的分:以如下形式显⽰:课程ID,最⾼分,最低分Select CourseId as 课程ID, 最⾼分=(Select Max(Score) From tblScore sc Where sc.CourseId=cs.CourseId ),最低分=(Select Min(Score) From tblScore sc Where sc.CourseId=cs.CourseId )From tblCourse cs--19、按各科平均成绩从低到⾼和及格率的百分数从⾼到低顺序 (百分数后如何格式化为两位⼩数??)Select 课程ID,平均分,及格率 From(Select CourseId as 课程ID, 平均分=(Select Avg(Score) From tblScore sc Where sc.CourseId=cs.CourseId ),及格率=Convert(varchar(10),((Select Count(*) From tblScore sc Where sc.CourseId=cs.CourseId And sc.Score>=60)*10000/(Select Count(*) From tblScore sc Where sc.CourseId=cs.CourseId))/100)+'%'From tblScore cs) as tmpGroup by 课程ID,平均分,及格率Order by 平均分, Convert(float,substring(及格率,1,len(及格率)-1)) Desc--20、查询如下课程平均成绩和及格率的百分数(⽤"1⾏"显⽰): 企业管理(001),马克思(002),OO&UML (003),数据库(004)Select 课程ID=sc.CourseId,课程名称=cs.CourseName,平均成绩=Avg(Score),及格率 =Convert(varchar(10),((Select Count(Score) From tblScore Where CourseId=sc.CourseId AndScore>=60)*10000/Count(Score))/100.0)+'%'From tblScore scInner Join tblCourse cs ON sc.CourseId=cs.CourseIdWhere sc.CourseId like '00[1234]'Group By sc.CourseId,cs.CourseName--21、查询不同⽼师所教不同课程平均分从⾼到低显⽰Select 课程ID=CourseId,课程名称=CourseName,授课教师=TeaName,平均成绩=(Select Avg(Score) From tblScore WhereCourseId=cs.CourseId)From tblCourse csInner Join tblTeacher tc ON cs.TeaId=tc.TeaIdOrder by 平均成绩 Desc--22、查询如下课程成绩第 3 名到第 6 名的学⽣成绩单:企业管理(001),马克思(002),UML (003),数据库(004)格式:[学⽣ID],[学⽣姓名],企业管理,马克思,UML,数据库,平均成绩Select * From(Select Top 6 学⽣ID=StuId,学⽣姓名=StuName,企业管理=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='企业管理' And sc.StuID=st.StuId),马克思=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='马克思' Andsc.StuID=st.StuId),UML=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='UML' Andsc.StuID=st.StuId),数据库=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='数据库' Andsc.StuID=st.StuId),平均成绩=(Select Avg(Score) From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where (CourseName='数据库' or CourseName='企业管理' or CourseName='UML'or CourseName='马克思') And sc.StuID=st.StuId),排名=Row_Number() Over(Order by(Select Avg(Score) From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where (CourseName='数据库' or CourseName='企业管理' or CourseName='UML'or CourseName='马克思') And sc.StuID=st.StuId) DESC) From tblStudent stOrder by 排名) as tmpWhere 排名 between 3 And 6--23、统计列印各科成绩,各分数段⼈数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]Select 课程ID=CourseId, 课程名称=CourseName,[100-85]=(Select Count(*) From tblScore sc Where CourseId=cs.CourseId And Score between 85 And 100),[85-70]=(Select Count(*) From tblScore sc Where CourseId=cs.CourseId And Score between 70 And 84),[70-60]=(Select Count(*) From tblScore sc Where CourseId=cs.CourseId And Score between 60 And 69),[<60]=(Select Count(*) From tblScore sc Where CourseId=cs.CourseId And Score <60)From tblCourse cs--24、查询学⽣平均成绩及其名次Select 学号=st.StuId, 姓名=StuName,平均成绩=sc.AvgScore,名次=(Dense_Rank() Over(Order by sc.AvgScore Desc)) From tblStudent st Inner Join (Select StuId,Avg(Score) as AvgScore From tblScore Group by StuId) as sc On sc.StuId=st.StuIdOrder by 学号--25、查询各科成绩前三名的记录:(不考虑成绩并列情况)Select 学号=StuId,课程号=CourseId,分数=ScoreFrom(Select Row_Number() Over(order by CourseId,Score Desc) as i,* From tblScore) as tmp --得到⼀个临时的排名表,其中i表⽰编号Where i In(Select Top 3 i From (Select Row_Number() Over(order by CourseId,Score Desc) as i,* From tblScore) as t1 Wheret1.CourseId=tmp.CourseId)--26、查询每门课程被选修的学⽣数Select 课程ID=CourseId,选修⼈数=(Select Count(*) From (Select Distinct StuId From tblScore Where CourseId=cs.CourseId) as tmp) From tblCourse cs--27、查询出只选修了⼀门课程的全部学⽣的学号和姓名Select 学号=StuId,姓名=StuNameFrom tblStudent stWhere (Select Count(*) From (Select Distinct CourseId From tblScore Where StuId=st.StuId) as tmp)=1--28、查询男⽣、⼥⽣⼈数Select 男⽣⼈数=(select Count(*) From tblStudent Where StuSex='男'),⼥⽣⼈数=(select Count(*) From tblStudent Where StuSex='⼥')--29、查询姓“张”的学⽣名单Select * From tblStudent Where StuName like '张%'--30、查询同名同性学⽣名单,并统计同名⼈数Select Distinct 学⽣姓名=StuName,同名⼈数=(Select Count(*) From tblStudent s2 Where s2.StuName=st.StuName) From tblStudent st Where (Select Count(*) From tblStudent s2 Where s2.StuName=st.StuName)>=2--31、1981年出⽣的学⽣名单(注:Student表中Sage列的类型是datetime)Select * From tblStudent Where Year(Sage)=1981--32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列Select 课程ID=CourseId,课程名称=CourseName,平均成绩=(Select Avg(Score) From tblScore Where CourseId=cs.CourseId)From tblCourse csOrder by 平均成绩,CourseId Desc--33、查询平均成绩⼤于85的所有学⽣的学号、姓名和平均成绩Select 学号=StuId,姓名=StuName,平均成绩=(Select Avg(Score) From tblScore Where StuId=st.StuId) From tblStudent stWhere (Select Avg(Score) From tblScore Where StuId=st.StuId)>85--34、查询课程名称为“数据库”,且分数低于60的学⽣姓名和分数Select 姓名=StuName,分数=Score From tblScore scInner Join tblStudent st On sc.StuId=st.StuIdInner Join tblCourse cs On sc.CourseId=cs.CourseIdWhere CourseName='数据库' And Score<60--35、查询所有学⽣的选课情况;Select 学号=StuId,选课数=(Select Count(*) From (Select Distinct CourseId From tblScore Where StuId=st.StuId) as tmp)From tblStudent stSelect distinct 姓名=StuName,选修课程=CourseName From tblScore scInner Join tblStudent st On sc.StuId=st.StuIdInner Join tblCourse cs On sc.CourseId=cs.CourseId--36、查询任何⼀门课程成绩在70分以上的姓名、课程名称和分数;Select 姓名=StuName,课程名称=CourseName,分数=Score From tblScore scInner Join tblStudent st On sc.StuId=st.StuIdInner Join tblCourse cs On sc.CourseId=cs.CourseIdWhere Score>=70--37、查询不及格的课程,并按课程号从⼤到⼩排列Select * From tblScore Where Score<60 order by CourseId Desc--38、查询课程编号为003且课程成绩在80分以上的学⽣的学号和姓名;Select StuId,StuName From tblStudentWhere StuId in(Select StuId From tblScore Where CourseId='003' And Score>=80)--39、求选了课程的学⽣⼈数Select 选了课程的学⽣⼈数=Count(*) From tblStudent st Where StuId IN (Select StuID From tblScore)--40、查询选修“叶平”⽼师所授课程的学⽣中,成绩最⾼的学⽣姓名及其成绩Select CourseId,CourseName,该科最⾼学⽣=(Select StuName From tblStudent Where StuId in (Select Top 1 StuID From tblScore Where CourseId=cs.CourseId Order by Score Desc)),成绩=(Select Top 1 Score From tblScore Where CourseId=cs.CourseId Order by Score Desc)From tblCourse cs Inner Join tblTeacher tc ON cs.TeaId=tc.TeaIdWhere TeaName='叶平'--41、查询各个课程及相应的选修⼈数Select 课程ID=CourseId,选修⼈数=(Select Count(*) From (Select Distinct StuId From tblScore Where CourseId=cs.CourseId) as tmp) From tblCourse cs--42、查询不同课程成绩相同的学⽣的学号、课程号、学⽣成绩Select 学号=StuId, 课程号=CourseId, 成绩=Score From tblScore scWhere Exists (Select * From tblScore Where Score=sc.Score And StuId=sc.StuId And CourseId <>sc.CourseId)Order by 学号,成绩--43、查询每门功成绩最好的前两名Select 课程号=CourseId,第1名=(Select Top 1 StuId From tblScore Where CourseId=cs.CourseId Order by Score DESC),第2名=(Select Top 1 StuID From (Select Top 2 StuId,Score From tblScore Where CourseId=cs.CourseId Order by Score DESC) as tmp Order by Score)From tblCourse cs--44、统计每门课程的学⽣选修⼈数(超过10⼈的课程才统计)。

数据库中SQL查询语句习题含的答案解析

查询问题:设教学数据库Education有三个关系:学生关系S(SNO,SNAME,AGE,SEX,SDEPT);学习关系SC(SNO,CNO,GRADE);课程关系C(CNO,CNAME,CDEPT,TNAME)(1)检索计算机系的全体学生的学号,姓名和性别;(2)检索学习课程号为C2的学生学号与姓名;(3)检索选修课程名为“DS”的学生学号与姓名;(4)检索选修课程号为C2或C4的学生学号;(5)检索至少选修课程号为C2和C4的学生学号;(6)检索不学C2课的学生姓名和年龄;(7)检索学习全部课程的学生姓名;(8)查询所学课程包含学生S3所学课程的学生学号。

(1)检索计算机系的全体学生的学号,姓名和性别;SELECT Sno,Sname,SexFROM SWHERE Sdept =’CS’;(2)检索学习课程号为C2的学生学号与姓名;(3)检索选修课程名为“DS”的学生学号与姓名本查询涉及到学号、姓名和课程名三个属性,分别存放在S和C表中,但S和C表没有直接联系,必须通过SC表建立它们二者的联系。

C → SC → S基本思路:(1)首先在C表中找出“DS”课程的课程号Cno;(2)然后在SC表中找出Cno等于第一步给出的Cno 集合中的某个元素Cno;(3)最后在S关系中选出Sno等于第二步中Sno 集合中某个元素的元组,取出Sno 和Sname送入结果表列。

SELECT Sno,SnameFROM SWHERE Sno IN(SELECT SnoFROM SCWHERE Cno IN(SELECT CnoFROM CWHERE Cname=‘DS’));(4)检索选修课程号为C2或C4的学生学号;SELECT SnoFROM SCWHERE Cno=‘C2’ OR Cno=‘C4’;(5)检索至少选修课程号为C2和C4的学生学号;SELECT SnoFROM SC X,SC YWHERE = AND =‘C2’ AND =‘C4’;(6)检索不学C2课的学生姓名和年龄;(7)检索学习全部课程的学生姓名;在表S中找学生,要求这个学生学了全部课程。

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