牛客-SQL-刷题(下)

上是一些基本操作回顾

按照牛客上的通过率,下应该难一点

 

31. 使用join查询方式找出没有分类的电影id以及名称

film表
字段 说明
film_id 电影id
title 电影名称
description 电影描述信息

category表

字段 说明
category_id 电影分类id
name 电影分类名称
last_update 电影分类最后更新时间

film_category表

字段 说明
film_id 电影id
category_id 电影分类id
last_update 电影id和分类id对应关系的最后更新时间

分析:film_id在film表中,但不在film_category表中
SELECT a.film_id, a.title FROM film a
LEFT JOIN film_category b
ON a.film_id=b.film_id
WHERE b.film_id is NULL;

 

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

      分析:考察SQLite中字符串的拼接 ‘||’

SELECT last_name || ' ' || first_name name FROM employees;

 

33. 查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工

      分析:考察LEFT JOIN,左表有的记录都会展现出来,不论右表有没有

SELECT a.last_name, a.first_name, b.dept_no FROM employees a
LEFT JOIN dept_emp b
ON a.emp_no=b.emp_no;

 

34. 查找所有已经分配部门的员工的last_name和first_name以及dept_no

      分析:主键emp_no在dept_emp中,以dept_emp作为左表

SELECT b.last_name, b.first_name, a.dept_no FROM dept_emp a
LEFT JOIN employees b
ON a.emp_no=b.emp_no;

 

35. 现在在last_update后面新增加一列名字为create_date, 类型为datetime, NOT NULL,默认值为'0000 00:00:00'

      分析:知识盲区:设置默认值DEFAULT 在创建表时就应该注意到了

ALTER TABLE actor ADD create_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00';

 

36. 获取所有员工的emp_no、部门编号dept_no以及对应的bonus类型btype和received ,没有分配具体的员工不显示

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`));
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`));
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`));
CREATE TABLE `emp_bonus`(`emp_no` int not null,`recevied` datetime not null,`btype` smallint not null);

      分析:btype, received选自emp_bonus表,dept_no选自dept_emp表,二者用emp_no连接起来

                 因为dep_emp表中的emp_no $\subset$ employees表中的emp_no,所以不需要再连接筛选一遍

SELECT a.emp_no,a.dept_no, b.btype,b.recevied FROM dept_emp a
LEFT JOIN emp_bonus b
ON a.emp_no=b.emp_no

注意:牛客后台emp_bonus中是recevied,不是recevied

 

37. 按照salary的累计和running_total,其中running_total为前两个员工的salary累计和,其他以此类推。

      分析:整懵了,参考他人的题解:running_total给出的应该是前面所有员工的salary之和

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(牛客-SQL-刷题(下))