資料表相關操作

HanghangzZ發表於2020-10-01

資料表是由行和列組成的二維網路,為什麼說MySQL是典型的關係型資料庫,就是因為表和表之間存在關係

資料表相關操作

  • 資料表

    • 是資料庫最重要的成分之一,資料是儲存在資料表中的
    • 資料表由行(row)和列(column)組成
    • 每個資料表中至少有一列,行可以有零行、一行或者多行組成
    • 表明要求唯一,不要含有特殊字元,最好含義明確
  • 建立表

    • CREATE TABLE [IF NOT EXISTS] tbl_name{

      欄位名稱 欄位型別 [完整性約束條件],

      欄位名稱 欄位型別 [完整性約束條件],

      }ENGINE = 儲存引擎 CHARSET = 編碼方式;

      • 欄位名稱,如:使用者名稱(userName),年齡(age),編號(id)等

        我們儘量不要使用中文,儘量使用英文

        可以使用COMMENT給欄位加註釋

      • 完整性約束條件

        • UNSIGNED:無符號,沒有負數,從0開始
        • ZEROFILL:零填充,當資料的顯示長度不夠的時候可以使用前補0的效果填充至指定長度
        • NOT NULL:非空約束,也就是插入值的時候這個欄位必須要給值,並且值不能為空值
        • DEFAULT:預設值,如果插入記錄的時候沒有給欄位賦值,則使用預設值。一般配合NOT NULL來使用
        • PRIMARY KEY:主鍵,標識記錄的唯一性,一個表只能有一個主鍵,自動禁止為空
        • UNIQUE KEY唯一性,一個表中可以有多個欄位是唯一索引,同樣的值不能重複,但是NULL值除外
        • AUTO_INCREMENT:自動增長,只能用於數值列,而且配合索引。一般我們給主鍵一個自動增長,實現一個自動化的效果。預設起始值從1開始,每次增長1。在測試UNIQUE時發現,就算記錄插入失敗了,AUTO_INCREMENT還是會自動增加。我們如果想讓它自動增長,並且在插入記錄的時候寫了它,只能給它NULL。
        • FOREIGN KEY:外來鍵約束
      • CHECK:CHECK(條件)檢查約束,在插入記錄時,必須要滿足檢查約束中的內容,條件的邏輯可以用or或者and來連線

  • MySQL中的資料型別

    • 數值型

      • 整數型[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-VAFxvdoX-1601535648940)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200923181243612.png)]

        我們可以根據我們資料物件的不同選用不同的型別。比如記錄中國的人口,那麼就有十幾億,我們就要選擇較大的型別。選擇記錄一個班級,那麼我們可以選擇TINYINT,並且應該是無符號值,因為人數不會為負數。

      • 浮點數型[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-xralRjJo-1601535648944)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200923181505157.png)]

        M代表浮點數的總長度,D代表小數點後幾位。如:(9,2)代表它的小數位是兩位,然後小數點前是七位。

        DECIMAL是定點數。

        DOUBLE型別是存在誤差的,如果對精度要求較高,可以使用定點數,因為它的內部是用字串的形式儲存數值的(我也不知道為什麼這樣精度更高(* ̄(oo) ̄))

        浮點型的儲存範圍比整數型要大。

    • 字串型別[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-W0sAp0KI-1601535648946)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200923182034771.png)]

      CHAR是一種固定長度的型別,VARCHAR則是一種可變長度的型別

      例如:

      我們定義一個地址欄位,我們寫CHAR(50),代表最大長度為50個字元,而VARCHAR(50)代表0~50個字元之間;

      在儲存空間上來說,如果只是往CHAR(50)中存入一個a,那麼也要佔用50個位元組;如果往VARCHAR(50)中存入一個a,那麼只佔用2個位元組,即長度+1個位元組(那多出來的1個是儲存我們的長度的)

      由此,CHAR是比較浪費空間的,而VARCHAR則會根據你給的內容的多少來分配空間。

      但是有好處也有弊端,因為它們的儲存方式,包括它們的檢索方式不一樣,CHAR型別的檢索速度比VARCAHR要快。可以想象成CHAR是拿空間換時間,而VARCHAR是拿時間換空間

      CHAR在儲存值的時候,如果內容達不到指定的長度,後面會用空格來填充到指定的長度,但是在檢索和查詢這個資料的時候,它會把後面的空格給去掉。而VARCHAR在儲存時不進行填充,尾部的空格會留下。這就是CHAR和VARCHAR在儲存方式上的不同

      如何選擇?

      如果明確的知道儲存內容的長度,那麼就可以使用CHAR;不固定的長度則可以選用VARCHAR。當然,如果儲存的長度大於255,那麼就不能選擇CHAR了。

      下面還有一堆TEXT型別的,可以儲存文章、新聞內容。注意:TEXT相關的列不能有預設值;檢索的時候不存在大小寫轉換,即區分大小寫;儲存效率沒有CHAR或者VARCHAR高

      **ENUM型別:**在這個型別中,每一個值都有一個序號,按序號來進行排列。儲存的時候儲存的也不是這個值,而是這個值對應的編號。列舉型別會自動過濾掉空格。

      **SET型別:**可以和ENUM型別對照的去看,同樣的每一個值都有一個序號,儲存的時候儲存的也不是這個值,而是這個值對應的編號。同樣這個值後面的空格也會把它去掉。集合還有一個特性,在插入的時候,我們不用按照它的順序來寫,它會按照指定的列表中的順序來重新排列。**應用:**使用者的許可權。如MySQL資料庫中建立資料庫,建表,增刪改查。我們可以建立集合來給不同的使用者不同的許可權

    • 日期時間型別

    • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-73RNACdA-1601535648949)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200923182322451.png)]

      TIME佔用的記憶體是3個位元組,如果我們儲存單個的時間還是可以的,將來我們可以使用整型並利用時間戳來儲存時間

      DATETIME就是TIME和DATE的結合版,不過在時間容量上沒有TIME大

      TIMESTAMP和DATETIME基本一致,插入值的形式是一樣的,不過前者的時間和日期的範圍比後者更小。並且前者是自動帶有時區的,它會根據你係統的時區來獲得值

      **YEAR:**根據手冊範圍是1000到9999,但是實際測試是1901~2155。它的佔用位元組數很小,當我們只考慮儲存年份的時候,我們可以使用year。

  • 檢視當前資料庫下已有資料表

    • SHOW TABLES;

      手冊中的語法

      SHOW [EXTENDED] [FULL] TABLES
      [{FROM | IN} db_name]
      [LIKE ‘pattern’ | WHERE expr]

      其中FULL是預設的,也可以不寫,使用FROM或者IN可以不用開啟資料庫就檢視錶,最後一行是帶有正規表示式的語句,我們先暫時不用理他

  • 檢視指定資料表的詳細資訊

    • SHOW CREATE TABLE tbl_name;
  • 檢視錶結構

    • DESC tbl_name;
    • DESCRIBE tbl_name;
    • SHOW COLUMNS FROM tbl_name;
  • 刪除指定的資料表

    • DROP TABLE [IF EXISTS] tbl_name;
  • 查詢表中所有記錄

    • SELECT * FROM tbl_name 其中*表示所有的欄位,如果寫的是*,那麼所有的欄位都會被查出來
  • 查詢非預設資料庫中的表資訊

    • SELECT * FROM db_name.tbl_name;

因為欄位名稱會一下子定義很多個,所以我們可以先在編輯器裡面打好,然後再複製到命令列中去(但是我複製到命令列後,在編輯器裡不同行的語句直接都擠到了一起,難受死了/(ㄒoㄒ)/~~)

例項:使用者名稱錶

-- 使用者名稱錶
CREATE TABLE IF NOT EXISTS imooc_user(
id INT,
username VARCHAR(20),
password CHAR(32),
email VARCHAR(50),
age TINYINT,
card CHAR(18),
tel CHAR(11),
salary FLOAT(8,2),
married TINYINT(1),
addr VARCHAR(100),
sex ENUM('男','女','保密')
)ENGINE=INNODB,CHARSET=UTF8;	#這裡它預設的儲存引擎就是這個東東

-- 向表中插入記錄
-- INSERT [INTO] tbl_name(id,username,...) VALUES(1,...)
INSERT INTO imooc_user(id,username,password,email,age,card,tel,salary,married,addr,sex) 
VALUES(1,'hanghang','hanghang','1005130450@qq.com',20,330328200103273913,15258496596,0,0,'浙江省','男');

-- 查詢表中所有記錄 SELECT * FROM tbl_name     其中*表示所有的欄位,如果寫的是*,那麼所有的欄位都會被查出來

INSERT INTO imooc_user(id,username,password,email,age,card,tel,salary,married,addr,sex)
VALUES(-5,'hanghang','hanghang','1005130450@qq.com',127,'330328200103273913','15258496596',0,1,'浙江省','女');

測試資料型別

測試整型

-- 測試整型
CREATE TABLE test_int(
	a TINYINT,
    b SMALLINT,
    c MEDIUMINT,
    d INT,
    f BIGINT
);

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-tU5y5JUr-1601535648952)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200923202800681.png)]

我們在建立表的時候並沒有給上括號,但是在建立後檢視錶結構,發現每一個後面都跟著一個括號,我們來拿tinyint舉例說明。

這裡面的(4)表示的是顯示寬度,tinyint我們沒有指定它是否無符號,它的範圍是從-128~127,負數-128顯示的時候正好是4位,所以寬度位4。其它幾項亦如此

-- 可以只插入一個值
INSERT INTO test_int(a) VALUES(-128);
INSERT INTO test_int(a) VALUES(-129);

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-O0QqGdIa-1601535648953)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200923203525422.png)]

超出範圍,會報錯,並且無法插入

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-WFRM0Hn8-1601535648954)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200923203949052.png)]

測試無符號整型

-- 測試無符號
CREATE TABLE test_unsigned(
	a tinyint,
    b tinyint unsigned
);
INSERT INTO test_unsigned(a,b) VALUES(-12,-12);
INSERT INTO test_unsigned(a,b) VALUES(0,0);
INSERT INTO test_unsigned(a,b) VALUES(0,256);

同理,超出範圍直接報錯

測試零填充

-- 測試零填充 ZEROFILL
CREATE TABLE test_int1(
	a TINYINT ZEROFILL,
    b SMALLINT ZEROFILL,
    c MEDIUMINT ZEROFILL,
    d INT ZEROFILL,
    f BIGINT ZEROFILL
);
INSERT test_int1(a,b,c,d,f) VALUES(1,1,1,1,1);

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-2dCe5UCz-1601535648954)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200923205726832.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-blnmA4r3-1601535648955)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200923205648615.png)]

我們可以發現加了零填充之後,直接就加上了unsigned,就不能位負了,tinyint括號裡面的數字也變成了3

但是這個顯示長度並不能限制我們插入資料的一個結果,它只是為了資料結構格式的統一與好看

CREATE TABLE test_int2(
	a tinyint(2),
    b smallint(2)
);
INSERT INTO test_int2(a,b) VALUES(123,4567);

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-276ZAnMi-1601535648956)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200923210747219.png)]

測試浮點型

-- 測試浮點型
CREATE TABLE test_float(
	a FLOAT(6,2),
    b DOUBLE(6,2),
    c DECIMAL(6,2)
);
INSERT INTO test_float(a,b,C) VALUES(4.143,4.146,4.149);

CREATE TABLE test_float1(
	a FLOAT,
    b DOUBLE,
    c DECIMAL
);
INSERT INTO test_float1(a,b,C) VALUES(4.143,4.146,4.149);
INSERT INTO test_float1(a,b,C) VALUES(4.143,4.146,4.649);

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-FoZIWfLN-1601535648956)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200924193445014.png)]

我們在test_float表中,給各個欄位的浮點型設定了小數點位數為2位。我們可以發現,它們都保留兩位小數並進行了四捨五入。但是decimal報了警告被截斷。我們繼續來看test_float1表。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-hYp4uv7f-1601535648957)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200924193903606.png)]

這一次,我們沒有給它們設定小數點位數的限制,但是decimal又進行了四捨五入,並且還是報了被截斷的警告,下面也同理,這是因為decimal預設儲存的是整數,如果對精度要求較高,選擇decimal型別??????

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Sc2fEAvq-1601535648957)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200924194001813.png)]

測試字串

測試CHAR和VARCHAR

-- 測試CHAR和VARCHAR
CREATE TABLE test_str(
	a CHAR(5),
    b VARCHAR(5)
);
INSERT INTO test_str(a,b) VALUES('','');
INSERT INTO test_str(a,b) VALUES('a','a');
INSERT INTO test_str(a,b) VALUES('ab','ab');
INSERT INTO test_str(a,b) VALUES('abc','abc');
INSERT INTO test_str(a,b) VALUES('abcd','abcd');
INSERT INTO test_str(a,b) VALUES('abcde','abcde');
INSERT INTO test_str(a,b) VALUES('abcdef','abcdef');

INSERT INTO test_str(a,b) VALUES(' 123 ',' 123 ');

SELECT CONCAT('*',a,'*'),CONCAT('*',b,'*') FROM test_str;

前面的插入都是正常的

我們用第14行和第16行的語句來體現CHAR和VARCHAR的不同,第16行的語句也就是在欄位的前後加東西

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Yw86aUI1-1601535648958)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200924201158875.png)]

我們可以發現在char那裡末尾的空格給刪掉了,這是因為CHAR在儲存值的時候,如果內容達不到指定的長度,後面會用空格來填充到指定的長度,但是在檢索和查詢這個資料的時候,它會把後面的空格給去掉。這就是CHAR和VARCHAR在儲存方式上的不同。

測試TEXT不能有預設值

-- 測試TEXT不能有預設值
CREATE TABLE test_str1(
	context TEXT DEFAULT 'THIS IS A TEXT'
);

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-cbNLthxp-1601535648959)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200924202827733.png)]

測試enum型別

-- 測試enum
CREATE TABLE test_enum(
	sex ENUM('男','女','保密')
);
INSERT INTO test_enum(sex) VALUES('男');
INSERT INTO test_enum(sex) VALUES('男1');
-- 沒有指定這個欄位不能為空,所以可以指定這個NULL值
INSERT INTO test_enum(sex) VALUES(NULL);
-- 1對應的是男
INSERT INTO test_enum(sex) VALUES(1);
INSERT INTO test_enum(sex) VALUES(3);
INSERT INTO test_enum(sex) VALUES(5);

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-KeBsbsRp-1601535648959)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200924204602796.png)]

插入enum中不存在的東東,是會報錯的。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-cVFA2dYp-1601535946439)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200924204652786.png)]

沒有指定這個欄位不能為空,所以可以指定這個NULL值。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-U6RJJoms-1601535648961)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200924204800647.png)]

這個下標對應的從1開始,如果超出列舉數目則會報錯

CREATE TABLE test_enum1(
	sex ENUM('男      ','女','保密    ')
);
INSERT INTO test_enum1(sex) VALUES('男');

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-eJZfi98g-1601535648961)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200924205053890.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-MmNQjP4M-1601535648962)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200924205104576.png)]

列舉型別會自動過濾掉空格

測試SET型別

-- 測試SET
CREATE TABLE IF NOT EXISTS test_set(
	a SET('A','B','C','D','E','F')
);

INSERT INTO test_set(a) VALUES('A');
INSERT INTO test_set(a) VALUES('C');
INSERT INTO test_set(a) VALUES('C,D,E');
-- 會自動地幫你排序好
INSERT INTO test_set(a) VALUES('C,F,A');
-- 插入集合中沒有地會報錯,插入失敗
INSERT INTO test_set(a) VALUES('C,F,A,H');
-- 插入序號為2的那一項
INSERT INTO test_set(a) VALUES(2);
-- 會轉換大小寫,集合中是大寫地,插入小寫地也插入成功了
INSERT INTO test_set(a) VALUES('c,f,a');

1~8行都是顯然的

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-gd4gJEYM-1601535648963)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200925185637750.png)]

第十行,會自動幫你按照你建立欄位時的順序幫你排序好。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-krrHE2s1-1601535648963)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200925185648243.png)]

第十二行,插入集合中沒有的東東會報錯

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-eGxySKMZ-1601535648965)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200925185710627.png)]

第十四行插入的是序號為2的那一項

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-sMZsMoDT-1601535648966)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200925185748956.png)]

第十六行,會自動地轉換大小寫

測試日期和時間型別

測試TIME型別

-- 測試日期時間型別
-- TIME型別的時間範圍是-838:59:59~838:59:59    HH:MM:SS
-- 為什麼會這麼大呢 其實還有可選的定義方式 [D] HH:MM:SS
-- D表示天數,範圍為0~34,如:2 3:23:45 即 51:23;45    所以才會有那麼大的範圍
-- 測試TIME型別
CREATE TABLE IF NOT EXISTS test_time(
	a TIME
);

INSERT INTO test_time(a) VALUES('12:43:45');
INSERT INTO test_time(a) VALUES('2 12:43:45');
INSERT INTO test_time(a) VALUES('22:22');
INSERT INTO test_time(a) VALUES('22');

-- ERROR 1292 (22007): Incorrect time value: '22:' for column 'a' at row 1
INSERT INTO test_time(a) VALUES('22:');

INSERT INTO test_time(a) VALUES('2 22');

-- 相當於HHMMSS
INSERT INTO test_time(a) VALUES('121212');

-- 都相當於00:00:00
INSERT INTO test_time(a) VALUES(0);
INSERT INTO test_time(a) VALUES('0');

INSERT INTO test_time(a) VALUES(1212); -- 00:12:12
INSERT INTO test_time(a) VALUES(121212); -- 12:12:12

-- ERROR 1292 (22007): Incorrect time value: '787878' for column 'a' at row 1
INSERT INTO test_time(a) VALUES(787878);

-- 系統函式NOW()和CURRENT_TIME會直接取當前系統時間 
 INSERT INTO test_time(a) VALUES(NOW());
 INSERT INTO test_time(a) VALUES(CURRENT_TIME());

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-exmBtGmH-1601535648967)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200925193407640.png)]

測試DATA型別

 -- 測試DATA型別 YYYYMMDD YYYY-MM-DD
 CREATE TABLE IF NOT EXISTS test_date(
	a DATE
 );
 INSERT INTO test_date(a) VALUES('2020-9-25');
 INSERT INTO test_date(a) VALUES('2020-09-01');
 INSERT INTO test_date(a) VALUES('4007-03-27');
 -- 會自動轉換成4007-12-12
 INSERT INTO test_date(a) VALUES('40071212');
 
 -- MySQL中還支援一些不嚴格的語法格式 可以指定一些任意的分隔符,來當作我們日期時間的分割符,但是讀出表後還是-連線的
 INSERT INTO test_date(a) VALUES('4007.11.11');
 INSERT INTO test_date(a) VALUES('4008@12@12');
 -- ERROR 1292 (22007): Incorrect date value: '4009.13.13' for column 'a' at row 1
 INSERT INTO test_date(a) VALUES('4009.13.13');
 
 -- 還可以使用兩位的年份,在70~99之間,會轉換成1970~1999;在00~69之間會轉換成2000~2069之間
 -- YY-MM-DD YYMMDD
 INSERT INTO test_date(a) VALUES('780902');
 INSERT INTO test_date(a) VALUES('690327');
 
 -- 使用庫函式插入系統時間
 INSERT INTO test_date(a) VALUES(NOW());
 INSERT INTO test_date(a) VALUES(CURRENT_DATE);

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-FELgKQmb-1601535648967)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200925195705520.png)]

在第23行使用NOW()插入系統時間會報警告,顯示又有時間又有日期,但是前面測試TIME的時候並沒有出現這樣的問題

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-67GQAKVk-1601535648968)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200925195754813.png)]

測試DATETIME型別

 -- 測試DATETIME型別
 CREATE TABLE IF NOT EXISTS test_datetime(
	a DATETIME
 );
 INSERT INTO test_datetime(a) VALUES('2020-09-01 00:00:00');
 -- 1972-03-05 12:12:12
 INSERT INTO test_datetime(a) VALUES('720305121212');
 
 -- 使用庫函式插入時間
 INSERT INTO test_datetime(a) VALUES(NOW());

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Qzi1mKmD-1601535648969)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200925200809947.png)]

測試TIMESTAMP型別

 -- 測試TIMESTAMP
 CREATE TABLE IF NOT EXISTS test_timestamp(
	a TIMESTAMP
 );
 INSERT INTO test_timestamp(a) VALUES('1978-10-23 12:12:12');
 
 -- 插入CURRENT_TIMESTAMP得到當前系統時間和日期
 INSERT INTO test_timestamp(a) VALUES(CURRENT_TIMESTAMP);
 INSERT INTO test_timestamp(a) VALUES(NULL);

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-R1wpjnX3-1601535648970)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200925202317828.png)]

測試完整性約束條件

測試主鍵和AUTO_INCREMENT

-- 測試主鍵
CREATE TABLE IF NOT EXISTS test_primary_key(
	id INT UNSIGNED PRIMARY KEY,
    username VARCHAR(20)
);
INSERT INTO test_primary_key(id,username) VALUES(1,'king');
-- ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
INSERT INTO test_primary_key(id,username) VALUES(1,'king123');

-- ERROR 1364 (HY000): Field 'id' doesn't have a default value
INSERT INTO test_primary_key(username) VALUES('queen');

-- 不打PRIMARY的表結構和打了是一樣的
CREATE TABLE IF NOT EXISTS test_primary_key1(
	id INT UNSIGNED KEY,
    username VARCHAR(20)
);

-- 還可以通過PRIMARY KEY(id)的方式來指定主鍵 對於多欄位主鍵 用這種方式比較方便
CREATE TABLE IF NOT EXISTS test_primary_key2(
	id INT UNSIGNED,
    username VARCHAR(20),
    PRIMARY KEY(id)
);

-- ERROR 1068 (42000): Multiple primary key defined
-- 一個表只能有一個主鍵 但是一個表可以有複合主鍵(很多個欄位共同組成的主鍵)
CREATE TABLE IF NOT EXISTS test_primary_key3(
	id INT UNSIGNED PRIMARY KEY,
    courseId INT UNSIGNED PRIMARY KEY,
    username VARCHAR(20),
	email VARCHAR(50)
);

我們可以通過檢視錶結構來觀察,可以看到id的Key那一欄標了PRI,Null那一欄標了NO

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-ToVZepbC-1601535648971)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200925214019860.png)]

複合主鍵

-- 複合主鍵
CREATE TABLE IF NOT EXISTS test_primary_key4(
	id INT UNSIGNED,
    courseId VARCHAR(20),
    username VARCHAR(20),
	email VARCHAR(50),
    PRIMARY KEY(id, courseId)
);

-- 1-a
INSERT INTO test_primary_key4(id,courseId,username,email)
VALUES(1,'a','king','1005130450@qq.com');

-- 1-b
INSERT INTO test_primary_key4(id,courseId,username,email)
VALUES(1,'b','king','1005130450@qq.com');

-- 2-a
INSERT INTO test_primary_key4(id,courseId,username,email)
VALUES(2,'a','king','1005130450@qq.com');

-- 1-a
-- ERROR 1062 (23000): Duplicate entry '1-a' for key 'PRIMARY'
INSERT INTO test_primary_key4(id,courseId,username,email)
VALUES(1,'a','king','1005130450@qq.com');

觀察一下它的表結構,它實際上就是一個由多個欄位組合起來的鍵

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-6nHMFiMk-1601535648971)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200925214241522.png)]

測試AUTO_INCREMENT

-- 測試AUTO_INCREMENT
-- 這個AUTO_INCRMENT要配合主鍵來使用,如果往不是主鍵的欄位上面來加,就會報下面的錯誤
-- ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
CREATE TABLE test_auto_increment(
	id INT UNSIGNED KEY AUTO_INCREMENT,
    username VARCHAR(20)
);
INSERT INTO test_auto_increment(username) VALUES('a');
INSERT INTO test_auto_increment(username) VALUES('b');
INSERT INTO test_auto_increment(username) VALUES('c');
-- 可以直接在id的VALUE那填NULL或者DEFAULT,它可以自動實現增長
INSERT INTO test_auto_increment(id,username) VALUES(NULL,'d');
INSERT INTO test_auto_increment(id,username) VALUES(DEFAULT,'e');
-- 也可以直接跳著自己指定,不過這樣子下一個增長的id就變成了16
INSERT INTO test_auto_increment(id,username) VALUES(15,'f');

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-KY1QUnNC-1601535648972)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200925214427485.png)]

這裡的AUTO_INCREMENT就是下一次自動增長成的值

測試非空

-- 測試非空
CREATE TABLE IF NOT EXISTS test_not_null(
	a VARCHAR(20),
    b VARCHAR(20) NOT NULL
);
INSERT INTO test_not_null(a,b) VALUES('','');
-- ERROR 1048 (23000): Column 'b' cannot be null
INSERT INTO test_not_null(a,b) VALUES(NULL,NULL);
INSERT INTO test_not_null(a,b) VALUES(NULL,'abc');

-- ERROR 1364 (HY000): Field 'b' doesn't have a default value
-- 檢視錶結構我們可以發現 欄位b的NULL那一欄是NO,代表不能為空 但是它的default那一欄是NULL 所以這就起了矛盾
INSERT INTO test_not_null(a) VALUES('TEST');

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-f06TnXd1-1601535648973)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200926161449793.png)]

測試預設值

-- 測試預設值default
CREATE TABLE IF NOT EXISTS test_default(
	id INT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(20) NOT NULL,
    age TINYINT UNSIGNED DEFAULT 18,
    email VARCHAR(50) NOT NULL DEFAULT '1005130450@qq.COM'
);
INSERT INTO test_default(username) VALUES('HANGHANG');
-- 給帶有預設值的值賦值,會將預設值覆蓋掉
INSERT INTO test_default(username,age,email) VALUES('B',30,'imooc@qq.com');
INSERT INTO test_default(username,age,email) VALUES('C',NULL,'izhu@qq.com');
-- ERROR 1048 (23000): Column 'email' cannot be null
INSERT INTO test_default(username,age,email) VALUES('D',NULL,NULL);

-- 打default就是插入預設值
INSERT INTO test_default(username,age,email) VALUES('E',NULL,DEFAULT);

-- 列舉型別配合default
CREATE TABLE IF NOT EXISTS test_default1(
	sex ENUM('男','女','保密') NOT NULL DEFAULT '保密'
);
INSERT INTO test_default1(sex) VALUES(DEFAULT);

-- 給列舉型別設定預設值的時候 如果不設定在列舉項中的預設值會報錯
-- ERROR 1067 (42000): Invalid default value for 'sex'
CREATE TABLE IF NOT EXISTS test_default2(
	sex ENUM('男','女','保密') NOT NULL DEFAULT '不是列舉中的'
);

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-FLAYbC7P-1601535648973)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200926163756997.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Jwdmc5kA-1601535648974)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200926163812172.png)]

學完資料型別和完整性約束條件後重建使用者表

-- 學完資料型別、完整性約束條件後重寫使用者名稱錶 
CREATE TABLE IF NOT EXISTS `imooc_user1`(
	`id` INT UNSIGNED AUTO_INCREMENT KEY COMMENT '使用者編號',
    `username` VARCHAR(20) NOT NULL UNIQUE COMMENT '使用者名稱',
    `password` VARCHAR(32) NOT NULL COMMENT '密碼',
    `email` VARCHAR(50) NOT NULL UNIQUE COMMENT '郵箱',
    `age` TINYINT NOT NULL DEFAULT 18 COMMENT '年齡',
    `sex` ENUM('男','女','保密') NOT NULL DEFAULT '保密' COMMENT '性別,預設為保密',
    `tel` CHAR(11) NOT NULL UNIQUE COMMENT '電話號碼',
    `addr` VARCHAR(50) NOT NULL COMMENT '住址',
    `card` CHAR(18) NOT NULL UNIQUE COMMENT '身份證號碼',
    `married` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '非0已婚,0為未婚',
    `salary` FLOAT(8,2) NOT NULL DEFAULT 0 COMMENT'工資'
)ENGINE=INNODB DEFAULT CHARSET=UTF8;

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-IH3keV9U-1601535648974)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200926182224537.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-KVKusVWV-1601535648975)(C:\Users\杭杭\AppData\Roaming\Typora\typora-user-images\image-20200926182235503.png)]

相關文章