1. 程式人生 > >基礎學習——MySQL基礎

基礎學習——MySQL基礎

1.基礎

資料庫用於記錄資料,使用資料庫記錄資料可以表現出各種資料間的聯絡,也可以很方便地對所記錄的資料進行增、刪、改、查等操作。

結構化查詢語言(Structured Query Language)簡稱 SQL,是上世紀 70 年代由 IBM 公司開發,用於對資料庫進行操作的語言。更詳細地說,SQL 是一種資料庫查詢和程式設計語言,用於存取資料以及查詢、更新和管理關係資料庫系統,同時也是資料庫指令碼檔案的副檔名

MySQL 是一個 DBMS(資料庫管理系統),由瑞典 MySQLAB 公司開發,目前屬於 Oracle 公司,MySQL 是最流行的關係型資料庫管理系統(關係資料庫,是建立在關係資料庫模型基礎上的資料庫,藉助於集合代數等概念和方法來處理資料庫中的資料)。由於其體積小、速度快、總體擁有成本低,尤其是開放原始碼這一特點,一般中小型網站的開發者都選擇 MySQL 作為網站資料庫。MySQL 使用 SQL 語言進行操作。

先要檢查Linux系統中是否已經安裝了MySQL,輸入命令嘗試開啟MySQL服務:

sudo service mysql start

如果提示是這樣的,則說明系統中沒有 MySQL,需要繼續安裝:

mysql: unrecognized service

在Ubuntu上安裝MySQL,最簡單的方式是線上安裝。只需要幾行簡單的命令( # 號後面是註釋):

#安裝 MySQL 服務端、核心程式
sudo apt-get install mysql-server

#安裝 MySQL 客戶端
sudo apt-get install mysql-client  

安裝結束後,用命令驗證是否安裝並啟動成功:

sudo netstat -tap | grep mysql 

1). 開啟MySQL

使用如下兩條命令,開啟MySQL服務並使用root使用者登入:

# 啟動 MySQL 服務
sudo service mysql start             

# 使用 root 使用者登入,實驗樓環境的密碼為空,直接回車就可以登入
mysql -u root

2). 檢視資料庫

使用命令 show databases;,檢視有哪些資料庫(注意不要漏掉分號 ;):

3). 連線資料庫

選擇連線其中一個數據庫,語句格式為 use <資料庫名>,這裡可以不用加分號,這裡我們選擇 information_schema 資料庫:

use information_schema

4). 查看錶

使用命令 show tables; 檢視資料庫中有哪些表(注意不要漏掉“;”):

5). 退出

使用命令 quit 或者 exit 退出 MySQL。

 

2.建立資料插入資料

語句格式為 CREATE DATABASE <資料庫名字>;,(注意不要漏掉分號 ;),前面的 CREATE DATABASE 也可以使用小寫,具體命令為:

CREATE DATABASE mysql_shiyan;
建立成功後輸入命令 show databases; (注意不要漏掉;)檢查一下:

 

但是出於嚴謹,而且便於區分保留字(保留字(reserved word):指在高階語言中已經定義過的字,使用者不能再將這些字作為變數名或過程名使用。)和變數名,我們把保留字大寫,把變數和資料小寫

資料表(table)簡稱表,它是資料庫最重要的組成部分之一。資料庫只是一個框架,表才是實質內容。

而一個數據庫中一般會有多張表,這些各自獨立的表通過建立關係被聯接起來,才成為可以交叉查閱

在資料庫中新建一張表的語句格式為:

CREATE TABLE 表的名字
(
列名a 資料型別(資料長度),
列名b 資料型別(資料長度),
列名c 資料型別(資料長度)
);

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

資料型別    大小(位元組)    用途    格式
INT    4    整數    
FLOAT    4    單精度浮點數    
DOUBLE    8    雙精度浮點數    
ENUM    --    單選,比如性別    ENUM('a','b','c')
SET    --    多選    SET('1','2','3')
DATE    3    日期    YYYY-MM-DD
TIME    3    時間點或持續時間    HH:MM:SS
YEAR    1    年份值    YYYY
CHAR    0~255    定長字串    
VARCHAR    0~255    變長字串    
TEXT    0~65535    長文字資料
整數除了 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);

 

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

 

3.SQL約束

約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的完整性、唯一性。本節實驗將在實踐操作中熟悉 MySQL 中的幾種約束

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

約束型別:    主鍵    預設值    唯一    外來鍵    非空
關鍵字:    PRIMARY KEY    DEFAULT    UNIQUE    FOREIGN KEY    NOT NULL

載入檔案中的資料,需要在 MySQL 控制檯中輸入命令:

source /home/shiyanlou/Desktop/SQL3/MySQL-03-01.sql;

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

一、實驗簡介

二、實驗步驟

2.1 約束分類

2.2 建立含約束的表

2.3 主鍵

2.4 預設值約束

2.5 唯一約束

2.6 外來鍵約束

2.7 非空約束

三、實驗總結

四、課後習題

SQL 的約束

一、實驗簡介

1.1 實驗內容

約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的完整性、唯一性。本節實驗將在實踐操作中熟悉 MySQL 中的幾種約束。

1.2 實驗知識點

  • SQL 約束

1.3 實驗環境

課程使用的實驗環境為 Ubuntu Linux 16.04 64 位版本。實驗中會用到程式:

  • Mysql 5.7.22
  • Xfce終端

二、實驗步驟

本節將通過實踐操作,帶領大家熟悉SQL的約束。

2.1 約束分類

聽名字就知道,約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的完整性、唯一性。

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

約束型別: 主鍵 預設值 唯一 外來鍵 非空
關鍵字: PRIMARY KEY DEFAULT UNIQUE FOREIGN KEY NOT NULL

2.2 建立含約束的表

為了方便介紹這幾種約束,我們先建立一個數據庫。

注:如果你是從上一節直接進入本節進行學習的,請先刪除上一節建立的資料庫mysql_shiyan,刪除語句為DROP DATABASE mysql_shiyan;

當然不用你一行一行地輸入命令搭建這個資料庫,實驗樓已經為你準備好了。首先開啟 Xfce 終端,輸入命令進入 /home/shiyanlou/Desktop 目錄:

cd Desktop

使用 git 命令將需要的資料檔案下載到本地資料夾:

git clone https://github.com/shiyanlou/SQL3.git

下載完成後,輸入命令開啟 MySQL 服務並使用 root 使用者登入:

#開啟 MySQL 服務
sudo service mysql start        

#使用 root 使用者登入
mysql -u root                   

剛才下載的 SQL3 目錄下,有個檔案 MySQL-03-01.sql,其中包含的程式碼可以新建一個數據庫 mysql_shiyan,然後在其中建立三張表 departmentemployeeproject,它們包含了各種約束。

(SQL3 目錄在桌面上,你可以用Gedit檢視裡面的 MySQL-03-01.sql 檔案。)

載入檔案中的資料,需要在 MySQL 控制檯中輸入命令:

source /home/shiyanlou/Desktop/SQL3/MySQL-03-01.sql;

檢視一下這個資料庫,輸入命令 show tables;,可見:

00

2.3 主鍵

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

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

07

也可以這樣定義主鍵:

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

09-

2.4 預設值約束
預設值約束 (DEFAULT) 規定,當有 DEFAULT 約束的列,插入資料為空時,將使用預設值

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

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

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

 

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

11

 

2.6 外來鍵約束
外來鍵 (FOREIGN KEY) 既能確保資料完整性,也能表現表之間的關係。

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

12-

 

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

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

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

 

3.select語句詳解

3.1 基本的SELECT語句
SELECT 語句的基本格式為:

SELECT 要查詢的列名 FROM 表名字 WHERE 限制條件;
如果要查詢表的所有內容,則把 要查詢的列名 用一個星號 * 號表示(實驗2、3中都已經使用過),代表要查詢表中所有的列。 而大多數情況,我們只需要檢視某個表的指定的列

SELECT name,age FROM employee;

 

3.2 數學符號條件
SELECT 語句常常會有 WHERE 限制條件,用於達到更加精確的查詢。WHERE限制條件可以有數學符號 (=,<,>,>=,<=)

SELECT name,age FROM employee WHERE age>25;

 

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

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

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

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

 

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

比如,要只記得電話號碼前四位數為1101,而後兩位忘記了,則可以用兩個 _ 萬用字元代替:

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

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

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

 

3.7 SQL 內建函式和計算
SQL 允許對錶中的資料進行計算。對此,SQL 有 5 個內建函式,這些函式都對 SELECT 的結果做操作:

函式名:    COUNT    SUM    AVG    MAX    MIN
作用:    計數    求和    求平均值    最大值    最小值
其中 COUNT 函式可用於任何資料型別(因為它只是計數),而 SUM 、AVG 函式都只能對數字類資料型別做計算,MAX 和 MIN 可用於數值、字串或是日期時間資料型別。

具體舉例,比如計算出salary的最大、最小值,用這樣的一條語句:

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

 

3.8 子查詢
上面討論的 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.9 連線查詢
在處理多個表時,子查詢只有在結果來自一個表時才有用。但如果需要顯示兩個表或多個表中的資料,這時就必須使用連線 (join) 操作。 連線的基本思想是把兩個或多個表當作一個新的表來操作,如下:

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

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

SELECT id,name,people_num
FROM employee JOIN department
ON employee.in_dpt = department.dpt_name
ORDER BY id;
結果也與剛才的語句相同

 

4.修改和刪除

現在我們執行命令刪除名為 test_01 的資料庫:

DROP DATABASE test_01;

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

RENAME TABLE 原名 TO 新名字;

ALTER TABLE 原名 RENAME 新名;

ALTER TABLE 原名 RENAME TO 新名;

3.2.2 刪除一張表
刪除一張表的語句,類似於剛才用過的刪除資料庫的語句,格式是這樣的:

DROP TABLE 表名字;

 

3.3 對一列的修改(即對錶結構的修改)
對錶結構的修改,是本節實驗的難點,有時候一些小的錯誤會造成不可挽回的後果,所以請細心操作。另外需要注意,不是必需儘量避免更改表結構。

3.3.1 增加一列
在表中增加一列的語句格式為:

ALTER TABLE 表名字 ADD COLUMN 列名字 資料型別 約束;

或: ALTER TABLE 表名字 ADD 列名字 資料型別 約束;

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

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

ALTER TABLE employee ADD test INT(10) DEFAULT 11 FIRST;

 

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

ALTER TABLE 表名字 DROP COLUMN 列名字;

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

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

ALTER TABLE 表名字 CHANGE 原列名 新列名 資料型別 約束;

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

 

3.3.4 改變資料型別
要修改一列的資料型別,除了使用剛才的CHANGE語句外,還可以用這樣的MODIFY語句:

ALTER TABLE 表名字 MODIFY 列名字 新資料型別;
再次提醒,修改資料型別必須小心,因為這可能會導致資料丟失。在嘗試修改資料型別之前,請慎重考慮。

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

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

3.4.2 刪除一行記錄
刪除表中的一行資料,也必須加上WHERE條件,否則整列的資料都會被刪除。刪除語句:

DELETE FROM 表名字 WHERE 條件;

 

4.其他基本操作

對一張表中的某個列建立索引,有以下兩種語句格式:

ALTER TABLE 表名字 ADD INDEX 索引名 (列名);

CREATE INDEX 索引名 ON 表名字 (列名);
我們用這兩種語句分別建立索引:

ALTER TABLE employee ADD INDEX idx_id (id);  #在employee表的id列上建立名為idx_id的索引

CREATE INDEX idx_name ON employee (name);   #在employee表的name列上建立名為idx_name的索引

 

索引的效果是加快查詢速度,當表中資料不夠多的時候是感受不出它的效果的。這裡我們使用命令 SHOW INDEX FROM 表名字; 檢視剛才新建的索引:

3.2 檢視
檢視是從一個或多個表中匯出來的表,是一種虛擬存在的表。它就像一個視窗,通過這個視窗可以看到系統專門提供的資料,這樣,使用者可以不用看到整個資料庫中的資料,而只關心對自己有用的資料。

注意理解檢視是虛擬的表:

資料庫中只存放了檢視的定義,而沒有存放檢視中的資料,這些資料存放在原來的表中;
使用檢視查詢資料時,資料庫系統會從原來的表中取出對應的資料;
檢視中的資料依賴於原來表中的資料,一旦表中資料發生改變,顯示在檢視中的資料也會發生改變;
在使用檢視的時候,可以把它當作一張表。
建立檢視的語句格式為:

CREATE VIEW 檢視名(列a,列b,列c) AS SELECT 列1,列2,列3 FROM 表名字;
可見建立檢視的語句,後半句是一個SELECT查詢語句,所以檢視也可以建立在多張表上,只需在SELECT語句中使用子查詢或連線查詢

匯入操作,可以把一個檔案裡的資料儲存進一張表。匯入語句格式為:

LOAD DATA INFILE '檔案路徑和檔名' INTO TABLE 表名字;

匯出與匯入是相反的過程,是把資料庫某個表中的資料儲存到一個檔案之中。匯出語句基本格式為:

SELECT 列1,列2 INTO OUTFILE '檔案路徑和檔名' FROM 表名字

 

mysqldump 是 MySQL 用於備份資料庫的實用程式。它主要產生一個 SQL 指令碼檔案,其中包含從頭重新建立資料庫所必需的命令CREATE TABLE INSERT 等。

使用 mysqldump 備份的語句:

mysqldump -u root 資料庫名>備份檔名;   #備份整個資料庫

mysqldump -u root 資料庫名 表名字>備份檔名;  #備份整個表

 

用備份檔案恢復資料庫,其實我們早就使用過了。在本次實驗的開始,我們使用過這樣一條命令:

source /tmp/SQL6/MySQL-06.sql

把剛才備份的 bak.sql 恢復到 test 資料庫:

mysql -u root test < bak.sql