原本寫了一大堆廢話,想一想仍是刪了。html
本文主要記錄學習 sql
語句的使用,看完這些也不能讓你成爲數據庫高手,只是會對數據庫有了一個清晰的概念,會用原始的 sql
語句去操控數據庫,僅此而已。學習是沒有盡頭的,堅持下去也許能看到指望的風景(自我雞湯)。前端
右側目錄沒顯示全,只有展開全部的內容纔會顯示全~mysql
原本不想囉嗦這部分,畢竟網上太多安裝mysql
的教程了,但最後仍是決定寫上個人安裝步驟以看成參考。但由於個人平臺是 mac,因此此安裝步驟只適用於 mac,須要的能夠看下。sql
我是直接官網下載安裝包的,選擇的是社區版5.7.27
,你能夠自行去下載本身要的版本,5.7
版下載地址:傳送門。數據庫
下載安裝包後直接雙擊安裝,一路回車,須要注意的就是當安裝好後會有一個彈窗提示,這樣的:vim
紅框裏的是mysql默認登陸密碼,須要保存。若是忘記保存,在右側的系統通知欄裏也會有,如圖:rQn2d1Xr%L9*bash
安裝完畢,打開系統偏好設置,最下方會有一個mysql設置,點擊進去啓動mysql:服務器
爲了方便在命令行操做mysql,須要先設置一下環境變量。函數
/usr/local/mysql/bin/
,查看是否有mysql(默認安裝的路徑)vim ~/.bash_profile
.bash_profile
文件中添加PATH=$PATH:/usr/local/mysql/bin
語句,而後在英文輸入法下按 esc,而後輸入 wq 保存退出source ~/.bash_profile
默認密碼不方便記,修改本身的密碼,因爲已經設置過環境變量,因此直接執行如下命令:學習
mysqladmin -u root -p 123456
// 123456 是我設置的新密碼,替換成你想要設置的密碼
// 回車後會提示你輸入密碼,這個密碼就是上面說的安裝後默認給的密碼
複製代碼
輸入密碼後沒報錯就是修改密碼成功了,但也可能報下面這個錯誤:
mysql -uroot -p
,這個是登陸命令,回車後輸入默認密碼SET PASSWORD = PASSWORD('123456');
設置新密碼此時新密碼也設置成功了。
修改密碼後,用新密碼登陸測試如下,登陸命令是:
mysql -uroot -p
複製代碼
回車後輸入新密碼便可。
從這裏開始,須要你已經正確安裝好了mysql。
mysql -uroot -p
,而後回車輸入密碼mysql -uroot -p123456
,123456
是個人密碼,替換成你的密碼在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有兩種存儲引擎,分別是InnoDB
和MyISAM
。當不指定存儲引擎時,默認是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
主要應用在整型上,下面以建立整型數值舉例。
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的長度已經超過了設定的寬度,但依舊能夠被插入,只要沒有超過類型的存儲長度就行。
建立以下數據表:
-- 給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;
複製代碼
建立表格以下:
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);
複製代碼
結果:
創建數據表以下:
-- 設置字段 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)
);
複製代碼
能夠看到id
和userid
都屬於主鍵。來插入一條值試試:
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
組合已經有了,應該是很好理解的。
創建數據表以下:
-- 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);
複製代碼
上面的例子已經用過自動增加了,這裏再詳細說下。創建數據表以下:
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
控制添加的字段在指定字段後面,好比添加郵箱字段email
在username
後面:
-- 添加 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 自定的索引名(字段名稱);
複製代碼
分別使用兩種方法給username
和password
字段加上惟一性約束:
-- 使用字段名做爲索引名
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
是自增加的值,使用命令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
是自動增加,age
和 email
都是有默認值的,因此咱們能夠只指定 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 tbl_name SET 字段名稱=值,字段名稱=值,...;
複製代碼
測試插入一條數據:
INSERT user SET username='abc';
複製代碼
此種形式是能夠將 別的表中查到的數據 插入 到當前表中,命令以下:
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
會篩選出符合條件的數據,使用它的方式以下:
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);
複製代碼
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 字段名
複製代碼
爲了演示方便,我新建一個表並插入數據:
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()
函數。 好比咱們想要知道每一組中全部的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
能夠在每條記錄末尾添加一條記錄,是上面全部記錄的總和。 例如:
SELECT GROUP_CONCAT(username),
GROUP_CONCAT(age),
COUNT(*)
FROM user1 GROUP BY sex
WITH ROLLUP;
複製代碼
注意最後一行是自動添加的,若是是數字就相加,若是是集合就列出全部。
什麼意思呢?舉個例子,咱們先來一個分組:
-- 使用 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
,結果一樣正確:
使查詢結果按照某一順序排列,排序的命令以下:
-- 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 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;
複製代碼
建立表 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);
複製代碼
建立表 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);
複製代碼
建立表 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);
複製代碼
建立表 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
類型是 DATE
和 TIME
的結合體。建立表 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
類型和 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);
複製代碼
建立表 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
複製代碼
關於進階的部分,我準備另開一文記錄,主要這裏太長了,不方便寫做。進階部分主要涉及多表聯查,外鍵約束,函數的使用等等,須要的能夠關注一波喲~
文中有不對的地方歡迎指出。