对所有员工的当前(to_date='9999-01-01')薪水按照salary进行按照1-N的排名,相同salary并列且按照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`));
排名第几也就是说比他高的有几个人,所以一开始比较salary,统计有哪些人的salary比这个人高
select s1.emp_no,s1.salary,count(distinct s2.salary) as rank
from salaries as s1,salaries as s2
where s1.to_date='9999-01-01' and s2.to_date='9999-01-01' and s1.salary<=s2.salary
group by s1.emp_no
order by s1.salary desc,s1.emp_no asc
采用了复用表的方式,s1.salary<=s2.salary 就可以统计出比当前这个s1.salary高的有多少个,因为两个一样多的人排名相同,所以要用distinct去重一下,这样两个相同的salary,比他们多的数量也相同。然后排序先后两次就可以。
汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_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 IF NOT EXISTS `titles` (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);
分别需要对title和dept_no进行分组
select part.dept_no,part.dept_name,tm.title,count(tm.title) as count
from(select dep.dept_no,dep.emp_no,t.title from dept_emp dep inner join titles t
on dep.emp_no=t.emp_no
where t.to_date='9999-01-01' and dep.to_date='9999-01-01') as tm inner join departments part
on tm.dept_no=part.dept_no
group by part.dept_no,tm.title
film表
字段 | 说明 |
film_id | 电影id |
title | 电影名称 |
description | 电影描述信息 |
CREATE TABLE IF NOT EXISTS film (
film_id smallint(5) NOT NULL DEFAULT '0',
title varchar(255) NOT NULL,
description text,
PRIMARY KEY (film_id));
category表
字段 | 说明 |
category_id | 电影分类id |
name | 电影分类名称 |
last_update | 电影分类最后更新时间 |
CREATE TABLE category (
category_id tinyint(3) NOT NULL ,
name varchar(25) NOT NULL, `last_update` timestamp,
PRIMARY KEY ( category_id ));
film_category表
字段 | 说明 |
film_id | 电影id |
category_id | 电影分类id |
last_update | 电影id和分类id对应关系的最后更新时间 |
CREATE TABLE film_category (
film_id smallint(5) NOT NULL,
category_id tinyint(3) NOT NULL, `last_update` timestamp);
查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部
我们先找出所有类别中电影数量大于5的,建立一个新表,然后和其他表联合查询
select c.name,count(fc.film_id)
from (select category_id,count(film_id) as categry_num from film_category
group by category_id having count(film_id)>=5) as fm,film as f,category as c,film_category as fc
where f.description like '%robot%' and
f.film_id=fc.film_id and
fm.category_id=c.category_id and
c.category_id=fc.category_id
对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作
CREATE TABLE IF NOT EXISTS 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 | first_name | last_name | last_update |
---|---|---|---|
'3' | 'ED' | 'CHASE' | '2006-02-15 12:34:33' |
这里用到了一个ignore关键字,功能就是如果不存在该记录就插入,如果存在就忽略
insert IGNORE into actor
values(3,'ED','CHASE','2006-02-15 12:34:33');
如果是sqlite需要将or去掉