SQL经典题型

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_38201936/article/details/97620892

总共 4 张表  包括 学生表,课程表,成绩表,老师表

student (sId,sName,sex,age)   学生Id,姓名,性别,年龄

course(cId,cName,tId)  课程Id,课程名称,教师Id

grand(sId,cId,score)  学生Id, 课程Id,成绩

teacher(tId,tName)  教师Id,教师姓名

1 创建学生表

create table student(
sId int  not  null  primary key  auto_increment,
sName varchar(10)  not null ,
sex varchar(4) not null,
age int not null );

2 创建课程表

create table course(
cId int  not  null  primary key  auto_increment,
cName varchar(10)  not null,
tId int not null );

3 创建 成绩表

create table grand(
sId int  not  null ,
cId int  not  null,
score  int not null );

4 创建 教师表

create table teacher(
tId int  not  null  primary key  auto_increment,
tName varchar(10)  not null);

插入学生数据   

  • insert into student(sName,sex,age) VALUES("张三","男",24);
  • insert into student(sName,sex,age) VALUES("李四","男",21);
  • insert into student(sName,sex,age) VALUES("王五","男",20);
  • insert into student(sName,sex,age) VALUES("赵六","男",18);
  • insert into student(sName,sex,age) VALUES("凤七","女",26);
  • insert into student(sName,sex,age) VALUES("婉儿","女",19);

插入课程数据   

插入成绩数据 

插入教师数据 

上述数据准备好之后,开始进行SQL编写

-- 1.查询'1'课程比'2'课程成绩高的所有学生的学号 

SELECT a.sId FROM `grand` a,grand b  
WHERE a.cId=1  AND b.cId=2 AND a.sId=b.sId AND a.score>b.score

-- 2.查询同学的学号和平均成绩

SELECT sId,AVG(score) FROM grand GROUP BY sId 

-- 3 查询(平均成绩大于60分的)同学的学号和平均成绩

SELECT sId, AVG(score) FROM  grand  GROUP BY sId HAVING AVG(score)>60

-- 4.查询所有同学的学号、姓名、选课数、总成绩  

SELECT s.sId,s.sName,COUNT(cName) ,SUM(score) FROM student s LEFT JOIN grand g
ON s.sId = g.sId LEFT JOIN course c ON g.cId = c.cId GROUP BY s.sId,s.sName

-- 5 查询老师的个数
SELECT COUNT(tName),tName FROM teacher GROUP BY tName

-- 6 查询姓“亮”的老师的个数

SELECT COUNT(tName),tName FROM teacher WHERE tName LIKE '亮%'  GROUP BY tName

-- 7 .查询(上过'天天'老师课的)学生的学号、姓名 

SELECT sId,sName FROM student WHERE sId  NOT IN 
(SELECT s.sId FROM student s,grand g,course c WHERE s.sId =g.sId AND c.cId =g.cId AND c.cName IN
(SELECT c.cName FROM teacher t,course c WHERE c.tId=t.tId AND t.tName ='天天'))

-- 8 .查询(没上过'天天'老师课的)学生的学号、姓名 

SELECT sId,sName FROM student WHERE sId NOT IN 
(SELECT s.sId FROM student s,grand g,course c WHERE s.sId =g.sId AND c.cId =g.cId AND c.cName IN
(SELECT c.cName FROM teacher t,course c WHERE c.tId=t.tId AND t.tName ='天天'))

-- 9.查询学过编号'1'课程的同学的学号、姓名; 

SELECT s.sId,s.sName FROM student s,grand g
WHERE s.sId = g.sId AND g.cId='1' 

-- 10.查询学过编号'1'并且也学过编号'2'课程的同学的学号、姓名; 

SELECT s.sId,s.sName FROM student s,grand g,grand g1
WHERE s.sId = g.sId AND g.sId = g1.sId AND g.cId='1' AND g1.cId='2'

-- 11 查询每个老师所教课程的数量

SELECT t.tName,c.cName, COUNT(cName) FROM course c,teacher t WHERE c.tId = t.tId GROUP BY tName;


-- 12 查询老师所教课程数为1门课

SELECT t.tName,c.cName, COUNT(cName) AS num FROM course c,teacher t 
WHERE c.tId = t.tId  GROUP BY tName HAVING num =1

-- 13 查询老师所教课程数为2门课

SELECT t.tName,c.cName, COUNT(cName) AS num FROM course c,teacher t 
WHERE c.tId = t.tId  GROUP BY tName HAVING num =2

-- 14.查询(课程编号'2'的成绩比课程编号'1'课程低的)所有同学的学号、姓名  
 
SELECT s.sId,s.sName FROM student s,grand g,grand g1 
WHERE s.sId = g.sId AND g.sId = g1.sId AND g.cId =1 AND g1.cId =2 AND g.score<g1.score;

-- 15.查询课程成绩大于80分的同学的学号、姓名、课程、成绩

SELECT s.sId,s.sName,c.cName,g.score FROM student s,grand g,course c
WHERE s.sId=g.sId AND c.cId = g.cId HAVING  g.score >80

-- 16查询课程成绩大于80分的同学的学号、姓名、课程、成绩,并按成绩进行降序排名

SELECT s.sId,s.sName,c.cName,g.score FROM student s,grand g,course c
WHERE s.sId=g.sId AND c.cId = g.cId  HAVING g.score >80 ORDER BY score DESC

猜你喜欢

转载自blog.csdn.net/weixin_38201936/article/details/97620892