數(shù)據(jù)庫(kù)管理
創(chuàng)建數(shù)據(jù)庫(kù)
- 語(yǔ)法:
CREATE DATABASE [IF NOT EXISTS] <數(shù)據(jù)庫(kù)名>
[[DEFAULT] CHARACTER SET <字符集名>]
[[DEFAULT] COLLATE <校對(duì)規(guī)則名>];
-
[ ]中的內(nèi)容是可選的 - <數(shù)據(jù)庫(kù)名>:創(chuàng)建數(shù)據(jù)庫(kù)的名稱(chēng)。MySQL 的數(shù)據(jù)存儲(chǔ)區(qū)將以目錄方式表示 MySQL 數(shù)據(jù)庫(kù),因此數(shù)據(jù)庫(kù)名稱(chēng)必須符合操作系統(tǒng)的文件夾命名規(guī)則,不能以數(shù)字開(kāi)頭,盡量要有實(shí)際意義。注意在 MySQL 中不區(qū)分大小寫(xiě)。
- IF NOT EXISTS:在創(chuàng)建數(shù)據(jù)庫(kù)之前進(jìn)行判斷,只有該數(shù)據(jù)庫(kù)目前尚不存在時(shí)才能執(zhí)行操作。此選項(xiàng)可以用來(lái)避免數(shù)據(jù)庫(kù)已經(jīng)存在而重復(fù)創(chuàng)建的錯(cuò)誤。
- [DEFAULT] CHARACTER SET:指定數(shù)據(jù)庫(kù)的字符集。指定字符集的目的是為了避免在數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)出現(xiàn)亂碼的情況。如果在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)不指定字符集,那么就使用系統(tǒng)的默認(rèn)字符集。
- [DEFAULT] COLLATE:指定字符集的默認(rèn)校對(duì)規(guī)則。
- MySQL 的字符集(CHARACTER)和校對(duì)規(guī)則(COLLATION)是兩個(gè)不同的概念。字符集是用來(lái)定義 MySQL 存儲(chǔ)字符串的方式,校對(duì)規(guī)則定義了比較字符串的方式。
修改數(shù)據(jù)庫(kù)
- 語(yǔ)法:
ALTER DATABASE [數(shù)據(jù)庫(kù)名] {
[ DEFAULT ] CHARACTER SET <字符集名> |
[ DEFAULT ] COLLATE <校對(duì)規(guī)則名>}
- ALTER DATABASE 用于更改數(shù)據(jù)庫(kù)的全局特性。
- 使用 ALTER DATABASE 需要獲得數(shù)據(jù)庫(kù) ALTER 權(quán)限。
- 數(shù)據(jù)庫(kù)名稱(chēng)可以忽略,此時(shí)語(yǔ)句對(duì)應(yīng)于默認(rèn)數(shù)據(jù)庫(kù)。
- CHARACTER SET 子句用于更改默認(rèn)的數(shù)據(jù)庫(kù)字符集。
刪除數(shù)據(jù)庫(kù)
- 語(yǔ)法:
DROP DATABASE [ IF EXISTS ] <數(shù)據(jù)庫(kù)名>
- <數(shù)據(jù)庫(kù)名>:指定要?jiǎng)h除的數(shù)據(jù)庫(kù)名。
- IF EXISTS:用于防止當(dāng)數(shù)據(jù)庫(kù)不存在時(shí)發(fā)生錯(cuò)誤。
- DROP DATABASE:刪除數(shù)據(jù)庫(kù)中的所有表格并同時(shí)刪除數(shù)據(jù)庫(kù)。
- 如果要使用 DROP DATABASE,需要獲得數(shù)據(jù)庫(kù) DROP 權(quán)限。
表管理
關(guān)系數(shù)據(jù)庫(kù)的規(guī)范化
良好的數(shù)據(jù)庫(kù)設(shè)計(jì)表現(xiàn)在以下幾方面:
- 訪(fǎng)問(wèn)效率高
- 減少數(shù)據(jù)冗余,節(jié)省存儲(chǔ)空間,便于進(jìn)一步擴(kuò)展
- 可以使應(yīng)用程序的開(kāi)發(fā)變得更容易
關(guān)系數(shù)據(jù)庫(kù)的規(guī)范化理論為:關(guān)系數(shù)據(jù)庫(kù)中的每一個(gè)關(guān)系都要滿(mǎn)足一定的規(guī)范。根據(jù)滿(mǎn)足規(guī)范的條件不同,可以分為5個(gè)等級(jí):第一范式(1NF)、第二范式(2NF)……第五范式(5NF)。其中,NF是Normal Form的縮寫(xiě)。一般情況下,只要把數(shù)據(jù)規(guī)范到第三范式標(biāo)準(zhǔn)就可以滿(mǎn)足需要了。
第一范式(1NF)
- 在一個(gè)關(guān)系中,消除重復(fù)字段,且各字段都是最小的邏輯存儲(chǔ)單位。即,要滿(mǎn)足原子性。
- 第一范式是第二和第三范式的基礎(chǔ),是最基本的范式。第一范式包括下列指導(dǎo)原則。
(1)數(shù)據(jù)組的每個(gè)屬性只可以包含一個(gè)值。
(2)關(guān)系中的每個(gè)數(shù)組必須包含相同數(shù)量的值。
(3)關(guān)系中的每個(gè)數(shù)組一定不能相同。 - 在任何一個(gè)關(guān)系數(shù)據(jù)庫(kù)中,第一范式是對(duì)關(guān)系模式的基本要求,不滿(mǎn)足第一范式的數(shù)據(jù)庫(kù)就不是關(guān)系型數(shù)據(jù)庫(kù)。
第二范式(2NF)
- 第二范式是在第一范式的基礎(chǔ)上建立起來(lái)的,即滿(mǎn)足第二范式必先滿(mǎn)足第一范式(1NF)。
- 第二范式要求數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)體(即各個(gè)記錄行)必須可以被唯一地區(qū)分。
- 為實(shí)現(xiàn)區(qū)分各行記錄通常需要為表設(shè)置一個(gè)“區(qū)分列”,用以存儲(chǔ)各個(gè)實(shí)體的唯一標(biāo)識(shí)。這個(gè)唯一屬性列被稱(chēng)為主關(guān)鍵字或主鍵。
- 第二范式要求實(shí)體的屬性完完全依賴(lài)于主關(guān)鍵字,即不能存在僅依賴(lài)主關(guān)鍵字一部分的屬性,如果存在,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來(lái)形成一個(gè)新的實(shí)體,新實(shí)體與原實(shí)體之間是一對(duì)多的關(guān)系。
第三范式(3NF)
- 第三范式是在第二范式的基礎(chǔ)上建立起來(lái)的,即滿(mǎn)足第三范式必先滿(mǎn)足第二范式。
- 第三范式要求關(guān)系表不存在非關(guān)鍵字列對(duì)任意候選關(guān)鍵字列的傳遞函數(shù)依賴(lài),也就是說(shuō),第三范式要求一個(gè)關(guān)系表中不包含已在其他表中包含的非主關(guān)鍵字信息。
- 除主鍵外,其他字段必須依賴(lài)主鍵。
表管理語(yǔ)句
創(chuàng)建表
- 語(yǔ)法:
CREATE TABLE 表名稱(chēng)
(
列名稱(chēng)1 數(shù)據(jù)類(lèi)型 [(長(zhǎng)度) 約束],
列名稱(chēng)2 數(shù)據(jù)類(lèi)型 [(長(zhǎng)度) 約束],
列名稱(chēng)3 數(shù)據(jù)類(lèi)型 [(長(zhǎng)度) 約束],
....
)
- 常用數(shù)據(jù)類(lèi)型
| 數(shù)據(jù)類(lèi)型 | 描述 |
|---|---|
| tinyint(m) | 1個(gè)字節(jié) 范圍(-128~127) |
| smallint(m) | 2個(gè)字節(jié) 范圍(-32768~32767) |
| mediumint(m) | 3個(gè)字節(jié) 范圍(-8388608~8388607) |
| int(m) | 4個(gè)字節(jié) 范圍(-2147483648~2147483647) |
| bigint(m) | 8個(gè)字節(jié) 范圍(+-9.22*10的18次方) |
| float(m,d) | 單精度浮點(diǎn)型 8位精度(4字節(jié)) m總個(gè)數(shù),d小數(shù)位 |
| double(m,d) | 雙精度浮點(diǎn)型 16位精度(8字節(jié)) m總個(gè)數(shù),d小數(shù)位 |
| decimal(m,d) | m表示十進(jìn)制數(shù)字總的個(gè)數(shù),d表示小數(shù)點(diǎn)后面數(shù)字的位數(shù)。常用于貨幣 |
| char(n) | 固定長(zhǎng)度,最多255個(gè)字符 |
| varchar(n) | 固定長(zhǎng)度,最多65535個(gè)字符 |
| tinytext | 可變長(zhǎng)度,最多255個(gè)字符 |
| text | 可變長(zhǎng)度,最多65535個(gè)字符 |
| mediumtext | 可變長(zhǎng)度,最多2的24次方-1個(gè)字符 |
| longtext | 可變長(zhǎng)度,最多2的32次方-1個(gè)字符 |
| date | 日期 '2008-12-2' |
| time | 時(shí)間 '12:25:36' |
| datetime | 日期時(shí)間 '2008-12-2 22:06:44' |
| timestamp | 自動(dòng)存儲(chǔ)記錄修改時(shí)間 |
| enum(選項(xiàng)1, 選項(xiàng)2, ...) | 單選字符串?dāng)?shù)據(jù)類(lèi)型,適合存儲(chǔ)表單界面中的“單選值” |
| set(選項(xiàng)1,選項(xiàng)2, ...) | 多選字符串?dāng)?shù)據(jù)類(lèi)型,適合存儲(chǔ)表單界面的“多選值”。 |
- 示例:
# 創(chuàng)建數(shù)據(jù)庫(kù)mydb
mysql> create database mydb default charset utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql> use mydb;
Database changed
# 創(chuàng)建部門(mén)表
mysql> create table departments (
-> id int,
-> dept_name varchar(20)
-> );
Query OK, 0 rows affected (0.01 sec)
修改表
修改列名
- 語(yǔ)法:
ALTER TABLE 表
CHANGE [COLUMN] 列表 數(shù)據(jù)類(lèi)型
- 示例:
mysql> alter table departments
-> change id dept_id int;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
修改列的類(lèi)型或約束
- 語(yǔ)法:
ALTER TABLE 表
MODIFY [COLUMN] 列名 類(lèi)型
- 示例:
mysql> alter table departments
-> modify dept_name varchar(10);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
添加新列
- 語(yǔ)法:
ALTER TABLE 表
ADD [COLUMN] 列名 類(lèi)型
- 示例:
mysql> alter table departments
-> add manager_id int;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
刪除列
- 語(yǔ)法:
ALTER TABLE 表
DROP [COLUMN] 列名
- 示例:
mysql> alter table departments
-> drop manager_id;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
修改表名
- 語(yǔ)法:
ALTER TABLE 表名
RENAME TO 新表名
- 示例:
mysql> alter table departments
-> rename to depts;
Query OK, 0 rows affected (0.00 sec)
刪除表
- 語(yǔ)法:
DROP TABLE [IF EXISTS] 表名
- 示例:
mysql> drop table depts;
Query OK, 0 rows affected (0.01 sec)
表復(fù)制
僅復(fù)制表結(jié)構(gòu)
- 語(yǔ)法:
CREATE TABLE 待創(chuàng)建的表名 LIKE 已有表名
- 示例:
mysql> create table departments like test2021.departments;
Query OK, 0 rows affected (0.01 sec)
復(fù)制表結(jié)構(gòu)及數(shù)據(jù)
- 語(yǔ)法:
CREATE TABLE 待創(chuàng)建的表名
SELECT 字段, ... FROM 已有表名
- 示例:
mysql> create table departments2
-> select * from test2021.departments;
Query OK, 13 rows affected (0.01 sec)
Records: 13 Duplicates: 0 Warnings: 0