MySQL基礎學習2

2.1 MySQL 基礎 (二)- 表操作

  1. MySQL表數據類型
    https://www.runoob.com/mysql/mysql-data-types.html
    MySQL支持多種類型,大致可以分爲三類:數值、日期/時間和字符串(字符)類型。
    (1)數值
    (2)日期/時間
    (3)字符串(字符)類型

  2. 用SQL語句創建表
    MySQL數據表包括:表名、表字段、名定義每個表字段。

通用語句:
CREATE TABLE table_name (column_name column_type);

語句解釋
設定列類型 、大小、約束
設定主鍵

  1. 用SQL語句向表中添加數據
    在MySQL 表中,使用 INSERT INTO SQL語句來插入數據。
INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );
                       
如果數據是字符型,必須使用單引號或者雙引號,如:"value"。

語句解釋
多種添加方式(指定列名;不指定列名)

  1. 用SQL語句刪除表
刪除語句的代碼:
DROP TABLE table_name ;

語句解釋
DELETE
DROP
TRUNCATE
不同方式的區別

  1. 用SQL語句修改表
    https://blog.csdn.net/xilihong816/article/details/52763249
以下是 UPDATE 命令修改 MySQL 數據表數據的通用 SQL 語法:

UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]

修改列名
修改表中數據
刪除行
刪除列
新建列
新建行

作業

項目三:編寫一個 SQL 查詢,列出所有超過或等於5名學生的課

創建如下所示的courses 表 ,有: student (學生) 和 class (課程)。 例如,表: ±--------±-----------+ | student | class | ±--------±-----------+ | A | Math | | B | English | | C | Math | | D | Biology | | E | Math | | F | Computer | | G | Math | | H | Math | | I | Math | | A | Math | ±--------±-----------+
編寫一個 SQL 查詢,列出所有超過或等於5名學生的課。 應該輸出: ±--------+ | class | ±--------+ | Math | ±--------+ Note: 學生在每個課中不應被重複計算。

創建表:
CREATE TABLE courses(
student VARCHAR(50),
class VARCHAR(50)
);

插入數據:
INSERT INTO courses VALUES('A','Math');
INSERT INTO courses VALUES('B','English');
INSERT INTO courses VALUES('C','Math');
INSERT INTO courses VALUES('D','Biology');
INSERT INTO courses VALUES('E','Math');
INSERT INTO courses VALUES('F','Computer');
INSERT INTO courses VALUES('G','Math');
INSERT INTO courses VALUES('H','Math');
INSERT INTO courses VALUES('I','Math');
INSERT INTO courses VALUES('A','Math');

選取:
SELECT class from courses
GROUP BY class
HAVING COUNT(DISTINCT student)>=5;

結果如下:
在這裏插入圖片描述

項目四:交換工資

創建一個 salary表,如下所示,有m=男性 和 f=女性的值 。 例如: | id | name | sex | salary | |----|------|-----|--------| | 1 | A | m | 2500 | | 2 | B | f | 1500 | | 3 | C | m | 5500 | | 4 | D | f | 500 |
交換所有的 f 和 m 值(例如,將所有 f 值更改爲 m,反之亦然)。要求使用一個更新查詢,並且沒有中間臨時表。 運行你所編寫的查詢語句之後,將會得到以下表: | id | name | sex | salary | |----|------|-----|--------| | 1 | A | f | 2500 | | 2 | B | m | 1500 | | 3 | C | f | 5500 | | 4 | D | m | 500 |

創建表:
CREATE TABLE Salary(
id INT PRIMARY KEY,
name VARCHAR(50),
sex VARCHAR(50),
salary INT
);

插入數據:
INSERT INTO Salary VALUES(1, 'A', 'm', 2500);
INSERT INTO Salary VALUES(2, 'B', 'f', 2500);
INSERT INTO Salary VALUES(3, 'C', 'm', 2500);
INSERT INTO Salary VALUES(4, 'D', 'f', 2500);

UPDATE Salary
SET sex = 
CASE when sex = 'f'
THEN 'm'
ELSE  'f'
END;

SELECT * FROM Salary

結果如下:
在這裏插入圖片描述

項目五:有趣的電影

某城市開了一家新的電影院,吸引了很多人過來看電影。該電影院特別注意用戶體驗,專門有個 LED顯示板做電影推薦,上面公佈着影評和相關電影描述。
作爲該電影院的信息部主管,您需要編寫一個 SQL查詢,找出所有影片描述爲非 boring (不無聊) 的並且 id 爲奇數 的影片,結果請按等級 rating 排列。
例如,下表 cinema:
±--------±----------±-------------±----------+ | id | movie | description | rating | ±--------±----------±-------------±----------+ | 1 | War | great 3D | 8.9 | | 2 | Science | fiction | 8.5 | | 3 | irish | boring | 6.2 | | 4 | Ice song | Fantacy | 8.6 | | 5 | House card| Interesting| 9.1 | ±--------±----------±-------------±----------+ 對於上面的例子,則正確的輸出是爲:
±--------±----------±-------------±----------+ | id | movie | description | rating | ±--------±----------±-------------±----------+ | 5 | House card| Interesting| 9.1 | | 1 | War | great 3D | 8.9 | ±--------±----------±-------------±----------+

創建表:
DROP TABLE IF EXISTS cinema;

CREATE TABLE cinema (
id INT(11) NOT NULL,
movie VARCHAR(255) DEFAULT NULL,
description VARCHAR(255) DEFAULT NULL,
rating FLOAT(2,1) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

插入數據:
INSERT INTO cinema VALUES ('1', 'War', 'great3D', '8.9');
INSERT INTO cinema VALUES ('2', 'Science','fiction', '8.5');
INSERT INTO cinema VALUES ('3', 'irish','boring', '6.2');
INSERT INTO cinema VALUES ('4', 'Ice song','Fantacy', '8.6');
INSERT INTO cinema VALUES ('5', 'House card','Interesting', '9.1');

選取數據:
select * from cinema where description<> 'boring' and  MOD(id, 2) = 1 order by rating desc;

知識點:
奇數:mod(id,2)=1
偶數:mod(id,2)=0

結果如下:
在這裏插入圖片描述

2.2 MySQL 基礎 (三)- 表聯結

  • MySQL別名
  • INNER JOIN
  • LEFT JOIN
  • CROSS JOIN
  • 自連接
  • UNION
  • 以上幾種方式的區別和聯繫

1、JOIN 按照功能大致分爲如下三類:
INNER JOIN(內連接,或等值連接):獲取兩個表中字段匹配關係的記錄。
LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。
2、UNION 操作符用於連接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重複的數據。

項目六:組合兩張表 (難度:簡單)

在數據庫中創建表1和表2,並各插入三行數據(自己造)
表1:
Person ±------------±--------+ | 列名 | 類型 | ±------------±--------+ | PersonId | int | | FirstName | varchar | | LastName | varchar | ±------------±--------+ PersonId 是上表主鍵
表2:
Address ±------------±--------+ | 列名 | 類型 | ±------------±--------+ | AddressId | int | | PersonId | int | | City | varchar | | State | varchar | ±------------±--------+ AddressId 是上表主鍵
編寫一個 SQL 查詢,滿足條件:無論 person 是否有地址信息,都需要基於上述兩表提供 person 的以下信息:FirstName, LastName, City, State

使用連接查詢,分爲內連接和外連接
    內連接(inner join)會捨棄兩表中不相同的部分
    外連接(left join和right join)除了顯示符合條件的記錄外,還顯示錶中的記錄

創建表Person:
CREATE TABLE Person(
PersonId INT,
FirstName VARCHAR(10),
LastName VARCHAR(10)
);

創建表Address:
CREATE TABLE Address(
AddressId INT,
PersionId INT,
City VARCHAR(255),
State VARCHAR(255)
);
插入數據Person和Address:
INSERT INTO Person VALUES (1,'Jobs','Steven');
INSERT INTO Person VALUES(2,'Jack','Ma');
INSERT INTO Person VALUES(3,'Jack','Chen');

INSERT INTO Address VALUES(001,1,'Silicon Valley','California');
INSERT INTO Address VALUES(002,2,'Hangzhou','Zhejiang');
INSERT INTO Address VALUES(003,2,'HongKong','China');

組合選取數據:
SELECT FirstName, LastName, City, State FROM 
        Person LEFT JOIN Address ON Person.PersonId=Address.PersionId; 

結果如下:
在這裏插入圖片描述

項目七:刪除重複的郵箱(難度:簡單)

編寫一個 SQL 查詢,來刪除 email 表中所有重複的電子郵箱,重複的郵箱裏只保留 **Id ***最小 *的那個。 ±—±--------+ | Id | Email | ±—±--------+ | 1 | [email protected] | | 2 | [email protected] | | 3 | [email protected] | ±—±--------+ Id 是這個表的主鍵。 例如,在運行你的查詢語句之後,上面的 Person表應返回以下幾行: ±—±-----------------+ | Id | Email | ±—±-----------------+ | 1 | [email protected] | | 2 | [email protected] | ±—±-----------------+

DROP TABLE IF EXISTS email;

創建表:
CREATE TABLE email ( 
Id INT PRIMARY KEY, 
Email VARCHAR ( 255 ) 
);

插入數據:
INSERT INTO email VALUES( 1, '[email protected]' );
INSERT INTO email VALUES( 2, '[email protected]' );
INSERT INTO email VALUES( 3, '[email protected]' );

刪除重複數據並按要求輸出:
DELETE FROM email 
WHERE Id NOT IN 
( SELECT a.min_id FROM ( SELECT MIN( Id ) AS min_id FROM email GROUP BY Email ) a );

結果如下:
在這裏插入圖片描述

項目八:從不訂購的客戶 (難度:簡單)

某網站包含兩個表,Customers 表和 Orders 表。編寫一個 SQL 查詢,找出所有從不訂購任何東西的客戶。
Customers 表:
±—±------+ | Id | Name | ±—±------+ | 1 | Joe | | 2 | Henry | | 3 | Sam | | 4 | Max | ±—±------+ Orders 表:
±—±-----------+ | Id | CustomerId | ±—±-----------+ | 1 | 3 | | 2 | 1 | ±—±-----------+ 例如給定上述表格,你的查詢應返回:
±----------+ | Customers | ±----------+ | Henry | | Max | ±----------+

DROP TABLE IF EXISTS Customers;
創建Customers表:
Create table If Not Exists Customer (Id int, Name varchar(255));

DROP TABLE IF EXISTS Orders;
創建Orders 表:
Create table If Not Exists Order1(Id int,CustomerId int);


插入數據:
INSERT INTO Customer VALUES( 1, 'Joe' );
INSERT INTO Customer VALUES( 2, 'Henry' );
INSERT INTO Customer VALUES( 3, 'Sam' );
INSERT INTO Customer VALUES( 4, 'Max' );

INSERT INTO Order1 VALUES( 1, 3);
INSERT INTO Order1 VALUES( 2,1);

查找從未購物的客戶:

(1)使用not exists

select c.Name as Customer from Customer c 

where not exists 

(select distinct o.CustomerId Id from Order1 o where c.Id = o.CustomerId);

(2)使用 not in
select c.Name as Customer from Customer c 

where c.Id not in 

(select distinct o.CustomerId Id from Order1 o);

出現問題:faied to add the foreign key constraint
在這裏插入圖片描述
解決辦法:
https://blog.csdn.net/xldmx/article/details/85090724
https://blog.csdn.net/xldmx/article/details/85090724

結果如下:
在這裏插入圖片描述

項目九:超過經理收入的員工(難度:簡單)

Employee 表包含所有員工,他們的經理也屬於員工。每個員工都有一個 Id,此外還有一列對應員工的經理的 Id。
±—±------±-------±----------+ | Id | Name | Salary | ManagerId | ±—±------±-------±----------+ | 1 | Joe | 70000 | 3 | | 2 | Henry | 80000 | 4 | | 3 | Sam | 60000 | NULL | | 4 | Max | 90000 | NULL | ±—±------±-------±----------+ 給定 Employee 表,編寫一個 SQL 查詢,該查詢可以獲取收入超過他們經理的員工的姓名。在上面的表格中,Joe 是唯一一個收入超過他的經理的員工。
±---------+ | Employee | ±---------+ | Joe | ±---------+

創建表:
CREATE TABLE Employee (
Id int,
Name varchar(255), 
Salary int, 
ManagerId int
);

插入數據:
INSERT INTO Employee VALUES ('1', 'Joe', '70000', '3');
INSERT INTO Employee VALUES('2', 'Henry', '80000', '4');
INSERT INTO Employee VALUES('3', 'Sam', '60000', Null);
INSERT INTO Employee VALUES('4', 'Max', '90000', Null);

查詢:
Select e1.Name as Employee from Employee e1 join Employee e2  on e1.ManagerId = e2.Id and e1.Salary > e2.Salary;

或者:Select e1.Name as Employee from Employee e1 , Employee e2  where e1.ManagerId = e2.Id and e1.Salary > e2.Salary;

結果如下:
在這裏插入圖片描述

參考學習:

https://blog.csdn.net/albert184/article/details/90555099

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