【sql】牛客網練習題 (共 61 題)


【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`));
題解:
1 select * from employees order by hire_date desc limit 1;
 
 【2】查找入職員工時間排名倒數第三的員工所有信息 (表同問題1)題解:limit m, n 表示從第 m 條數據(0-based)開始取 n 條數據。(或者也可以理解成 limit m, n  表示從第 m + 1 條數據開始, 取 n 條數據)
1 select * from employees order by hire_date desc limit 2, 1;
 
 【3】查找當前薪水詳情以及部門編號dept_no查找各個部門當前(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`));
題解:兩張表 join 一下,然后選擇 salaries 表作為主表join dept表。 (注意寫法)。
select s.* , d.dept_no from salaries as s join dept_manager as d on s.emp_no=d.emp_no where s.to_date = '9999-01-01' and d.to_date = '9999-01-01'
 
【4】查找所有已經分配部門的員工的last_name和first_name
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 emp.last_name, emp.first_name, dept.dept_no from employees as emp join dept_emp as dept on emp.emp_no = dept.emp_no;
 
 
 【5】查找所有員工的last_name和first_name以及對應部門編號dept_no查找所有員工的last_name和first_name以及對應部門編號dept_no,也包括展示沒有分配具體部門的員工。創建表語句同第4題。題解:因為沒有分配具體部門的員工也需要展示,所以,需要 left join。INNER JOIN 兩邊表同時有對應的數據,即任何一邊缺失數據就不顯示。LEFT JOIN 會讀取左邊數據表的全部數據,即便右邊表無對應數據。RIGHT JOIN 會讀取右邊數據表的全部數據,即便左邊表無對應數據。 注意on與where有什么區別,兩個表連接時用on,在使用left  jion時,on和where條件的區別如下:1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。 2、where條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經沒有left  join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
 
select emp.last_name, emp.first_name, dept.dept_no from employees as emp left join dept_emp as dept on emp.emp_no = dept.emp_no;
 

【6】查找所有員工入職時候的薪水情況

【7】查找薪水漲幅超過15次的員工號emp_no以及其對應的漲幅次數t

【8】找出所有員工當前具體的薪水salary情況

【9】獲取所有部門當前manager的當前薪水情況

【10】獲取所有非manager的員工emp_no

【11】獲取所有員工當前的manager

【12】獲取所有部門中當前員工薪水最高的相關信息

【13】從titles表獲取按照title進行分組

【14】從titles表獲取按照title進行分組,注意對於重復的emp_no進行忽略。

【15】查找employees表所有emp_no為奇數

【16】統計出當前各個title類型對應的員工當前薪水對應的平均工資

【17】獲取當前薪水第二多的員工的emp_no以及其對應的薪水salary

【18】查找當前薪水排名第二多的員工編號emp_no

【19】查找所有員工的last_name和first_name以及對應的dept_name

20】查找員工編號emp_now為10001其自入職以來的薪水salary漲幅值growth

【21】查找所有員工自入職以來的薪水漲幅情況

【22】統計各個部門對應員工漲幅的次數總和

【23】對所有員工的當前薪水按照salary進行按照1-N的排名

【24】獲取所有非manager員工當前的薪水情況

【25】獲取員工其當前的薪水比其manager當前薪水還高的相關信息

【26】匯總各個部門當前員工的title類型的分配數目

【27】給出每個員工每年薪水漲幅超過5000的員工編號emp_no

【28】查找描述信息中包括robot的電影對應的分類名稱以及電影數目

【29】使用join查詢方式找出沒有分類的電影id以及名稱

【30】使用子查詢的方式找出屬於Action分類的所有電影對應的title,description

【31】獲取select

【32】將employees表的所有員工的last_name和first_name拼接起來作為Name,中間以一個空格區分

【33】創建一個actor表,包含如下列信息

【34】批量插入數據

【35】批量插入數據,如果數據已經存在,請忽略,不使用replace操作

【36】創建一個actor_name表,將actor表中的所有first_name以及last_name導入改表

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

【38】針對actor表創建視圖actor_name_view

【39】針對上面的salaries表emp_no字段創建索引idx_emp_no,查詢emp_no為10005,

【40】在last_update后面新增加一列名字為create_date

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

【42】刪除emp_no重復的記錄,只保留最小的id對應的記錄。

【43】將所有to_date為9999-01-01的全部更新為NULL,且

【44】將id=5以及emp_no=10001的行數據替換成id=5以及emp_no=10005,其他數據保持不變,使用replace實現。

【45】將titles_test表名修改為titles_2017

【46】在audit表上創建外鍵約束,其emp_no對應employees_test表的主鍵id

【47】如何獲取emp_v和employees有相同的數據no

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

【49】針對庫中的所有表生成select

【50】將employees表中的所有員工的last_name和first_name通過(')連接起來。

【51】查找字符串'10,A,B'

【52】獲取Employees中的first_name,查詢按照first_name最后兩個字母,按照升序進行排列

【53】按照dept_no進行匯總,屬於同一個部門的emp_no按照逗號進行連接,結果給出dept_no以及連接出的結果employees

【54】查找排除當前最大、最小salary之后的員工的平均工資avg_salary

【55】分頁查詢employees表,每5行一頁,返回第2頁的數據

【56】獲取所有員工的emp_no

【57】使用含有關鍵字exists查找未分配具體部門的員工的所有信息。

【58】獲取employees中的行數據,且這些行也存在於emp_v中

【59】獲取有獎金的員工相關信息。

【60】統計salary的累計和running_total

【61】對於employees表中,給出奇數行的first_name   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM