sql语句小练习一

近期在学习sql server,老师布置了一些小练习。说实话这些练习题在网上都能找到答案的,可是直接抄答案有什么意思呢?简直是浪费生命!

以下附原题及个人写的sql语句,如有和网上某某的语句相同,只能说纯属雷同了。因为本人不喜欢直接copy某某的东西,学习一定要有一个认真的态度。

原题及答案如下:

create database aaa

go

use aaa

go

create table student(

sno varchar(3),

sname varchar(4) not null,--性别

ssex varchar(2) not null,--出生年月

sbirthday datetime,--所在班级

class varchar(5)

)

go

create table teacher(

tno varchar(3) not null primary key,--教工姓名

tname varchar(4) not null,--教工性别

tsex varchar(2) not null,--教工出生日期

tbirthday datetime,--职称

prof varchar(6),--所在部门

depart varchar(10)

)

go

create table course

(

--课程号

cno varchar(5) not null primary key,--课程名称

cname varchar(10) not null,--教工编号

tno varchar(3)

)

go

create table score

(

--学号

sno varchar(3),--课程号

cno varchar(5),--成绩

degree decimal(4,1)

)

go

insert into student values(‘108‘,‘曾华‘,‘男‘,‘1977-09-01‘,‘95033‘)

insert into student values(‘105‘,‘匡明‘,‘男‘,‘1975-10-02‘,‘95031‘)

insert into student values(‘107‘,‘王丽‘,‘女‘,‘1976-01-23‘,‘95033‘)

insert into student values(‘101‘,‘李军‘,‘男‘,‘1976-02-20‘,‘95033‘)

insert into student values(‘109‘,‘王芳‘,‘女‘,‘1975-02-10‘,‘95031‘)

insert into student values(‘103‘,‘陆君‘,‘男‘,‘1974-06-03‘,‘95031‘)

insert into teacher values(‘804‘,‘李诚‘,‘男‘,‘1958-12-02‘,‘副教授‘,‘计算机系‘)

insert into teacher values(‘856‘,‘张旭‘,‘男‘,‘1969-03-12‘,‘讲师‘,‘电子工程系‘)

insert into teacher values(‘825‘,‘王萍‘,‘女‘,‘1972-05-05‘,‘助教‘,‘计算机系‘)

insert into teacher values(‘831‘,‘刘冰‘,‘女‘,‘1958-08-14‘,‘助教‘,‘电子工程系‘)

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‘)

insert into score values(‘103‘,‘3-245‘,‘86‘)

insert into score values(‘105‘,‘3-245‘,‘75‘)

insert into score values(‘109‘,‘3-245‘,‘68‘)

insert into score values(‘103‘,‘3-105‘,‘92‘)

insert into score values(‘105‘,‘3-105‘,‘88‘)

insert into score values(‘109‘,‘3-105‘,‘76‘)

insert into score values(‘101‘,‘3-105‘,‘64‘)

insert into score values(‘107‘,‘3-105‘,‘91‘)

insert into score values(‘108‘,‘3-105‘,‘78‘)

insert into score values(‘101‘,‘6-166‘,‘85‘)

insert into score values(‘107‘,‘6-166‘,‘79‘)

insert into score values(‘108‘,‘6-166‘,‘81‘)

select * from student

select * from teacher

select * from course

select * from score

--1、 查询Student表中的所有记录的Sname、Ssex和Class列。

select sname from student

select ssex from student

select class from student

--2、 查询教师所有的单位即不重复的Depart列。

select distinct depart from teacher

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

select * from student

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

select * from score where degree >=60.0 and degree <=80.0

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

select * from score where degree in (85,86,88)

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

select * from student where class =‘95031‘ or ssex = ‘女‘

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

select * from student order by class desc

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

select * from score order by sno asc,degree desc

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

select COUNT(*) from student where class =‘95031‘

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

select sno,cno from score where degree = (select MAX(degree) from score)

--11、查询‘3-105’号课程的平均分。

select AVG(degree) from score where cno=‘3-105‘

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

select AVG(degree) from score where cno like ‘3%‘ group by cno having COUNT(*) >=5

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

select sno from score where degree in (select degree from score group by degree having MIN(degree) >70 and MAX(degree)<90)

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

select Sname,Cno,degree from student inner join score on student.sno = score.sno

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

select sno,cname,degree from score inner join course on score.cno = course.cno

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

select Sname,Cname,degree from student inner join score on student.sno = score.sno

inner join course on score.cno = course.cno

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

select AVG(degree) from score inner join student on student.class = ‘95033‘

--18、假设使用如下命令建立了一个grade表:

create table grade(low int,upp int,rank varchar(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‘)

--现查询所有同学的Sno、Cno和rank列。

select sno,cno,degree,

(select rank from grade where degree > low and degree < upp) as rank

from score

from score

select * from grade

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

select * from score where degree >(select degree from score where sno=‘109‘ and cno= ‘3-105‘)and cno = ‘3-105‘

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

select * from score s1 where  degree <(select MAX(degree) from score s2 where s1.sno = s2.sno group by s2.sno having COUNT(*) >1)

--主查询每查询一行,然后拿着查询出的这一行sno做为参数,放入到子查询中做为条件,在子查询中

--根椐这个条件筛选出指定的sno,然后对其分组,取得该sno的最大成绩,得到最大成绩后

--与主查询的成绩对比,如果主查询成绩小,满 足要要求输出主查询的结果

--22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。

select sno,sname,sbirthday from student where YEAR(sbirthday) = (select YEAR(sbirthday) from student where sno = ‘105‘) and sno!=‘105‘

--108号同学的出生年月是唯一的;

--23、查询“张旭“教师任课的学生成绩。

select sno,cno,degree from score where cno = (select cno from course inner join teacher on course.tno = teacher.tno and teacher.tname = ‘张旭‘)

--24、查询选修某课程的同学人数多于5人的教师姓名。

select tname from teacher where tno in (select tno from course

where cno =(select cno from score group by cno having COUNT(*)>5))

--25、查询95033班和95031班全体学生的记录。

select * from student where class = ‘95033‘ or class = ‘95031‘ order by class

--26、查询存在有85分以上成绩的课程Cno.

select distinct Cno from score where degree >85

--27、查询出“计算机系“教师所教课程的成绩表。

select cno,degree from score where cno in (select cno from course where tno in (select tno from teacher where depart = ‘计算机系‘))

--28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。

select  tname ,prof from teacher where prof not in

(select prof from teacher where depart=‘电子工程系‘) and depart=‘计算机系‘

union --这个东西将两个查询的结果合并成一个,两个查询的结果必须数量一致,数据类型一致

select  tname ,prof from teacher where prof not in

(select prof from teacher where depart=‘计算机系‘) and depart=‘电子工程系‘

select tname ,prof from teacher t1

where not exists (select * from teacher t2 where t1.prof=t2.prof and t1.tname <>t2.tname)

--主查询中每取出一行记录,拿着这个记录的prof到子查询中是看看存不存在和自已相同的prof,并且

--(和自已不同名,如果不存在就打印出主查询取出这行记录)

--29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。

select cno,sno,degree from score where degree >(select MAX(degree) from score where cno = ‘3-245‘) and cno = ‘3-105‘ order by degree desc

--30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.

select cno,sno,degree from score where degree >(select MAX(degree) from score where cno = ‘3-245‘) and cno = ‘3-105‘

--31、查询所有教师和同学的name、sex和birthday.

select sname,ssex,sbirthday from student union select tname,tsex,tbirthday from teacher

--32、查询所有“女”教师和“女”同学的name、sex和birthday.

select sname,ssex,sbirthday from student where ssex=‘女‘ union select tname,tsex,tbirthday from teacher where tsex=‘女‘

--33、查询成绩比该课程平均成绩低的同学的成绩表。

select sno,cno,degree from score s1 where s1.degree <(select AVG(degree) from score s2 where s1.cno = s2.cno group by s2.cno)

--a.得到每个同学的每门课成绩,和该门课的平均分进行对比

--b.得到平均成绩

--c.进行对比

select sno,s1.cno,degree from score s1 where degree <

(select avg(degree) from score s2 where s2.cno=s1.cno group by s2.cno )

--因为主查询和子查询中都会产生cno这一列,要进行区分

--所以我们给主查询中的表给了一个别名叫s1 ,那么主查询产生的cno就叫s1.cno

--子查询中的表给了一个别名叫s2,子查询中cno就叫s2.cno

--34、查询所有任课教师的Tname和Depart.

select tname,depart from teacher inner join course on teacher.tno = course.tno

--35 查询所有未讲课的教师的Tname和Depart.

select tname,depart from teacher t where not exists (select * from course c where c.tno =t.tno)

--36、查询至少有2名男生的班号。

select class from student where ssex=‘男‘ group by class having COUNT(*) >=2

--37、查询Student表中不姓“王”的同学记录。

select * from student where sname not like ‘王%‘

--38、查询Student表中每个学生的姓名和年龄。

select Sname,datediff(YEAR,sbirthday,GETDATE()) from student

--39、查询Student表中最大和最小的Sbirthday日期值。

select MAX(YEAR(sbirthday)) as ‘最大日期‘,MIN(YEAR(sbirthday)) as ‘最小日期‘ from student

--40、以班号和年龄从大到小的顺序查询Student表中的全部记录。

select * from student order by class desc,datediff(year,sbirthday,getdate())desc

--41、查询“男”教师及其所上的课程。

select tname,cname from teacher inner join course on teacher.tno = course.tno where tsex = ‘男‘

--42、查询最高分同学的Sno、Cno和Degree列。

select * from score where degree = (select MAX(degree) from score)

--43、查询和“李军”同性别的所有同学的Sname.

select sname from student where ssex = (select ssex from student where sname = ‘李军‘) and sname!=‘李军‘

--44、查询和“李军”同性别并同班的同学Sname.

select sname from student where ssex = (select ssex from student where sname = ‘李军‘) and

class = (select class from student where sname = ‘李军‘) and sname!=‘李军‘

--45、查询所有选修“计算机导论”课程的“男”同学的成绩表。

select sname,ssex,cname,degree from course inner join score on course.cno = score.cno

inner join student on score.sno = student.sno where cname = ‘计算机导论‘ and ssex = ‘男‘

--46、查询score表中分数最高的学生的信息。//多层嵌套

select student.*,degree from student inner join score on degree = (select MAX(degree) from score) and student.sno = score.sno

--47、查询score表中的平均分在80分以上的学生信息。//相关查询。无关查询

--相关子查询:

select * from student st where exists (select * from score sc where st.sno = sc.sno group by sc.sno having AVG(sc.degree) >80)

--无关子查询:

select *from student where sno in(select sno from score group by sno having AVG(degree) >80)

时间: 2024-10-09 20:05:52

sql语句小练习一的相关文章

SQL语句小总结

无论是面试过程中,还是未来工作中,SQL都是一定会考到和用到的.所以,在此对之前看过的一些SQL知识点进行一下总结和记录,算是起到一个笔记本的作用.没有深入学习过SQL的和对SQL印象不太深的朋友可以看一下,起到一个快速使用SQL语句的作用(针对有一点SQL知识的人的). 首先,SQL最基础的就是语句的使用,SQL根据功能分为查询语句.插入语句.修改语句和删除语句,这里用到最多的便是查询语句,首先便总结一下查询语句的用法: 1.简单查询 (1).select name from table; 意

sql语句小练习

1.用一条SQL 语句 查询出每门课都大于80 分的学生姓名 name kecheng fenshu 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 语文 81 王五 数学 100 王五 英语 90 A:select distinct name from table where name not in (select distinct name from table where fenshu<=80)    关键词 DISTINCT 用于返回唯一不同的值 B:sel

oracle中sql语句小练习(使用连接查询)

假设A(m,n,p),B(m,n,p) --1.A表中有某一项m而B表中没有 使用左连接查询:select a.* from A a left join B b on a.m=b.m where b.m is null; 左连接查询公共部分以及A表中的全部数据,B表中该列值为null的数据即为A中存在而B中不存在的结果. --2.A表中没有某一项m而B表中有 可改为使用右连接查询: select b.* from A a right join B b on a.m=b.m where a.m i

sql语句小练习二

1.创建一个数据库StudentManage, 初始化大小10M,不足以1M每次增长 create database StudentManage on ( name = 'StudentManage_data', filename = 'D:\StudentManage_data.mdf', size = 10mb, maxsize = 100mb, filegrowth = 15% ) log on ( name = 'StudentManage_log', filename = 'D:\St

SQL语句关于时间的查询小心得,希望大家给点意见

查询本月信息:Select * FROM T_Users Where datediff(month,RegisterTime,getdate())=0 昨天的信息:SELECT * FROM T_Users where LastLoginTime>DATEADD(DAY,-2,GETDATE()) AND LastLoginTime<GETDATE() SELECT SUM([DetailMoney]) FROM [dbo].[T_BuyDetails] INNER JOIN [dbo].[T

小贝_mysql sql语句优化过程

sql语句优化 一.SQL优化的一般步骤 (1).通过show status命令了解各种SQL的执行频率. (2).定位执行效率较低的SQL语句-(重点select) (3).通过explain分析低效率的SQL语句的执行情况 (4).确定问题并采取相应的优化措施 (1) 通过showstatus命令了解各种SQL的执行频率 MySQL客户端连接成功后,通过使用show[session|global] status 命令可以提供服务器状态信息.其中的session来表示当前的连接的统计结果,gl

写sql语句连接的时候注意的一个小细节

我在写权限的查询的时候,用到了sql语句的链接写一下出错的时候的代码 $sqlpid="select auth_name from sw_auth where auth_level=0"; if(session('mg_id')!=5){ $sqlpid.="and auth_id in ($ids)"; } show($sqlpid); 出错的截图 根据图中的输出就能知道出错的原因了了,sql语句没写对 正确的代码 $sqlpid="select aut

戈多编程-小谈sql语句的优化分析

在sqlserver大数据查询中,避免不了查询效率减慢,暂且抛弃硬件原因和版本原因,仅从sql语句角度分析. 一. sql 语句性能不达标,主要原因有一下几点: 1. 未建索引,检索导致全表扫描 2. 已建索引,但是未走索引导致索引失效,进而全表扫描. 3. 没有有效的索引视图 二. sql 语句优化 1. 分析比较执行时间计划读取情况 (1) 查看执行时间和cpu占用时间和查询对I/O的操作情况 I.先执行一个400多万数据的sql set statistics time,io on sele

50个常用的sql语句

50个常用的sql语句 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#,score from SC wher