上是一些基本操作回顾
按照牛客上的通过率,下应该难一点
31. 使用join查询方式找出没有分类的电影id以及名称
字段 | 说明 |
film_id | 电影id |
title | 电影名称 |
description | 电影描述信息 |
category表
字段 | 说明 |
category_id | 电影分类id |
name | 电影分类名称 |
last_update | 电影分类最后更新时间 |
film_category表
字段 | 说明 |
film_id | 电影id |
category_id | 电影分类id |
last_update | 电影id和分类id对应关系的最后更新时间 |
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之和