Mysql数据库练习
创建数据库和表
要开始MySQL的练习,首先需要创建一个数据库以及必要的表,以下是创建学生表、课程表、教师表和成绩表的SQL语句:
CREATE DATABASE IF NOT EXISTS school; USE school; CREATE TABLE IF NOT EXISTS student ( s_id VARCHAR(20) PRIMARY KEY, s_name VARCHAR(20) NOT NULL, s_birth VARCHAR(20) NOT NULL, s_sex VARCHAR(10) NOT NULL ); CREATE TABLE IF NOT EXISTS course ( c_id VARCHAR(20) PRIMARY KEY, c_name VARCHAR(20) NOT NULL ); CREATE TABLE IF NOT EXISTS teacher ( t_id VARCHAR(20) PRIMARY KEY, t_name VARCHAR(20) NOT NULL, t_sex VARCHAR(10) NOT NULL ); CREATE TABLE IF NOT EXISTS score ( s_id VARCHAR(20), c_id VARCHAR(20), s_score INT, PRIMARY KEY(s_id, c_id), FOREIGN KEY(s_id) REFERENCES student(s_id), FOREIGN KEY(c_id) REFERENCES course(c_id) );
代码创建了一个名为school
的数据库,并在其中创建了四个表,每个表都有其特定的字段和约束,如主键和外键。
经典练习50题解析
下面将详细解析部分经典练习题目的实现方式:
1. 查询"01"课程比"02"课程成绩高的学生信息及课程分数
要从数据库中查询出在"01"课程上得分高于"02"课程的所有学生的信息以及他们的课程分数,可以使用以下SQL语句:
SELECT s.*, sc1.s_score AS 'score_01', sc2.s_score AS 'score_02' FROM student s JOIN score sc1 ON s.s_id = sc1.s_id JOIN score sc2 ON s.s_id = sc2.s_id WHERE sc1.c_id = '01' AND sc2.c_id = '02' AND sc1.s_score > sc2.s_score;
此查询通过两次连接score
表来比较同一学生在两门课程中的得分,并筛选出满足条件的记录。
2. 查询"01"课程比"02"课程成绩低的学生信息及课程分数
与上一题类似,但此次我们关注的是"01"课程成绩低于"02"课程的情况:
SELECT s.*, sc1.s_score AS 'score_01', sc2.s_score AS 'score_02' FROM student s JOIN score sc1 ON s.s_id = sc1.s_id JOIN score sc2 ON s.s_id = sc2.s_id WHERE sc1.c_id = '01' AND sc2.c_id = '02' AND sc1.s_score < sc2.s_score;
3. 查询平均成绩大于等于60分的同学
要找出平均成绩大于或等于60分的学生,我们需要对每个学生的分数进行平均计算,然后根据条件筛选结果:
SELECT s.s_id, s.s_name, AVG(sc.s_score) AS 'average_score' FROM student s JOIN score sc ON s.s_id = sc.s_id GROUP BY s.s_id, s.s_name HAVING average_score >= 60;
此查询使用了GROUP BY
子句来按学生分组,并使用聚合函数AVG()
来计算每组的平均分。HAVING
子句则用于过滤出平均成绩符合条件的学生。
4. 查询平均成绩小于60分的同学
与上一题相似,但是这里我们关注平均成绩低于60分的学生:
SELECT s.s_id, s.s_name, AVG(sc.s_score) AS 'average_score' FROM student s LEFT JOIN score sc ON s.s_id = sc.s_id GROUP BY s.s_id, s.s_name HAVING average_score < 60;
5. 查询所有同学的学生编号、姓名、选课总数、所有课程的总成绩
为了获取每位学生的选课数量和所有课程的总成绩,我们需要再次使用GROUP BY
子句,并结合计数函数COUNT()
和求和函数SUM()
:
SELECT s.s_id, s.s_name, COUNT(sc.c_id) AS 'total_courses', SUM(sc.s_score) AS 'total_score' FROM student s LEFT JOIN score sc ON s.s_id = sc.s_id GROUP BY s.s_id, s.s_name;
此查询展示了如何统计每位学生选修的课程数量以及这些课程的成绩总和。
6. 查询"李"姓老师的数量
要找出所有姓“李”的老师,我们可以使用LIKE
子句来进行模糊匹配:
SELECT COUNT(*) AS 'number_of_li_teachers' FROM teacher WHERE t_name LIKE '李%';
这个查询利用了通配符%
来代表任意数量的字符,从而选出所有以“李”开头的教师姓名。
7. 询学过"张三"老师授课的同学的信息
要查询学习过特定老师(张三”)授课的学生信息,我们需要关联student
表和score
表,并找到对应的教师信息:
SELECT DISTINCT s.* FROM student s JOIN score sc ON s.s_id = sc.s_id JOIN course c ON sc.c_id = c.c_id JOIN teacher t ON c.t_id = t.t_id WHERE t.t_name = '张三';
8. 查询没学过"张三"老师授课的同学的信息
对于从未学习过某位老师(张三”)授课的学生,我们可以使用NOT IN
子句来实现:
SELECT * FROM student WHERE s_id NOT IN ( SELECT DISTINCT s.s_id FROM student s JOIN score sc ON s.s_id = sc.s_id JOIN course c ON sc.c_id = c.c_id JOIN teacher t ON c.t_id = t.t_id WHERE t.t_name = '张三' );
在这个查询中,我们首先在内查询中找到了所有学习过“张三”老师课程的学生ID,然后在外部查询中排除这些ID,得到从未学习过该老师课程的学生列表。
本文提供了一些MySQL练习题目的具体实现方法,覆盖了从基本的建表语句到复杂的多表联合查询,通过这些练习,可以加深对SQL语言的理解和应用能力,建议读者在实际操作中尝试更多的练习题,并结合具体的应用场景来提高问题解决能力。