---------PS:但凡有聚合函數(where),必然后Group by,Group by后面跟having
---------面試題

SELECT name,sum(fen) as s from score GROUP BY NAME ORDER BY s;
PS:一般聚合查詢后面跟having
SELECT title, COUNT(DISTINCT emp_no) AS t FROM titles --內部再次過濾
GROUP BY title HAVING t >= 2
分頁查詢
查詢第1條到第10條的數據的sql是:select * from table limit 0,10; ->對應我們的需求就是查詢第一頁的數據:select * from table limit (1-1)*10,10;
查詢第10條到第20條的數據的sql是:select * from table limit 10,20; ->對應我們的需求就是查詢第二頁的數據:select * from table limit (2-1)*10,10;
查詢第20條到第30條的數據的sql是:select * from table limit 20,30; ->對應我們的需求就是查詢第三頁的數據:select * from table limit (3-1)*10,10;
------------------題目--------------------- --1.查找最晚入職員工的所有信息 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 * FROM employees WHERE hire_date = (SELECT MAX(hire_date) FROM employees); --排序 SELECT * FROM employees ORDER BY hire_date DESC LIMIT 0,1; --2.查找入職員工時間排名倒數第三的員工所有信息 SELECT * FROM employees ORDER BY hire_date DESC LIMIT 2,1; --3.查找各個部門當前(to_date='9999-01-01')領導當前薪水詳情以及其對應部門編號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`)); --Answer: select salaries.emp_no,salaries.salary,salaries.from_date,salaries.to_date,dept_manager.dept_no from salaries inner join dept_manager on dept_manager.emp_no = salaries.emp_no where dept_manager.to_date = '9999-01-01' --沒想起來 and salaries.to_date = '9999-01-01'; --4.查找所有已經分配部門的員工的last_name和first_name -- 內鏈接推薦 SELECT e.last_name,e.first_name,d.dept_no FROM dept_emp d INNER JOIN employees e ON d.emp_no = e.emp_no --left join(左連接):join左表中所有記錄和右表中滿足連接條件的記錄信息 --right join(右連接):join右表中所有記錄和左表中滿足連接條件的記錄信息 --5.查找所有員工的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 d.emp_no = e.emp_no; --6.查找所有員工入職時候的薪水情況,給出emp_no以及salary, 並按照emp_no進行逆序 SELECT e.emp_no,s.salary FROM employees e INNER JOIN salaries s ON s.emp_no = e.emp_no AND e.hire_date = s.from_date --少考慮這一種情況 ORDER BY e.emp_no DESC; --7.查找薪水漲幅超過15次的員工號emp_no以及其對應的漲幅次數t -- 本題主要考聚合查詢 SELECT emp_no, COUNT(emp_no) AS t FROM salaries GROUP BY emp_no HAVING t>15; --8.找出所有員工當前(to_date='9999-01-01')具體的薪水salary情況,對於相同的薪水只顯示一次,並按照逆序顯示 SELECT DISTINCT(salary) FROM salaries WHERE to_date='9999-01-01' ORDER BY salary DESC; --9.獲取所有部門當前manager的當前薪水情況,給出dept_no, emp_no以及salary,當前表示to_date='9999-01-01' -- PS: on已經是條件的判斷了,不能再用where, INNER JOIN 左右兩表交換 沒有 錯,oj有問題 SELECT d.dept_no,d.emp_no,s.salary FROM dept_manager d INNER JOIN salaries s ON s.emp_no = d.emp_no AND d.to_date = '9999-01-01' AND s.to_date = '9999-01-01' ---WHERE to_date='9999-01-01'; ---注:有人反映將連接語句改成FROM dept_manager AS d INNER JOIN salaries AS s后,結果通不過。 --INNER JOIN對於左右兩表並無順序要求,此為本題OJ系統Bug所致。 --10.獲取所有非manager的員工emp_no !!!!!! -- -PS:考察NOT IN --方法一:使用NOT IN選出在employees但不在dept_manager中的emp_no記錄 SELECT emp_no FROM employees WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager) -- 方法二:先使用LEFT JOIN連接兩張表,再從此表中選出dept_no值為NULL對應的emp_no記錄 SELECT emp_no?FROM?(SELECT * FROM employees LEFT JOIN dept_manager ON employees.emp_no = dept_manager.emp_no) WHERE dept_no IS NULL --11.獲取所有員工當前的manager,如果當前的manager是自己的話結果不顯示,當前表示to_date='9999-01-01'。 --結果第一列給出當前員工的emp_no,第二列給出其manager對應的manager_no。 SELECT de.emp_no, dm.emp_no AS manager_no? FROM dept_emp AS de INNER JOIN dept_manager AS dm ON de.dept_no = dm.dept_no? WHERE dm.to_date = '9999-01-01' AND de.emp_no <> dm.emp_no --12.獲取所有部門中當前員工薪水最高的相關信息,給出dept_no, emp_no以及其對應的salary SELECT de.dept_no,de.emp_no,MAX(sa.salary) AS salary FROM dept_emp AS de INNER JOIN salaries AS sa ON de.emp_no = sa.emp_no WHERE de.to_date = '9999-01-01' AND sa.to_date = '9999-01-01' GROUP BY de.dept_no --13.從titles表獲取按照title進行分組,每組個數大於等於2,給出title以及對應的數目t。 --PS:正確的過濾是在having以后過濾 SELECT title,COUNT(title) AS t FROM titles WHERE t>=2 --錯誤 GROUP BY title -- 正確的答案 SELECT title, COUNT(title) AS t FROM titles GROUP BY title HAVING t >= 2; --- 聚合就聚合到這里了 --14.從titles表獲取按照title進行分組,每組個數大於等於2,給出title以及對應的數目t。注意對於重復的emp_no進行忽略。 --PS:對COUNT中進行分解 SELECT title, COUNT(DISTINCT emp_no) AS t FROM titles GROUP BY title HAVING t >= 2 --15.查找employees表所有emp_no為奇數,且last_name不為Mary的員工信息,並按照hire_date逆序排列 SELECT * FROM employees WHERE emp_no%2 = 1 AND last_name!='Mary' ORDER BY hire_date DESC; --16 .統計出當前各個title類型對應的員工當前薪水對應的平均工資。結果給出title以及平均工資avg。 --PS:不知道為什么不行 --SELECT t.title AVG(s.salary); --FROM salaries s INNER JOIN titles t --ON s.emp_no = t.emp_no AND t.to_date='9999-01-01' AND s.to_date='9999-01-01' --GROUP BY title select t.title,avg(s.salary) from titles t, salaries s where s.emp_no = t.emp_no and s.to_date =?'9999-01-01' and t.to_date =?'9999-01-01' group by title --17.獲取當前(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 --18.查找當前薪水(to_date='9999-01-01')排名第二多的員工編號emp_no、薪水salary、last_name以及first_name,不准使用order by SELECT e.emp_no, MAX(s.salary) AS salary, e.last_name, e.first_name FROM employees AS e INNER JOIN salaries AS s ON e.emp_no = s.emp_no AND s.to_date = '9999-01-01' AND s.salary NOT IN ( SELECT MAX(salary) FROM salaries WHERE salaries.to_date = '9999-01-01'); --19.查找所有員工的last_name和first_name以及對應的dept_name,也包括暫時沒有分配部門的員工 --毀三觀!!!!!! --1、第一次LEFT --JOIN連接employees表與dept_emp表,得到所有員工的last_name和first_name以及對應的dept_no,也包括暫時沒有分配部門的員工 --2、第二次LEFT --JOIN連接上表與departments表,即連接dept_no與dept_name,得到所有員工的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 d.dept_no=de.dept_no; --20.查找員工編號emp_now為10001其自入職以來的薪水salary漲幅值growth SELECT (MAX(salary)-MIN(salary)) AS growth FROM salaries WHERE emp_no = '10001' --16 .統計出當前各個title類型對應的員工當前薪水對應的平均工資。結果給出title以及平均工資avg。 --PS:不知道為什么不行 --SELECT t.title AVG(s.salary); --FROM salaries s INNER JOIN titles t --ON s.emp_no = t.emp_no AND t.to_date='9999-01-01' AND s.to_date='9999-01-01' --GROUP BY title select t.title,avg(s.salary) from titles t, salaries s where s.emp_no = t.emp_no and s.to_date =?'9999-01-01' and t.to_date =?'9999-01-01' group by title --17.獲取當前(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 --18.查找當前薪水(to_date='9999-01-01')排名第二多的員工編號emp_no、薪水salary、last_name以及first_name,不准使用order by SELECT e.emp_no, MAX(s.salary) AS salary, e.last_name, e.first_name FROM employees AS e INNER JOIN salaries AS s ON e.emp_no = s.emp_no AND s.to_date = '9999-01-01' AND s.salary NOT IN ( SELECT MAX(salary) FROM salaries WHERE salaries.to_date = '9999-01-01'); --19.查找所有員工的last_name和first_name以及對應的dept_name,也包括暫時沒有分配部門的員工 --毀三觀!!!!!! --1、第一次LEFT --JOIN連接employees表與dept_emp表,得到所有員工的last_name和first_name以及對應的dept_no,也包括暫時沒有分配部門的員工 --2、第二次LEFT --JOIN連接上表與departments表,即連接dept_no與dept_name,得到所有員工的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 d.dept_no=de.dept_no; --20.查找員工編號emp_now為10001其自入職以來的薪水salary漲幅值growth SELECT (MAX(salary)-MIN(salary)) AS growth FROM salaries WHERE emp_no = '10001' --21.查找所有員工自入職以來的薪水漲幅情況,給出員工編號emp_noy以及其對應的薪水漲幅growth,並按照growth進行升序 select t1.emp_no, t1.salary - t2.salary as growth from (select e.emp_no,s.salary from salaries s,employees e where e.emp_no=s.emp_no and s.to_date='9999-01-01' )as t1, (select e.emp_no,s.salary from salaries s,employees e where e.emp_no=s.emp_no and s.from_date=e.hire_date)as t2 where t1.emp_no=t2.emp_no order by growth; --22.統計各個部門對應員工漲幅的次數總和,給出部門編碼dept_no、部門名稱dept_name以及次數sum -- 多個表查詢,可以多次鏈接 SELECT de.dept_no, dp.dept_name, COUNT(s.salary) AS sum? FROM (dept_emp AS de INNER JOIN salaries AS s ON de.emp_no = s.emp_no)? INNER JOIN departments AS dp ON de.dept_no = dp.dept_no? GROUP BY de.dept_no --23.對所有員工的當前(to_date='9999-01-01')薪水按照salary進行按照1-N的排名,相同salary並列且按照emp_no升序排列 SELECT emp_no,salary, AS rank FROM salaries WHERE to_date='9999-01-01' ORDER BY emp_no --24.對所有員工的當前(to_date='9999-01-01')薪水按照salary進行按照1-N的排名,相同salary並列且按照emp_no升序排列 select s1.emp_no , s1.salary ,count(distinct s2.salary) as rank from salaries s1, salaries s2 where s1.to_date = '9999-01-01' and s2.to_date = '9999-01-01' and s1.salary<=s2.salary --最大的數只小於等於自己,第二大的數只小於等於兩個數,以此類推。。。為他們的rank group by s1.emp_no order by rank ; --25.獲取所有非manager員工當前的薪水情況,給出dept_no、emp_no以及salary ,當前表示to_date='9999-01-01' SELECT de.dept_no, s.emp_no, s.salary? FROM (employees AS e INNER JOIN salaries AS s ON s.emp_no = e.emp_no AND s.to_date = '9999-01-01') INNER JOIN dept_emp AS de ON e.emp_no = de.emp_no WHERE de.emp_no NOT IN (SELECT emp_no FROM dept_manager)
--25.獲取員工其當前的薪水比其manager當前薪水還高的相關信息,當前表示to_date='9999-01-01',結果第一列給出員工的emp_no,第二列給出其manager的manager_no,第三列給出該員工當前的薪水emp_salary,第四列給該員工對應的manager當前的薪水manager_salary --SELECT --FROM dept_emp e INNER JOIN dept_manager m --ON e.emp_no = m.emp_no --本題主要思想是創建兩張表(一張記錄當前所有員工的工資,另一張只記錄部門經理的工資)進行比較,具體思路如下: -- 1、先用INNER JOIN連接salaries和demp_emp,建立當前所有員工的工資記錄sem -- 2、再用INNER JOIN連接salaries和demp_manager,建立當前所有員工的工資記錄sdm -- 3、最后用限制條件sem.dept_no = sdm.dept_no AND sem.salary > -- sdm.salary找出同一部門中工資比經理高的員工,並根據題意依次輸出emp_no、manager_no、emp_salary、manager_salary SELECT sem.emp_no AS emp_no, sdm.emp_no AS manager_no, sem.salary AS emp_salary, sdm.salary AS manager_salary 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 sem, (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 sdm WHERE sem.dept_no = sdm.dept_no AND sem.salary > sdm.salary --26.匯總各個部門當前員工的title類型的分配數目,結果給出部門編號dept_no、dept_name、其當前員工所有的title以及該類型title對應的數目count --PS:對一個表進行連接以后,可以再連接兩一個表 本題的關鍵在於用 GROUP BY 同時對 de.dept_no 和 t.title 進行分組,具體思路如下: 1、先用 INNER JOIN 連接 dept_emp 與 salaries,根據測試數據添加限定條件 de.to_date = '9999-01-01' AND t.to_date = '9999-01-01',即當前員工的當前頭銜 2、再用 INNER JOIN 連接departments,限定條件為 de.dept_no = dp.dept_no,即部門編號相同 3、最后用 GROUP BY 同時對 de.dept_no 和 t.title 進行分組,用 COUNT(t.title) 統計相同部門下相同頭銜的員工個數 SELECT de.dept_no, dp.dept_name, t.title, COUNT(t.title) AS count FROM titles AS t INNER JOIN dept_emp AS de ON t.emp_no = de.emp_no AND de.to_date = '9999-01-01' AND t.to_date = '9999-01-01' INNER JOIN departments AS dp ON de.dept_no = dp.dept_no GROUP BY de.dept_no, t.title --27.給出每個員工每年薪水漲幅超過5000的員工編號emp_no、薪水變更開始日期from_date以及薪水漲幅值salary_growth,並按照salary_growth逆序排列。 -- 提示:在sqlite中獲取datetime時間對應的年份函數為strftime('%Y', to_date) --SELECT emp_no,from_date, AS salary_growth --FROM salaries SELECT s2.emp_no, s2.from_date, (s2.salary - s1.salary) AS salary_growth FROM salaries AS s1, salaries AS s2 WHERE s1.emp_no = s2.emp_no AND salary_growth > 5000 AND (strftime("%Y",s2.to_date) - strftime("%Y",s1.to_date) = 1 OR strftime("%Y",s2.from_date) - strftime("%Y",s1.from_date) = 1 ) ORDER BY salary_growth DESC --28.查找描述信息中包括robot的電影對應的分類名稱以及電影數目,而且還需要該分類對應電影數量>=5部 SELECT c.name AS name, COUNT(c.name) AS amount FROM (film AS f INNER JOIN film_category AS fc ON f.film_id = fc.film_id ) INNER JOIN category AS c ON fc.category_id = c.category_id WHERE f.description LIKE '%robot%' GROUP BY c.name HAVING amount >= 2 --29.使用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 --30.使用子查詢的方式找出屬於Action分類的所有電影對應的title,description SELECT f.title, f.description FROM film f, film_category fc, category c WHERE f.film_id = fc.film_id AND fc.category_id = c.category_id AND c.name = 'Action' --32.將employees表的所有員工的last_name和first_name拼接起來作為Name,中間以一個空格區分 --不同數據庫連接字符串的方法不完全相同,MySQL、SQL --Server、Oracle等數據庫支持CONCAT方法,而本題所用的SQLite數據庫只支持用連接符號"||"來連接字符串 SELECT last_name||" "||first_name AS Name FROM employees --33.創建一個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')) ) --34.批量插入數據 INSERT INTO actor VALUES (1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'), (2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33') --35.批量插入數據 INSERT OR IGNORE INTO actor VALUES (3, 'ED', 'CHASE', '2006-02-15 12:34:33') --36.創建一個actor_name表,將actor表中的所有first_name以及last_name導入改表。 actor_name表結構如下: CREATE TABLE actor_name ( first_name varchar(45) NOT NULL, last_name varchar(45) NOT NULL ); INSERT INTO actor_name SELECT first_name, last_name FROM actor; --37.對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); --38.針對actor表創建視圖actor_name_view,只包含first_name以及last_name兩列,並對這兩列重新命名,fist_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'))) ------------------------------- --視圖是用來干什么的?視圖時虛表,僅存儲建立視圖的sql語句,查詢的時候跟普通的表一樣, CREATE VIEW actor_name_view AS SELECT first_name AS fist_name_v, last_name AS last_name_v FROM actor --39.針對salaries表emp_no字段創建索引idx_emp_no,查詢emp_no為10005, 使用強制索引。 SELECT * FROM salaries INDEXED BY idx_emp_no WHERE emp_no='10005'; --40.現在在last_update后面新增加一列名字為create_date, 類型為datetime, NOT NULL,默認值為'0000 00:00:00' --ADD COLUMN create_date ALTER TABLE actor ADD COLUMN create_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00'; --41.構造一個觸發器audit_log,在向employees表中插入一條數據的時候,觸發插入相關的數據到audit中。 CREATE TRIGGER audit_log AFTER INSERT ON employees_test BEGIN INSERT INTO audit VALUES (NEW.ID, NEW.NAME); END; --42.刪除emp_no重復的記錄,只保留最小的id對應的記錄。 DELETE FROM titles_test WHERE id NOT IN (SELECT MIN(id) FROM titles_test GROUP BY emp_no); --43.將所有to_date為9999-01-01的全部更新為NULL,且 from_date更新為2001-01-01。 UPDATE FROM titles_test SET to_date =NULL, from_date='2001-01-01' WHERE to_date='9999-01-01'; --44.將id=5以及emp_no=10001的行數據替換成id=5以及emp_no=10005,其他數據保持不變,使用replace實現。 update titles_test set emp_no=replace(emp_no,'10001','10005') where id='5' --45.將titles_test表名修改為titles_2017。 -- RENAME TABLE titles_test AS titles_2017; ALTER TABLE titles_test RENAME TO titles_2017; --46.在audit表上創建外鍵約束,其emp_no對應employees_test表的主鍵id。 --CREATE FOREIGN KEY for REFERENCES ON --47.存在如下的視圖:create view emp_v as select * from employees where emp_no >10005;如何獲取emp_v和employees有相同的數據? --PS :使用INTERSECT取交集 SELECT * FROM employees INTERSECT SELECT * FROM emp_v --48.將所有獲取獎金的員工當前的薪水增加10%。 update salaries set salary=1.1*salary where emp_no in (select emp_no from emp_bonus) --50.將employees表中的所有員工的last_name和first_name通過(')連接起來。 SELECT last_name || "'" || first_name AS name FROM employees; --51.查找字符串'10,A,B' 中逗號','出現的次數cnt SELECT (length("10,A,B")-length(replace("10,A,B",",","")))/length(",") AS cnt --52.獲取Employees中的first_name,查詢按照first_name最后兩個字母,按照升序進行排列 SELECT first_name FROM employees ORDER BY substr(first_name,-2) ; --53.按照dept_no進行匯總,屬於同一個部門的emp_no按照逗號進行連接,結果給出dept_no以及連接出的結果employees --SELECT dept_no,(SELECT ) AS employees --FROM dept_emp --本題要用到SQLite的聚合函數group_concat(X,Y),其中X是要連接的字段,Y是連接時用的符號,可省略,默認為逗號。此函數必須與 GROUP BY 配合使用。此題以 dept_no 作為分組,將每個分組中不同的emp_no用逗號連接起來(即可省略Y)。可參考: http://www.sqlite.org/lang_aggfunc.html#groupconcat http://blog.csdn.net/langzxz/article/details/16807859 1 SELECT dept_no, group_concat(emp_no) AS employees FROM dept_emp GROUP BY dept_no --54.查找排除當前最大、最小salary之后的員工的平均工資avg_salary。 --PS:不會選擇最大和最小 --SELECT AVG(salary) AS avg_salary --FROM salaries SELECT AVG(salary) AS avg_salary FROM salaries WHERE to_date = '9999-01-01' AND salary NOT IN (SELECT MAX(salary) FROM salaries WHERE to_date = '9999-01-01') AND salary NOT IN (SELECT MIN(salary) FROM salaries WHERE to_date = '9999-01-01') --55.分頁查詢employees表,每5行一頁,返回第2頁的數據 SELECT * FROM employees LIMIT 5,5 --56.獲取所有員工的emp_no、部門編號dept_no以及對應的bonus類型btype和recevied,沒有分配具體的員工不顯示 SELECT em.emp_no, de.dept_no, eb.btype, eb.recevied FROM employees AS em INNER JOIN dept_emp AS de ON em.emp_no = de.emp_no LEFT JOIN emp_bonus AS eb ON de.emp_no = eb.emp_no --57.使用含有關鍵字exists查找未分配具體部門的員工的所有信息。 SELECT * FROM employees WHERE NOT EXISTS (SELECT emp_no FROM dept_emp WHERE emp_no = employees.emp_no) SELECT * FROM employees WHERE emp_no NOT IN (SELECT emp_no FROM dept_emp) --58.獲取employees中的行數據,且這些行也存在於emp_v中。注意不能使用intersect關鍵字。 --根據題意,不能使用 INTERSECT 關鍵字,但由於視圖 emp_v 的記錄是從 employees 中導出的,因此要判斷兩者中相等的數據,只需要判斷emp_no相等即可。 -- 方法一:用 WHERE 選取二者 emp_no 相等的記錄 1 SELECT em.* FROM employees AS em, emp_v AS ev WHERE em.emp_no = ev.emp_no --59.獲取有獎金的員工相關信息. --給出emp_no、first_name、last_name、獎金類型btype、對應的當前薪水情況salary以及獎金金額bonus。 --bonus類型btype為1其獎金為薪水salary的10%,btype為2其獎金為薪水的20%,其他類型均為薪水的30%。 當前薪水表示to_date='9999-01-01' 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' --60.按照salary的累計和running_total,其中running_total為前兩個員工的salary累計和,其他以此類推。 具體結果如下Demo展示。 --SELECT emp_no,salary, ADD(salary) AS running_total --FROM salaries SELECT s1.emp_no, s1.salary, (SELECT SUM(s2.salary) FROM salaries AS s2 WHERE s2.emp_no <= s1.emp_no AND s2.to_date = '9999-01-01') AS running_total FROM salaries AS s1 WHERE s1.to_date = '9999-01-01' --61.對於employees表中,給出奇數行的first_name --SELECT first_name --FROM employees --WHERE SELECT e.first_name FROM employees AS e WHERE e.first_name IN( SELECT e1.first_name FROM employees AS e1 INNER JOIN employees AS e2 ON e1.first_name >= e2.first_name GROUP BY e1.first_name HAVING count(e2.first_name) % 2 = 1);