SQL牛客网刷题(七)——11、12、31、32、33题解析

  • SQL11. 获取所有员工当前的manager
  • SQL12. 获取所有部门中当前员工当前薪水最高的相关信息
  • SQL31. 获取select * from employees对应的执行计划
  • SQL32. 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
  • SQL33. 创建一个actor表,包含如下列信息(注:sqlite获取系统默认时间是datetime

SQL11. 获取所有员工当前的manager

难度:中等

题目描述

获取所有员工当前的(dept_manager.to_date=‘9999-01-01’)manager,如果员工是manager的话不显示(也就是如果当前的manager是自己的话结果不显示)。输出结果第一列给出当前员工的emp_no,第二列给出其manager对应的emp_no。
CREATE TABLE dept_emp (
emp_no int(11) NOT NULL, – ‘所有的员工编号’
dept_no char(4) NOT NULL, – ‘部门编号’
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));
CREATE TABLE dept_manager (
dept_no char(4) NOT NULL, – ‘部门编号’
emp_no int(11) NOT NULL, – ‘经理编号’
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));

代码

select e.emp_no, m.emp_no
from dept_emp as e left join dept_manager as m 
on e.dept_no=m.dept_no
where m.to_date='9999-01-01'
and e.emp_no <> m.emp_no;

思路

这题难度不大,简单的两表关联,加上where的两个筛选条件。

SQL12. 获取所有部门中当前员工当前薪水最高的相关信息

难度:中等

题目描述

获取所有部门中当前(dept_emp.to_date = ‘9999-01-01’)员工当前(salaries.to_date=‘9999-01-01’)薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary
CREATE TABLE dept_emp (
emp_no int(11) NOT NULL,
dept_no char(4) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));
CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));

代码

select dept_no, d.emp_no, max(salary) as salary
from dept_emp as d join salaries as s 
on d.emp_no = s.emp_no
where d.to_date = '9999-01-01'
and s.to_date='9999-01-01'
group by dept_no;

思路

这题难度也不大,多表关联+group by语句就可以轻松通过了。

SQL31. 获取select * from employees对应的执行计划

难度:较难

题目描述

获取select * from employees对应的执行计划

代码

explain select * from employees;

思路

这题我是真的学到了,在SQLite数据库中,可以用 “EXPLAIN” 关键字或 “EXPLAIN QUERY PLAN” 短语,用于描述表的细节。

SQL32. 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分

难度:较难

题目描述

将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
(注:该数据库系统是sqllite,字符串拼接为 || 符号,不支持concat函数)
CREATE TABLE employees ( emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) NOT NULL,
hire_date date NOT NULL,
PRIMARY KEY (emp_no));

代码

select (last_name || ' ' || first_name) as Name
from employees;

思路

由于本题的环境是sqllite,不支持concat函数,而支持||,||的用法很简单,相当于python里字符拼接的+,另外提供一下mysql语句中该题的答案:

select concat(last_name, ' ', first_name) as Name
from employees

SQL33. 创建一个actor表,包含如下列信息(注:sqlite获取系统默认时间是datetime

难度:较难

题目描述

创建一个actor表,包含如下列信息(注:sqlite获取系统默认时间是datetime(‘now’,‘localtime’))
在这里插入图片描述

代码

create table actor(
actor_id smallint(5) not null primary key,
first_name varchar(45) not null,
last_name varchar(45) not null,
last_update timestamp not null default (datetime('now','localtime'))
);

思路

本题就是创建一个表,难度也很小,注意的就是设置actor_id字段为primary key以及设置last_update的default值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值