本文已参与「新人创作礼」活动,一起开启掘金创作之路。
🔖文章摘要
题目选自牛客网在线编程SQL实战,文章包含5道题,难度简单,内容依次为:①题目介绍、②代码编写要求、③解题思路、④解题代码和⑤要点总结共五大部分。
📝题目一(难度:简单)
📌题目介绍
有一个员工表employees简况如下:
有一个部门领导表dept_manager简况如下:
📌编写要求
找出所有非部门领导的员工emp_no,以上例子输出:
📌解题思路
📌解题代码
# 解法一:
select employees.emp_no from employees
left join dept_manager
on employees.emp_no=dept_manager.emp_no
where dept_no is null;
# 解法二:
select employees.emp_no from employees
where emp_no not in (
select emp_no from dept_manager);
📌要点总结
- 该题主要考查多表连接、where条件筛选以及子查询的用法,比较简单
📝题目二(难度:简单)
📌题目介绍
有一个员工表employees简况如下:
📌编写要求
查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列,以上例子查询结果如下:
📌解题思路
📌解题代码
# 解法一:
select * from employees
where emp_no % 2
and last_name <> 'Mary'
order by hire_date desc;
# 解法二:
select * from employees
where emp_no & 1
and last_name != 'Mary'
order by hire_date desc;
📌要点总结
- 判断不等于可使用<> 或 !=
- 判断奇偶数的方法首先会想到 除2取余为1,但其实使用位运算更加巧妙,规律为:
1 & 奇数 = 1;1 & 偶数 = 0。所以判断一个数(前提为整数)是奇偶数,直接用某个数与1进行按位与即可。
📝题目三(难度:简单)
📌题目介绍
有一个薪水表salaries简况如下:
📌编写要求
获取薪水第二多的员工的emp_no以及其对应的薪水salary,若有多个员工的薪水为第二多的薪水,则将对应的员工的emp_no和salary全部输出,并按emp_no升序排序。
📌解题思路
📌解题代码
select emp_no, salary from salaries
where salary = (
select distinct salary from salaries
order by salary desc limit 1, 1)
order by emp_no;
📌要点总结
- 注意limit用法的局限之处,where+子查询用法更加全面
📝题目四(难度:简单)
📌题目介绍
现有员工表employees如下:
📌编写要求
将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分。(注:sqllite,字符串拼接为 || 符号,不支持concat函数,mysql支持concat函数)。
📌解题思路
📌解题代码
select CONCAT(e.last_name,' ',e.first_name) as 'Name'
from employees as e;
📌要点总结
- 主要考察concat函数的用法,concat函数的作用是:将多个字符串连接成一个字符串,语法:concat(str1, str2,...) 返回结果为连接参数产生的字符串,如果其中有一个参数为null,则返回值为null。
📝题目五(难度:简单)
📌题目介绍
题目已经先执行了如下语句:
📌编写要求
对于表actor批量插入如下数据(不能有2条insert语句哦!)
📌解题代码
insert into actor
VALUES(1,'PENELOPE','GUINESS','2006-02-15 12:34:33'),
(2,'NICK','WAHLBERG','2006-02-15 12:34:33');
📌要点总结
- 主要考查insert插入数据的用法
方式一:insert into 表名(字段名,...) values(值1,...);
方式二:insert into 表名 set 字段=值,字段=值,...; - 方式一支持一次插入多行,语法如下: insert into 表名(字段名,..) values(值,..),(值,...),...; 且支持子查询,语法如下:insert into 表名 查询语句;