以下是SQL经典50题的解答,涵盖了基础查询、连接、聚合、子查询等常见SQL操作。
SELECT s.*, a.score AS score_01, b.score AS score_02
FROM Student s
JOIN SC a ON s.SId = a.SId AND a.CId = '01'
JOIN SC b ON s.SId = b.SId AND b.CId = '02'
WHERE a.score > b.score;
SELECT s.SId, s.Sname, AVG(sc.score) AS avg_score
FROM Student s
JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname
HAVING AVG(sc.score) >= 60;
SELECT s.SId, s.Sname, COUNT(sc.CId) AS course_count, SUM(sc.score) AS total_score
FROM Student s
LEFT JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname;
SELECT COUNT(*) AS li_count
FROM Teacher
WHERE Tname LIKE '李%';
SELECT DISTINCT s.*
FROM Student s
JOIN SC sc ON s.SId = sc.SId
JOIN Course c ON sc.CId = c.CId
JOIN Teacher t ON c.TId = t.TId
WHERE t.Tname = '张三';
SELECT s.*
FROM Student s
JOIN SC sc1 ON s.SId = sc1.SId AND sc1.CId = '01'
JOIN SC sc2 ON s.SId = sc2.SId AND sc2.CId = '02';
SELECT s.*
FROM Student s
JOIN SC sc1 ON s.SId = sc1.SId AND sc1.CId = '01'
LEFT JOIN SC sc2 ON s.SId = sc2.SId AND sc2.CId = '02'
WHERE sc2.SId IS NULL;
SELECT s.*
FROM Student s
LEFT JOIN (
SELECT SId, COUNT(DISTINCT CId) AS course_count
FROM SC
GROUP BY SId
) sc ON s.SId = sc.SId
WHERE sc.course_count < (SELECT COUNT(*) FROM Course)
OR sc.course_count IS NULL;
SELECT DISTINCT s.*
FROM Student s
JOIN SC sc ON s.SId = sc.SId
WHERE sc.CId IN (
SELECT CId
FROM SC
WHERE SId = '01'
) AND s.SId != '01';
SELECT s.*
FROM Student s
WHERE s.SId IN (
SELECT SId
FROM SC
WHERE SId != '01'
GROUP BY SId
HAVING COUNT(CId) = (SELECT COUNT(CId) FROM SC WHERE SId = '01')
AND SUM(CASE WHEN CId IN (SELECT CId FROM SC WHERE SId = '01') THEN 1 ELSE 0 END) =
(SELECT COUNT(CId) FROM SC WHERE SId = '01')
);
SELECT s.Sname
FROM Student s
WHERE s.SId NOT IN (
SELECT DISTINCT sc.SId
FROM SC sc
JOIN Course c ON sc.CId = c.CId
JOIN Teacher t ON c.TId = t.TId
WHERE t.Tname = '张三'
);
SELECT s.SId, s.Sname, AVG(sc.score) AS avg_score
FROM Student s
JOIN SC sc ON s.SId = sc.SId
WHERE sc.score < 60
GROUP BY s.SId, s.Sname
HAVING COUNT(sc.CId) >= 2;
SELECT s.*, sc.score
FROM Student s
JOIN SC sc ON s.SId = sc.SId AND sc.CId = '01'
WHERE sc.score < 60
ORDER BY sc.score DESC;
SELECT s.SId, s.Sname,
MAX(CASE WHEN sc.CId = '01' THEN sc.score ELSE NULL END) AS score_01,
MAX(CASE WHEN sc.CId = '02' THEN sc.score ELSE NULL END) AS score_02,
MAX(CASE WHEN sc.CId = '03' THEN sc.score ELSE NULL END) AS score_03,
AVG(sc.score) AS avg_score
FROM Student s
LEFT JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname
ORDER BY avg_score DESC;
SELECT c.CId, c.Cname,
MAX(sc.score) AS max_score,
MIN(sc.score) AS min_score,
AVG(sc.score) AS avg_score,
COUNT(sc.SId) AS student_count,
SUM(CASE WHEN sc.score >= 60 THEN 1 ELSE 0 END) AS pass_count,
SUM(CASE WHEN sc.score >= 60 THEN 1 ELSE 0 END)/COUNT(sc.SId)*100 AS pass_rate
FROM Course c
LEFT JOIN SC sc ON c.CId = sc.CId
GROUP BY c.CId, c.Cname
ORDER BY c.CId;
SELECT sc1.CId, sc1.SId, sc1.score, COUNT(sc2.score) + 1 AS rank
FROM SC sc1
LEFT JOIN SC sc2 ON sc1.CId = sc2.CId AND sc2.score > sc1.score
GROUP BY sc1.CId, sc1.SId, sc1.score
ORDER BY sc1.CId, rank;
SELECT s.SId, s.Sname, SUM(sc.score) AS total_score,
RANK() OVER (ORDER BY SUM(sc.score) DESC) AS rank
FROM Student s
LEFT JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname
ORDER BY total_score DESC;
SELECT t.TId, t.Tname, c.CId, c.Cname, AVG(sc.score) AS avg_score
FROM Teacher t
JOIN Course c ON t.TId = c.TId
LEFT JOIN SC sc ON c.CId = sc.CId
GROUP BY t.TId, t.Tname, c.CId, c.Cname
ORDER BY avg_score DESC;
WITH RankedScores AS (
SELECT sc.CId, sc.SId, sc.score,
RANK() OVER (PARTITION BY sc.CId ORDER BY sc.score DESC) AS rank
FROM SC sc
)
SELECT s.*, rs.CId, rs.score
FROM RankedScores rs
JOIN Student s ON rs.SId = s.SId
WHERE rs.rank BETWEEN 2 AND 3
ORDER BY rs.CId, rs.rank;
SELECT c.CId, c.Cname,
SUM(CASE WHEN sc.score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS '[100-85]',
SUM(CASE WHEN sc.score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS '[85-70]',
SUM(CASE WHEN sc.score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS '[70-60]',
SUM(CASE WHEN sc.score < 60 THEN 1 ELSE 0 END) AS '[<60]'
FROM Course c
LEFT JOIN SC sc ON c.CId = sc.CId
GROUP BY c.CId, c.Cname;
SELECT s.SId, s.Sname, AVG(sc.score) AS avg_score,
RANK() OVER (ORDER BY AVG(sc.score) DESC) AS rank
FROM Student s
LEFT JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname;
WITH RankedScores AS (
SELECT sc.CId, sc.SId, sc.score,
RANK() OVER (PARTITION BY sc.CId ORDER BY sc.score DESC) AS rank
FROM SC sc
)
SELECT rs.CId, s.SId, s.Sname, rs.score, rs.rank
FROM RankedScores rs
JOIN Student s ON rs.SId = s.SId
WHERE rs.rank <= 3
ORDER BY rs.CId, rs.rank;
SELECT c.CId, c.Cname, COUNT(sc.SId) AS student_count
FROM Course c
LEFT JOIN SC sc ON c.CId = sc.CId
GROUP BY c.CId, c.Cname;
SELECT s.SId, s.Sname
FROM Student s
JOIN (
SELECT SId, COUNT(CId) AS course_count
FROM SC
GROUP BY SId
HAVING COUNT(CId) = 2
) sc ON s.SId = sc.SId;
SELECT Ssex, COUNT(*) AS count
FROM Student
GROUP BY Ssex;
SELECT *
FROM Student
WHERE Sname LIKE '%风%';
SELECT Sname, Ssex, COUNT(*) AS count
FROM Student
GROUP BY Sname, Ssex
HAVING COUNT(*) > 1;
SELECT *
FROM Student
WHERE YEAR(Sage) = 1990;
SELECT CId, AVG(score) AS avg_score
FROM SC
GROUP BY CId
ORDER BY avg_score DESC, CId ASC;
SELECT s.SId, s.Sname, AVG(sc.score) AS avg_score
FROM Student s
JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname
HAVING AVG(sc.score) >= 85;
SELECT s.Sname, sc.score
FROM Student s
JOIN SC sc ON s.SId = sc.SId
JOIN Course c ON sc.CId = c.CId
WHERE c.Cname = '数学' AND sc.score < 60;
SELECT s.SId, s.Sname,
MAX(CASE WHEN c.Cname = '语文' THEN sc.score ELSE NULL END) AS '语文',
MAX(CASE WHEN c.Cname = '数学' THEN sc.score ELSE NULL END) AS '数学',
MAX(CASE WHEN c.Cname = '英语' THEN sc.score ELSE NULL END) AS '英语'
FROM Student s
LEFT JOIN SC sc ON s.SId = sc.SId
LEFT JOIN Course c ON sc.CId = c.CId
GROUP BY s.SId, s.Sname;
SELECT s.Sname, c.Cname, sc.score
FROM Student s
JOIN SC sc ON s.SId = sc.SId
JOIN Course c ON sc.CId = c.CId
WHERE sc.score > 70;
SELECT s.SId, s.Sname, c.Cname, sc.score
FROM Student s
JOIN SC sc ON s.SId = sc.SId
JOIN Course c ON sc.CId = c.CId
WHERE sc.score < 60;
SELECT s.SId, s.Sname
FROM Student s
JOIN SC sc ON s.SId = sc.SId
WHERE sc.CId = '01' AND sc.score > 80;
SELECT CId, COUNT(SId) AS student_count
FROM SC
GROUP BY CId;
SELECT s.*, sc.score
FROM Student s
JOIN SC sc ON s.SId = sc.SId
JOIN Course c ON sc.CId = c.CId
JOIN Teacher t ON c.TId = t.TId
WHERE t.Tname = '张三'
ORDER BY sc.score DESC
LIMIT 1;
WITH TopScores AS (
SELECT sc.SId, sc.score,
RANK() OVER (ORDER BY sc.score DESC) AS rank
FROM SC sc
JOIN Course c ON sc.CId = c.CId
JOIN Teacher t ON c.TId = t.TId
WHERE t.Tname = '张三'
)
SELECT s.*, ts.score
FROM TopScores ts
JOIN Student s ON ts.SId = s.SId
WHERE ts.rank = 1;
SELECT DISTINCT a.SId, a.CId, a.score
FROM SC a
JOIN SC b ON a.SId = b.SId AND a.CId != b.CId AND a.score = b.score;
WITH RankedScores AS (
SELECT sc.CId, sc.SId, sc.score,
ROW_NUMBER() OVER (PARTITION BY sc.CId ORDER BY sc.score DESC) AS rank
FROM SC sc
)
SELECT rs.CId, s.Sname, rs.score, rs.rank
FROM RankedScores rs
JOIN Student s ON rs.SId = s.SId
WHERE rs.rank <= 2
ORDER BY rs.CId, rs.rank;
SELECT CId, COUNT(SId) AS student_count
FROM SC
GROUP BY CId
HAVING COUNT(SId) > 5;
SELECT SId
FROM SC
GROUP BY SId
HAVING COUNT(CId) >= 2;
SELECT s.*
FROM Student s
JOIN (
SELECT SId, COUNT(CId) AS course_count
FROM SC
GROUP BY SId
HAVING COUNT(CId) = (SELECT COUNT(*) FROM Course)
) sc ON s.SId = sc.SId;
SELECT SId, Sname,
TIMESTAMPDIFF(YEAR, Sage, CURDATE()) AS age
FROM Student;
SELECT *
FROM Student
WHERE WEEKOFYEAR(Sage) = WEEKOFYEAR(CURDATE());
SELECT *
FROM Student
WHERE WEEKOFYEAR(Sage) = WEEKOFYEAR(CURDATE()) + 1;
SELECT *
FROM Student
WHERE MONTH(Sage) = MONTH(CURDATE());
SELECT *
FROM Student
WHERE MONTH(Sage) = MONTH(CURDATE()) + 1;
SELECT s.SId, s.Sname,
COUNT(sc.CId) AS course_count,
SUM(sc.score) AS total_score
FROM Student s
LEFT JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname;
```sql SELECT s.SId, s.Sname, AVG(sc.score