1. Créer des données
DROP TABLE IF EXISTS sc;
CREATE TABLE sc (
stu_no VARCHAR(4) COMMENT '学号',
class_no VARCHAR(4) COMMENT '课程号',
grade INT(2) COMMENT '成绩'
);
DROP TABLE IF EXISTS class;
CREATE TABLE class (
class_no VARCHAR(4) COMMENT '课程号',
class_name VARCHAR(8) COMMENT '课程名称'
);
INSERT INTO sc VALUES
('0001','C001',89),
('0001','C002',85),
('0001','C003',99),
('0002','C001',78),
('0002','C002',83),
('0002','C003',86),
('0002','C004',77),
('0003','C001',88),
('0003','C003',68),
('0003','C004',55);
INSERT INTO class VALUES
('C001','语文'),
('C002','数学'),
('C003','英语'),
('C004','科学');
Deuxièmement, affichez la structure des données
SELECT * FROM sc;
SELECT * FROM class;
3. Exigences (vérifiez le score de chaque étudiant pour chaque cours, si l'étudiant n'a pas de score pour ce cours dans la base de données, le score pour ce cours est fixé à 0)
-
1. Utilisez la jointure croisée pour faire un produit cartésien sur deux tables.
SELECT * FROM sc CROSS JOIN class
+--------+----------+-------+----------+------------+ | stu_no | class_no | grade | class_no | class_name | +--------+----------+-------+----------+------------+ | 0001 | C001 | 89 | C001 | 语文 | | 0001 | C001 | 89 | C002 | 数学 | | 0001 | C001 | 89 | C003 | 英语 | | 0001 | C001 | 89 | C004 | 科学 | | 0001 | C002 | 85 | C001 | 语文 | | 0001 | C002 | 85 | C002 | 数学 | | 0001 | C002 | 85 | C003 | 英语 | | 0001 | C002 | 85 | C004 | 科学 | | 0001 | C003 | 99 | C001 | 语文 | | 0001 | C003 | 99 | C002 | 数学 | | 0001 | C003 | 99 | C003 | 英语 | | 0001 | C003 | 99 | C004 | 科学 | | 0002 | C001 | 78 | C001 | 语文 | | 0002 | C001 | 78 | C002 | 数学 | | 0002 | C001 | 78 | C003 | 英语 | | 0002 | C001 | 78 | C004 | 科学 | | 0002 | C002 | 83 | C001 | 语文 | | 0002 | C002 | 83 | C002 | 数学 | | 0002 | C002 | 83 | C003 | 英语 | | 0002 | C002 | 83 | C004 | 科学 | | 0002 | C003 | 86 | C001 | 语文 | | 0002 | C003 | 86 | C002 | 数学 | | 0002 | C003 | 86 | C003 | 英语 | | 0002 | C003 | 86 | C004 | 科学 | | 0002 | C004 | 77 | C001 | 语文 | | 0002 | C004 | 77 | C002 | 数学 | | 0002 | C004 | 77 | C003 | 英语 | | 0002 | C004 | 77 | C004 | 科学 | | 0003 | C001 | 88 | C001 | 语文 | | 0003 | C001 | 88 | C002 | 数学 | | 0003 | C001 | 88 | C003 | 英语 | | 0003 | C001 | 88 | C004 | 科学 | | 0003 | C003 | 68 | C001 | 语文 | | 0003 | C003 | 68 | C002 | 数学 | | 0003 | C003 | 68 | C003 | 英语 | | 0003 | C003 | 68 | C004 | 科学 | | 0003 | C004 | 55 | C001 | 语文 | | 0003 | C004 | 55 | C002 | 数学 | | 0003 | C004 | 55 | C003 | 英语 | | 0003 | C004 | 55 | C004 | 科学 | +--------+----------+-------+----------+------------+
-
2. Définissez les deux lignes de données avec un nom_classe différent dans le tableau ci-dessus et définissez la note sur 0.
SELECT stu_no, t1.class_no, t2.class_no, CASE WHEN t1.class_no=t2.class_no THEN grade ELSE 0 END AS grade, class_name FROM sc AS t1 CROSS JOIN class AS t2
+--------+----------+----------+-------+------------+ | stu_no | class_no | class_no | grade | class_name | +--------+----------+----------+-------+------------+ | 0001 | C001 | C001 | 89 | 语文 | | 0001 | C001 | C002 | 0 | 数学 | | 0001 | C001 | C003 | 0 | 英语 | | 0001 | C001 | C004 | 0 | 科学 | | 0001 | C002 | C001 | 0 | 语文 | | 0001 | C002 | C002 | 85 | 数学 | | 0001 | C002 | C003 | 0 | 英语 | | 0001 | C002 | C004 | 0 | 科学 | | 0001 | C003 | C001 | 0 | 语文 | | 0001 | C003 | C002 | 0 | 数学 | | 0001 | C003 | C003 | 99 | 英语 | | 0001 | C003 | C004 | 0 | 科学 | | 0002 | C001 | C001 | 78 | 语文 | | 0002 | C001 | C002 | 0 | 数学 | | 0002 | C001 | C003 | 0 | 英语 | | 0002 | C001 | C004 | 0 | 科学 | | 0002 | C002 | C001 | 0 | 语文 | | 0002 | C002 | C002 | 83 | 数学 | | 0002 | C002 | C003 | 0 | 英语 | | 0002 | C002 | C004 | 0 | 科学 | | 0002 | C003 | C001 | 0 | 语文 | | 0002 | C003 | C002 | 0 | 数学 | | 0002 | C003 | C003 | 86 | 英语 | | 0002 | C003 | C004 | 0 | 科学 | | 0002 | C004 | C001 | 0 | 语文 | | 0002 | C004 | C002 | 0 | 数学 | | 0002 | C004 | C003 | 0 | 英语 | | 0002 | C004 | C004 | 77 | 科学 | | 0003 | C001 | C001 | 88 | 语文 | | 0003 | C001 | C002 | 0 | 数学 | | 0003 | C001 | C003 | 0 | 英语 | | 0003 | C001 | C004 | 0 | 科学 | | 0003 | C003 | C001 | 0 | 语文 | | 0003 | C003 | C002 | 0 | 数学 | | 0003 | C003 | C003 | 68 | 英语 | | 0003 | C003 | C004 | 0 | 科学 | | 0003 | C004 | C001 | 0 | 语文 | | 0003 | C004 | C002 | 0 | 数学 | | 0003 | C004 | C003 | 0 | 英语 | | 0003 | C004 | C004 | 55 | 科学 | +--------+----------+----------+-------+------------+
-
3. En observant les données de l'étape précédente, il n'est pas difficile de constater que nous avons terminé les notes de cours manquantes de chaque étudiant avec 0, mais les données à l'origine normales ont répété certaines données de cours avec 0, nous devons donc supprimer les doublons et aller Le plus important est d'utiliser group by ou distinct, mais distinct n'est pas contrôlable, nous choisissons donc group by ici pour reproduire les données que nous voulons.
SELECT stu_no, t2.class_no, SUM(CASE WHEN t1.class_no=t2.class_no THEN grade ELSE 0 END ) AS grade, class_name FROM sc AS t1 CROSS JOIN class AS t2 GROUP BY stu_no,t2.class_no,class_name;