总共 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