資料庫操作練習13
阿新 • • 發佈:2019-02-12
1. 使用join查詢方式找出沒有分類的電影id以及名稱
題目描述
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);
SQL LEFT JOIN 關鍵字
LEFT JOIN 關鍵字會從左表 (table_name1) 那裡返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。
LEFT JOIN 關鍵字語法
SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
註釋:在某些資料庫中, LEFT JOIN 稱為 LEFT OUTER JOIN。
由此sql1:
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
sql2:inner join
先用film_id相等條件連線兩個表,然後再在film表中找出film_id不在連線的表中的部分
SELECT f.film_id,f.title from film f where f.film_id not in(select f.film_id from film f inner join film_category
fc where f.film_id=fc.film_id)
sql3:
select f.film_id,f.title
from film as f left join film_category as fm
on f.film_id = fm.film_id
where f.film_id not in (select film_id from film_category);
sql4:
select bb.film_id,bb.title
from (film left join film_category on film.film_id = film_category.film_id) as bb
where bb.category_id is null
2. 統計salary的累計和running_total
題目描述
按照salary的累計和running_total,其中running_total為前兩個員工的salary累計和,其他以此類推。 具體結果如下Demo展示。。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`));
輸出格式:
emp_no | salary | running_total |
---|---|---|
10001 | 88958 | 88958 |
10002 | 72527 | 161485 |
10003 | 43311 | 204796 |
10004 | 74057 | 278853 |
10005 | 94692 | 373545 |
10006 | 43311 | 416856 |
10007 | 88070 | 504926 |
10009 | 95409 | 600335 |
10010 | 94409 | 694744 |
10011 | 25828 | 720572 |
1、輸出的第三個欄位,是由一個 SELECT 子查詢構成。將子查詢內複用的 salaries 表記為 s2,主查詢的 salaries 表記為 s1,當主查詢的 s1.emp_no 確定時,對子查詢中不大於 s1.emp_no 的 s2.emp_no 所對應的薪水求和
2、注意是對員工當前的薪水求和,所以在主查詢和子查詢內都要加限定條件 to_date = '9999-01-01'
select s1.emp_no,s1.salary,
(
SELECT SUM(s2.salary) from salaries as s2 where s1.emp_no>=s2.emp_no and s2.to_date='9999-01-01'
)as running_total
from salaries as s1 where s1.to_date='9999-01-01'
3.獲取有獎金的員工相關資訊。
題目描述
獲取有獎金的員工相關資訊。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_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 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`));
給出emp_no、first_name、last_name、獎金型別btype、對應的當前薪水情況salary以及獎金金額bonus。 bonus型別btype為1其獎金為薪水salary的10%,btype為2其獎金為薪水的20%,其他型別均為薪水的30%。 當前薪水錶示to_date='9999-01-01'
輸出格式:
emp_no | first_name | last_name | btype | salary | bonus |
---|---|---|---|---|---|
10001 | Georgi | Facello | 1 | 88958 | 8895.8 |
10002 | Bezalel | Simmel | 2 | 72527 | 14505.4 |
10003 | Parto | Bamford | 3 | 43311 | 12993.3 |
10004 | Chirstian | Koblick | 1 | 74057 | 7405.7 |
條件表示式:
該表示式的語法規則如下:
1). CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END
2). CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END
select eb.emp_no, first_name, last_name, btype, salary,
(case eb.btype
when 1 then salary*0.1
when 2 then salary*0.2
else salary*0.3
end) as bonus
from emp_bonus eb,employees e ,salaries s where
eb.emp_no = e.emp_no and e.emp_no=s.emp_no and s.to_date='9999-01-01' ;
sql2:
SELECT e.emp_no, e.first_name, e.last_name, b.btype, s.salary,
(CASE b.btype
WHEN 1 THEN s.salary * 0.1
WHEN 2 THEN s.salary * 0.2
ELSE s.salary * 0.3 END) AS bonus
FROM employees AS e INNER JOIN emp_bonus AS b ON e.emp_no = b.emp_no
INNER JOIN salaries AS s ON e.emp_no = s.emp_no AND s.to_date = '9999-01-01'
sql3:
其實觀察測試資料會發現 btype 只有1,2,3三種情況,即使不會 CASE 表示式,也能運用四則運算解出:(注意要除以10.0間接轉換為double型別,如果除以10的話,得到的是int型別。結果的小數位會被捨去)
SELECT e.emp_no, e.first_name, e.last_name, b.btype, s.salary,
(s.salary * b.btype / 10.0) AS bonus
FROM employees AS e INNER JOIN emp_bonus AS b ON e.emp_no = b.emp_no
INNER JOIN salaries AS s ON e.emp_no = s.emp_no AND s.to_date = '9999-01-01'