sql单表-多表查询练习

create table Student    -- 学生表
(
Sno char(3) NOT NULL Primary key ,    -- 学号 ,设为主键,不允许空值   
Sname char(8) NOT NULL,        -- 学生姓名
Ssex char(2)NOT NULL,        -- 学生性别
Sbirthday datetime,     -- 学生出生年月
Class char(5)         -- 学生所在班级编号
);

create table Teacher        -- 教师表
(
Tno char(3)NOT NULL primary key,        -- 教工编号设为主键
Tname char(4)NOT NULL,        -- 教工姓名
Tsex char(2)NOT NULL,        -- 教工性别
Tbirthday datetime,        -- 教工出生年月
Prof char(6),        -- 职称
Depart varchar(10) NOT NULL        -- 教工所在部门
);

create table Course        -- 课程表
(
Cno char(5) NOT NULL Primary key ,        -- 课程号设为主键
Cname varchar(10) NOT NULL,        -- 课程名称
Tno char(3) NOT NULL ,
foreign key (tno) references Teacher(Tno)        -- 教工编号设为外键
);

create table Score    -- 成绩表
(
Sno char(3) NOT NULL references Student(Sno),    -- 学号设为外码
Cno char(5) NOT NULL references Course(Cno),    -- 课程号设为外码
Degree Decimal(4,1),    -- 成绩
primary key(Sno,Cno)    -- 学号和课程号设为联合主键
);
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,'王萍','女','1982-05-05','助教','计算机系') ;
insert into Teacher values(831,'刘冰','女','1997-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);
-- 1、 查询Student表中的所有记录的Sname、Ssex和Class列。

select sname,ssex,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 and degree =< 80;
select * from score where degree between 60 and 80;

-- 5、 查询Score表中成绩为85,86或88的记录。
select * from score where degree in (85, 86, 88);
-- 6、 查询Student表中"95031"班或性别为"女"的同学记录。
select * from student where student.Class = '95031' || student.Ssex = '女';
-- 7、 以Class降序查询Student表的所有记录。
select * from student ORDER BY class desc;
-- 8、 以Cno升序、Degree降序查询Score表的所有记录。
select * from score ORDER BY cno asc, degree desc;
-- 9、 查询"95031"班的学生人数。
select count(*) from student where class = '95031';
-- 10、 查询Score表中的最高分的学生学号和课程号。(子查询或者排序)
select sno 学号,cno 课程号 from score 
where degree in(select max(degree) from score);
select score.Cno, score.Sno from score 
ORDER BY score.Degree desc
limit 1;
--查询班级里面最高分和最低分的学生信息
select * from score 
where degree =(select max(degree) from score) || degree =(select min(degree) from score );
select * from score where degree in ((select max(degree) from score),(select min(degree) from score));
select * from score where degree in 
((select max(degree) from score) union (select min(degree) from score));
-- 11、查询每门课的平均成绩。
select score.Cno, avg(score.Degree) from score GROUP BY score.Cno;
-- 12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
select avg(score.Degree) from score 
where score.Cno like '3%' GROUP BY Cno HAVING count(score.Cno) >= 5;
-- 13、查询分数大于70,小于90的Sno列。
select sno from score where score.Degree > 70 and score.Degree < 90;
-- 14、查询所有学生的Sname、Cno和Degree列。 
-- 内连接
-- sql92
select sname, cno, degree from student,score
WHERE student.Sno = score.Sno;
-- sql99
select sname, cno, degree from student INNER JOIN score
on student.Sno = score.Sno;
-- 15、查询所有学生的Sno、Cname和Degree列。
select score.sno, course.cname, score.degree from score,course 
where score.Cno = course.Cno; 
select score.sno, course.cname, score.degree from score JOIN course 
on score.Cno = course.Cno; 
-- 16、查询所有学生的Sname、Cname和Degree列。
-- 用where直接关联
select student.Sname,course.Cname,score.Degree from score, course, student
WHERE student.Sno = score.Sno and course.Cno = score.Cno;
-- 第二种写法
select student.Sname,course.Cname,score.Degree from score 
INNER JOIN course ON score.Cno = course.Cno
INNER JOIN student ON score.Sno = student.Sno;
-- 第三种写法
select Sname, Cname,Degree from Course join Score join Student 
on Course.Cno=Score.Cno and Student.Sno=Score.Sno;
-- 17、查询"95033"班学生的平均分。
select student.Class,avg(score.degree) from score,student where 
student.Class = '95033' and score.Sno = student.Sno;
-- 18、 现查询所有同学的Sno、Cno和rank列。
select 
-- 19、查询所有选修"计算机导论"课程的"男"同学的成绩表。
select * from score 
INNER JOIN course ON score.Cno = course.Cno
INNER JOIN student ON score.Sno = student.Sno
WHERE student.Ssex= '男' AND course.Cname = '计算机导论';

-- 20、查询成绩高于学号为"109"、课程号为"3-105"的成绩的所有记录。
select * from score 
where score.Degree > (select score.Degree from score ,student,course 
WHERE score.Sno = '109' and student.Sno = '109'and score.Cno = '3-105' and course.Cno = '3-105') ;

select * from score 
where score.Degree > (select score.Degree from score  
WHERE score.Sno = '109' AND score.Cno = '3-105') ;

-- 21、查询和学号为109的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
select YEAR(student.Sbirthday) from student where student.Sno = '109';
select sno,sname,sbirthday from student 
where YEAR(sbirthday) = (select YEAR(student.Sbirthday) from student where student.Sno = '109') AND student.Sno != '109';

-- 22、查询"张旭"教师任课的学生成绩。
select tno from teacher where teacher.Tname = '张旭';
select cno from course ,teacher
where  course.tno in (select tno from teacher where teacher.Tname = '张旭');

select score.Degree from score
where  score.Cno in (select course.cno from course ,teacher
where  course.tno in (select teacher.tno from teacher where teacher.Tname = '张旭'));

SELECT teacher.Tno FROM teacher WHERE teacher.Tname = '张旭';


-- 23、查询选修某课程的同学人数多于5人的教师姓名。
select cno from course;
select count(sno), score.cno from score 
GROUP BY score.cno HAVING count(sno) > 5;
select tno from course 
WHERE course.Cno in (select score.cno from score 
GROUP BY score.cno HAVING count(sno) > 5);

select teacher.Tname from teacher
where teacher.Tno in (select tno from course 
WHERE course.Cno in (select score.cno from score 
GROUP BY score.cno HAVING count(sno) > 5));
-- 24、查询95033班和95031班全体学生的记录。
select * from student where class in ('95033','95031');

-- 25、查询年龄小于50岁的所有老师记录。
SELECT YEAR(NOW()) FROM teacher;
SELECT YEAR(NOW()) - YEAR(teacher.Tbirthday) FROM teacher;

select * from teacher where (YEAR(NOW()) - YEAR(teacher.Tbirthday))<50;
-- 26、查询出"计算机系"教师所教课程的成绩表。
select * from teacher WHERE teacher.Depart = '计算机系';
select * FROM course 
WHERE course.Tno in (select tno from teacher WHERE teacher.Depart = '计算机系');

SELECT * from score 
WHERE score.Cno in (select course.Cno FROM course 
WHERE course.Tno in (select tno from teacher WHERE teacher.Depart = '计算机系'));

SELECT score.Cno,score.Sno,Degree,Depart 
FROM course JOIN score ON course.Cno = score.Cno
JOIN teacher ON course.Tno = teacher.Tno
where teacher.Depart = '计算机系';
-- 27、查询选修编号为"3-105"课程且成绩至少高于一个选修编号为"3-245"的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
SELECT Cno,Sno,Degree FROM score
WHERE Cno = '3-105';
SELECT Degree FROM score WHERE Cno = '3-245';

SELECT Cno,Sno,Degree FROM score 
WHERE Cno = '3-105' 
AND Degree > ANY(SELECT Degree FROM score WHERE Cno = '3-245')
ORDER BY Degree DESC;

SELECT Cno,Sno,Degree FROM score 
WHERE Cno = '3-105' 
AND Degree > (SELECT MIN(Degree)Degree FROM score WHERE Cno = '3-245')
ORDER BY Degree DESC;

-- 28、查询选修编号为"3-105"且成绩高于选修编号为"3-245"课程的同学的Cno、Sno
SELECT Cno,Sno,Degree FROM score 
WHERE Cno = '3-105' 
AND Degree > ALL(SELECT Degree FROM score WHERE Cno = '3-245')
ORDER BY Degree DESC;

-- 31、查询所有教师和同学的name、sex和birthday。 
SELECT Tname name,Tsex sex,Tbirthday birthday FROM teacher
UNION
SELECT Sname,Ssex,Sbirthday FROM student;

-- 32、查询所有"女"教师和"女"同学的name、sex和birthday。
-- 两个表连接
SELECT Tname name,Tsex sex,Tbirthday birthday FROM teacher
WHERE teacher.Tsex = '女'
UNION
SELECT Sname,Ssex,Sbirthday FROM student
WHERE student.Ssex = '女';

-- 33、查询成绩比该课程平均成绩低的同学的成绩表。 
SELECT cno,AVG(Degree) avgdegree from score GROUP BY Cno;
-- 自连接
SELECT * FROM score s1 ,
(SELECT cno,AVG(Degree) avgdegree from score GROUP BY Cno) s2
WHERE s1.Cno = s2.cno AND s1.Degree < s2.avgdegree;

-- 34、查询所有任课教师的Tname和Depart。 
SELECT teacher.Tname, teacher.Depart FROM teacher;

-- 35、查询所有任课教师的Tsex和Tbirthday。 
SELECT teacher.Tsex, teacher.Tbirthday from teacher;

-- 36、查询至少有2名男生的班号。 
SELECT Sno,Class from student;
SELECT count(sno) from student WHERE Ssex= '男';
-- 按照班号分组
SELECT Class, COUNT(*)
FROM student 
WHERE Ssex = '男'
GROUP BY Class
HAVING COUNT(*) >= 2;


-- 37、查询Student表中不姓"王"的同学记录。
SELECT * FROM student WHERE student.Sname NOT LIKE '王%';

-- 38、查询Student表中每个学生的姓名和年龄。
SELECT Sname,(YEAR(NOW()) - YEAR(Sbirthday)) 年龄 FROM student ; 

-- 40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
SELECT * from student
ORDER BY Class DESC , YEAR(Sbirthday) ASC;

-- 41、查询"男"教师及其所上的课程。
SELECT tno from teacher WHERE teacher.Tsex = '男';

SELECT teacher.Tname,course.Cname FROM teacher JOIN course
ON teacher.Tno = course.Tno
WHERE teacher.Tsex = '男';
-- 42、查询最高分同学的Sno、Cno和Degree列。
SELECT max(degree) from score;

SELECT Sno,Cno,Degree from score 
WHERE Degree = (SELECT max(degree) from score);

-- 43、查询和"李军"同性别的所有同学的Sname。
SELECT sname from student 
WHERE Ssex = (SELECT Ssex from student where student.Sname = '李军');

-- 44、查询和"李军"同性别并同班的同学Sname。
SELECT Ssex from student where student.Sname = '李军';
SELECT Class from student where student.Sname = '李军';

SELECT sname from student 
WHERE Ssex = (SELECT Ssex from student where student.Sname = '李军') 
AND Class = (SELECT Class from student where student.Sname = '李军');


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值