目录
-
- 61. 对于employees表中,给出奇数行的first_name
- 59. 获取有奖金的员工相关信息。
- 57. 使用含有关键字exists查找未分配具体部门的员工的所有信息。
- 55. 分页查询employees表,每5行一页,返回第2页的数据
- 54. 查找排除当前最大、最小salary之后的员工的平均工资avg_salary
- 53. 按照dept_no进行汇总
- 52. 获取Employees中的first_name
- 51. 查找字符串 10,A,B 中逗号,出现的次数cnt
- 49. 针对库中的所有表生成select count(*)对应的SQL语句
- 46. 在audit表上创建外键约束,其emp_no对应employees_test表的主键id
- 47. 如何获取emp_v和employees有相同的数据no
- 45. 将titles_test表名修改为titles_2017
- 44. 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005
- 43. 将所有to_date为9999-01-01的全部更新为NULL
- 42. 删除emp_no重复的记录,只保留最小的id对应的记录。
- 41. 构造一个触发器audit_log
- 40. 在last_update后面新增加一列名字为create_date
- 39. 针对上面的salaries表emp_no字段创建索引idx_emp_no
- 38. 针对actor表创建视图actor_name_view
- 37. 对first_name创建唯一索引uniq_idx_firstname
- 36. 创建一个actor_name表
- 35. 批量插入数据,不使用replace操作
- 34. 批量插入数据
- 33. 创建一个actor表,包含如下列信息
- 31. 获取select * from employees对应的执行计划
- 28. 查找描述信息中包含robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部
- 22. 统计各个部门的工资记录数
- 21. 查找所有员工自入职以来的薪水涨幅情况
- 19. 查找所有员工的last_name和first_name以及对应的dept_name
- 17. 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
- 12. 获取所有部门中当前员工薪水最高的相关信息
- 10. 获取所有非manager的员工emp_no
- 9. 获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary
- 5. 查找所有员工的last_name和first_name以及对应部门编号dept_no
- 2. 查找入职员工时间排名倒数第三的员工所有信息
61. 对于employees表中,给出奇数行的first_name
SELECT first_name
FROM (
SELECT e1.first_name, COUNT(e2.first_name) AS idx
FROM employees e1, employees e2
WHERE e1.first_name >= e2.first_name
GROUP BY e1.first_name
HAVING idx%2 =1);
未解之谜,一道我怎么看都觉得写的没问题,用SQLite online测试也没问题,但就是在牛客输出有问题的query:
等待大神解答。
59. 获取有奖金的员工相关信息。
SELECT e.emp_no, e.first_name, e.last_name, eb.btype, s.salary,
CASE eb.btype
WHEN 1 THEN 0.1 * s.salary
WHEN 2 THEN 0.2 * s.salary
ELSE 0.3 * s.salary
END bonus
FROM salaries s
INNER JOIN employees e
ON s.emp_no = e.emp_no
AND s.to_date = '9999-01-01'
INNER JOIN emp_bonus eb
ON s.emp_no = eb.emp_no
ORDER BY e.emp_no;
考察CASE的用法:SQLite CASE
57. 使用含有关键字exists查找未分配具体部门的员工的所有信息。
SELECT e.*
FROM employees e
WHERE NOT EXISTS (
SELECT d.emp_no
FROM dept_emp d
WHERE e.emp_no = d.emp_no);
55. 分页查询employees表,每5行一页,返回第2页的数据
SELECT *
FROM employees
LIMIT 5,5
读题,每5行一页,返回第2页的数据,那就是要6-10的数据,也就是从5后5条数据,所以是 LIMIT 5,5。
54. 查找排除当前最大、最小salary之后的员工的平均工资avg_salary
SELECT AVG(salary) AS avg_salary
FROM salaries
WHERE salary NOT IN (
SELECT MAX(salary)
FROM salaries
WHERE to_date = '9999-01-01')
AND salary NOT IN (
SELECT MIN(salary)
FROM salaries
WHERE to_date = '9999-01-01')
AND to_date = '9999-01-01';
本题纯属题目描述逻辑有误,原题目为:“查找排除最大、最小salary之后的当前(to_date = ‘9999-01-01’ )员工的平均工资avg_salary。”
应改为“查找当前(to_date = ‘9999-01-01’ )员工排除最大、最小salary之后的平均工资avg_salary。”
53. 按照dept_no进行汇总
SELECT dept_no, group_concat(emp_no) AS employees FROM dept_emp
GROUP BY dept_no
链接:[编程题]按照dept_no进行汇总
来源:牛客网
本题要用到SQLite的聚合函数group_concat(X,Y),其中X是要连接的字段,Y是连接时用的符号,可省略,默认为逗号。此函数必须与 GROUP BY 配合使用。
此题以 dept_no 作为分组,将每个分组中不同的emp_no用逗号连接起来(即可省略Y)。可参考:
http://www.sqlite.org/lang_aggfunc.html#groupconcat
http://blog.csdn.net/langzxz/article/details/16807859
52. 获取Employees中的first_name
-- 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列
SELECT first_name
FROM employees
ORDER BY substr(first_name,-2);
substr(X,Y,Z)
substr(X,Y)
The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. If Z is omitted then substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. The left-most character of X is number 1. If Y is negative then the first character of the substring is found by counting from the right rather than the left. If Z is negative then the abs(Z) characters preceding the Y-th character are returned. If X is a string then characters indices refer to actual UTF-8 characters. If X is a BLOB then the indices refer to bytes.
substr( string, start, length )
51. 查找字符串 10,A,B 中逗号,出现的次数cnt
SELECT LENGTH('10,A,B') -LENGTH(REPLACE('10,A,B'