mysql中的三表查询,使用外连和查找最大值和最大值分组完成
SELECT subject.subject, MAX(grade.score) as highest_score, student.name
FROM grade
JOIN student ON grade.student_id = student.id
JOIN subject ON grade.subject_id = subject.id
GROUP BY subject.subject
不知道你这个问题是否已经解决, 如果还没有解决的话:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
–及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
SELECT
sc.c_id AS '课程ID',
c.c_name AS '课程name',
MAX(sc.s_score) AS '最高分',
MIN(sc.s_score) AS '最低分',
AVG(sc.s_score) AS '平均分',
SUM(CASE WHEN sc.s_score >= 60 THEN 1 ELSE 0 END) / COUNT(*) AS '及格率',
SUM(CASE WHEN sc.s_score >= 70 AND sc.s_score < 80 THEN 1 ELSE 0 END) / COUNT(*) AS'中等率',
SUM(CASE WHEN sc.s_score >= 80 AND sc.s_score < 90 THEN 1 ELSE 0 END) / COUNT(*) AS'优良率',
SUM(CASE WHEN sc.s_score >= 90 THEN 1 ELSE 0 END) / COUNT(*) AS'优秀率'
FROM
score sc, course c
WHERE sc.c_id = c.c_id
GROUP BY sc.c_id
-- 01 语文 80 31 64.5 0.6667 0.3333 0.3333 0
-- 02 数学 90 30 72.6667 0.8333 0 0.5 0.1667
-- 03 英语 99 20 68.5 0.6667 0 0.3333 0.3333
-- 格式优化
SELECT CONCAT(FORMAT(0.665269* 100,2),'%')
-- 19、按各科成绩进行排序,并显示排名(实现不完全)
SELECT
sc.c_id AS '课程ID',
c.c_name AS '课程name',
MAX(sc.s_score) AS '最高分',
MIN(sc.s_score) AS '最低分',
AVG(sc.s_score) AS '平均分',
CONCAT(FORMAT((SUM(CASE WHEN sc.s_score >= 60 THEN 1 ELSE 0 END) / COUNT(*))* 100,2),'%') AS '及格率',
CONCAT(FORMAT(( SUM(CASE WHEN sc.s_score >= 70 AND sc.s_score < 80 THEN 1 ELSE 0 END) / COUNT(*))* 100,2),'%') AS'中等率',
CONCAT(FORMAT((SUM(CASE WHEN sc.s_score >= 80 AND sc.s_score < 90 THEN 1 ELSE 0 END) / COUNT(*))* 100,2),'%') AS'优良率',
CONCAT(FORMAT((SUM(CASE WHEN sc.s_score >= 90 THEN 1 ELSE 0 END) / COUNT(*))* 100,2),'%') AS'优秀率'
FROM
score sc, course c
WHERE sc.c_id = c.c_id
GROUP BY sc.c_id
-- 01 语文 80 31 64.5 66.67% 33.33% 33.33% 0.00%
-- 02 数学 90 30 72.6667 83.33% 0.00% 50.00% 16.67%
-- 03 英语 99 20 68.5 66.67% 0.00% 33.33% 33.33%
首先,根据问题描述,我们需要进行三表查询,同时使用外连接和查找最大值的方法来查询各科成绩的最高分和对应的考生。我们可以按照以下步骤解决该问题:
CREATE TABLE students (
student_id INT PRIMARY KEY,
student_name VARCHAR(50) NOT NULL
);
CREATE TABLE subjects (
subject_id INT PRIMARY KEY,
subject_name VARCHAR(50) NOT NULL
);
CREATE TABLE scores (
score_id INT PRIMARY KEY,
student_id INT,
subject_id INT,
score INT,
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (subject_id) REFERENCES subjects(subject_id)
);
INSERT INTO students (student_id, student_name) VALUES
(1, '张三'),
(2, '李四'),
(3, '王五');
INSERT INTO subjects (subject_id, subject_name) VALUES
(1, '数学'),
(2, '英语'),
(3, '物理');
INSERT INTO scores (score_id, student_id, subject_id, score) VALUES
(1, 1, 1, 80),
(2, 1, 2, 90),
(3, 1, 3, 85),
(4, 2, 1, 75),
(5, 2, 2, 85),
(6, 2, 3, 90),
(7, 3, 1, 90),
(8, 3, 2, 95),
(9, 3, 3, 80);
SELECT s.subject_name, MAX(score) AS max_score, st.student_name
FROM students st
LEFT JOIN scores sc ON st.student_id = sc.student_id
LEFT JOIN subjects s ON sc.subject_id = s.subject_id
GROUP BY s.subject_name;
这条SQL语句使用了外连接(LEFT JOIN)将学生表、成绩表和科目表连接起来。然后使用了MAX函数来计算每个科目的最高分,并将结果命名为max_score。最后使用GROUP BY对科目名进行分组。
通过以上步骤,我们可以得到科目、最高分和对应的考生名称的查询结果。