DW集訓營數據庫Mysql梳理[五]

1 任務

任務五

學習內容
數據導入導出 (見附件)
   將Excel文件導入MySQL表
   MySQL導出表到Excel文件
作業
項目七: 各部門工資最高的員工(難度:中等)
創建Employee 表,包含所有員工信息,每個員工有其對應的 Id, salary 和 department Id。
+----+-------+--------+--------------+
| Id | Name  | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 70000  | 1            |
| 2  | Henry | 80000  | 2            |
| 3  | Sam   | 60000  | 2            |
| 4  | Max   | 90000  | 1            |
+----+-------+--------+--------------+
創建Department 表,包含公司所有部門的信息。
+----+----------+
| Id | Name     |
+----+----------+
| 1  | IT       |
| 2  | Sales    |
+----+----------+
編寫一個 SQL 查詢,找出每個部門工資最高的員工。例如,根據上述給定的表格,Max 在 IT 部門有最高工資,Henry 在 Sales 部門有最高工資。
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Max      | 90000  |
| Sales      | Henry    | 80000  |
+------------+----------+--------+

項目八: 換座位(難度:中等)
小美是一所中學的信息科技老師,她有一張 seat 座位表,平時用來儲存學生名字和與他們相對應的座位 id。
其中縱列的 id 是連續遞增的
小美想改變相鄰倆學生的座位。
你能不能幫她寫一個 SQL query 來輸出小美想要的結果呢?
 請創建如下所示seat表:
示例:
+---------+---------+
|    id   | student |
+---------+---------+
|    1    | Abbot   |
|    2    | Doris   |
|    3    | Emerson |
|    4    | Green   |
|    5    | Jeames  |
+---------+---------+
假如數據輸入的是上表,則輸出結果如下:
+---------+---------+
|    id   | student |
+---------+---------+
|    1    | Doris   |
|    2    | Abbot   |
|    3    | Green   |
|    4    | Emerson |
|    5    | Jeames  |
+---------+---------+
注意:
如果學生人數是奇數,則不需要改變最後一個同學的座位。

項目九:  分數排名(難度:中等)
編寫一個 SQL 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名(Rank)相同。請注意,平分後的下一個名次應該是下一個連續的整數值。換句話說,名次之間不應該有“間隔”。
創建以下score表:
+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
例如,根據上述給定的 Scores 表,你的查詢應該返回(按分數從高到低排列):
+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

2 數據導入導出

附件excel文件已存百度網盤:附件excel

2.1將Excel文件導入MySQL表

將Excel文件導入到Navicat for MySQL數據庫

  1. 根據excel的文件類型,在數據庫的表頁面運行’導入嚮導’,選擇導入數據的類型:
    在這裏插入圖片描述
  2. 選擇Excel文件的位置,選擇文件數據源,並導入數據源中的表,這裏我導入xlsx失敗,於是將xlsx文件保存爲xls進行導入:
    在這裏插入圖片描述
  3. 選擇目標表,也可以新建一個表將數據插入:
    在這裏插入圖片描述
  4. 設定主鍵
    在這裏插入圖片描述
  5. 選擇導入模式,如果是新建表,則選擇第一項–添加記錄到目標表:
    在這裏插入圖片描述
  6. 導入成功
    在這裏插入圖片描述
  7. 對錶進行操作
    通過上述步驟將excel文件導入到Navicat數據庫中,在數據表窗口中,通過’+‘和’-'可以實現插入和刪除一條記錄,當要遍歷每一列添加內容時,使用’Tab’鍵即可依次往下添加數據。

2.2 MySQL表導出表到Excel文件

  1. 根據表的右鍵選擇導出嚮導;
  2. 選擇要導出的數據表格式,這裏我們選擇的是xls表格格式;
    在這裏插入圖片描述
  3. 接下來選擇需要導出的表,並設置導出文件的位置,然後點擊下一步:
    在這裏插入圖片描述
  4. 導出成功
    在這裏插入圖片描述
  5. 在保存的位置,可以看到導出的數據表成功
    在這裏插入圖片描述

3 作業

3.1 各部門工資最高的員工

先建立表並插入數據:

CREATE TABLE IF NOT EXISTS Employee(
	Id SMALLINT PRIMARY KEY AUTO_INCREMENT,
	Name VARCHAR(20) NOT NULL,
	Salary INT NOT NULL,
	DepartmentId TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS Department(
	Id SMALLINT PRIMARY KEY AUTO_INCREMENT,
	Name VARCHAR(20) NOT NULL
);

INSERT Employee(Name,Salary,DepartmentId)
Values('Joe',70000,1),
			('Henry',80000,2),
			('Sam',60000,2),
			('Max',90000,1);

INSERT Department(Name)
Values('IT'),
			('Sales');

在處理這個問題的思路上,我首先先將表連接,再對連接好的表來設置條件,設置的條件爲:對應的id相同,並且使用子查詢的方式篩選出了最大值,這裏要注意的是,因爲題目有最終數據表的格式,所以再select中的命名需要起別名:

SELECT d.Name as Department,e.Name as Employee,e.Salary
FROM Employee e,Department d
WHERE e.DepartmentId = d.Id 
and e.Salary = (SELECT MAX(Employee.Salary)
									FROM Employee
									WHERE Employee.DepartmentId = d.Id);	

3.2 換座位

同樣,我們先創建表結構並且插入數據:

CREATE TABLE IF NOT EXISTS seat(
	id TINYINT PRIMARY KEY AUTO_INCREMENT,
	student VARCHAR(20) NOT NULL
);
INSERT seat(student) 
VALUES('Abbot'),('Doris'),('Emerson'),('Green'),('Jeames');

接下來考慮交換相鄰的座位,如果是奇數的話,則最後一個座位不用變,這裏考慮的是使用case when的條件語句:

SELECT (CASE
WHEN id=counts THEN id
WHEN MOD(id,2)=0 THEN id-1
ELSE id+1 END) AS id,student
FROM seat
,(SELECT COUNT(id) AS counts FROM seat) 
ORDER BY id;

3.3 分數排名

編寫一個 SQL 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名(Rank)相同。
首先創建表以及插入語句:

-----創建表
CREATE TABLE IF NOT EXISTS score(
	Id TINYINT PRIMARY KEY AUTO_INCREMENT,
	Score FLOAT(5,2) NOT NULL
);
-----插入表
INSERT score(Score) 
VALUES('3.50'),
			('3.65'),
			('4.00'),
			('3.85'),
			('4.00'),
			('3.65');

現在的問題是,如何select出score,並且還select出score的排名?現在有一個思路是:所謂的現在的排名,實質上表示的意思是當前大於或等於其對應分數的數字,比如4,還有相同的分數4,那麼其對應的排名應該是1。於是我們需要在score表中找出大於或者等於該分數的不重複的分數,然後降序排列:

SELECT Score,
			(SELECT COUNT(DISTINCT Score)
				FROM score AS s2 
				WHERE s2.Score>=s1.Score
			) 
FROM score AS s1
ORDER BY Score DESC; 

參考

MySQL實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章