mysql语句练习题

sql语句练习题(Mysql版)

表名和字段
–1.学生表
Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别
–2.课程表
Course(CID,Cname,TID) --CID --课程编号,Cname 课程名称,TID 教师编号
–3.教师表
Teacher(TID,Tname) --TID 教师编号,Tname 教师姓名
–4.成绩表
SC(SID,CID,score) --SID 学生编号,CID 课程编号,score 分数

–创建测试数据

#创建学生表

create table Student
(SID varchar(10),
Sname nvarchar(10),
Sage datetime,
Ssex nvarchar(10));

#插入学生信息

insert into Student 
(SID,Sname,Sage,Ssex)
values
(01 , "赵雷" , '1990-01-01' , "男"),
(02 , "钱电" , '1990-12-21' , "男"),
(03 , "孙风" , '1990-05-20' , "男"),
(04 , "李云" , '1990-08-06' , "男"),
(05 , "周梅" , '1991-12-01' , "女"),
(06 , "吴兰" , '1992-03-01' , "女"),
(07 , "郑竹" , '1989-07-01' , "女"),
(08 , "王菊" , '1990-01-20' , "女");

#创建课程表

create table Course
(CID varchar(10),
Cname nvarchar(10),
TID varchar(10));

#插入课程数据

insert into Course
(CID,Cname,TID) 
values(01 , "语文" , 02),
(02 , "数学" , 01),
(03 , "英语" , 03);

#创建教师表

create table Teacher
(TID varchar(10),
Tname nvarchar(10));

#插入教师数据

insert into Teacher 
(TID,Tname)
values
(01 , "张三"),
(02 , "李四"),
(03 , "王五");

#创建成绩表

create table SC
(SID varchar(10),
CID varchar(10),
score decimal(18,1));

#插入成绩数据

insert into SC
(SID,CID,score)
values
(01 , 01 , 80),
(01 , 02 , 90),
(01 , 03 , 99),
(02 , 01 , 70),
(02 , 02 , 60),
(02 , 03 , 80),
(03 , 01 , 80),
(03 , 02 , 80),
(03 , 03 , 80),
(04 , 01 , 50),
(04 , 02 , 30),
(04 , 03 , 20),
(05 , 01 , 76),
(05 , 02 , 87),
(06 , 01 , 31),
(06 , 03 , 34),
(07 , 02 , 89),
(07 , 03 , 98);

练习题和mysql语句

1.查询"01"课程比"02"课程成绩高的学生的信息及课程分数

#方法一:
SELECT a.*, s.score 课程01的分数, c.score 课程02的分数
FROM student a, sc s, sc c
WHERE a.SID= s.SID AND s.SID=c.SID
AND s.CID= '1' AND c.CID='2'
AND s.score>c.score;
#方法二:
#查询同时存在"01"课程和"02"课程的情况和存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)(以下存在相同内容时不再解释)
SELECT a.*,s.score 01课程分数, ss.score 02课程分数
FROM student a 
LEFT JOIN sc s ON a.SID=s.SID AND s.CID='1'
LEFT JOIN sc ss ON a.SID=ss.SID AND ss.CID='2'
WHERE s.score> IFNULL(ss.score,0);

2.查询"01"课程比"02"课程成绩低的学生的信息及课程分数

#方法一:
SELECT a.*, s.score 课程01的分数, c.score 课程02的分数
FROM student a, sc s, sc c
WHERE a.SID= s.SID AND s.SID=c.SID
AND s.CID= '1' AND c.CID='2'
AND s.score<c.score;
#方法二
SELECT a.*,s.score 01课程分数, ss.score 02课程分数
FROM student a 
LEFT JOIN sc s ON a.SID=s.SID AND s.CID='1'
LEFT JOIN sc ss ON a.SID=ss.SID AND ss.CID='2'
WHERE s.score< IFNULL(ss.score,0);

3.查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩,最高成绩和最低成绩

#第一步,先求出学生的学生编号和学生姓名和平均成绩,最高成绩和最低成绩
SELECT stu.sid, stu.Sname, AVG(sc.score),MAX(sc.score),MIN(sc.score)
FROM student AS stu
INNER JOIN sc
ON stu.sid = sc.sid
GROUP BY stu.sid, stu.sname
#第二步,加上条件平均成绩大于等于60分
SELECT stu.sid, stu.Sname, AVG(sc.score),MAX(sc.score),MIN(sc.score)
FROM student AS stu
INNER JOIN sc
ON stu.sid = sc.sid
GROUP BY stu.sid, stu.sname
HAVING AVG(sc.score)>=60

4.查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩(保留两位小数)

SELECT a.SID, a.Sname, ROUND (AVG(s.score),2)
FROM student a, sc s
WHERE a.SID=s.SID
GROUP BY a.SID, a.Sname
HAVING AVG(s.score)<60

5.查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩(包括有成绩的和无成绩的)

SELECT a.SID, a.Sname, ROUND (AVG(s.score),2) 平均成绩 FROM student a
LEFT JOIN sc s ON a.SID=s.SID
GROUP BY a.SID, a.Sname
HAVING AVG(s.score)<60
UNION
#union 以下的是为了找出没有参加考试的学生,即学生表里有而成绩表里没有的
SELECT a.SID, a.Sname, 0 平均成绩
FROM student a
WHERE a.SID NOT IN (
SELECT DISTINCT a.SID
FROM sc
)

6.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

SELECT a.SID, a.Sname, COUNT(s.CID), SUM(s.score)
FROM student a
JOIN sc s ON a.SID=s.SID
GROUP BY a.SID,a.Sname

7、查询"王"姓老师的数量

#方法一
SELECT t.Tname, COUNT(*) 数量
FROM teacher t
WHERE t.Tname LIKE "王%"
#方法二
SELECT t.Tname, COUNT(*) 数量
FROM teacher t
WHERE LEFT(t.Tname,1)='王'
#left(code, 1)表示取code字段从左截取1位,

这里用到了正则表达式,可以点开链接回顾一下

8.查询学过"张三"老师授课的同学的信息

#思路:先查询张三老师教授的是什么课,再查询学过这门课的学生的信息
SELECT a.*
FROM student a JOIN sc s ON a.SID=s.SID
WHERE s.CID IN (
   SELECT CID FROM course WHERE TID = (
   SELECT TID FROM teacher WHERE Tname = '张三'))

你可能感兴趣的:(数据库)