1.用一条SQL 语句 查询出每门课都大于80 分的学生姓名
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
#按学生分组,每组的分数都要大于80
SELECT name
FROM score
GROUP BY name
HAVING MIN(fenshu) >80
2.学生表 如下:
自动编号 学号 姓名 课程编号 课程名称 分数
1 2005001 张三 0001 数学 69
2 2005002 李四 0001 数学 89
3 2005001 张三 0001 数学 69
删除除了自动编号不同, 其他都相同的学生冗余信息.
1.先查找自动编号不同, 其他也都不相同的学生信息,
SELECT min(id) from student group by sno,sname,cno,cname,score;
2.删除重复数据
DELETE FROM student
WHERE id not in(上述结果);
整合为:
DELETE FROM student
WHERE id not in(SELECT min(id) from student group by sno,sname,cno,cname,score;);
此时结果会出错,因为mysql不允许更新的表与子查询的表相同。
修改为:
DELETE FROM student
WHERE id not in(
select t1.id from
(SELECT min(id) id from student
group by sno,sname,cno,cname,score) t1
);
3.请用SQL 语句实现:从account 数据表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。请注意:account 中有很多科目,都有1 -12 月份的发生额。
AccID :科目代码,Occmonth :发生额月份,DebitOccur :发生额。
1.先查询101科目所对应的月份以及月份所对应的发生额
select occMonth,debitOccur from account where accID='101';
2.接着查询account表中除了101科目外,月发生额比101对应月份的发生额高的科目信息
select a.* from account a,
(select occMonth,debitOccur from account where accID='101') b
where a.occMonth=b.occMonth and a.debitOccur>b.debitOccur;
3.最后去掉不是每一个月份的发生额都比101科目对应月份的发生额高的科目
select accID from
(
select a.* from account a,
(select occMonth,debitOccur from account where accID='101') b
where a.occMonth=b.occMonth and a.debitOccur>b.debitOccur
) c
group by accID having count(occMonth)=12;
SELECT Name AS Customers
FROM Customers
WHERE Name NOT IN (
SELECT b.Name FROM Orders a, Customers b
WHERE a.CustomerId = b.Id)