下面应用在MySql数据库下测试通过的。
1.查询各科成绩都超过80
id name course score
------ ------ ------ --------
1 Andy 数学 70
2 Andy 英语 80
3 Lily 数学 80
4 Lily 英语 90
5 Lucy 数学 90
6 Lucy 英语 90
查询结果:
id name course score
------ ------ ------ --------
5 Lucy 数学 90
6 Lucy 英语 90
查询SQL:
SELECT * FROM student WHERE NAME IN (SELECT NAME FROM student GROUP BY NAME HAVING MIN(score)>80)
2.行列互换
2.1:列转行
id name course score
------ ------ ------ --------
1 Andy 数学 70
2 Andy 英语 80
3 Lily 数学 80
4 Lily 英语 90
5 Lucy 数学 90
6 Lucy 英语 90
查询结果:
name 数学 英语
------ ------ --------
Andy 70 80
Lily 80 90
Lucy 90 90
查询SQL:
SELECT NAME,
MAX(CASE course WHEN '数学' THEN score ELSE 0 END) 数学,
MAX(CASE course WHEN '英语' THEN score ELSE 0 END) 英语
FROM student
GROUP BY NAME
2.2 行转列
--------------------------
name 英语 数学 物理
------ ------ ------ --------
Andy 100 10 80
Lily 60 50 54
查询结果:
name course score
------ ------ --------
Andy 数学 10
Andy 物理 80
Andy 英语 100
Lily 数学 50
Lily 物理 54
Lily 英语 60
查询SQL:
SELECT * FROM (
SELECT NAME,'英语' AS course,英语 AS score FROM td
UNION ALL
SELECT NAME,'数学' AS course,数学 AS score FROM td
UNION ALL
SELECT NAME,'物理' AS course,物理 AS score FROM td )t
ORDER BY NAME,course
3.删除姓名和分数相同的项,并取ID最大的那行
id name course score
------ ------ ------ --------
1 Andy 数学 80
2 Andy 英语 80
3 Lily 数学 80
4 Lily 英语 90
5 Lucy 数学 90
6 Lucy 英语 90
查询结果:
id name course score
------ ------ ------ --------
1 Andy 数学 80
3 Lily 数学 80
4 Lily 英语 90
5 Lucy 数学 90
查询SQL:
SELECT MAX(id),NAME,score FROM student GROUP BY NAME,score
1.查询各科成绩都超过80
id name course score
------ ------ ------ --------
1 Andy 数学 70
2 Andy 英语 80
3 Lily 数学 80
4 Lily 英语 90
5 Lucy 数学 90
6 Lucy 英语 90
查询结果:
id name course score
------ ------ ------ --------
5 Lucy 数学 90
6 Lucy 英语 90
查询SQL:
SELECT * FROM student WHERE NAME IN (SELECT NAME FROM student GROUP BY NAME HAVING MIN(score)>80)
2.行列互换
2.1:列转行
id name course score
------ ------ ------ --------
1 Andy 数学 70
2 Andy 英语 80
3 Lily 数学 80
4 Lily 英语 90
5 Lucy 数学 90
6 Lucy 英语 90
查询结果:
name 数学 英语
------ ------ --------
Andy 70 80
Lily 80 90
Lucy 90 90
查询SQL:
SELECT NAME,
MAX(CASE course WHEN '数学' THEN score ELSE 0 END) 数学,
MAX(CASE course WHEN '英语' THEN score ELSE 0 END) 英语
FROM student
GROUP BY NAME
2.2 行转列
--------------------------
name 英语 数学 物理
------ ------ ------ --------
Andy 100 10 80
Lily 60 50 54
查询结果:
name course score
------ ------ --------
Andy 数学 10
Andy 物理 80
Andy 英语 100
Lily 数学 50
Lily 物理 54
Lily 英语 60
查询SQL:
SELECT * FROM (
SELECT NAME,'英语' AS course,英语 AS score FROM td
UNION ALL
SELECT NAME,'数学' AS course,数学 AS score FROM td
UNION ALL
SELECT NAME,'物理' AS course,物理 AS score FROM td )t
ORDER BY NAME,course
3.删除姓名和分数相同的项,并取ID最大的那行
id name course score
------ ------ ------ --------
1 Andy 数学 80
2 Andy 英语 80
3 Lily 数学 80
4 Lily 英语 90
5 Lucy 数学 90
6 Lucy 英语 90
查询结果:
id name course score
------ ------ ------ --------
1 Andy 数学 80
3 Lily 数学 80
4 Lily 英语 90
5 Lucy 数学 90
查询SQL:
SELECT MAX(id),NAME,score FROM student GROUP BY NAME,score