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;

在这里插入图片描述

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