SQL基本操作语句

  • 员工表
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 `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 `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 `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`));
  • title表
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);
  • 部门表
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`));

相关操作

  • 查找最晚入职员工的所有信息
SELECT * FROM employees ORDER BY hire_date desc limit 0,1;/*limit m, n 表示从m+1开始去n条数据*/
  • 查找入职员工时间排名倒数第三的员工所有信息
select * from employees order by hire_date desc limit 2,1;
  • 查找各个部门当前(to_date=’9999-01-01’)领导当前薪水详情以及其对应部门编号dept_no
select s.*, d.dept_no from salaries s,dept_manager d 
where s.to_date = '9999-01-01' and d.to_date = '9999-01-01'and s.emp_no = d.emp_no;
  • 查找所有已经分配部门的员工的last_name和first_name
select e.last_name,e.first_name,d.dept_no from employees e,dept_emp d where e.emp_no = d.emp_no;
  • 查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
select e.last_name,e.first_name,d.dept_no from employees e left join dept_emp d on e.emp_no = d.emp_no;
  • 查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序
select e.emp_no,s.salary from employees as e , salaries as s  
where s.emp_no=e.emp_no and s.from_date=e.hire_date 
order by s.emp_no desc;

-查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t。

select emp_no,count(*) t from salaries group by emp_no having t > 15;
  • 找出所有员工当前(to_date=’9999-01-01’)具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示
select salary from salaries where to_date = '9999-01-01'
group by salary order by salary desc;
  • 获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date=’9999-01-01’
select d.dept_no,d.emp_no,s.salary from  salaries as s, dept_manager as d
where d.emp_no = s.emp_no and d.to_date = '9999-01-01' and s.to_date = '9999-01-01';
  • 获取所有非manager的员工emp_no
select emp_no from employees where emp_no not in (select emp_no from dept_manager);
  • 获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date=’9999-01-01’。结果第一列给出当前员工的emp_no,第二列给出其manager对应的manager_no。
select de.emp_no,dm.emp_no from dept_emp de, dept_manager dm
where de.dept_no = dm.dept_no
and de.emp_no not in (select emp_no from dept_manager)
and de.to_date = '9999-01-01'
and dm.to_date = '9999-01-01';
  • 获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary
SELECT d.dept_no, d.emp_no, MAX(s.salary) AS salary FROM salaries AS s, dept_emp AS d
WHERE s.emp_no = d.emp_no AND d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'
GROUP BY d.dept_no
  • 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
select title,count(*) t from titles group by title having t >= 2;
  • 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。注意对于重复的emp_no进行忽略。
select title, count(distinct emp_no) t from titles 
group by title having t >= 2;
  • 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
select * from employees where last_name != 'Mary' and round(emp_no / 2.0) != emp_no / 2.0
order by hire_date desc;
  • 统计出当前各个title类型对应的员工当前薪水对应的平均工资。结果给出title以及平均工资avg。
select t.title, avg(s.salary) from salaries s, titles t
where t.to_date = '9999-01-01' and s.to_date = '9999-01-01' and t.emp_no = s.emp_no
group by t.title;
  • 获取当前(to_date=’9999-01-01’)薪水第二多的员工的emp_no以及其对应的薪水salary
select emp_no, salary from salaries where to_date = '9999-01-01' order by salary desc limit 1,1;
  • 查找当前薪水(to_date=’9999-01-01’)排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by
select e.emp_no, MAX(s.salary), e.last_name, e.first_name from employees e, salaries s
where s.salary < (select MAX(salary) from salaries) and e.emp_no = s.emp_no;
  • 查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
select e.last_name, e.first_name,d.dept_name 
from employees e left join dept_emp de on e.emp_no = de.emp_no 
left join departments d on de.dept_no = d.dept_no;
  • 查找员工编号emp_now为10001其自入职以来的薪水salary涨幅值growth
select (MAX(salary) - MIN(salary))growth from salaries where emp_no = 10001;
  • 查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_noy以及其对应的薪水涨幅growth,并按照growth进行升序
select t1.emp_no,t1.salary-t2.salary as growth
from (select s.emp_no,salary from salaries as s,employees as e where s.emp_no=e.emp_no and s.to_date='9999-01-01')as t1,
      (select s.emp_no,salary from salaries s,employees as e where s.emp_no=e.emp_no and s.from_date=e.hire_date)as t2
where t1.emp_no=t2.emp_no order by growth;
  • 统计各个部门对应员工涨幅的次数总和,给出部门编码dept_no、部门名称dept_name以及次数sum
select d.dept_no,d.dept_name, sum 
from departments as d, (select dept_no,sum(t)as sum from dept_emp as de,
    (select emp_no,count(*) as t from salaries group by emp_no)as e where e.emp_no = de.emp_no group by dept_no) as t1
where d.dept_no = t1.dept_no;
  • 对所有员工的当前(to_date=’9999-01-01’)薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列
select s1.emp_no,s1.salary,count(distinct s2.salary) rank
from salaries s1, salaries s2 
where s1.salary <= s2.salary and s1.to_date = '9999-01-01' and s2.to_date = '9999-01-01'
group by s1.emp_no order by rank;
  • 获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date=’9999-01-01’
select d.dept_no, e.emp_no, s.salary
from employees e, dept_emp d, salaries s
where e.emp_no not in (select emp_no from dept_manager where to_date = '9999-01-01')
and s.emp_no = e.emp_no
and e.emp_no = d.emp_no
and d.to_date = '9999-01-01'
and s.to_date = '9999-01-01';
  • 获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date=’9999-01-01’,
    结果第一列给出员工的emp_no,第二列给出其manager的manager_no,第三列给出该员工当前的薪水emp_salary,第四列给该员工对应的manager当前的薪水manager_salary
select t1.emp_no, t2.emp_no,t1.salary as s1,t2.salary as s2
from
(
    select salary,s.emp_no,dept_no
    from salaries as s join dept_emp de on s.emp_no=de.emp_no
    where s.to_date='9999-01-01' and de.to_date='9999-01-01' and
    s.emp_no not in (select emp_no from dept_manager dm)
) as t1,
(
    select salary,s.emp_no,dept_no
    from salaries as s join dept_manager dm on s.emp_no=dm.emp_no
    where s.to_date='9999-01-01'
    and dm.to_date='9999-01-01'
) as t2
where s1>s2
and t1.dept_no = t2.dept_no
  • 汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count
select d.dept_no, d.dept_name, t.title, count(t.title) as count
from departments d, dept_emp de, titles t
where d.dept_np = de.dept_no and de.emp_no = t.emp_no and de.to_date = '9999-01-01' 
and t.to_date = '9999-01-01'
group by d.dept_no, t.title;
  • 给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。
    提示:在sqlite中获取datetime时间对应的年份函数为strftime(‘%Y’, to_date)
SELECT s.emp_no, s.from_date, s.salary-s1.salary AS salary_growth
FROM salaries AS s, salaries AS s1
WHERE (strftime('%Y', s.to_date) - strftime('%Y', s1.to_date)) = 1
AND s.emp_no = s1.emp_no
AND salary_growth > 5000
ORDER BY salary_growth DESC
  • film表
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表
CREATE TABLE category  (
category_id  tinyint(3)  NOT NULL ,
name  varchar(25) NOT NULL, `last_update` timestamp,
PRIMARY KEY ( category_id ));
  • film_category表
CREATE TABLE film_category  (
film_id  smallint(5)  NOT NULL,
category_id  tinyint(3)  NOT NULL, `last_update` timestamp);

相关操作

  • 查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部
SELECT c.name, COUNT(*)
FROM category AS c, film_category AS f1, film AS f2
WHERE f1.film_id = f2.film_id
AND c.category_id = f1.category_id
AND f2.description LIKE '%robot%'
GROUP BY f1.category_id
HAVING COUNT(*) > 1
  • 使用join查询方式找出没有分类的电影id以及名称
select f.film_id,f.title
from film f left join film_category fc on f.film_id = fc.film_id where fc.category_id is null;
  • 使用子查询的方式找出属于Action分类的所有电影对应的title,description
SELECT title, description
FROM film
WHERE film_id in(
    SELECT film_id
    FROM film_category
    WHERE category_id in(
        SELECT category_id
        FROM category
        WHERE name='Action'
    )
)
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值