SQL常见面试题

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)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值