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數據庫
- 根據excel的文件類型,在數據庫的表頁面運行’導入嚮導’,選擇導入數據的類型:
- 選擇Excel文件的位置,選擇文件數據源,並導入數據源中的表,這裏我導入xlsx失敗,於是將xlsx文件保存爲xls進行導入:
- 選擇目標表,也可以新建一個表將數據插入:
- 設定主鍵
- 選擇導入模式,如果是新建表,則選擇第一項–添加記錄到目標表:
- 導入成功
- 對錶進行操作
通過上述步驟將excel文件導入到Navicat數據庫中,在數據表窗口中,通過’+‘和’-'可以實現插入和刪除一條記錄,當要遍歷每一列添加內容時,使用’Tab’鍵即可依次往下添加數據。
2.2 MySQL表導出表到Excel文件
- 根據表的右鍵選擇導出嚮導;
- 選擇要導出的數據表格式,這裏我們選擇的是xls表格格式;
- 接下來選擇需要導出的表,並設置導出文件的位置,然後點擊下一步:
- 導出成功
- 在保存的位置,可以看到導出的數據表成功
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;