前端學習mysql的詳細圖文記錄

讓我嘮叨

原本寫了一大堆廢話,想一想仍是刪了。html

本文主要記錄學習 sql 語句的使用,看完這些也不能讓你成爲數據庫高手,只是會對數據庫有了一個清晰的概念,會用原始的 sql 語句去操控數據庫,僅此而已。學習是沒有盡頭的,堅持下去也許能看到指望的風景(自我雞湯)。前端

右側目錄沒顯示全,只有展開全部的內容纔會顯示全~mysql

mysql安裝

原本不想囉嗦這部分,畢竟網上太多安裝mysql的教程了,但最後仍是決定寫上個人安裝步驟以看成參考。但由於個人平臺是 mac,因此此安裝步驟只適用於 mac,須要的能夠看下。sql

展開查看安裝詳情

我是直接官網下載安裝包的,選擇的是社區版5.7.27,你能夠自行去下載本身要的版本,5.7版下載地址:傳送門數據庫

安裝

下載安裝包後直接雙擊安裝,一路回車,須要注意的就是當安裝好後會有一個彈窗提示,這樣的:vim

紅框裏的是mysql默認登陸密碼,須要保存。若是忘記保存,在右側的系統通知欄裏也會有,如圖:rQn2d1Xr%L9*bash

啓動

安裝完畢,打開系統偏好設置,最下方會有一個mysql設置,點擊進去啓動mysql:服務器

設置環境變量

爲了方便在命令行操做mysql,須要先設置一下環境變量。函數

  1. 進入目錄/usr/local/mysql/bin/,查看是否有mysql(默認安裝的路徑)
  2. 執行vim ~/.bash_profile
  3. .bash_profile文件中添加PATH=$PATH:/usr/local/mysql/bin語句,而後在英文輸入法下按 esc,而後輸入 wq 保存退出
  4. 最後在命令行輸入source ~/.bash_profile

修改mysql登陸密碼

默認密碼不方便記,修改本身的密碼,因爲已經設置過環境變量,因此直接執行如下命令:學習

mysqladmin -u root -p 123456

// 123456 是我設置的新密碼,替換成你想要設置的密碼
// 回車後會提示你輸入密碼,這個密碼就是上面說的安裝後默認給的密碼
複製代碼

輸入密碼後沒報錯就是修改密碼成功了,但也可能報下面這個錯誤:

若是出現此錯誤,個人作法是用默認密碼登陸一次mysql,而後再設置新密碼,步驟:

  1. 執行 mysql -uroot -p,這個是登陸命令,回車後輸入默認密碼
  2. 登陸成功後,執行 SET PASSWORD = PASSWORD('123456');設置新密碼

此時新密碼也設置成功了。

登陸mysql

修改密碼後,用新密碼登陸測試如下,登陸命令是:

mysql -uroot -p
複製代碼

回車後輸入新密碼便可。

mysql的登陸及退出

從這裏開始,須要你已經正確安裝好了mysql。

查看mysql的登陸退出

登陸的兩種方法

  1. 命令行執行mysql -uroot -p,而後回車輸入密碼
  2. 或者直接執行 mysql -uroot -p123456123456是個人密碼,替換成你的密碼

退出的三種方法

在mysql交互界面輸入 exit 或輸入 quit或輸入\q,回車

建立數據庫

登陸mysql後,就能夠執行SQL語句來操做數據庫了,從建立數據庫開始。

查看建立數據庫詳情

常規建立數據庫

執行如下命令:

CREATE DATABASE db_name;
或者
CREATE SCHEMA db_name;

// db_name 是數據庫名,不能包含特殊字符和 MYSQL 關鍵字,最好是有意義的。
複製代碼

注意:sql語句是能夠小寫的,如:create database db_name。後面我爲了區分自定義的庫名和表名,全部sql命令都使用大寫。

例子:

注意:sql語句後要以 `;` 結尾,或者 `\g`結尾

若是數據庫名非要使用 MYSQL 關鍵字命名,可使用 `` 來包括,例如建立一個名爲database的數據庫:

檢測庫名建立數據庫

若是重複建立數據庫是會報錯的,如:

若是不想報錯,能夠帶檢測庫名的去建立數據庫,命令:

CREATE DATABASE IF NOT EXISTS db_name;
複製代碼

此時重複建立就不會報錯了,而是給出警告:

查看警告,可執行命令:SHOW WARNINGS;

指定編碼建立數據庫

在建立數據庫時能夠同時指定編碼,使用命令:

CREATE DATABASE [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset;

// [] 中是可選語句,charset 是你要指定的編碼類型,如‘UTF8’,'GBK'複製代碼

例子:

要想修改數據庫的編碼,可以使用命令:ALTER DATABASE db_name [DEFAULT] CHARACTER SET [=] charset; // charset 是要修改的編碼方式

數據庫相關操做

查看數據庫相關操做

查看數據庫

建立數據庫後,須要查詢操做。

查看當前服務器下所有數據庫

SHOW DATABASES;
或者 SHOW SCHEMAS;
複製代碼

查看指定數據庫的詳細信息

SHOW CREATE DATABASE db_name;
複製代碼

例子:

使用數據庫

當要具體操做一個數據庫時,好比插入數據,須要先使用這個數據庫,使用命令:

USE db_name;
複製代碼

此時就能夠針對當前這個數據庫進行操做了。而有時可能會忘記了當前使用的是哪一個數據庫,那麼可使用下面這個命令來查看:

SELECT DATABASE();
或者 SELECT SCHEMA();
複製代碼

刪除數據庫

刪除數據庫使用命令:

DROP DATABASE [IF EXISTS] db_name;
複製代碼

例子:

數據類型

保存在數據庫中的數據都有本身的類型,選用合適的字段類型對數據庫的優化很是重要。MYSQL中的數據類型大體能夠分爲三類:數值字符串日期,趕忙來了解下吧。

查看數據類型

數值類型

數值類型又可分爲: 整數型浮點型

整數型

數據類型 存儲範圍 字節
TINYINT 有符號值:-128 到 127
無符號值:0 到 255
1
SMALLINT 有符號值:-32768 到 32767
無符號值:0 到 65535
2
MEDIUMINT 有符號值:-8388608 到 8388607
無符號值:0 到 16777215
3
INT 有符號值:-2147483648 到 2147483647
無符號值:0 到 4294967295
4
BIGINT 有符號值:-9223372036854775808 到 9223372036854775808
無符號值:0 到 18446744073709551615
8
BOOL,BOOLEAN 等價於TINYINT(1),0爲false,其他爲true 1

浮點型

數據類型 存儲範圍 字節
FLOAT[(M,D)] 負數取值範圍爲-3.40E+38 到 -1.17E-3八、0和1.175E-38 到 3.40E+38。
M是數字總位數,D是小數點後面的位數。若是M和D被省略,根據硬件容許的限制來保存值。單精度浮點數精確到大約7位小數位。
4
DOUBLE[(M,D)] -1.79E+308 到 -2.22E-30八、0和2.22E-308 到 1.79E+308。 8
DECIMAL[(M,D)] 和DOUBLE同樣,內部以字符串形式存儲值 M+2

字符串類型

數據類型 存儲範圍 用途
CHAR(M) 0<=M<=255 定長字符串
VARCHAR(M) 0<=M<=65535 變長字符串
TINYTEXT 0~255字節 短文本字符串
TEXT 0~65535字節 長文本數據
MEDIUMTEXT 0~16777215字節 中等長度文本數據
LONGTEXT 0~4294967295字節 極大文本數據
ENUM('value1','value2',...) 最多65535個值 枚舉
SET('value1','value2',...) 最多64個成員 集合

日期類型

數據類型 存儲範圍 格式
TIME '-838:59:59'/'838:59:59' HH:MM:SS
DATE 1000-01-01/9999-12-31 YYYY-MM-DD
DATETIME 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS
TIMESTAMP 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 YYYYMMDD HHMMSS
YEAR 1901~2155 YYYY

這些類型都會在後面使用到,而且文章後面還有一個 補充 章節,會介紹一些沒用到的類型的使用。

數據表

數據表是數據庫最重要的組成部分之一,數據是保存在數據表中的;數據表由行(row)和列(column)組成,每一個數據表中至少有一列,行能夠有零行一行和多行;數據表名是惟一的,不可包含特殊字符,最好含義明確。

查看數據表相關

建立數據表

建立數據表需按照下面的方式建立:

CREATE TABLE [IF NOT EXISTS] tbl_name(
    字段名稱 字段類型 [完整性約束條件],
    字段名稱 字段類型 [完整性約束條件],
    ...
)[ENGINE=存儲引擎 CHARSET=編碼方式];
複製代碼

來看一下各個點的含義:

  • tbl_name:表示數據表名稱,不要包含特殊字符和 MYSQL 關鍵字,最好是有意義的;
  • 字段名稱:不用多說,就是咱們前端常常從接口裏獲取的字段;
  • 字段類型:即字段的數據類型,前面已經列舉了;
  • 完整性約束條件:可加可不加,後面會詳細說,暫時無論;
  • 存儲引擎:mysql有兩種存儲引擎,分別是InnoDBMyISAM。當不指定存儲引擎時,默認是InnoDB。兩種存儲引擎的區別因爲我也不是很熟,因此就不說了,默認的便可;
  • 編碼方式:通常設置爲UTF8,默認也爲UTF8

如今來嘗試建立一個表:

CREATE TABLE IF NOT EXISTS user(
    id INT,
    username VARCHAR(20),
    password CHAR(32),
    email VARCHAR(50),
    addr VARCHAR(100),
    sex ENUM('男','女','保密')
)ENGINE=INNODB CHARSET=UTF8;
複製代碼

將這段代碼拷貝到mysql命令行:

會發現沒有成功,報錯 No database selected。這是由於表要創建在數據庫裏,因此咱們要先建立一個數據庫,並使用這個數據庫,以下:

-- 建立數據庫 user_demo(後面的例子都使用這個數據庫)
CREATE DATABASE IF NOT EXISTS user_demo DEFAULT CHARACTER SET = UTF8;

-- 使用數據庫
USE user_demo;

複製代碼

再次執行上面的建立表操做就能夠了:

查看數據表

查看當前數據庫下已有數據表使用命令:

SHOW TABLES;
複製代碼

能夠看到第一行提示 Tables_in_user_demo,表示這是在數據庫user_demo裏的全部數據表。因此查看數據表以前也須要使用 USE 命令先打開某一個數據庫。

查看數據表也能夠不用先打開數據庫,使用以下命令:

SHOW [FULL] TABLES [{FROM | IN} db_name];
複製代碼

除了這個命令外,其餘對於表的操做都須要先 USE 一下某數據庫。

查看指定數據表的詳細信息

查看某一個數據表的詳細信息,使用命令:

SHOW  CREATE TABLE tbl_name;
複製代碼

查看錶結構

查看錶結構有如下三種命令方式,效果都是同樣的:

DESC tbl_name;

DESCRIBE tbl_name;

SHOW COLUMNS FROM tbl_name;
複製代碼

刪除指定的數據表

刪除命令:

DROP TABLE [IF EXISTS] tbl_name;
複製代碼

完整性約束條件

上面說到了怎麼建立一個數據表,可是咱們沒有用到那個完整性約束條件,這裏就來仔細說下什麼是完整性約束。

查看完整性約束條件

什麼是完整性約束?爲何使用?

完整性約束是爲了防止不合規範的數據進入數據庫。當建表時指定了約束條件,那麼用戶在進行增刪改等操做時會自動按照約束條件進行檢查,從而讓不合規範的數據不能進入到數據庫,保證數據的完整和一致性,也能提升程序運行效率,下降程序複雜性。

約束類型

經常使用約束條件以下:

  • UNSIGNED:無符號,沒有負數,從0開始,應用於數值類型。
  • ZEROFILL:0填充,當數值類型的數據長度不夠時,使用前補0的方式填充至指定長度,自動添加 UNSIGNED
  • NOT NULL:非空約束,插入值的時候這個字段必需要給值,值不能爲空值。
  • DEFAULT:默認值,若是插入記錄的時候沒有給字段賦值,則使用默認值。
  • PRIMARY KEY:主鍵,標識記錄的惟一性,值不能重複,一個表只能有一個主鍵,自動禁止爲空。
  • UNIQUE KEY:惟一性,一個表中能夠有多個字段是惟一索引,一樣的值不能重複,但NULL值除外。
  • AUTO_INCREMENT:自動增加,用於數值列,默認從1開始。
  • FOREIGN KEY:外鍵約束(外鍵部分本文先不涉及)。

測試 UNSIGNED 和 ZEROFILL

UNSIGNEDZEROFILL 主要應用在整型上,下面以建立整型數值舉例。

UNSIGNED 無符號約束

創建以下數據表:

CREATE TABLE test_unsigned(
    a tinyint,
    b tinyint UNSIGNED
);
複製代碼

a 和 b 都是 tinyint 類型,b 加上了無符號約束,即不可爲負數。如今插入第一組數據:

INSERT test_unsigned(a,b) VALUES(-15,-15)

-- 提早認識如下插入數據的命令,本章節會一直使用此條命令,後面會詳細說添加數據相關操做
-- 字段名稱 跟 值 一一對應
INSERT tbl_name(字段名稱,...)VALUES(值,...)
複製代碼

很明顯數據沒有插入成功,由於b被約束不可爲負數,但插入的值是負數,因此提示 b 超出了範圍。

如今把 b 改成正數:

INSERT test_unsigned(a,b) VALUES(-15,15);
複製代碼

此次就成功插入了數據。

ZEROFILL 零填充約束

創建以下表格:

CREATE TABLE test_int(
    a tinyint ZEROFILL,
    b smallint ZEROFILL,
    c mediumint ZEROFILL,
    d int ZEROFILL,
    e bigint ZEROFILL
);
複製代碼

表中全部字段是不一樣類型的整型,他們的區別是值的範圍,表現效果上就是顯示的寬度不同,能夠看看它們的寬度:

圖中紅線框住的就是默認寬度,注意寬度指的是顯示長度,不是存儲長度。tinyint的默認寬度原本應該是4,由於它的值範圍最小是 -128,加上-就是4位了,可是加上ZEROFILL約束會自動加上無符號約束,因此如今寬度是3,其餘的整型同理。

來插入一組數據:

INSERT test_int(a,b,c,d,e) VALUES(1,1,1,1,1);
複製代碼

如圖所示,咱們插入的數值都是1,可是結果都前補0了,使得寬度達到默認寬度。這就是加上 ZEROFILL 約束後的效果,當數據的長度不夠它的默認寬度時,會前補0填充至默認寬度。

其實寬度是能夠自定義的,好比:

CREATE TABLE test_int1(
    a tinyint(2),
    b tinyint(2)
);
複製代碼

但其實此時插入的數據長度並無被限制,如:

INSERT test_int1(a,b) VALUES(12,123);
複製代碼

可見,b的長度已經超過了設定的寬度,但依舊能夠被插入,只要沒有超過類型的存儲長度就行。

測試非空約束 NOT NULL

建立以下數據表:

-- 給b字段加上非空約束

CREATE TABLE test_not_null(
    a VARCHAR(20),
    b VARCHAR(20) NOT NULL
);
複製代碼

查看錶結構,能夠看到字段b是不容許爲 NULL 的。

如今再依次插入如下數據:

-- 注意 '' 不是空值,不等於 null,因此能夠插入此條數據
INSERT test_not_null(a,b) VALUES('','');

-- Column 'b' cannot be null. b不能夠爲null,此條數據插入報錯
INSERT test_not_null(a,b) VALUES(NULL,NULL);

-- a 字段沒有限制不可爲空,因此此條數據插入插入成功
INSERT test_not_null(a,b) VALUES(NULL,'b');

-- b 沒有設置默認值,也沒有插入數據,因不能爲空,因此此條數據插入報錯
INSERT test_not_null(a) VALUES('a');
複製代碼

來看一下結果:

可見只成功插入了第一條和第三條數據。這麼看可能不明顯,咱們用 * 來標記下:

-- 在字段及數據兩邊加上 * 顯示
SELECT CONCAT('*',a,'*'),CONCAT('*',b,'*') FROM test_not_null;
複製代碼

測試默認值 DEFAULT

建立表格以下:

CREATE TABLE test_default(
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(20) NOT NULL,
    age TINYINT UNSIGNED DEFAULT 18
);
複製代碼

能夠看到 age字段有咱們設置的默認值18。如今依次插入幾條數據:

-- 能夠只插入 username 數據,age 有默認值,id是自增的主鍵無需主動插入值,後面會說
INSERT test_default(username) VALUES('A');

-- age 的默認值能夠被覆蓋
INSERT test_default(username,age) VALUES('B',25);

-- 沒有限制不可爲空,age 能夠設置爲空值 NULL
INSERT test_default(username,age) VALUES('C',NULL);
複製代碼

結果:

測試主鍵 PRIMARY KEY

創建數據表以下:

-- 設置字段 id 爲主鍵
CREATE TABLE test_primary_key(
    id INT UNSIGNED PRIMARY KEY,
    username VARCHAR(20)
);
複製代碼

來依次插入下面數據:

-- 正常數據插入
INSERT test_primary_key(id,username) VALUES(1,'aaa');

-- 主鍵值重複,報錯Duplicate entry '1' for key 'PRIMARY'
INSERT test_primary_key(id,username) VALUES(1,'aaa123');

-- 主鍵沒有默認值,不可不插值,報錯 Field 'id' doesn't have a default value。
-- id 加上 AUTO_INCREMENT 或 DEFAULT 時,能夠只插入username值
INSERT test_primary_key(username) VALUES('bbb');
複製代碼

主鍵能夠簡寫成 KEY,如:

-- 簡寫成 KEY 表示主鍵
CREATE TABLE test_primary_key1(
    id INT UNSIGNED KEY,
    username VARCHAR(20)
);
複製代碼

還能夠這麼寫:

-- 使用PRIMARY KEY() 的方式添加主鍵
CREATE TABLE test_primary_key2(
    id INT UNSIGNED,
    username VARCHAR(20),
    PRIMARY KEY(id)
);
複製代碼

一個表中只能有一個主鍵,若是設置兩個主鍵會報錯:

圖中建立表,設置了兩個主鍵,建立不成功。

雖然不能設置多個主鍵,可是能夠設置複合主鍵,以下:

-- 使用 PRIMARY KEY() 方式添加複合主鍵
CREATE TABLE test_primary_key4(
    id INT UNSIGNED,
    userid INT UNSIGNED,
    username VARCHAR(20),
    PRIMARY KEY(id,userid)
);
複製代碼

能夠看到iduserid都屬於主鍵。來插入一條值試試:

INSERT test_primary_key4(id,userid,username) VALUES(1,1,'aaa');
複製代碼

能夠看到插入成功了,說明同一條數據的複合主鍵值相同是不會衝突的,再試試:

INSERT test_primary_key4(id,userid,username) VALUES(1,2,'aaa');
複製代碼

結果也是能夠的,並不會由於id字段有 1 這個值了而不能再插值 1,主要這裏要聯繫 userid一塊兒看,如今再插入一次相同的值試試,即id=1 userid=2

此次沒有成功,由於 1-2 組合已經有了,應該是很好理解的。

測試惟一性 UNIQUE KEY

創建數據表以下:

-- username 和 password 都加上惟一性約束,UNIQUE KEY 能夠簡寫爲 UNIQUE
CREATE TABLE test_unique(
    id INT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(20) NOT NULL UNIQUE KEY,
    password VARCHAR(20) UNIQUE
);
複製代碼

依次插入下列數據:

-- 正常數據插入成功
INSERT test_unique(username,password) VALUES('A','12345');

-- 字段username插入相同的值,因惟一性約束,報錯 Duplicate entry 'A' for key 'username'。
INSERT test_unique(username,password) VALUES('A','12345678');

-- 惟一性約束能夠插入 NULL 值
INSERT test_unique(username,password) VALUES('B',NULL);

-- 惟一性約束不包括對 NULL 值的約束
INSERT test_unique(username,password) VALUES('C',NULL);
複製代碼

測試自動增加 AUTO_INCREMENT

上面的例子已經用過自動增加了,這裏再詳細說下。創建數據表以下:

CREATE TABLE test_auto_increment(
    id INT UNSIGNED KEY AUTO_INCREMENT,
    username VARCHAR(20)
);
複製代碼

自動增加顧名思義就是無需咱們主動插值,會從 1 開始自動增加,用於數值列。例子:

-- 只添加 username 的值,測試 id 是否自動增加
INSERT test_auto_increment(username) VALUES('A');
INSERT test_auto_increment(username) VALUES('B');
INSERT test_auto_increment(username) VALUES('C');
複製代碼

能夠看到,id 的值是從 1 開始自動增加的。

數據表結構相關操做

查看數據表結構相關操做

添加和刪除字段

對已存在的數據表,咱們能夠執行添加和刪除字段的操做。命令以下:

-- 添加字段
ALTER TABLE tbl_name ADD 字段名稱 字段屬性 [完整性約束條件] [FIRST | AFTER 字段名稱]

-- 刪除字段
ALTER TABLE tbl_name DROP 字段名稱

複製代碼

添加字段

爲了演示,新建立一個數據表,只包含id字段:

CREATE TABLE IF NOT EXISTS user1(
    id INT UNSIGNED AUTO_INCREMENT KEY
);
複製代碼

如今分別添加兩條數據:

-- 添加用戶名字段 username,類型是 VARCHAR(20)
ALTER TABLE user1 ADD username VARCHAR(20);

-- 添加用戶密碼字段 password,類型是 VARCHAR(32),不可爲空
ALTER TABLE user1 ADD password VARCHAR(32) NOT NULL;
複製代碼

結果:

使用 AFTER 控制添加的字段在指定字段後面,好比添加郵箱字段emailusername後面:

-- 添加 email 字段,類型 VARCHAR(50),約束 NOT NULL UNIQUE,在username後面
ALTER TABLE user1 ADD email VARCHAR(50) NOT NULL UNIQUE AFTER username;
複製代碼

結果:

使用 FIRST 控制字段添加在第一行,好比:

-- 添加測試字段 test TINYINT(1) NOT NULL DEFAULT 0;加到首位
ALTER TABLE user1 ADD test TINYINT(1) NOT NULL DEFAULT 0 FIRST;
複製代碼

結果:

刪除字段

刪除操做就比較簡單,刪掉測試字段 test

ALTER TABLE user1 DROP test;
複製代碼

結果:

還能夠把多個添加和刪除操做一塊兒執行,好比:

-- 添加age addr 字段 ,刪除email字段
ALTER TABLE user1 
ADD age TINYINT UNSIGNED NOT NULL DEFAULT 18,
ADD addr VARCHAR(100) NOT NULL DEFAULT '北京',
DROP email;
複製代碼

結果:

添加和刪除默認值

對已有字段,咱們能夠執行添加和刪除默認值操做。命令以下:

-- 添加默認值 (折行顯示是爲了便於觀看)
ALTER TABLE tbl_name
ALTER 字段名稱 SET DEFAULT 默認值;

-- 刪除默認值 (折行顯示是爲了便於觀看)
ALTER TABLE tbl_name
ALTER 字段名稱 DROP DEFAULT;
複製代碼

添加默認值

爲了演示,新建數據表以下:

CREATE TABLE user2(
    id INT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(20) NOT NULL,
    age TINYINT UNSIGNED NOT NULL DEFAULT 18,
    email VARCHAR(50) NOT NULL
);
複製代碼

email字段添加默認值 12345@qq.com

ALTER TABLE user2 ALTER email SET DEFAULT '12345@qq.com';
複製代碼

結果:

刪除默認值

刪除上表中的age字段的默認值:

ALTER TABLE user2 ALTER age DROP DEFAULT;
複製代碼

結果:

修改字段類型和字段屬性

咱們能夠修改字段的類型和屬性,命令以下:

-- (折行顯示是爲了便於觀看)
ALTER TABLE tbl_name
MODIFY 字段名稱 字段類型 [字段屬性][FIRST | AFTER 字段名稱]
複製代碼

新建一個數據表:

CREATE TABLE user3(
    id INT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(5) NOT NULL UNIQUE,
    password CHAR(32) NOT NULL,
    email VARCHAR(10) NOT NULL
);
複製代碼

此時表結構是這樣的:

如今依次作如下字段修改:

-- (折行顯示是爲了便於觀看)

-- 將 username 修改成 VARCHAR(20) 類型
ALTER TABLE user3
MODIFY username VARCHAR(20) NOT NULL;

-- 將 password 長度修改成40
ALTER TABLE user3
MODIFY password CHAR(40) NOT NULL;

-- 將 email 字段改成 VARCHAR(50) NOT NULL FIRST
ALTER TABLE user3
MODIFY email VARCHAR(50) NOT NULL FIRST;
複製代碼

結果:

可見修改爲功了。

修改字段名稱,字段類型和字段屬性

上面說了修改字段類型和字段屬性,若是要修改字段名稱,就要用關鍵字CHANGE了,命令以下:

ALTER TABLE tbl_name
CHANGE 原字段名稱 新字段名稱 字段類型 字段屬性 [FIRST | AFTER 字段名稱]
複製代碼

在表user3上依次執行以下操做:

-- 將 username 改成 user 
ALTER TABLE user3
CHANGE username user VARCHAR(20) NOT NULL;

-- 將 password 改成 pwd
ALTER TABlE user3
CHANGE password pwd CHAR(40) NOT NULL;

-- 將 email 改爲userEmail 類型改爲 VARCHAR(100) DEFAULT 'imooc@qq.com'
ALTER TABLE user3
CHANGE email userEmail VARCHAR(100) DEFAULT 'imooc@qq.com';
複製代碼

結果:

添加和刪除主鍵

便於演示,創建新表:

CREATE TABLE user4(
    id INT UNSIGNED,
    username VARCHAR(20) NOT NULL
);
複製代碼

此時表中沒有主鍵的:

接下來對此表進行添加和刪除主鍵操做。

添加主鍵

使用命令:

ALTER TABLE tbl_name ADD PRIMARY KEY(字段名稱);
複製代碼

例如給字段 id 加上主鍵:

ALTER TABLE user4
ADD PRIMARY KEY(id);
複製代碼

如今再來看看錶結構:

可見添加主鍵成功。

刪除主鍵

使用命令:

ALTER TABLE tbl_name DROP PRIMARY KEY;
複製代碼

刪除表user4中的主鍵:

ALTER TABLE user4 DROP PRIMARY KEY;
複製代碼

刪除主鍵成功。

刪除有自動增加約束的主鍵

主鍵有時是跟自動增加配合使用的,因此要刪除帶有自動增加的主鍵前,要先去除自動增加的約束。舉例說明,先建個表:

-- id 是主鍵,也有自動增加約束
CREATE TABLE user5(
    id INT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(20) NOT NULL
);
複製代碼

若是此時刪除主鍵是會失敗的,以下:

去除id的自動增加約束,可使用上面說到的修改字段屬性方法:

ALTER TABLE user5 MODIFY id INT UNSIGNED;
複製代碼

如今就能夠正常刪除主鍵了:

ALTER TABLE user5 DROP PRIMARY KEY;
複製代碼

添加和刪除惟一索引

建新表:

CREATE TABLE user6(
    id INT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(20) NOT NULL UNIQUE,
    password CHAR(32) NOT NULL
);
複製代碼

此時表中username字段含有惟一性約束:

刪除惟一索引

使用命令:

ALTER TABLE tbl_name DROP INDEX 惟一索引名(默認是字段名)
複製代碼

如刪除表user6中的惟一索引username

ALTER TABLE user6 DROP INDEX username;
複製代碼

如圖,惟一索引已經成功刪除。

添加惟一索引

使用命令:

ALTER TABLE tbl_name ADD UNIQUE KEY(字段名稱);
複製代碼

或者使用:

ALTER TABLE tbl_name ADD UNIQUE 自定的索引名(字段名稱);
複製代碼

分別使用兩種方法給usernamepassword字段加上惟一性約束:

-- 使用字段名做爲索引名
ALTER TABLE user6 ADD UNIQUE KEY(username);

-- 自定義索引名,定義爲 pass
ALTER TABLE user6 ADD UNIQUE pass(password);
複製代碼

查看索引名是否符合預期,使用命令 SHOW CREATE TABLE user6;,結果:

添加惟一索引成功。

修改數據表名稱

修改表名,使用命令:

ALTER TABLE tbl_name RENAME TO new_tbl_name;

-- 或者使用 AS 關鍵字
ALTER TABLE tbl_name RENAME AS new_tbl_name;
複製代碼

將表 user6 更名爲 user666

再將 user666 改回 user6

修改 AUTO_INCREMENT 的值

AUTO_INCREMENT是自增加的值,使用命令SHOW CREATE TABLE tbl_name能夠查看此值。有時候當咱們刪除表中數據時,自增值是不會重置的,好比經常使用的id字段,哪怕刪除了前面的數據,id仍是在原基礎上自增的,要是想修改此值,可使用命令:

ALTER TABLE tbl_name AUTO_INCREMENT=值;
複製代碼

此命令能夠先了解,有個印象,須要用到的時候天然就明白了。

數據表數據記錄相關操做

查看數據表數據記錄相關操做

添加(插入)數據

插入數據操做在以前說過一個,即:

INSERT tbl_name(字段名稱,...)VALUES(值,...);
複製代碼

如今再來補充說明一些操做。避免混淆,也爲了複習前面的知識,咱們新建一個數據庫,並在庫中建一個表:

-- 新建數據庫 data_demo
CREATE DATABASE IF NOT EXISTS data_demo DEFAULT CHARACTER SET 'UTF8';

-- 使用新數據庫
USE data_demo;

-- 新建數據表 user
CREATE TABLE IF NOT EXISTS user(
    id INT UNSIGNED AUTO_INCREMENT KEY COMMENT '編號',
    username VARCHAR(20) NOT NULL UNIQUE COMMENT '用戶名',
    age TINYINT UNSIGNED DEFAULT 18 COMMENT '年齡',
    email VARCHAR(50) NOT NULL DEFAULT '123@qqcom' COMMENT '郵箱'
)ENGINE=INNODB CHARSET=UTF8;
複製代碼

總體複製上面語句粘貼到命令行中執行,建庫建表成功,查看數據表:

不指定字段名稱插入數據

咱們不須要指定每個字段名,能夠按字段順序依次插入數據:

-- 在 VALUE 後面的括號中依次寫入數據,按照表中字段的順序
-- 也可使用關鍵字 VALUES
INSERT tbl_name VALUE(value...)
複製代碼

測試在user中插入一條數據:

INSERT user VALUE(1,'瓶子',18,'000@qq.com');
複製代碼

結果:

插入成功,數據正確對應到字段上。因爲 id字段是自動增加的,因此能夠不指定具體數值,寫法以下:

-- 關鍵字能夠用 VALUES

-- 使用 NULL 填充
INSERT user VALUES(NULL,'tom',20,'123@qq.com');

-- 使用 DEFAULT 填充
INSERT user VALUES(DEFAULT,'lily',16,'163@qq.com');
複製代碼

能夠看到依舊成功插入數據,且 id是自動增加的。

指定字段插入數據

這種就是以前說過的:

INSERT tbl_name(字段名稱,...) VALUES(值,...);
複製代碼

因爲user表中,id是自動增加,ageemail 都是有默認值的,因此咱們能夠只指定 username 來插入數據:

INSERT user(username) VALUES('a');
複製代碼

結果:

一次插入多條數據

有時候須要一次操做插入多條數據,可使用命令:

-- 字段名稱能夠不寫
INSERT tbl_name[(字段名稱,...)] VALUES(值,...),
(值,...),
(值,...);
複製代碼

咱們一次插入三條數據試試:

-- 注意標點符號
INSERT user(id,username,age,email) VALUES(NULL,'b',22,'b@qq.com'),
(NULL,'c',23,'c@qq.com'),
(NULL,'d',24,'d@qq.com');
複製代碼

結果:

INSERT ... SET 的形式插入數據

命令:

INSERT tbl_name SET 字段名稱=值,字段名稱=值,...;
複製代碼

測試插入一條數據:

INSERT user SET username='abc';
複製代碼

INSERT ... SELECT 的形式插入數據

此種形式是能夠將 別的表中查到的數據 插入 到當前表中,命令以下:

INSERT tbl_name[(字段名稱...)] SELECT 字段名稱,... FROM tbl_name2;
複製代碼

咱們能夠測試下,先建一個數據表,並插入一些數據:

-- 建表
CREATE TABLE test(
    a VARCHAR(10)
);

-- 插入三條數據
INSERT test VALUES('AA'),('BB'),('CC');
複製代碼

上述語句執行完以後,咱們來嘗試使用INSERT...SELECT方式給user插入數據:

INSERT user(username) SELECT a FROM test;
複製代碼

結果:

至此,你掌握了好幾種插入數據的方式。

修改數據

修改數據的命令很簡單:

UPDATE tbl_name SET 字段名稱=值,字段名稱=值,...[WHERE 條件]
複製代碼

其中,WHERE是條件,修改數據時若是不指定條件,會將表中全部數據都修改了,因此使用條件是很必要的,後面會詳細說到 WHERE

在修改數據前,咱們先看看 user 表中先有的數據:

咱們來修改第一條數據的年齡,將 18 修改成 20,此條數據的惟一標識就是id字段,因此條件是 id=1

UPDATE user SET age=20 WHERE id=1;
複製代碼

若是咱們不指定 WHERE,那麼將修改全部的數據,好比:

UPDATE user SET age=100;
複製代碼

刪除數據

刪除數據的命令爲:

DELETE FROM tbl_name [WHERE 條件];
複製代碼

一樣,刪除操做也應該加上條件,否則就刪除了全部的數據,因此刪除需謹慎,必定要先寫好條件。

刪除 id=1 的數據:

DELETE FROM user WHERE id=1;
複製代碼

能夠看到 id=1 的數據被刪除了。

刪除表中全部的數據:

DELETE FROM user;
複製代碼

此時,表中全部數據被清空。這時候有一個須要注意的地方,那就是全部數據被清空後,AUTO_INCREMENT 的值是不會被重置的,執行命令 SHOW CREATE TABLE user 結果以下:

能夠看到即便數據被清空,AUTO_INCREMENT 的值仍是保持以前的,再添加的數據的 id 就是 13。在上面表結構章節中最後說到了怎麼重置此值,能夠往上查閱,這裏來重置一下值爲 1:

ALTER TABLE user AUTO_INCREMENT=1;
複製代碼

完全清空數據表

還有一個命令乾脆直接,直接清空全部數據,並重置 AUTO_INCREMENT 的值,方法:

TRUNCATE [TABLE] tbl_name;
複製代碼

因爲上面清空來數據表user,因此再從新添加幾條數據(不要怕麻煩,一步步實踐加深印象)

-- 添加幾條數據
-- 再強調一遍,自增值可使用 NULL 或 DEFAULT 填充;默認值可使用 DEFAULT 代替
INSERT user VALUES(NULL,'AA',18,DEFAULT),(NULL,'BB',19,DEFAULT),(NULL,'CC',20,DEFAULT);
複製代碼

查看錶結構,SHOW CREATE TABLE user

此時,數據有了,AUTO_INCREMENT 值爲4,再使用 TRUNCATE 來清空全部:

TRUNCATE user;
複製代碼

結果:

查詢數據

查詢命令 SELECT,前面咱們一直有在使用,其實查詢操做是靈活多變的,它的語法結構能夠總結以下:

-- 這是一個總結性的語法結構,當你須要使用時能夠參考,[] 表示可選。後面每個細節都會說到。
SELECT 表達式(或字段),... FROM tbl_name
[WHERE 條件] -- 條件
[GROUP BY {字段|位置} HAVING 二次篩選]  -- 分組
[ORDER BY {字段|位置|表達式}[ASC|DESC]] -- 排序
[LIMIT 限制結果集的顯示條數] -- 限制顯示條數
複製代碼

使用 * 查詢全部字段

這也是咱們前面一直用的命令:

SELECT * FROM tbl_name;
複製代碼

這裏也就很少說了,補充一個知識點就是能夠直接查詢某庫中的某表:

SELECT * FROM db_name.tbl_name;
複製代碼

好比咱們查詢 data_demo 數據庫中的 user 表,就能夠這樣:

-- 注意你的庫名和表名可能和個人不同,若是一步步跟我步驟操做的,應該是同樣的
SELECT * FROM data_demo.user;
複製代碼

注意:我提早在user表中插入了數據,若是你跟我步驟作的,記得也提早插入幾條測試數據。查詢結果:

這樣查詢的好處就是不須要先 USE 數據庫。

查詢指定字段的信息

使用命令:

SELECT 字段名稱,... FROM tbl_name;
複製代碼

例如:

SELECT username,age FROM user;
複製代碼

給字段起別名查詢顯示

命令:

SELECT 字段名稱 [AS] 別名名稱,... FROM [db_name.]tbl_name;
複製代碼

例如:

SELECT id AS '編號', username AS '用戶名',email AS '郵箱' FROM user;
複製代碼

給數據表起別名查詢

命令:

SELECT 字段名稱,... FROM tbl_name [AS] 別名;
複製代碼

例如:

SELECT id,username,email FROM user AS a;
複製代碼

給表名起別名在這裏看不出啥特別的效果,先記住有這種方法。

表名.字段名 查詢

命令:

SELECT tbl_name.col_name,... FROM tbl_name;
複製代碼

例如:

SELECT user.id,user.username FROM user;
複製代碼

一樣看不出有啥特別的效果,先記住有這種方法。

查詢數據之 WHERE 詳解

WHERE 屬於查詢操做的重要關鍵字,這裏單獨一章節說明。WHERE會篩選出符合條件的數據,使用它的方式以下:

SELECT 字段名或表達式,... FROM tbl_name WHERE 條件
複製代碼

其中條件是有幾種方式的。

經過比較運算符來篩選數據

前面說到的WHERE id=1;就是運用的比較運算符,能夠用的比較運算符有:>>=<<=!=<><=>,前面五個不用多說,我主要來講說後面這兩個。

<>是不等於的意思,跟!=做用是同樣的;<=>是等於的意思,跟=做用相似,但有一個區別就是<=>能夠檢測 NULL 值。舉個例子,咱們先改造user表的數據以下:

即爲了測試增長兩個 NULL值,我使用了更新命令 UPDATE user SET age=NULL WHERE id>2;,請根據本身實際狀況改造數據。如今分別使用 =<=> 來查詢:

-- 使用 =
SELECT * FROM user WHERE age=NULL;

-- 使用 <=>
SELECT * FROM user WHERE age<=>NULL;
複製代碼

結果:

可見使用 <=> 能夠檢測到 NULL 值,其實檢測 NULL 值還有另一個方法,就是使用 IS [NOT] NULL,以下:

指定範圍來篩選數據

咱們也能夠對某個字段指定值的範圍來篩選數據,語法以下:

WHERE 字段名 [NOT] BETWEEN ... AND ... 
複製代碼

好比咱們篩選 id 值在 2 和 4 的數據:

SELECT * FROM user WHERE id BETWEEN 2 AND 4;
複製代碼

從結果能夠看出,查詢結果包含了首位和末尾的數據。

指定集合來篩選數據

指定集合查詢數據,將在集合內的值篩選出,語法:

WHERE 字段名 [NOT] IN(值,...);
複製代碼

好比查 id 值爲 1 和 3 的數據:

SELECT * FROM user WHERE id IN (1,3);
複製代碼

再好比咱們查 username 值爲 BB 和 YY 的數據:

SELECT * FROM user WHERE username IN('BB','YY');
複製代碼

沒有 username=YY 的值,因此只返回 username=BB 的數據。

使用邏輯運算符篩選數據

可使用兩個邏輯運算符:

  • AND 邏輯與
  • OR 邏輯或

舉例:

-- 查詢 id>3 而且 age>20 的數據
SELECT * FROM user WHERE id>3 AND age>20;

-- 查詢 id<3 或者 age>20 的數據
SELECT * FROM user WHERE id<3 OR age>20;
複製代碼

結果:

此處僅演示做用,可自行創建數據更豐富的表來測試。

模糊查詢

模糊查詢頗有用,它的語法很簡單:

WHERE 字段名 [NOT] LIKE ...
複製代碼

它一般要結合佔位符來使用:

  • % 表示任意長度的字符串
  • _ 表示任意一個字符

查詢 username 值中含字母 B 的:

SELECT * FROM user WHERE username LIKE '%B%';
複製代碼

從結果知道, 查詢時是不區分大小寫的

再查詢 username 值長度爲 4 的:

SELECT * FROM user WHERE username LIKE '____';
複製代碼

查詢數據之 GROUP BY 分組

分組是把值相同的放到一個組中,語法以下:

GROUP BY 字段名
複製代碼

爲了演示方便,我新建一個表並插入數據:

CREATE TABLE user1(
    id INT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(20) NOT NULL,
    age TINYINT UNSIGNED DEFAULT 18,
    sex ENUM('男','女','保密')
)ENGINE=INNODB CHARSET=UTF8;

INSERT user1 VALUES(NULL,'張三',45,'男'),
(NULL,'李四',18,'男'),
(NULL,'王五',24,'保密'),
(NULL,'小麗',24,'女'),
(NULL,'小紅',18,'女');
複製代碼

如今按照年齡來分組:

SELECT * FROM user1 GROUP BY sex;
複製代碼

結果卻報錯了:

這裏的錯誤意思是說,要查詢的列名必須出如今 GROUP BY後面,因爲咱們查全部的列,分組是按照 sex來的,因此報錯了。另外這個錯誤跟mysql版本有關係,可能你安裝的版本不會有這個錯誤,若是有錯誤,能夠修改語句:

SELECT sex FROM user1 GROUP BY sex;
複製代碼

如今就查詢成功了。若是就想查詢不少列也是有辦法的,自行搜索關鍵詞ERROR 1055 (42000),網上有詳細的說明,我就很少說了。再來看看搜索結果,只顯示了組中的一條記錄,這樣很不直觀,咱們須要每一個組中具體有哪些數據,這時候就利用GROUP_CONCAT()這個函數來解決。

分組配合 GROUP_CONCAT() 函數使用

爲了查看每一個分組中的具體數據詳情,咱們須要使用 GROUP_CONCAT()函數。 好比咱們想要知道每一組中全部的username詳情,能夠這樣寫:

SELECT GROUP_CONCAT(username),sex FROM user1 GROUP BY sex;
複製代碼

這樣就能清晰的知道了每一個分組裏的狀況,同時發現使用 GROUP_CONCAT()函數後,上面的那個限制錯誤就不會出現了,因此能夠查看全部詳情:

SELECT GROUP_CONCAT(id),
GROUP_CONCAT(username),
GROUP_CONCAT(age),
sex FROM user1 GROUP BY sex;
複製代碼

分組配合聚合函數使用

聚合函數包括:

  • COUNT() 統計總數
  • SUM() 求和
  • MAX() 求最大值
  • MIN() 求最小值
  • AVG() 求平均值

須要注意的是聚合函數不是隻能用在分組操做中的,只是這裏講分組時能夠配合一塊兒用。後續的進階篇會詳細說mysql中的函數操做

舉個例子,按照 sex 分組,查看username詳情,而且獲得每一個分組中的總人數,能夠這樣寫:

-- 使用 COUNT(*) 統計分組數據總數
SELECT GROUP_CONCAT(username),sex,COUNT(*) FROM user1 GROUP BY sex;
複製代碼

也能夠直接在COUNT()函數中傳入字段名,如COUNT(username),結果也能實現:

區別在於:使用 COUNT(*) 能夠識別出 NULL 數據,而使用 COUNT(字段名) 識別不出 NULL

其餘的幾個函數使用方式同樣,一塊兒來使用一下:

-- 按性別分組,查看用戶名詳情,查看年齡詳情,統計數據總數量,求年齡的和,求年齡的最大值,求年齡的最小值,求年齡的平均值;
-- 使用 AS 能夠起別名
SELECT sex,
GROUP_CONCAT(username) AS username,
GROUP_CONCAT(age) AS age,
COUNT(*) AS total,
SUM(age) AS sum_age,
MAX(age) AS max_age,
MIN(age) AS min_age,
AVG(age) AS avg_age
FROM user1 GROUP BY sex;
複製代碼

結果:

分組配合 WITH ROLLUP 關鍵字使用

使用 WITH ROLLUP 能夠在每條記錄末尾添加一條記錄,是上面全部記錄的總和。 例如:

SELECT GROUP_CONCAT(username),
GROUP_CONCAT(age),
COUNT(*)
FROM user1 GROUP BY sex
WITH ROLLUP;
複製代碼

注意最後一行是自動添加的,若是是數字就相加,若是是集合就列出全部。

HAVING 子句對分組結果進行二次篩選

什麼意思呢?舉個例子,咱們先來一個分組:

-- 使用 AS 能夠起別名
SELECT GROUP_CONCAT(username) AS detail,
COUNT(*) AS total
FROM user1
GROUP BY sex;
複製代碼

如今咱們要篩選出分組中總數大於等於 2 的分組,那麼能夠在上面的語句最後加上一句:

SELECT GROUP_CONCAT(username) AS detail,
COUNT(*) AS total
FROM user1
GROUP BY sex
HAVING COUNT(*) >=2;
複製代碼

如今顯示的就是總數大於等於 2 的分組了。因爲我使用了AS起別名,因此也能夠直接使用別名,即 HAVING total>=2,結果一樣正確:

查詢數據之 ORDER BY 排序

使查詢結果按照某一順序排列,排序的命令以下:

-- ASC 升序;DESC 降序。默認是升序 ASC
ORDER BY 字段名稱 ASC|DESC
複製代碼

先來看一個表的默認顯示順序:

具體請以你本身本地的數據爲準,如今能夠試試按照年齡升序排列:

-- 由於默認使用的 ASC,因此升序時能夠不加 ASC 後綴
SELECT * FROM user1 ORDER BY age [ASC];
複製代碼

如今結果是按照年齡升序排列的。有一個小問題就是前兩條數據的年齡是同樣的,這樣的就以 id升序再排列,咱們也可讓他們再按照 id降序排列,即多字段排序:

SELECT * FROM user1 ORDER BY age ASC,id DESC;
複製代碼

結果如圖所示,前兩條在年齡相同的狀況下,按照 id 降序再排列。

結合條件查詢排序

在條件查詢的基礎上也能夠排序,好比查詢年齡大於 18 的,且按照id降序排列的:

SELECT * FROM user1 WHERE age>18 ORDER BY id DESC;
複製代碼

隨機排序

隨機排序使用到 RAND(),每次查詢結果順序都不同:

SELECT * FROM user1 ORDER BY RAND();
複製代碼

結果每次都不相同,就不展現了。

查詢數據之 LIMIT 限制結果集顯示條數

但數據量很大的時候,咱們就須要限制每次查詢到的數據量,常見的場景就是分頁效果。使用關鍵字 LIMIT 就能夠實現這種操做,它的使用方式有兩種:

  • LIMIT count 這種形式表示顯示結果集的前 count 條數據
  • LIMIT offset,count 表示從 offset 開始,顯示 count 條數據,offset 從 0 開始,表示偏移量

例如,個人 user1 表中一共五條數據,如今我只想查看前三條數據,我能夠:

SELECT * FROM user1 LIMIT 3;
複製代碼

又例如我想看從第二條到第四條的數據,那就是偏移了 1,看 3 條數據:

SELECT * FROM user1 LIMIT 1,3;
複製代碼

其實 LIMIT 很靈活,能夠結合不少語句一塊兒使用,下面給出幾個例子,可自行嘗試:

-- 更新 user1 表中前三條數據,將 age 都加 3
UPDATE user1 SET age=age+3 LIMIT 3;

-- 將 user1 表數據按照 id 降序排列,再更新前三條數據,將 age 都減 5
-- 這裏須要注意,結果是先排序後作減的
UPDATE user1 SET age=age-5 ORDER BY id DESC LIMIT 3;

-- 刪除 user1 表中前兩條數據
DELETE FROM user1 LIMIT 2;

-- 刪除 user1 表中後面兩條數據(默認 id 是升序的)
-- 刪除後面的數據,能夠先按 id 降序排列,再刪除
DELETE FROM user1 ORDER BY id DESC LIMIT 2;
複製代碼

補充

補充部分

枚舉類型(ENUM)的使用

建立表 test_enum

-- 枚舉類型須要將可能的值所有枚舉出來
CREATE TABLE test_enum(
    sex ENUM('男','女','保密')
);
複製代碼

測試下面幾種插入數據的方式:

-- 男 屬於枚舉中的一個,能夠正常插入
INSERT test_enum(sex) VALUES('男');

-- male 不在枚舉值中,插入錯誤
INSERT test_enum(sex) VALUES('male');

-- 能夠插入 NULL 值
INSERT test_enum(sex) VALUES(NULL);

-- 能夠用枚舉值的序號代替值,序號從 1 開始,超出範圍則報錯
INSERT test_enum(sex) VALUES(1);
複製代碼

集合類型(SET)的使用

建立表 test_set

CREATE TABLE test_set(
    a SET('A','B','C','D','E','F')
);
複製代碼

測試下面操做:

-- A,C 都在集合中,正常插入
INSERT test_set(a) VALUES('A');
INSERT test_set(a) VALUES('C');

-- 能夠一次插入多個成員,順序不影響
INSERT test_set(a) VALUES('C,D,E');
INSERT test_set(a) VALUES('C,F,A');

-- H 不在集合中,報錯
INSERT test_set(a) VALUES('C,F,A,H');

-- 能夠用序號代替集合值,序號從 1 開始
INSERT test_set(a) VALUES(2);
複製代碼

時間類型的使用

TIME 類型

建立表 test_time

CREATE TABLE test_time(
    a TIME
);
複製代碼

測試下面操做:

-- TIME 的存儲格式是 HH:MM:SS
INSERT test_time(a) VALUES('10:10:10'); -- 結果:10:10:10

-- 支持加入天數,格式爲 D HH:MM:SS,D表明天數,範圍是 0~34
-- 下面結果是 58:10:10,計算方式是 (2*24+10):10:10
INSERT test_time(a) VALUES('2 10:10:10'); -- 結果:58:10:10

-- 若是插入兩個值(指的是帶冒號的),表示時分 HH:MM
INSERT test_time(a) VALUES('10:10'); -- 結果:10:10:00

-- 若是隻插入一個值,表示秒 SS
INSERT test_time(a) VALUES('10'); -- 結果:00:00:10

-- 插入兩個值,不帶冒號的,表示天數和時 D HH
INSERT test_time(a) VALUES('2 10'); -- 結果:58:00:00

-- 能夠省略冒號,HHMMSS
INSERT test_time(a) VALUES('101010'); -- 結果:10:10:10

-- 插入 0 或者 '0',最後都會轉換爲 00:00:00
INSERT test_time(a) VALUES('0'); -- 結果:00:00:00
INSERT test_time(a) VALUES(0); -- 結果:00:00:00

-- 分 和 秒 的範圍不得大於 59
INSERT test_time(a) VALUES('80:60:59'); -- 分 超出範圍
INSERT test_time(a) VALUES('80:59:60'); -- 秒 超出範圍

-- 使用 NOW() 和 CURRENT_TIME 能夠轉換爲當前時間
INSERT test_time(a) VALUES(NOW());
INSERT test_time(a) VALUES(CURRENT_TIME);
複製代碼

DATE 類型

建立表 test_date

CREATE TABLE test_date(
    a DATE
);
複製代碼

測試下面操做:

-- DATE的存儲格式是 YYYY-MM-DD,而插入數據的格式沒必要嚴格遵循這個

-- 下面兩種插入方式都支持
INSERT test_date(a) VALUES('2019-02-02'); -- 結果:2019-02-02
INSERT test_date(a) VALUES('2019-2-2'); -- 結果:2019-02-02

-- 能夠不指定分隔符,即 YYYYMMDD
INSERT test_date(a) VALUES('20191020'); -- 結果:2019-10-20

-- 甚至能夠自定義分隔符
INSERT test_date(a) VALUES('2019#10#20'); -- 結果:2019-10-20
INSERT test_date(a) VALUES('2019@10@20'); -- 結果:2019-10-20
INSERT test_date(a) VALUES('2019.10.20'); -- 結果:2019-10-20

-- 月份和日期要遵循正常的日期規則,好比月份不得超過 12,日期不得超過 31,同時9月不能有31號等等
-- 下面三個都報錯
INSERT test_date(a) VALUES('2019.13.25');
INSERT test_date(a) VALUES('2019.10.32');
INSERT test_date(a) VALUES('2019.9.31');

-- 使用 NOW() 和 CURRENT_TIME 能夠轉換爲當前日期
INSERT test_date(a) VALUES(NOW());
INSERT test_date(a) VALUES(CURRENT_TIME);
複製代碼

DATE 類型還支持插入兩位數的年份數據,即 YY-MM-DD 或者 YYMMDD,規則是 70~99 之間的轉換爲1970~1999,00~69 之間的轉換爲2000~2069,以下:

INSERT test_date(a) VALUES('190506'); -- 結果:2019-05-06
INSERT test_date(a) VALUES('730506'); -- 結果:1973-05-06
複製代碼

DATETIME 類型

DATETIME 類型是 DATETIME 的結合體。建立表 test_datetime

CREATE TABLE test_datetime(
    a DATETIME
);
複製代碼

測試下面操做:

-- 完整格式 YYYY-MM-DD HH:MM:SS
INSERT test_datetime(a) VALUES('2019-07-08 12:10:45'); -- 結果:2019-07-08 12:10:45

-- 只寫兩位數年份,不寫分隔符等規則一樣適用
INSERT test_datetime(a) VALUES('191020121212'); -- 結果:2019-10-20 12:12:12

-- 使用 NOW() 獲得當前日期
INSERT test_datetime(a) VALUES(NOW());
複製代碼

TIMESTAMP 類型

TIMESTAMP 類型和 DATETIME 很相似,但它們的時間範圍不同,並且 TIMESTAMP 會識別時區的。

建立表 test_timestamp

CREATE TABLE test_timestamp(
    a TIMESTAMP
);
複製代碼

測試下面操做:

-- 跟 DATETIME 同樣的插入格式
INSERT test_timestamp(a) VALUES('1988-10-20 12:12:12'); -- 結果:1988-10-20 12:12:12

-- 也能夠只寫兩位數年份,不加分隔符
INSERT test_timestamp(a) VALUES('191020121212'); -- 結果:2019-10-20 12:12:12

-- 插入 CURRENT_TIMESTAMP 或者 NULL,會獲得當前系統的日期
INSERT test_timestamp(a) VALUES(CURRENT_TIMESTAMP);
INSERT test_timestamp(a) VALUES(NULL);
複製代碼

YEAR 類型

建立表 test_year

CREATE TABLE test_year(
    a YEAR
);
複製代碼

測試下面操做:

-- 存儲年份 YYYY 或者 YY 
-- YY 格式遵循:70~99 之間的轉換爲1970~1999,00~69 之間的轉換爲2000~2069
INSERT test_year(a) VALUES(2019); -- 結果:2019
INSERT test_year(a) VALUES(20); -- 結果:2020

-- YEAR 範圍是 1901~2155,超出範圍報錯
INSERT test_year(a) VALUES(1900); -- 報錯
INSERT test_year(a) VALUES(2156); -- 報錯

-- 有趣的插入 0 和 '0' 的結果不同
INSERT test_year(a) VALUES(0); -- 結果:0000 (不在範圍內也不會報錯)
INSERT test_year(a) VALUES('0'); -- 結果:2000
複製代碼

進階操做

關於進階的部分,我準備另開一文記錄,主要這裏太長了,不方便寫做。進階部分主要涉及多表聯查,外鍵約束,函數的使用等等,須要的能夠關注一波喲~

文中有不對的地方歡迎指出。

相關文章
相關標籤/搜索