MySQL實戰(六個小練習)

練習一

  • 創建Employee表並插入數據
CREATE TABLE Employee(
	id INT NOT NULL PRIMARY KEY,
	name CHAR(10),
	salary INT,
	department_id INT);

INSERT INTO Employee
VALUES
	(1, 'Joe', 70000, 1),
	(2, 'Henry', 80000, 2),
	(3, 'Sam', 60000, 2),
	(4, 'Max', 90000, 1);
  • 創建Department表並創建數據
CREATE TABLE Department(
	id INT NOT NULL PRIMARY KEY,
	name CHAR(10)
	);

INSERT INTO Department
VALUES
	(1, 'IT'),
	(2, 'Sales');
  • 查詢出每個部門工資最高的員工
SELECT D.name AS department,E.name,E.salary
FROM Employee AS E 
	JOIN Department AS D
	ON E.department_id = D.id
WHERE salary IN(
	SELECT MAX(salary)
	FROM Employee
	GROUP BY department_id);

在這裏插入圖片描述

練習二

  • 創建seat表並插入數據
CREATE TABLE seat(
	id INT NOT NULL PRIMARY KEY,
	student CHAR(10)
	);

INSERT INTO seat
VALUES
	(1, 'Abbot'),
	(2, 'Doris'),
	(3, 'Emerson'),
	(4, 'Green'),
	(5, 'Jeams');
  • 改變相鄰兩學生的座位
    id列表示學生座位,如果學生人數是奇數,則不需要改變最後一個同學的座位
SELECT
	(CASE
		WHEN id%2=1 AND id!=(SELECT MAX(id) FROM seat) THEN id+1
		WHEN id%2=0 THEN id-1
		ELSE id
	END)id,student
FROM seat
ORDER BY id;

在這裏插入圖片描述

練習三

  • 創建Scores表格並插入數據
CREATE TABLE Scores(
	id INT NOT NULL PRIMARY KEY,
	score FLOAT);

INSERT INTO Scores
VALUES 
	(1, 3.50),
	(2, 3.65),
	(3, 4.00),
	(4, 3.85),
	(5, 4.00),
	(6, 3.65);
  • 按分數大小進行排名
    如果兩個分數相同,則兩個分數排名(Rank)相同。請注意,平分後的下一個名次應該是下一個連續的整數值。換句話說,名次之間不應該有“間隔”。
SELECT s.score, 
	(SELECT count(DISTINCT score) 
	FROM Scores 
	WHERE score>=s.score) AS `Rank` 
FROM Scores AS s 
ORDER BY score DESC;

如果遇到“ERROR 1064 (42000): You have an error in your SQL syntax; ”,可查看錯誤原因及解決辦法
在這裏插入圖片描述

練習四

  • 創建Trips表與Users表並插入數據
CREATE TABLE Trips(
    Id INT NOT NULL PRIMARY KEY,
    Client_Id INT,
    Driver_Id INT,
    City_Id INT,
    Status ENUM('completed', 'cancelled_by_driver', 'cancelled_by_client'),
    Request_at DATE);

CREATE TABLE Users(
    Users_Id INT NOT NULL PRIMARY KEY,
    Banned VARCHAR(10),
    Role ENUM('client', 'driver', 'partnet'));

INSERT INTO Trips
VALUES (1,1,10,1,'completed','2013-10-01'),
       (2,2,11,1, 'cancelled_by_driver','2013-10-01'),
       (3,3,12,6,'completed','2013-10-01'),
       (4,4,13,6,'cancelled_by_client','2013-10-01'),
       (5,1,10,1,'completed','2013-10-02'),
       (6,2,11,6,'completed','2013-10-02'),
       (7,3,12,6,'completed','2013-10-02'),
       (8,2,12,12,'completed','2013-10-03'),
       (9,3,10,12,'completed','2013-10-03'),
       (10,4,13,12, 'cancelled_by_driver','2013-10-03');

INSERT INTO Users
VALUES (1, 'No', 'client'),
       (2, 'Yes', 'client'),
       (3, 'No', 'client'),
       (4, 'No', 'client'),
       (10, 'No', 'driver'),
       (11, 'No', 'driver'),
       (12, 'No', 'driver'),
       (13, 'No', 'driver');
  • 查詢 2013年10月1日 至 2013年10月3日 期間非禁止用戶的取消率。
暫未做

練習五

  • 在練習一的Employee插入新數據(使用IGNORE在練習一中的Employee表中多插入兩行)
INSERT IGNORE INTO Employee
VALUES (1, 'Joe', 70000, 1),
       (2, 'Henry', 80000, 2),
       (3, 'Sam', 60000, 2),
       (4, 'Max', 90000, 1),
       (5, 'Janet', 69000, 1),
       (6, 'Randy', 85000, 1);

在這裏插入圖片描述

  • 查詢每個部門工資前三高的員工
SELECT d.Name Department, e1.Name Employee, e1.Salary Salary
FROM Employee AS e1
JOIN Department AS d
ON e1.department_id = d.Id
WHERE 3 > (
           SELECT COUNT(DISTINCT e2.Salary) 
           FROM Employee e2
           WHERE e2.Salary > e1.Salary AND e1.department_id = e2.department_id
          )
ORDER BY d.Name, e1.Salary DESC;

在這裏插入圖片描述

練習六

  • 對練習三的Scores表操作,實現排名功能,但是排名是非連續的。
Score Rank
4.00 1
4.00 1
3.85 3
3.65 4
3.65 4
3.50 6
SELECT s1.Score,
	(SELECT COUNT(s2.Score)+1 
	FROM Scores AS s2 
	WHERE s2.Score > s1.Score) AS `Rank`
FROM Scores AS s1
ORDER BY s1.Score DESC;

在這裏插入圖片描述

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