原文出自:https://www.pandashen.com
前言
MySQL 是目前使用最廣泛的關係型數據庫,是在軟件開發中所必備的技能之一,這是關於 MySQL 的系列文章,將從 MySQL 的基本概念、基本使用、SQL 語句、函數、聚合函數、表連接以及表設計等多方面對 MySQL 進行總結,而本篇是數據庫基礎部分,大多都是一些概念性的內容和表的創建,數據庫博大精深,本系列文章內容較淺,適合於前端的同學們對 MySQL 的入門,當然這也是我的學習筆記,希望可以幫助大家。
MySQL 的基本概念
MySQL 的特點:開源免費、性能高、安裝使用簡單。
MySQL 的作用:
- 存儲大量數據,方便檢索和訪問;
- 保持數據信息的一致、完整;
- 實現數據的共享和安全;
- 通過組合分析產生新的有用信息。
實體:只要是客觀存在,能夠被描述出來的都是實體,每一條數據都是一個實體。
DB:是數據庫的意思,就是存儲數據的倉庫,可以存放結構化的數據。
DBMS:代表數據管理系統,是一種系統軟件,提供操作數據庫的環境,如 Navicat for MySQL
,可以通過數據庫管理系統對數據進行增、刪、改、查。
SQL:結構化查詢語言,專門用來和數據庫進行交流的語言,幾乎所有的 DBMS
都支持 SQL
。
數據表:
- 表是數據庫中包含所有數據的數據庫對象,也是其他對象的基礎;
- 表定義是一個集合,數據在表中是按行和列的格式組織的,用來存放數據;
- 行被稱爲記錄,用來存放一個實體,列稱爲字段用來描述實體的某一個屬性。
MySQL 的配置和命令
1、MySQL 配置
在 MySQL 的默認安裝目錄中 my.ini
文件是專門用來配置的,常用配置項如下:
- port:端口號;
- basedir:安裝目錄;
- datadir:數據存放目錄
- charcter-set-server:字符集;
- default-storage-engine:存儲引擎;
- sql-mode:語法模式;
- max-connections:最大連接數。
2、MySQL 命令
MySQL 服務啓動和停止:
net start MySQL
net stop MySQL
連接和退出數據庫:
mysql -h 127.0.0.1 -P 3306 -uroot -p123456
exit
-h
代表主機名,-p
代表端口號,-u
和 -p
分別代表當前 MySQL 服務的賬號和密碼。
查看當前 MySQL 中的數據庫:
show dbs;
show database;
切換數據庫:
use dataname;
查看數據庫的表:
show tables;
show tables from mysql;
查看當前所在的數據庫:
select database();
查詢表結構:
desc tablename;
數據完整性
數據完整性是指,數據庫種所有數據值均爲正確狀態,如果數據存儲有不正確的的數據值,則該數據庫喪失數據完整性,爲了實現數據完整性,需要檢驗數據庫表中每行每列的數據是否符合要求,在創建表時,應該保證以後輸入的數據都是正確的,錯誤的數據不允許輸入。
1、域(列)完整性
域完整性是對數據表中字段屬性的約束,通常指數據的有效性,它包括字段的值域、字段的類型及字段的有效規則等約束,它是由確定關係結構時所定義的字段的屬性決定的,如關於年齡的字段,數據類型應爲 int
,關於普通的字符串值得類型應該爲 varchar
等等,並在規定值類型時相應得規定值的長度,即所佔的字節數。
數據類型圖如下:
數值類型整數型:
- tinyint:存儲所佔
1
字節,無符號可以存儲0
~255
,有符號可以存儲-128
~127
; - smallint:存儲所佔
2
字節,無符號可以存儲0
~65535
,有符號可以存儲-32768
~32767
; - mediumint:存儲所佔
3
字節,無符號可以存儲0
~16777215
,有符號可以存儲-8388608
~8388607
; - int:存儲所佔
4
字節,無符號可以存儲0
~4294967295
,有符號可以存儲-2147483648
~2147483647
; - bigint:存儲所佔
8
字節,無符號可以存儲0
~18446744073709551615
,有符號可以存儲-9223372036854775808
~9223372036854775807
。
上面的整數型用來規定字段存儲的數據必須爲整數,從上到下需要佔用的空間越來越多,能表示的數字也越來越大,定義字段時選擇滿足需求的數字範圍即可。
數值類型小數型:
- float:單精度浮點型,存儲所佔
4
字節,數值範圍爲-3.4E38 ~ 3.4E38
,7
個有效位; - double:雙精度浮點型,存儲所佔
8
字節,數值範圍爲-1.7E308~1.7E308
,15
個有效位; - decimal:定點型,存儲所佔
16
字節,28
個有效位,不存在精度損失,常用於銀行賬目計算。
數值存儲範圍越小,精度越高,範圍越大,精度越不準確,既要求精度,又固定小數點位數的數值存儲,建議使用 decimal
,優點在於可以自定義小數點位數,精度高,特殊情況,數值範圍巨大,只能使用 float
類型,該類型一般不建議使用。
字符串類型:
- set:存儲字符串對象,最多包含
64
個元素,並且可以取到集合中任意元素; - enum:存儲字符串對象,最多包含
65536
個元素,只能取到集合中一個元素; - blob:用於存儲二進制字符串,有子類型;
- text:用於存儲大文本,有子類型;
- char:定長,最大
255
字節,存儲空間未滿,會在數據右側填充空格; - varchar:不定長,最大
65536
字節,當長度小於4
時,會自動轉換成char
。
上面類型中最常用的爲 varchar
可以根據字段內容的自定義長度。
時間類型:
- year:
yyyy
格式表示的年份值; - timestamp:
yyyymmddhhmmss
格式表示的時間戳; - time:
hh:mm:ss
格式表示的時間值; - date:
yyyy-mm-dd
格式表示的日期值; - datetime:
yyyy-mm-dd hh:mm:ss
格式表示的日期和時間。
默認值:默認值是指如果某個字段沒有指定值的情況下,會爲該字段指定一個預先設定的值。
非空約束:我們可以指定某個字段不能不輸入,必須提供一個非空的值,即不能爲 null
。
2、實體(行)完整性
實體完整性是對關係中的記錄唯一性,也就是主鍵的約束,準確地說,實體完整性是指關係中的主屬性值不能爲 null
且不能有相同值,定義表中的所有行唯一的標識,一般用主鍵。
主鍵:表中一列或者幾列組合的值能用來唯一標識表中的每一行,這樣的列或者列組合稱爲表的主鍵,主鍵表的數據不能重複,如果兩列或者多列組合起來唯一標識表中的每一行,則該主鍵又稱爲 “組合主鍵”。
主鍵的選擇標準:
- 最少性:儘量選擇單個鍵作爲主鍵;
- 穩定性:由於主鍵是用來在兩個表之間建立關聯的,不能經常更新或者說一般不更新,所以最好選擇無意義的列作爲主鍵,如各種
id
值。
3、引用完整性
引用完整性意思是對關係型數據庫中建立關聯關係的數據表之間數據參照引用的約束,也就是對外鍵的約束,準確地說,是指關係中的外鍵必須是另一個關係的主鍵有效值,或者是 null
,參考完整性,維護表間數據的有效性,完整性,通常通過建立外部鍵聯繫另一張關聯表的主鍵實現。
外鍵:用於連接兩張表的字段稱爲外鍵,屬於外鍵表,通常要關聯的主鍵表的字段作爲外鍵,保證了引用完整性。
外鍵約束:外鍵表的外鍵必須引用主鍵表的主鍵,主表沒有記錄。
如果一個表的外鍵引用了一個表的主鍵會有以下限制:
- 在外鍵表裏不能添加主鍵表裏沒有的數據,外鍵表的數據與主鍵表的數據必須通過外鍵一一對應;
- 要想刪除主鍵表的數據必須刪除所有外鍵表的數據。
唯一約束:唯一約束是指某個字段值是唯一的,在所有的記錄中不能有重複的值,如某個人的身份證號,需將外鍵的索引類型設置爲 Unique
。
標識列:當表中沒有適合做主鍵的列時,此時創建作爲主鍵的無意義列稱爲標識列,標識列的值是自動生成的,不能輸入修改,且是自增的,可以設置每次的增量,具有 “斷號保留” 的特性,當某一個實體被刪除時,該標識列的值是永久保存的,其他新增實體會在這個標識列的基礎上繼續自增。
DDL 數據定義語言的使用
我們可以通過兩種方式創建表,可以使用 DDL(data defintion language)數據定義語言來創建,也可以使用 DBMS 數據管理系統來創建,使用 DBMS 還是很方便的,而且也是最常用的方式,但 DDL 創建方式我們不得不說,就是通過代碼的方式來實現表的創建和操作,因爲這是最原始的方式,即使圖形化的操作會更方便,我們也應該瞭解。
1、SQL 規範
SQL 語句的規範如下:
- SQL 語句不區分大小寫,建議 SQL 關鍵字大寫,表名和列表小寫;
- 命令用分號結尾;
- 命令可以縮進和換行,一種類型的關鍵字放在一行;
- 可以寫單行和多行註釋 ,
#
和--
是單行註釋,/*/
是多行註釋。
2、使用 DDL 操作表
在 DBMS 中的查詢編輯器可以代替命令行實現命令的編寫,爲了視覺效果,我們都使用 Navicat for MySQL
的查詢編輯器,操作界面如下圖。
(1) 創建表
創建表 student
,創建一個標識列 id
不爲空,設爲主鍵並自增,創建 name
列,varchar
類型,64
位,不爲空,創建 age
列,int
類型,不爲空,創建 city
列,varchar
類型,32
位,默認值爲 “北京”。
CREATE TABLE `student`
(
`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(64) NOT NULL,
`age` INT NOT NULL,
`city` VARCHAR(32) DEFAULT "北京"
);
(2) 操作表的列
給上面的表 student
增加 idcard
列,值爲空,將 idcard
列類型大小修改爲 32
位,添加 province
列,插入到 city
列前面,查詢表結構,刪除 idcard
列,刪除表 student
。
ALTER TABLE `student` ADD COLUMN `idcard` VARCHAR(18) NULL;
ALTER TABLE `student` MODIFY COLUMN `idcard` VARCHAR(32) NULL;
ALTER TABLE `student` ADD COLUMN `province` VARCHAR(32) AFTER `age`;
DESC `student`;
ALTER TABLE `student` DROP COLUMN `idcard`;
DROP TABLE `student`;
(3) 添加主鍵約束
重新創建上面的 student
表,city
不設置默認值,不添加主鍵約束和標識列,再通過命令添加主鍵約束。
CREATE TABLE `student`
(
`id` INT NOT NULL,
`name` VARCHAR(64) NOT NULL,
`age` INT NOT NULL,
`city` VARCHAR(32)
);
ALTER TABLE `student` ADD PRIMARY KEY(id);
(4) 添加唯一約束
將上面我們 student
表中的 idcard
列再加回來,給 idcard
列添加唯一約束,外鍵名爲 uq_idcard
。
ALTER TABLE `student` ADD COLUMN `idcard` VARCHAR(18) NULL;
ALTER TABLE `student` ADD UNIQUE INDEX uq_idcard(`idcard`);
(5) 添加默認約束
將 student
表 city
列的默認值設置爲 “北京”。
ALTER TABLE `student` MODIFY COLUMN `city` VARCHAR(64) DEFAULT "北京";
(6) 添加外鍵約束
創建一個子表 score
,添加 student_id
列,添加外鍵 fk_student_id
,將 student_id
與 student
表的主鍵 id
相關聯,此時 student
爲主表(主鍵表),score
爲子表(外鍵表)。
CREATE TABLE `score`
(
`student_id` INT
);
ALTER TABLE `score` ADD CONSTRAINT `fk_student_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`);
注意:在項目中一般不會添加這個約束,因爲在開發時會頻繁操作表和修改數據,會經常報錯,非常麻煩,不添加這個約束並不影響數據的檢索和修改。
(7) 刪除約束
刪除 score
表與 student
表的外鍵約束,即刪除外鍵 fk_student_id
。
ALTER TABLE `score` DROP FOREIGN KEY `fk_student_id`;
3、使用 DDL 創建一個完整的表關係
完整的表關係圖如下:
DDL 命令如下:
-- 創建表 student
CREATE TABLE `student` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`idcard` VARCHAR(18) DEFAULT NULL,
`age` INT(11) DEFAULT NULL,
`city` VARCHAR(50) DEFAULT "北京",
PRIMARY KEY (`id`)
);
-- 創建表 course
CREATE TABLE `course` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (`id`)
);
-- 創建表 score,並添加外鍵約束
CREATE TABLE `score` (
`student_id` INT(11) NOT NULL DEFAULT "0",
`course_id` INT(11) NOT NULL DEFAULT "0",
`grade` FLOAT DEFAULT NULL,
PRIMARY KEY (`student_id`, `course_id`),
KEY `fk_courseid` (`course_id`),
CONSTRAINT `fk_courseid` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`),
CONSTRAINT `fk_student_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在實際開發當中使用 DDL 對錶的編輯並不多,因爲命令繁瑣,在效率上,使用 DBMS 效率更高,但是 DDL 是學習 MySQL 數據庫的根本之一,應該會寫。
總結
到此 MySQL 系列文章的第一篇就結束了,裏面大部分內容都是關於 MySQL 數據庫的概念以及表的創建,非常枯燥,但又是初學 MySQL 所必須要懂的知識點,相信大家通過本節已經對 MySQL 有了一定的認識,那麼下一篇將是重中之重,是在開發中經常使用的 DML 數據庫操作語言,也就是我們平時所說的 SQL 語句,在此期待我們的下一篇 《MySQL —— SQL 語句總結》。