BytePrince / Database-SQL-Actual-Combat

牛客网数据库SQL实战题目汇总

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

数据库SQL实战

选项 说明
🐵 通过
🙈 未通过或不符合MySQL5.7语法规范
编号 分类 标题 提交
1 过滤 查找最晚入职员工的所有信息 🐵
2 过滤 查找入职员工时间排名倒数第三的员工所有信息 🐵
3 连接 查找当前薪水详情以及部门编号dept_no 🐵
4 连接 查找所有已经分配部门的员工的last_name和first_name 🐵
5 连接 查找所有员工的last_name和first_name以及对应部门编号dept_no 🐵
6 连接 查找所有员工入职时候的薪水情况 🐵
7 分组 查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t 🐵
8 过滤 找出所有员工当前薪水salary情况 🐵
9 连接 获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date=9999-01-01 🐵
10 过滤 获取所有非manager的员工emp_no 🐵
11 连接 获取所有员工当前的manager 🐵
12 分组聚合 获取所有部门中当前员工薪水最高的相关信息 🙈
13 分组聚合 从titles表获取按照title进行分组 🐵
14 分组聚合 从titles表获取按照title进行分组 🐵
15 过滤 查找employees表 🐵
16 分组聚合 统计出当前各个title类型对应的员工当前薪水对应的平均工资 🐵
17 过滤 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary 🐵
18 连接 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary,不准使用order by 🐵
19 连接 查找所有员工的last_name和first_name以及对应的dept_name 🐵
20 过滤 查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth 🐵
21 连接 查找所有员工自入职以来的薪水涨幅情况 🐵
22 分组聚合 统计各个部门对应员工涨幅的次数总和 🐵
23 排名 对所有员工的薪水按照salary进行按照1-N的排名 🙈
24 连接 获取所有非manager员工当前的薪水情况 🐵
25 连接 获取员工其当前的薪水比其manager当前薪水还高的相关信息 🐵
26 连接和分组 汇总各个部门当前员工的title类型的分配数目 🐵
27 连接 给出每个员工每年薪水涨幅超过5000的员工编号emp_no 🙈
28 连接 查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部 🐵
29 连接 使用join查询方式找出没有分类的电影id以及名称 🐵
30 子查询 使用子查询的方式找出属于Action分类的所有电影对应的title,description 🐵
31 优化 获取 select * from employees 对应的执行计划 🐵
32 字符串处理 将employees表的所有员工的last_name和first_name拼接起来作为Name 🙈
33 表操作 创建一个actor表,包含如下列信息 🙈
34 数据操作 批量插入数据 🐵
35 数据操作 批量插入数据,不使用replace操作 🙈
36 表和数据操作 创建一个actor_name表 🐵
37 索引 对first_name创建唯一索引uniq_idx_firstname 🐵
38 视图 针对actor表创建视图actor_name_view 🐵
39 索引 针对上面的salaries表emp_no字段创建索引idx_emp_no 🙈
40 表操作 在last_update后面新增加一列名字为create_date 🙈
41 触发器 构造一个触发器audit_log 🐵
42 数据操作 删除emp_no重复的记录,只保留最小的id对应的记录 🐵
43 数据操作 将所有to_date为9999-01-01的全部更新为NULL 🐵
44 数据操作 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005 🐵
45 表操作 将titles_test表名修改为titles_2017 🐵
46 外键 在audit表上创建外键约束,其emp_no对应employees_test表的主键id 🐵
47 连接 如何获取emp_v和employees有相同的数据no 🐵
48 数据操作 将所有获取奖金的员工当前的薪水增加10% 🐵
49 字符串处理 针对库中的所有表生成select count(*)对应的SQL语句 🙈
50 字符串处理 将employees表中的所有员工的last_name和first_name通过(')连接起来 🙈
51 字符串处理 查找字符串'10,A,B' 中逗号','出现的次数cnt 🐵
52 字符串处理 获取Employees中的first_name 🐵
53 聚合函数 按照dept_no进行汇总 🐵
54 聚合函数 查找排除当前最大、最小salary之后的员工的平均工资avg_salary 🐵
55 关键字 分页查询employees表,每5行一页,返回第2页的数据 🐵
56 连接 获取所有员工的emp_no 🐵
57 子查询 使用含有关键字exists查找未分配具体部门的员工的所有信息 🐵
58 视图 获取employees中的行数据,且这些行也存在于emp_v中 🐵
59 条件语句 获取有奖金的员工相关信息 🐵
60 表的复用 统计salary的累计和running_total 🐵
61 表的复用 对于employees表中,给出奇数行的first_name 🙈

答案全部在牛客网测试通过。语法规格SQLite3.7.9

题解主要有参考牛课网论坛

本地测试使用MySQL5.7,部分语法与SQLite存在差异,对于MySQL5.7+,请设置sql_mode,正确使用group by(解决ONLY_FULL_GROUP_BY导致的group by查询条件严苛问题,此方法只做临时修改)

set sql_mode=(select replace(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 

详情参考:MySQL的sql_mode解析与设置

离线练习数据集配置

牛客网的数据结构几乎与MySQL测试用的数据集相通,可以先在本地测试后,再在牛客网提交结果

  1. 前往 https://launchpad.net/test-db/employees-db-1/1.0.6 下载文件 employees_db-full-1.0.6.tar.bz2

  2. 解压缩下载的文件

    tar jxvf employees_db-full-1.0.6.tar.bz2
    cd employees_db-full-1.0.6
  3. 修改文件 employees.sql

    # 38行 set storage_engine = InnoDB; 替换
    set default_storage_engine = InnoDB;
    # 44行 select CONCAT('storage engine: ', @@storage_engine) as INFO; 替换
    select CONCAT('storage engine: ', @@default_storage_engine) as INFO;
  4. 导入数据库

    mysql -uroot -p -t < employees.sql

参考:https://blog.csdn.net/appleyuchi/article/details/79439387

GitHub:https://github.com/datacharmer/test_db

About

牛客网数据库SQL实战题目汇总

License:MIT License