最全面的MySQL面试题大全-一

现在正是毕业季,很多的在校的大学生都在找工作,但是有很多的公司都会在某个方面卡大家一下,其中让很多人头疼的地方就是数据库的查询。这里我就总结了之前在有些公司面试的时候遇到的一些关于数据库查询的笔试题给大家做一个归纳。所使用的是面试题中比较经典的一个场景就是学生管理系统中所涉及到的表结构。

表结构介绍

第一张表 学生表
sid 学生id
sname 学生姓名
sage 学生年龄
sex 学生性别


在这里插入图片描述

第二张表 老师表
tid 老师id
Tname 老师姓名


在这里插入图片描述

第三张表 成绩表
sid 学生id
cid 课程id
score 分数


在这里插入图片描述

第四张表 课程表
cid课程id
Cname课程名称
Tid 教师id


在这里插入图片描述

面试题
1.用一条SQL语句查询每门课程都是大于80分的学生的姓名

分析:首先需要知道课程、分数、学生姓名这三个信息是分别存在于多张表中的。所需要查询到所有的信息就必须涉及到多表查询的问题。
所以有通过分析由以下的语句即结果

SELECT sname,score as sco FROM Student as s,SC
WHERE s.sid = SC.Sid AND SC.score>80;
SELE
以下是些关于 MySQL 连续三天登录相关的面试题: ### 基础查询类 1. 有个用户登录记录表`login_records`,包含字段`user_id`(用户 ID)、`login_date`(登录日期),请编写 SQL 查询出连续三天登录的用户 ID。 ```sql -- 思路:自连接表,根据用户 ID 分组,判断是否存在连续三天的日期 SELECT DISTINCT t1.user_id FROM login_records t1 JOIN login_records t2 ON t1.user_id = t2.user_id AND DATEDIFF(t2.login_date, t1.login_date) = 1 JOIN login_records t3 ON t1.user_id = t3.user_id AND DATEDIFF(t3.login_date, t1.login_date) = 2; ``` ### 进阶优化类 2. 对于上述的`login_records`表,如果数据量非常大,如何优化查询连续三天登录用户 ID 的 SQL 语句? 可以考虑在`user_id`和`login_date`字段上创建联合索引,以加快查询速度: ```sql CREATE INDEX idx_user_login_date ON login_records (user_id, login_date); ``` ### 条件扩展类 3. 在`login_records`表中,除了`user_id`和`login_date`字段外,还有`login_time`(登录时间)字段,现在要求查询出在连续三天内,每天登录时间都在早上 9 点到 10 点之间的用户 ID。 ```sql SELECT DISTINCT t1.user_id FROM login_records t1 JOIN login_records t2 ON t1.user_id = t2.user_id AND DATEDIFF(t2.login_date, t1.login_date) = 1 JOIN login_records t3 ON t1.user_id = t3.user_id AND DATEDIFF(t3.login_date, t1.login_date) = 2 WHERE TIME(t1.login_time) BETWEEN '09:00:00' AND '10:00:00' AND TIME(t2.login_time) BETWEEN '09:00:00' AND '10:00:00' AND TIME(t3.login_time) BETWEEN '09:00:00' AND '10:00:00'; ``` ### 结果统计类 4. 基于`login_records`表,查询出连续三天登录的用户 ID 以及他们连续登录的次数(例如某个用户有 2 次连续三天登录的记录)。 ```sql -- 使用窗口函数和分组统计 WITH consecutive_logins AS ( SELECT user_id, login_date, login_date - INTERVAL ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) DAY AS grp FROM login_records ) SELECT user_id, COUNT(DISTINCT grp) AS consecutive_login_count FROM consecutive_logins GROUP BY user_id HAVING COUNT(DISTINCT grp) >= 3; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nihui123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值