1. 程式人生 > >資料庫操作練習13

資料庫操作練習13

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);
使用join查詢方式找出沒有分類的電影id以及名稱

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
本題的思路為複用 salaries表進行子查詢,最後輸出求和結果。
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
本題主要考查 SQLite 中 CASE 表示式的用法。即當 btype = 1 時,得到 salary * 0.1;當 btype = 2 時,得到 salary * 0.2;其他情況得到 salary * 0.3。
條件表示式:
該表示式的語法規則如下:
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'