SQL 题目整理

1.题目描述

对所有员工的当前(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,比他们多的数量也相同。然后排序先后两次就可以。

 

2.题目描述

汇总各个部门当前员工的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

 

3.题目描述

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

 

4.题目描述

对于表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_idfirst_namelast_namelast_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去掉

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值