1. 程式人生 > >MYSQL學習04--數據導入導出及實戰練習

MYSQL學習04--數據導入導出及實戰練習

dep png 導入導出 mys ins avi name key 兩個

1、數據導入導出

  • MySQL表導出,且是CSV格式
    我使用navicat導入導出,導出過程為:
    右鍵表名->導出向導->選擇csv文件->下一步選擇源表名->下一步選擇導出字段->勾選包含列標題等配置->
    開始->導出成功
    技術分享圖片

  • 再將CSV表導入數據庫
    右鍵表名->導入向導->選擇csv文件->下一步選擇導入文件->下一步設置分隔符->下一步設置字段名稱,導入起始結束行 ->下一步設置源表目標表->設置字段 ->下一步選擇導入模式->點擊開始導入->導入成功
    技術分享圖片

2、作業

  • 項目七: 各部門工資最高的員工(難度:中等)
    編寫一個 SQL 查詢,找出每個部門工資最高的員工。例如,根據上述給定的表格,Max 在 IT 部門有最高工資,Henry 在 Sales 部門有最高工資。
------------------------------------------------------------
-----**************項目七******************************-----
------------------------------------------------------------
CREATE TABLE employee (
id INT UNSIGNED AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
salary INT(10) NOT NULL,
departmentId INT UNSIGNED NOT NULL,
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO employee(name,salary,departmentId) VALUES("Joe",70000,1);
INSERT INTO employee(name,salary,departmentId) VALUES("Henry",80000,2);
INSERT INTO employee(name,salary,departmentId) VALUES("Sam",60000,2);
INSERT INTO employee(name,salary,departmentId) VALUES("Max",90000,1);

CREATE TABLE department(
departmentId INT UNSIGNED AUTO_INCREMENT,
d_name VARCHAR(20) NOT NULL,
PRIMARY KEY(departmentId)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO department(d_name) VALUES('IT');
INSERT INTO department(d_name) VALUES('Sales');

--GROUP BY 和MAX()函數不能直接一起用,GROUP BY返回的是小組第一行的值,MAX()返回的是最大的,2組值組合在一起,會有錯誤

SELECT d.d_name,e.name,e.salary FROM employee e LEFT JOIN department d on e.departmentId=d.departmentId 
where e.salary IN
    (SELECT MAX(salary)
        FROM employee
        GROUP BY departmentId);
  • 項目八: 換座位(難度:中等)
    小美是一所中學的信息科技老師,她有一張 seat 座位表,平時用來儲存學生名字和與他們相對應的座位 id。
    其中縱列的 id 是連續遞增的
    小美想改變相鄰倆學生的座位。
    你能不能幫她寫一個 SQL query 來輸出小美想要的結果呢?
------------------------------------------------------------
-----**************項目八、換座位************************---
------------------------------------------------------------
CREATE TABLE seats(
    id INT UNSIGNED AUTO_INCREMENT,
    sname VARCHAR(40) NOT NULL,
    PRIMARY KEY(id)
)ENGINE= INNODB DEFAULT CHARSET=utf8;

INSERT INTO seats(sname) VALUES("Abbot");
INSERT INTO seats(sname) VALUES("Doris");
INSERT INTO seats(sname) VALUES("Emerson");
INSERT INTO seats(sname) VALUES("Green");
INSERT INTO seats(sname) VALUES("Jeames"); 

SELECT (
        CASE WHEN id%2=1 and id = (SELECT COUNT(*) FROM seats) THEN id
        WHEN id%2 =1 THEN id+1
        ELSE id-1
        END
        ) AS id,sname
FROM seats
ORDER BY id; 
  • 項目九: 分數排名(難度:中等)
    編寫一個 SQL 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名(Rank)相同。請註意,平分後的下一個名次應該是下一個連續的整數值。換句話說,名次之間不應該有“間隔”。
------------------------------------------------------------
-----**************項目九、分數排名************************--
------------------------------------------------------------
CREATE TABLE score (
    sco_id INT UNSIGNED AUTO_INCREMENT,
    score FLOAT NOT NULL,
    PRIMARY KEY(sco_id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO score(score) VALUES(3.50);
INSERT INTO score(score) VALUES(3.65);
INSERT INTO score(score) VALUES(4.00);
INSERT INTO score(score) VALUES(3.50);
INSERT INTO score(score) VALUES(3.85);
INSERT INTO score(score) VALUES(4.00);
INSERT INTO score(score) VALUES(3.65);

SELECT score,(
    SELECT COUNT(DISTINCT(score))+1
    FROM score
    WHERE Score>s1.Score
) AS RANK
FROM score AS s1
ORDER BY Score DESC,sco_id ASC;

3、MySQL 實戰 - 復雜項目

  • 項目十:行程和用戶(難度:困難)
------------------------------------------------------------
-----*******項目十、行程和用戶****************************--
------------------------------------------------------------
CREATE TABLE trips(
id INT UNSIGNED AUTO_INCREMENT,
client_id INT NOT NULL,
driver_id INT NOT NULL,
city_id INT NOT NULL,
status enum('completed','cancelled_by_driver','cancelled_by_client'),
request_at DATE NOT NULL,
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO trips(client_id,driver_id,city_id,status,request_at) VALUES(1,10,1,'completed','2013-10-01');
INSERT INTO trips(client_id,driver_id,city_id,status,request_at) VALUES(2,11,1,'cancelled_by_driver','2013-10-01');
INSERT INTO trips(client_id,driver_id,city_id,status,request_at) VALUES(3,12,6,'completed','2013-10-01');
INSERT INTO trips(client_id,driver_id,city_id,status,request_at) VALUES(4,13,6,'cancelled_by_client','2013-10-01');
INSERT INTO trips(client_id,driver_id,city_id,status,request_at) VALUES(1,10,1,'completed','2013-10-02');
INSERT INTO trips(client_id,driver_id,city_id,status,request_at) VALUES(2,11,6,'completed','2013-10-02');
INSERT INTO trips(client_id,driver_id,city_id,status,request_at) VALUES(3,12,6,'completed','2013-10-02');
INSERT INTO trips(client_id,driver_id,city_id,status,request_at) VALUES(2,12,12,'completed','2013-10-03');
INSERT INTO trips(client_id,driver_id,city_id,status,request_at) VALUES(3,10,12,'completed','2013-10-03');
INSERT INTO trips(client_id,driver_id,city_id,status,request_at) VALUES(4,13,12,'cancelled_by_client','2013-10-03');

CREATE table users (
userId INT UNSIGNED AUTO_INCREMENT,
banned VARCHAR(4) NOT NULL,
role enum('client','driver','partner'),
PRIMARY KEY(userId)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO users(banned,role) VALUES( "No",'client');
INSERT INTO users(banned,role) VALUES( "Yes",'client');
INSERT INTO users(banned,role) VALUES( "No",'client');
INSERT INTO users(banned,role) VALUES( "No",'client');
INSERT INTO users(banned,role) VALUES( "No",'driver');
INSERT INTO users(banned,role) VALUES( "No",'driver');
INSERT INTO users(banned,role) VALUES( "No",'driver');
INSERT INTO users(banned,role) VALUES( "No",'driver');



SELECT t.request_at AS 'Day',
ROUND((SUM(CASE WHEN t.Status LIKE 'cancelled%' THEN 1 ELSE 0 END))/COUNT(*),2) AS 'Cancellation Rate' 
FROM trips AS t INNER JOIN users AS u 
ON u.userId = t.client_id AND u.banned = 'No' 
GROUP BY t.request_at;
  • 項目十一:各部門前3高工資的員工(難度:中等)
    將項目7中的employee表清空,重新插入以下數據(其實是多插入5,6兩行),編寫一個 SQL 查詢,找出每個部門工資前三高的員工。例如,根據上述給定的表格,查詢結果應返回,此外,請考慮實現各部門前N高工資的員工功能。
CREATE TABLE employee (
id INT UNSIGNED AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
salary INT(10) NOT NULL,
departmentId INT UNSIGNED NOT NULL,
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO employee(name,salary,departmentId) VALUES("Joe",70000,1);
INSERT INTO employee(name,salary,departmentId) VALUES("Henry",80000,2);
INSERT INTO employee(name,salary,departmentId) VALUES("Sam",60000,2);
INSERT INTO employee(name,salary,departmentId) VALUES("Max",90000,1);
INSERT INTO employee(name,salary,departmentId) VALUES("Janet",69000,1);
INSERT INTO employee(name,salary,departmentId) VALUES("Randy",85000,1);
  • 項目十二 分數排名 - (難度:中等)
    依然是昨天的分數表,實現排名功能,但是排名是非連續的,如下:
    +-------+------+
    | Score | Rank |
    +-------+------+
    | 4.00 | 1 |
    | 4.00 | 1 |
    | 3.85 | 3 |
    | 3.65 | 4 |
    | 3.65 | 4 |
    | 3.50 | 6 |
    +-------+------
CREATE TABLE score (
    sco_id INT UNSIGNED AUTO_INCREMENT,
    score FLOAT NOT NULL,
    PRIMARY KEY(sco_id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO score(score) VALUES(3.50);
INSERT INTO score(score) VALUES(3.65);
INSERT INTO score(score) VALUES(4.00);
INSERT INTO score(score) VALUES(3.50);
INSERT INTO score(score) VALUES(3.85);
INSERT INTO score(score) VALUES(4.00);
INSERT INTO score(score) VALUES(3.65);

MYSQL學習04--數據導入導出及實戰練習