(七)MySQL基礎——庫和表的管理、常見的資料型別、約束
DDL(資料定義語言):包括庫和表的管理
一、庫的管理
1、庫的建立
語法:CREATE DATABASE IF NOT EXISTS 庫名;
2、庫的修改
語法:RENAME DATABASE 舊庫名 TO 新庫名;(版本更新後不使用了,會影響庫內資料)
一般去外部檔案中去修改庫名,先停止服務,修改庫名之後再更新開啟服務。
更改庫的字符集:ALTER DATABASE 庫名 CHARACTER SET gbk;
3、庫的刪除
語法:DROP DATABASE IF EXISTS 庫名;
二、表的管理
1、表的建立
語法:CREATE TABLE IF NOT EXISTS 表名( 列名 列的型別【(長度) 約束】,
列名 列的型別【(長度) 約束】,
. . .
列名 列的型別【(長度) 約束】 )
CREATE TABLE IF NOT EXISTS book(
id INT,
bName VARCHAR(20),
bPrice DOUBLE,
authorId INT,
publishDate DATETIME
);
CREATE TABLE author(
id INT,
au_name VARCHAR(20),
nation VARCHAR(10)
)
VARCHAR(20)中20表示最大字串長度,一個字母佔一個字元,一個漢字也佔一個字元。
2、表的修改:alter
(1)可以修改列名;
語法:
ALTER TABLE 表名 CHANGE COLUMN 舊列名 新列名 新列名型別
ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME;
(2)可以修改列的型別或約束;
語法:
ALTER TABLE 表名 MODIFY COLUMN 列名 列要更改為的型別
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP;
(3)可以新增新列;
語法:
ALTER TABLE 表名 ADD COLUMN 要新增的列名 要新增列的型別
ALTER TABLE author ADD COLUMN annual DOUBLE;
(4)可以刪除列;
語法:
ALTER TABLE 表名 DROP COLUMN IF EXISTS 要刪除的列名
ALTER TABLE author DROP COLUMN IF EXISTS annual;
(5)可以修改表名。
語法:
ALTER TABLE 要修改的表名 RENAME TO 新表名
ALTER TABLE author RENAME TO author;
3、表的刪除:drop
語法:
DROP TABLE IF EXISTS 表名
DROP TABLE IF EXISTS bool_author;
4、表的複製:
(1)僅僅複製表的結構,語法如下:
CREATE TABLE 新表名 LIKE 要複製的表名
CREATE TABLE copy LIKE author;
(2)複製表的結構和資料,語法為:
CREATE TABLE 新表名 SELECT * FROM 要複製的表名
CREATE TABLE copy2 SELECT * FROM author;
(3)在(2)的基礎上,但僅僅複製部分資料和相應的欄位,語法為:
CREATE TABLE copy3 SELECT 要複製的資料列名 FROM 要複製的表名 WHERE 篩選條件
CREATE TABLE copy3 SELECT id,au_name FROM author WHERE nation='中國';
(4)僅僅複製某些欄位,語法為:
CREATE TABLE 新表名 SELECT 要複製的列名 FROM 要複製的表名 WHERE 0
CREATE TABLE copy4 SELECT id,au_name FROM author WHERE 0;
三、常見的資料型別
1、數值型:整型、小數(定點數、浮點數)
2、字元型:較短的文字(char、varchar)、較長的文字(text、blob(較長的二進位制資料))
3、日期型
(1)整型
分類:tinyint——1位元組、smallint——2位元組、mediumint——3位元組、int/integer——4位元組、bigint——8位元組
特點:
<1>如果不設定無符號還是有符號,預設是有符號,如果想設定無符號,需要新增你unsigned關鍵字。
<2>如果插入的數值超出整型的範圍,首先會報異常out of range,並且插入臨界值。
<3>如果不設定長度,會有預設的長度。長度代表了顯示的最大寬度,如果不夠會有0在左邊填充,但必須搭配ZEROFILL使用。
(2)小數
分類:浮點型——ffloat(M,D)——4位元組 double(M,D)——8位元組;定點型——decimal(M,D)——M+2位元組,可以簡寫成dec(M,D)
對於精確度要求較高的小數,建議使用定點型
特點:
<1>M和D:M代表整數部位+小數部位的總長度;D代表小數部位。如果超過範圍,則插入臨界值。M和D都可以省略。如果是decimal,則M預設為10,D預設為0;如果是float或者double,則會根據插入的數值的精度來決定精度。
<2>定點型的精確度較高,如果要求插入數值的精度較高,如:貨幣運算等,就優先考慮使用
(3)字元型
分類:
較短的文字——char和varchar、binary和varbinary(較短的二進位制)、enum用於儲存列舉、set用於儲存集合;
較長的文字——text和blob(較大的二進位制)、
特點:
<1>char(M)、varchar(M)——M的意思是指最大的字元數。
<2>char代表固定長度的字元,比較耗費空間,但效能較高一點;varchar代表可變長度字元,比較節省空間,但效能較低一些。
<3>char中M可以省略,預設為1,而varchar中M不可以省略。
(4)日期型
分類:date(只儲存日期)\datetime(儲存日期+時間)\timestamp(儲存日期+時間)\time(只儲存時間)\year(只儲存年)
特點:
datetime:8位元組、範圍1000—9999、不受時區影響
timestamp:4位元組、範圍1970—2038、受時區影響
四、常見約束
約束的含義:一種限制,用於限制表中的資料,為了保證表中的資料的準確和可靠性
六大分類:
1、NOT NULL (非空約束,用於保證該欄位的值不能為空,比如姓名、學號等)
2、DEFAULT (預設約束,用於保證該欄位有預設值,比如性別等)
3、PRIMARY KEY (主鍵約束,用於保證該欄位的值具有唯一性並且非空,比如學號、員工編號等)
4、UNIQUE (唯一約束,用於保證該欄位的值具有唯一性但可以為空,比如座位號等)
5、CHECK (檢查約束,MySQL中不支援該約束,比如檢查年齡、性別是否符合要求)
6、FOREIGN KEY (外來鍵約束,用於限制兩個表的關係,用於保證該欄位的值必須來自主表的關聯列的值)
注意,外來鍵約束是在從表中新增,用於引用主表中某列的值。比如學生表的專業編號,員工表的部門編號,工種編號等。
新增約束的時機:1、建立表時;2、修改表時
具體格式如下圖所示:
約束的新增分類:
1、列級約束(跟在欄位後面):六大約束語法上都支援,但外來鍵約束沒有效果
語法:直接在欄位名和型別後面追加約束型別即可,只支援:預設、非空、主鍵、唯一
CREATE TABLE stuinfo(
id INT PRIMARY KEY, #主鍵
stuName VARCHAR(20) NOT NULL, #非空
gender CHAR(1) CHECK (gender='男'OR gender='女'), #檢查
seat INT UNIQUE, #唯一
age INT DEFAULT 18, #預設約束
majorId INT REFERENCES major(id) #外來鍵
)
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
)
2、表級約束(脫離欄位):除了非空、預設約束,其他都支援
語法:在各個欄位的最下面,【CONSTRAINT 約束名】 約束型別(欄位名)
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id), #主鍵
CONSTRAINT ck CHECK (gender='男'OR gender='女'), #檢查
CONSTRAINT uq UNIQUE (seat), #唯一
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) #外來鍵
)
3、通用的寫法
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuname VARCHAR(20) NOT NULL,
sex CHAR(1),
seat INT UNIQUE,
age INT DEFAULT 18,
majorid INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) #外來鍵
)