用一条SQL 语句 查询出每门课都大于80 分的学生姓名
name
class
score
张三
语文
81
张三
数学
75
李四
语文
76
李四
数学
90
王五
语文
81
王五
数学
100
王五
英语
90
答案 1:使用子查询,先选择分数小于等于 80 分的学生姓名,只要姓名不在这里面的,就每门课程都大于 80 分
SELECT DISTINCT name
FROM table
WHERE name NOT IN
(SELECT DISTINCT name
FROM table WHERE score<=80);
答案 2:使用 GROUP BY…HAVING…,将分数按姓名分组,选择分组最小分数大于 80 的组的姓名
SELECT name
FROM table
GROUP BY name
HAVING MIN(score)>80;
删除除了自动编号不同, 其他都相同的学生冗余信息
No
id
name
class
score
1
0001
张三
语文
81
2
0003
李四
数学
75
3
0001
张三
语文
81
答案:按照后面几项进行分组,选取其最小编号作为唯一编号,删除不在唯一编号里的(即后面几项内容重复的),注意 MySQL 中子查询的格式,需指定别名。
DELETE FROM table
WHERE No NOT IN
(SELECT *
FROM
(SELECT MIN(No)
FROM table
GROUP BY id, name, class, score) A);
一个叫 team 的表,里面只有一个字段 name, 一共有 4 条纪录,分别是 a, b, c, d, 对应四个球队,现在四个球队进行比赛,用一条 SQL 语句显示所有可能的比赛组合
SELECT a.name team1, b.name team2
FROM team a, team b
WHERE a.name<b.name
请用 SQL 语句实现:从 table 数据表中查询出所有月份的发生额都比 101 科目相应月份的发生额高的科目。table 中有很多科目,都有1-12 月份的发生额。字段分别为: no :科目代码,mon :发生额月份,num :发生额
答案:先将 101 科目的数据拎出来,作为 b 表,然后提取出原数据表中月份和 b 表相同,发生额比 b 表大的数据,作为 c 表,然后对 c 表中按科目分类计数,结果为 12 个月的即为最终结果
SELECT c.* FROM
(SELECT a.* FROM table a, (SELECT * FROM table WHERE no=101) b
WHERE a.mon=b.mon AND a.num>b.num) c
GROUP BY c.no HAVING COUNT(c.mon)=12
面试题:怎么把这样一个表
year
month
amount
1991
1
1.1
1991
2
1.2
1991
3
1.