面试总结SQL 经典面试题

原文:

https://www.cnblogs.com/yoyoketang/p/10118924.html

 

前言

用一条SQL 语句查询xuesheng表每门课都大于80 分的学生姓名,这个是面试考sql的一个非常经典的面试题

having和not in

查询 xuesheng表每门课都大于80 分的学生姓名

namekechengscore
张三语文81
张三数学73
李四语文86
李四数学90
王五数学89
王五语文88
王五英语96

解决办法一: having

如果不考虑学生的课程少录入情况(比如张三只有2个课程,王五有3个课程)

SELECT name 
FROM xuesheng 
GROUP BY name
HAVING MIN(score)> 80

如果考虑学生的课程数大于等于3的情况

SELECT name 
FROM xuesheng 
GROUP BY name
HAVING MIN(score)> 80
AND COUNT(kecheng)>=3

解决办法二:not in

可以用反向思维,先查询出表里面有小于80分的name,然后用not in去除掉

SELECT DISTINCT name 
FROM xuesheng 
WHERE name NOT IN
	(SELECT DISTINCT name 
	FROM xuesheng 
	WHERE score <=80);

删除

学生表xueshengbiao 如下:自动编号 学号 姓名 课程编号 课程名称 分数

autoididnamekcidkcnamescore
12005001张三0001数学69
22005002李四0001数学89
32005001张三0001数学69

删除除了自动编号不同, 其他都相同的学生冗余信息

DELETE t1 
FROM xueshengbiao t1, xueshengbiao t2
WHERE t1.id = t2.id
and t1.name = t2.name
and t1.kcid = t2.kcid
and t1.kcname = t2.kcname
and t1.score = t2.score
and t1.autoid < t2.autoid

如果只是查询出自动编号不同, 其他都相同的学生冗余信息,可以用group by

SELECT * from xueshengbiao t1
WHERE t1.autoid
NOT IN
	(SELECT MIN(autoid) as autoid FROM xueshengbiao
	GROUP BY id, name, kcid, kcname, score)

模糊查询%

表名:student ,用sql查询出“张”姓学生中平均成绩大于75分的学生信息;

namekechengscore
张青语文72
张华英语81
王华数学72
张青物理67
李立化学98
张青化学76
select * from student
where name in 
(select name from student
where name like '张%' group by name having avg(score) > 75);

SQL 通配符

在 SQL 中,通配符与 SQL LIKE 操作符一起使用。SQL 通配符用于搜索表中的数据。在 SQL 中,可使用以下通配符:

通配符描述
%替代 0 个或多个字符
_替代一个字符
[charlist]字符列中的任何单一字符
[^charlist]或[!charlist]不在字符列中的任何单一字符

**MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式 **

找出姓张和姓李的同学, 用rlike实现匹配多个

-- 找出姓张和姓李的
select * from xuesheng
where name in 
(select name from xuesheng
where name rlike '[张李]' group by name having avg(score) > 75);

也可以用 REGEXP,结合正则匹配

select * from xuesheng
where name in 
(select name from xuesheng
where name REGEXP '^[张李]' group by name having avg(score) > 75);
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值