MySQL數據庫基礎總結


來源: 實驗樓

鏈接: https://www.shiyanlou.com/courses/9

一、開發准備

# 打開 MySQL 服務
sudo service mysql start        

#使用 root 用戶登錄,密碼為空
mysql -u root    

二、查看數據庫

SHOW DATABASES

三、新建數據庫

首先,我們創建一個數據庫,給它一個名字,比如 mysql_shiyan,以后的幾次實驗也是對 mysql_shiyan 這個數據庫進行操作。 語句格式為 CREATE DATABASE <數據庫名字>;,(注意不要漏掉分號 ;),前面的 CREATE DATABASE 也可以使用小寫,具體命令為:

CREATE DATABASE mysql_shiyan;

四、連接數據庫

接下來的操作,就在剛才創建的 mysql_shiyan 中進行,首先要連接數據庫,使用語句 use <數據庫名字>:

use mysql_shiyan;

輸入命令 show tables; 可以查看當前數據庫里有幾張表

五、新建數據表

在數據庫中新建一張表的語句格式為:

CREATE TABLE 表的名字
(
列名a 數據類型(數據長度),
列名b 數據類型(數據長度),
列名c 數據類型(數據長度)
);

我們嘗試在 mysql_shiyan 中新建一張表 employee,包含姓名,ID 和電話信息,所以語句為:

CREATE TABLE employee (id int(10),name char(20),phone int(12));

六、數據類型

在剛才新建表的過程中,我們提到了數據類型,MySQL 的數據類型和其他編程語言大同小異,下表是一些 MySQL 常用數據類型:


整數除了 INT 外,還有 TINYINT、SMALLINT、MEDIUMINT、BIGINT。

CHAR 和 VARCHAR 的區別: CHAR 的長度是固定的,而 VARCHAR 的長度是可以變化的,比如,存儲字符串 “abc",對於 CHAR(10),表示存儲的字符將占 10 個字節(包括 7 個空字符),而同樣的 VARCHAR(12) 則只占用4個字節的長度,增加一個額外字節來存儲字符串本身的長度,12 只是最大值,當你存儲的字符小於 12 時,按實際長度存儲。ENUM和SET的區別: ENUM 類型的數據的值,必須是定義時枚舉的值的其中之一,即單選,而 SET 類型的值則可以多選。

七、插入數據

我們通過 INSERT 語句向表中插入數據,語句格式為:

INSERT INTO 表的名字(列名a,列名b,列名c) VALUES(值1,值2,值3);

我們嘗試向 employee 中加入 Tom、Jack 和 Rose:

INSERT INTO employee(id,name,phone) VALUES(01,'Tom',110110110);

INSERT INTO employee VALUES(02,'Jack',119119119);

INSERT INTO employee(id,name) VALUES(03,'Rose');

你已經注意到了,有的數據需要用單引號括起來,比如 Tom、Jack、Rose 的名字,這是由於它們的數據類型是 CHAR 型。此外 VARCHAR,TEXT,DATE,TIME,ENUM 等類型的數據也需要單引號修飾,而 INT,FLOAT,DOUBLE 等則不需要。

第一條語句比第二條語句多了一部分:(id,name,phone) 這個括號里列出的,是將要添加的數據 (01,'Tom',110110110) 其中每個值在表中對應的列。而第三條語句只添加了 (id,name) 兩列的數據,所以在表中Rose的phone為NULL。

 八、MySQL約束

約束是一種限制,它通過對表的行或列的數據做出限制,來確保表的數據的完整性、唯一性。

1.約束分類

在MySQL中,通常有這幾種約束:

2.主鍵

主鍵 (PRIMARY KEY)是用於約束表中的一行,作為這一行的唯一標識符,在一張表中通過主鍵就能准確定位到一行,因此主鍵十分重要。主鍵不能有重復且不能為空。

在 MySQL-03-01.sql 中,這里有主鍵:

 

也可以這樣定義主鍵:

 

還有一種特殊的主鍵——復合主鍵。主鍵不僅可以是表中的一列,也可以由表中的兩列或多列來共同標識,比如:

 

3.默認值

默認值約束 (DEFAULT) 規定,當有 DEFAULT 約束的列,插入數據為空時,將使用默認值。

在 MySQL-03-01.sql 中,這段代碼包含了 DEFAULT 約束:

 

DEFAULT 約束只會在使用 INSERT 語句(上一實驗介紹過)時體現出來,INSERT語句中,如果被 DEFAULT 約束的位置沒有值,那么這個位置將會被 DEFAULT 的值填充,如語句:

# 正常插入數據
INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11);

#插入新的數據,people_num 為空,使用默認值
INSERT INTO department(dpt_name) VALUES('dpt2'); 

4.唯一約束

唯一約束 (UNIQUE) 比較簡單,它規定一張表中指定的一列的值必須不能有重復值,即這一列每個值都是唯一的。

在 MySQL-03-01.sql 中,也有 UNIQUE 約束:

當 INSERT 語句新插入的數據和已有數據重復的時候,如果有 UNIQUE約束,則 INSERT 失敗,比如:

INSERT INTO employee VALUES(01,'Tom',25,3000,110110,'dpt1');
INSERT INTO employee VALUES(02,'Jack',30,3500,110110,'dpt2'); 

結果如圖:

5.外鍵約束

外鍵 (FOREIGN KEY) 既能確保數據完整性,也能表現表之間的關系。

一個表可以有多個外鍵,每個外鍵必須 REFERENCES (參考) 另一個表的主鍵,被外鍵約束的列,取值必須在它參考的列中有對應值。

在 INSERT 時,如果被外鍵約束的值沒有在參考列中有對應,比如以下命令,參考列 (department 表的 dpt_name) 中沒有dpt3,則INSERT 失敗:

INSERT INTO employee VALUES(02,'Jack',30,3500,114114,'dpt3');

可見之后將 dpt3 改為 dpt2(department 表中有 dpt2),則插入成功:

6.非空約束

非空約束 (NOT NULL),聽名字就能理解,被非空約束的列,在插入值時必須非空。

在MySQL中違反非空約束,會報錯,比如以下語句:

#INSERT 成功 age 為空,因為沒有非空約束,表中顯示 NULL
INSERT INTO employee(id,name,salary,phone,in_dpt) VALUES(03,'Jim',3400,119119,'dpt2'); 

#報錯 salary 被非空約束,插入數據失敗
INSERT INTO employee(id,name,age,phone,in_dpt) VALUES(04,'Bob',23,123456,'dpt1'); 

結果如圖,插入數據失敗,實驗樓的 MySQL 環境是 5.7.22,禁止插入不符合非空約束的數據:

此時 employee 表的內容為:

 九、select語句

1.基本的SELECT語句

SELECT 語句的基本格式為:

SELECT 要查詢的列名 FROM 表名字 WHERE 限制條件;

如果要查詢表的所有內容,則把要查詢的列名 用一個星號 * 號表示,代表要查詢表中所有的列。 而大多數情況,我們只需要查看某個表的指定的列,比如要查看employee 表的 name 和 age:

SELECT name,age FROM employee;

2.數學符號條件

SELECT 語句常常會有 WHERE 限制條件,用於達到更加精確的查詢。WHERE限制條件可以有數學符號 (=,<,>,>=,<=) ,剛才我們查詢了 name 和 age,現在稍作修改:

SELECT name,age FROM employee WHERE age>25;

或者查找一個名字為 Mary 的員工的 name,age 和 phone:

SELECT name,age,phone FROM employee WHERE name='Mary';

3.AND”與“OR”

從這兩個單詞就能夠理解它們的作用。WHERE 后面可以有不止一條限制,而根據條件之間的邏輯關系,可以用 OR(或) 和 AND(且) 連接:

#篩選出 age 小於 25,或 age 大於 30
SELECT name,age FROM employee WHERE age<25 OR age>30;  

4.IN 和 NOT IN

關鍵詞IN和NOT IN的作用和它們的名字一樣明顯,用於篩選“在”或“不在”某個范圍內的結果,比如說我們要查詢在dpt3或dpt4的人:

SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt IN ('dpt3','dpt4');

而NOT IN的效果則是,如下面這條命令,查詢出了不在dpt1也不在dpt3的人:

SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt NOT IN ('dpt1','dpt3');

5.通配符

關鍵字 LIKE 在SQL語句中和通配符一起使用,通配符代表未知字符。SQL中的通配符是 _ 和 % 。其中 _ 代表一個未指定字符,% 代表不定個未指定字符。

比如,要只記得電話號碼前四位數為1101,而后兩位忘記了,則可以用兩個 _ 通配符代替:

SELECT name,age,phone FROM employee WHERE phone LIKE '1101__';

另一種情況,比如只記名字的首字母,又不知道名字長度,則用 % 通配符代替不定個字符:

SELECT name,age,phone FROM employee WHERE name LIKE 'J%';

6.對結果排序

為了使查詢結果看起來更順眼,我們可能需要對結果按某一列來排序,這就要用到 ORDER BY 排序關鍵詞。默認情況下,ORDER BY的結果是升序排列,而使用關鍵詞ASC和DESC可指定升序或降序排序。 比如,我們按salary降序排列,SQL語句為:

SELECT name,age,salary,phone FROM employee ORDER BY salary DESC;

7.SQL 內置函數和計算

SQL 允許對表中的數據進行計算。對此,SQL 有 5 個內置函數,這些函數都對 SELECT 的結果做操作:

其中 COUNT 函數可用於任何數據類型(因為它只是計數),而 SUM 、AVG 函數都只能對數字類數據類型做計算,MAX 和 MIN 可用於數值、字符串或是日期時間數據類型。

SELECT MAX(salary) AS max_salary,MIN(salary) FROM employee;

有一個細節你或許注意到了,使用AS關鍵詞可以給值重命名,比如最大值被命名為了max_salary:

8.子查詢

https://www.cnblogs.com/zhuiluoyu/p/5822481.html

上面討論的 SELECT 語句都僅涉及一個表中的數據,然而有時必須處理多個表才能獲得所需的信息。例如:想要知道名為 "Tom" 的員工所在部門做了幾個工程。員工信息儲存在 employee 表中,但工程信息儲存在project 表中。對於這樣的情況,我們可以用子查詢:

SELECT of_dpt,COUNT(proj_name) AS count_project FROM project GROUP BY of_dpt
HAVING of_dpt IN
(SELECT in_dpt FROM employee WHERE name='Tom');

子查詢還可以擴展到3層、4層或更多層。

Group By語句從英文的字面意義上理解就是”根據(by)一定的規則進行分組(Group)。 
它的作用是通過一定的規則將一個數據集划分成若干個小的區域,然后針對若干個小區域進行數據處理。語法格式如下:

select [columns] from table_name [where..] group by [columns] [having ...]

having為過濾條件。

9.連接查詢

在處理多個表時,子查詢只有在結果來自一個表時才有用。但如果需要顯示兩個表或多個表中的數據,這時就必須使用連接 (join) 操作。 連接的基本思想是把兩個或多個表當作一個新的表來操作,如下:

SELECT id,name,people_num
FROM employee,department
WHERE employee.in_dpt = department.dpt_name
ORDER BY id;

這條語句查詢出的是,各員工所在部門的人數,其中員工的 id 和 name 來自 employee 表,people_num 來自 department 表:

另一個連接語句格式是使用 JOIN ON 語法,剛才的語句等同於:

SELECT id,name,people_num
FROM employee JOIN department
ON employee.in_dpt = department.dpt_name
ORDER BY id;

結果也與剛才的語句相同。

 十、修改和刪除

1.對數據庫的修改

運行命令刪除名為 test_01 的數據庫:

DROP DATABASE test_01;

2.對一張表的修改

2.1重命名一張表

重命名一張表的語句有多種形式,以下 3 種格式效果是一樣的:

RENAME TABLE 原名 TO 新名字;

ALTER TABLE 原名 RENAME 新名;

ALTER TABLE 原名 RENAME TO 新名;

2.2刪除一張表

刪除一張表的語句,類似於剛才用過的刪除數據庫的語句

DROP TABLE 表名字;

3.對一列的修改(即對表的結構的修改)

3.1增加一列

ALTER TABLE 表名字 ADD COLUMN 列名字 數據類型 約束;

或: ALTER TABLE 表名字 ADD 列名字 數據類型 約束;

現在 employee 表中有 id、name、age、salary、phone、in_dpt 這6個列,我們嘗試加入 height (身高)一個列並指定DEFAULT 約束:

可以發現:新增加的列,被默認放置在這張表的最右邊。如果要把增加的列插入在指定位置,則需要在語句的最后使用AFTER關鍵詞(“AFTER 列1” 表示新增的列被放置在 “列1” 的后面)。

比如我們新增一列 weight (體重)放置在 age (年齡)的后面:

上面的效果是把新增的列加在某位置的后面,如果想放在第一列的位置,則使用 FIRST 關鍵詞,如語句:

3.2刪除一列

刪除表中的一列和剛才使用的新增一列的語句格式十分相似,只是把關鍵詞 ADD 改為 DROP ,語句后面不需要有數據類型、約束或位置信息。具體語句格式:

ALTER TABLE 表名字 DROP COLUMN 列名字;

或: ALTER TABLE 表名字 DROP 列名字;

3.3重命名一列

這條語句其實不只可用於重命名一列,准確地說,它是對一個列做修改(CHANGE) :

ALTER TABLE 表名字 CHANGE 原列名 新列名 數據類型 約束;

注意:這條重命名語句后面的 “數據類型” 不能省略,否則重命名失敗。

當原列名和新列名相同的時候,指定新的數據類型或約束,就可以用於修改數據類型或約束。需要注意的是,修改數據類型可能會導致數據丟失,所以要慎重使用。

3.4改變數據類型

要修改一列的數據類型,除了使用剛才的CHANGE語句外,還可以用這樣的MODIFY語句:

ALTER TABLE 表名字 MODIFY 列名字 新數據類型;

再次提醒,修改數據類型必須小心,因為這可能會導致數據丟失。在嘗試修改數據類型之前,請慎重考慮。

4對表的內容修改

4.1修改表中某個值

大多數時候我們需要做修改的不會是整個數據庫或整張表,而是表中的某一個或幾個數據,這就需要我們用下面這條命令達到精確的修改:

UPDATE 表名字 SET 列1=值1,列2=值2 WHERE 條件;

比如,我們要把 Tom 的 age 改為 21,salary 改為 3000:

注意:一定要有WHERE條件,否則會出現你不想看到的后果

4.2刪除一行記錄

刪除表中的一行數據,也必須加上WHERE條件,否則整列的數據都會被刪除。刪除語句:

DELETE FROM 表名字 WHERE 條件;

我們嘗試把Tom的數據刪除:

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM