nowCode上sql練習

總起:常用高級sql回憶總結。(寫了一年的前端,得練練手額)
join:
在這裏插入圖片描述
MySQL 數據庫不支持 SELECT … INTO 語句,但支持 INSERT INTO … SELECT 。

1,查找最晚入職員工的所有信息,爲了減輕入門難度,目前所有的數據裏員工入職的日期都不是同一天

CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL  comment '員工編號',
`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`));

mysql:
指定按hire_date降序desc,並取第一行。 (默認升序)

select * from employees order by hire_date desc limit 0,1

考慮最晚入職可能有很多:

select * from employees where hire_date =(select max(hire_date) from employees)

2,查找入職員工時間排名倒數第三的員工所有信息,爲了減輕入門難度,目前所有的數據裏員工入職的日期都不是同一天
從第二個開始取1個:

select * from employees order by hire_date desc limit 2,1

3,查找各個部門當前(dept_manager.to_date=‘9999-01-01’)領導當前(salaries.to_date=‘9999-01-01’)薪水詳情以及其對應部門編號dept_no(請注意輸出結果,dept_no列是最後一列)

CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL comment '部門編號',
`emp_no` int(11) NOT NULL comment '員工編號',
`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 comment '員工編號',
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

條件關聯:

select s.*,d.dept_no from salaries s,dept_manager d 
where d.emp_no = s.emp_no 
and d.to_date='9999-01-01' 
and s.to_date='9999-01-01'

jion關聯:

select s.*,d.dept_no from salaries s left join dept_manager d 
where d.emp_no = s.emp_no 
and d.to_date='9999-01-01' 
and s.to_date='9999-01-01'

查找所有已經分配部門的員工的last_name和first_name以及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 `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`));

條件關聯:

select e.last_name,e.first_name,d.dept_no
from employees e,dept_emp d
where e.emp_no = d.emp_no

join關聯:(兩個要都有,不能用left right join等。)

select e.last_name,e.first_name,d.dept_no from 
employees e inner join dept_emp d on 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進行逆序(請注意,一個員工可能有多次漲薪的情況)

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`));

顯然這是一對多的情況,解決方案兩種:1,找到hire_date時給的工資;2,找到最小時間給的工資。
1,找到hire_date時給的工資:

select s.emp_no,s.salary from employees e left join salaries s
on e.emp_no = s.emp_no
where e.hire_date = s.from_date
order by s.emp_no desc

2,找到最小時間給的工資:(不需要用到employees表,典型一對多處理)
一對多的分組emp_no有多個salaries。根據emp_no分組,取最小值,再根據emp_no排序。

select emp_no,salary from salaries
group by emp_no having min(from_date)
order by emp_no desc

查找薪水變動超過15次的員工號emp_no以及其對應的變動次數t。

select distinct emp_no, count(emp_no) as t from salaries 
group by emp_no having count(emp_no) > 15

找出所有員工當前(to_date=‘9999-01-01’)具體的薪水salary情況,對於相同的薪水只顯示一次,並按照逆序顯示.

select distinct salary from salaries
where to_date='9999-01-01'
order by salary desc

獲取所有部門當前(dept_manager.to_date=‘9999-01-01’)manager的當前(salaries.to_date=‘9999-01-01’)薪水情況,給出dept_no, emp_no以及salary(請注意,同一個人可能有多條薪水情況記錄)

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`));

去重即可。

select distinct d.dept_no,s.emp_no,s.salary from dept_manager d,salaries s
where d.emp_no = s.emp_no and d.to_date='9999-01-01'
and s.to_date='9999-01-01'

獲取所有非manager的員工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 `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`));

思路還是最開始的圖。簡單來說,就是集合處理。

select e.emp_no from employees e left join dept_manager d
on d.emp_no = e.emp_no
where d.emp_no is null

獲取所有員工當前的(dept_manager.to_date=‘9999-01-01’)manager,如果員工是manager的話不顯示(也就是如果當前的manager是自己的話結果不顯示)。輸出結果第一列給出當前員工的emp_no,第二列給出其manager對應的emp_no。(難理解對應關係)

CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL comment '所有的員工編號',
`dept_no` char(4) NOT NULL comment '部門編號',
`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 comment '部門編號',
`emp_no` int(11) NOT NULL comment '經理編號',
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));

考慮了下找到不到一種join能做到。那就條件關聯吧。、

員工 <--n:1-->部門<--n:1>部門經理

條件,當前員工的經理,所以在相同部門:de.dept_no = dm.dept_no
在相同部門前提下,區分當前員工的當前經理的條件,de.emp_no <> dm.emp_no

select de.emp_no as emp_no,dm.emp_no as manager_no 
from dept_emp de,dept_manager dm
where de.dept_no = dm.dept_no
and de.emp_no <> dm.emp_no
and dm.to_date='9999-01-01'

獲取所有部門中當前(dept_emp.to_date = ‘9999-01-01’)員工薪水最高的相關信息,給出dept_no, emp_no以及其對應的salary

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 `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`));

聚合函數:

select de.dept_no,de.emp_no,sa.salary from dept_emp de left join salaries sa
on de.emp_no = sa.emp_no
where de.to_date = '9999-01-01'
group by de.dept_no
having max(sa.salary)

從titles表獲取按照title進行分組,每組個數大於等於2,給出title以及對應的數目t。

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);
select title, count(*) as t from titles
group by title having count(title) >= 2

或者

select title, count(*) as t from titles
group by title having t >= 2

從titles表獲取按照title進行分組,每組個數大於等於2,給出title以及對應的數目t。
注意對於重複的emp_no進行忽略(即emp_no重複的title不計算,title對應的數目t不增加)。

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);

COUNT(DISTINCT emp_no)可以統計同一title值且不包含重複emp_no值的記錄條數:

select title, count(distinct emp_no) as t from titles
group by title having t >= 2

查找employees表所有emp_no爲奇數,且last_name不爲Mary(注意大小寫)的員工信息,並按照hire_date逆序排列(題目不能使用mod函數)

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`));

題目不能使用mod函數:

select * from employees where last_name <> 'Mary'
and emp_no % 2 = 1 order by hire_date desc

統計出當前各個title類型對應的員工當前(to_date=‘9999-01-01’)薪水對應的平均工資。結果給出title以及平均工資avg。

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 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類型對應的員工當前薪水。這是兩個條件。

select title,avg(s.salary) as avg from salaries s,titles t
where s.emp_no = t.emp_no
and s.to_date='9999-01-01'
and t.to_date='9999-01-01'
group by t.title

獲取當前(to_date=‘9999-01-01’)薪水第二多的員工的emp_no以及其對應的薪水salary

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`));

從第一個開始取,取一個。

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完成嗎

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`));

不能用order,用not in,也可以用操作子集等方案。

select e.emp_no,max(s.salary) as salary,e.last_name,e.first_name from
employees e left join salaries s on e.emp_no = s.emp_no
where s.to_date='9999-01-01'
and s.salary not in 
(select max(salary) from salaries where to_date='9999-01-01')

查找所有員工的last_name和first_name以及對應的dept_name,也包括暫時沒有分配部門的員工

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 `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`));

三表簡單關聯:

select e.last_name,e.first_name,dt.dept_name from 
employees e left join dept_emp de on e.emp_no = de.emp_no
left join departments dt on dt.dept_no = de.dept_no

查找員工編號emp_no爲10001其自入職以來的薪水salary漲幅(總共漲了多少)growth(可能有多次漲薪,沒有降薪)
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`));

由於沒有降薪:

select (max(salary) - min(salary)) as growth from salaries
where emp_no = '10001'

如果有降薪:一個降序,一個升序即可

select ((select salary from salaries where emp_no = 10001 order by salary desc limit 0,1) - 
(select  salary from salaries where emp_no = 10001 order by salary asc limit 0,1)) as growth

查找所有員工自入職以來的薪水漲幅情況,給出員工編號emp_no以及其對應的薪水漲幅growth,並按照growth進行升序
(注:可能有employees表和salaries表裏存在記錄的員工,有對應的員工編號和漲薪記錄,但是已經離職了,離職的員工salaries表的最新的to_date!=‘9999-01-01’,這樣的數據不顯示在查找結果裏面)

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 comment '入職時間',
PRIMARY KEY (`emp_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL comment '一條薪水記錄開始時間',
`to_date` date NOT NULL comment '一條薪水記錄結束時間',
PRIMARY KEY (`emp_no`,`from_date`));

漲幅等=當前工資 - 初始工資。

select scur.emp_no,(scur.salary - sinit.salary) as growth from
/* 當前工資 */
(select s.emp_no,s.salary from salaries s left join employees e on s.emp_no = e.emp_no
where s.to_date ='9999-01-01') as scur
inner join
/* 初始工資 */
(select s.emp_no,s.salary from salaries s left join employees e on s.emp_no = e.emp_no
where s.from_date = e.hire_date) as sinit 
on scur.emp_no = sinit.emp_no
order by growth

統計各個部門的工資記錄數,給出部門編碼dept_no、部門名稱dept_name以及次數sum

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 `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`));

題目條件給的不算完整:

select dt.dept_no,dt.dept_name,count(sa.salary) as sum 
from departments dt,dept_emp de,salaries sa
where dt.dept_no = de.dept_no
and de.emp_no = sa.emp_no
group by dt.dept_no

對所有員工的當前(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`));

這個提用存儲過程最簡單。這裏不能用。就只能採用複用表。一張表去排序,一張表取統計rank

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

獲取所有非manager員工當前的薪水情況,給出dept_no、emp_no以及salary ,當前表示to_date=‘9999-01-01’

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`));

not in 過濾掉非manager:

SELECT de.dept_no, e.emp_no, s.salary
FROM employees AS e INNER JOIN dept_emp AS de ON e.emp_no = de.emp_no
INNER JOIN salaries AS s ON e.emp_no = s.emp_no
WHERE s.to_date='9999-01-01'
AND e.emp_no NOT IN(
    SELECT emp_no FROM dept_manager WHERE to_date='9999-01-01'
);

獲取員工其當前的薪水比其manager當前薪水還高的相關信息,當前表示to_date=‘9999-01-01’,
結果第一列給出員工的emp_no,
第二列給出其manager的manager_no,
第三列給出該員工當前的薪水emp_salary,
第四列給該員工對應的manager當前的薪水manager_salary

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 `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`));

複雜問題簡單分解再根據條件組合

/*複雜場景採用分合思想*/
SELECT e.emp_no AS emp_no, m.emp_no AS manager_no,
 e.salary AS emp_salary, m.salary AS manager_salary
/*1、當前員工的工號、部門號、工資*/
FROM (SELECT s.salary, s.emp_no, de.dept_no FROM salaries s INNER JOIN dept_emp de
ON s.emp_no = de.emp_no AND s.to_date = '9999-01-01' ) AS e,
/*2、當前manager的工號、部門號、工資*/ 
(SELECT s.salary, s.emp_no, dm.dept_no FROM salaries s INNER JOIN dept_manager dm
ON s.emp_no = dm.emp_no AND s.to_date = '9999-01-01' ) AS m
/*3、部門匹配、條件匹配*/
WHERE e.dept_no = m.dept_no AND e.salary > m.salary

給出每個員工每年薪水漲幅超過5000的員工編號emp_no、薪水變更開始日期from_date以及薪水漲幅值salary_growth,並按照salary_growth逆序排列。
提示:在sqlite中獲取datetime時間對應的年份函數爲strftime(’%Y’, to_date)

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`));

條件複用處理。

/*重點:複用和時間條件匹配*/
select s1.emp_no,s1.from_date,(s1.salary - s2.salary) as salary_growth from
salaries s1,salaries s2
where s1.emp_no = s2.emp_no
and s1.salary - s2.salary > 5000
and strftime('%Y', s1.to_date) - strftime('%Y', s2.to_date) = 1
order by salary_growth desc

獲取select * from employees對應的執行計劃

/*mysql*/
explain select * from employees
/*oracle*/
explain plan select * from employees

針對如下表actor結構創建索引:
(注:在 SQLite 中,除了重命名錶和在已有的表中添加列,ALTER TABLE 命令不支持其他操作)

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')))

對first_name創建唯一索引uniq_idx_firstname,對last_name創建普通索引idx_lastname

create unique index uniq_idx_firstname on actor(first_name);
create index idx_lastname on actor(last_name);

針對actor表創建視圖actor_name_view,只包含first_name以及last_name兩列,並對這兩列重新命名,first_name爲first_name_v,last_name修改爲last_name_v:

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')))
create view actor_name_view (first_name_v,last_name_v) as
select first_name,last_name from actor

針對salaries表emp_no字段創建索引idx_emp_no,查詢emp_no爲10005, 使用強制索引。

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 index idx_emp_no on salaries(emp_no);
/*mysql
SELECT * FROM salaries FORCE INDEX idx_emp_no WHERE emp_no = 10005;
*/
/*sqllitte*/
SELECT * FROM salaries INDEXED BY idx_emp_no WHERE emp_no = 10005;

存在actor表,包含如下列信息:

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')));

現在在last_update後面新增加一列名字爲create_date, 類型爲datetime, NOT NULL,默認值爲’0000-00-00 00:00:00’

alter table actor add 'create_date' datetime not null default '0000-00-00 00:00:00'

構造一個觸發器audit_log,在向employees_test表中插入一條數據的時候,觸發插入相關的數據到audit中。

CREATE TABLE employees_test(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
CREATE TABLE audit(
EMP_no INT NOT NULL,
NAME TEXT NOT NULL
);
/*after/before爲觸發器觸發條件*/
create trigger audit_log after insert on employees_test
begin
     insert into audit values(new.id,new.name);
end;

刪除emp_no重複的記錄,只保留最小的id對應的記錄。

CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);
/*思路選出最小,將不是最小全部刪除*/
delete from titles_test where id  not in
(select min(id) from titles_test group by emp_no)

將titles_test表名修改爲titles_2017。

alter table titles_test rename to titles_2017
/*
mysql:rename sqllite rename to
alter table titles_test rename titles_2017
*/

將所有獲取獎金的員工當前的薪水增加10%。

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

利用in:

update salaries set salary = salary*1.1
where emp_no in (select emp_no from emp_bonus) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章