今天开始作息下SQL相关的练习题,题目来源这里
首先是数据库的准备,按照题目要求,自己创建了名为text_databases的数据库,并创建了相应的数据表,插入了数据。
文本编辑器用的是Navicat Premium
直接进入正题,开始练习。
-
查询‘01’课程比‘02’课程成绩高的学生的信息及课程分数
分析:题目要求的是学生的信息和课程分数,学生的信息在Students表中,课程分数在SC表中,过滤条件是01(语文)成绩比02(数学)成绩高。
两个表之间的查询考虑到子查询或联结查询,这两个表之间靠S#(学号)关联。
在Navicat Premium代码如下:
SELECT s.*, a.score AS score_01, b.score AS score_02
FROM students s,
(SELECT `S#`, score FROM sc WHERE `C#`=01) a,
(SELECT `S#`, score FROM sc WHERE `C#`=02) b
WHERE a.`S#` = b.`S#` AND a.`S#`=s.`S#` AND a.score > b.score;
上面代码中将子查询所得到的结果作为新表(可以理解为虚拟表),利用S#相等作为联结条件,将三个表联结,最后用分数条件过滤得出结果。
-
查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
分析:平均成绩立马想到了AVG函数,大于等于60分肯定是作为筛选条件,而学生编号和姓名是在Students表中,成绩是在SC表中,两表之间靠S#联结,因此还是表的联结查询。
SELECT s.`S#` AS "学生编号",Sname AS "学生姓名",AVG(score) AS "平均成绩"
FROM students AS s,SC
WHERE s.`S#` = SC.`S#`
GROUP BY s.`S#`,Sname
HAVING AVG(score) >= 60;
上面代码利用了分组方法,并对要查询的各字段进行了重命名。注意:GROUP BY 子句中的分组依据要包含SELECT语句中除聚集函数(例如SUM,AVG等)以外所有的列名。结果如下:
-
查询在 SC 表存在成绩的学生信息
分析:学生信息和成绩在两个表中,成绩表中出现的都是存在成绩的,因此在成绩表中查询出学生编号,在利用这些编号在学生信息表中查出完整的学生信息即可。
方法一(子查询):
SELECT s.*
FROM students AS s
WHERE s.`S#` IN (SELECT DISTINCT `S#`
FROM SC);
方法二(联结表):
SELECT s.*
FROM students AS s INNER JOIN (SELECT DISTINCT `S#` FROM SC) AS t
ON s.`S#` = t.`S#`;
或者
SELECT s.*
FROM students AS s,
(SELECT DISTINCT `S#` FROM SC) AS t
WHERE s.`S#` = t.`S#`;
-
查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
分析:要求查询学生的总成绩,没有成绩的显示为NULL,存在有学生信息,但没有成绩的情况,也就是要显示学生信息的所有行,因此采用LEFT JOIN。
SELECT s.`S#`,s.Sname,COUNT(`C#`) AS '选课总数',SUM(score) AS '总成绩'
FROM students AS s LEFT JOIN SC
ON s.`S#` = SC.`S#`
GROUP BY s.`S#`,s.Sname;
注意:对C#进行计数,有课程编号,就说明选了该课程。
-
查询「李」姓老师的数量
分析:模糊匹配,想到使用通配符或者正则表达式查询。
SELECT COUNT(Tname) AS "老师数量"
FROM teachers
WHERE Tname like '李%';
或者
SELECT COUNT(Tname) AS "老师数量"
FROM teachers
WHERE Tname REGEXP '李.+';
-
查询学过「张三」老师授课的同学的信息
分析:从题目要求可以看到用到了4个表,学生信息表students,成绩表SC,课程表courses,老师信息表teachers。它们之间两两通过ID连接。要从老师信息“张三”查到学生信息,必须从后往前查询;也可使用联结表,直接将4个表联结查询。
SELECT s.*
FROM students AS s,teachers AS t,courses AS c,SC
WHERE s.`S#` = SC.`S#` AND SC.`C#` = C.`C#` AND C.`T#` = t.`T#`
AND Tname = '张三';