前言
內容比較多,一下子可能會看不完,建議收藏,怕你們以後找不到我了。
MySQL數據類型介紹
數據表由多列字段構成,每一個字段指定了不同的數據類型,指定了數據類型之後,也就決定了向字段插入的數據內容;
不同的數據類型也決定了 MySQL 在存儲它們的時候使用的方式,以及在使用它們的時候選擇什麼運算符號進行運算;
數值數據類型
:TINYINT 、SMALINT 、MEDIUMINT 、INT 、BIGINT 、FLOAT 、DOUBLE 、DECIMAL
日期/時間類型
:YEAR 、TIME 、DATE 、DATETIME 、TIMESTAMP
字符串類型
:CHAR 、VARCHAR 、BINARY 、VARBINARY 、BLOB 、TEXT 、ENUM 、SET
數值數據類型
- 數值類型主要用來
存儲數字
,不同的數值類型提供不同的取值範圍,可以存儲的值範圍越大,所需要的存儲空間也越大 - 數值類型分爲:①整數類型 ②浮點數類型 ③定點數類型
整數類型
INT家族合集,都表示數字,用法都一樣,區別就是範圍不一樣而已(見上圖),所以下面就以INT舉例;
mysql> create table test2
-> (
-> id int(18) primary key auto_increment,
-> age int(3),
-> height int(4)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test2 values(1,18,182),(2,20,184),(3,22,183);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test2;
+------+------+--------+
| id | age | height |
+------+------+--------+
| 1 | 18 | 182 |
| 2 | 20 | 184 |
| 3 | 22 | 183 |
+------+------+--------+
3 rows in set (0.00 sec)
浮點數類型和定點數類型
- MySQL 中使用浮點數和定點數來表示
小數
,浮點數有兩種類型:單精度浮點數(FLOAT)和雙精度浮點數(DOUBLE),定點數只有DECIMAL
; - 浮點數和定點數都可以用
(M,N)
來表示,其中 M 是精度,表示總共的位數,N 是標度,表示小數的位數; - DECIMAL 實際是以字符串形式存放的,在對精度要求比較高的時候(如貨幣、科學數據等)使用DECIMAL 類型會比較好;
- 浮點數相對於定點數的優點是在長度一定的情況下,浮點數能夠表示更大的數據範圍,它的缺點是會引起精度問題
例子:
mysql> alter table test2 add t1 float(10,5);
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table test2 add t2 decimal(15,10);
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into test2 (t1) values(123.1234567);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test2 (t2) values(12346.1234567);
Query OK, 1 row affected (0.01 sec)
mysql> select * from test2;
+----+------------+--------+-----------+------------------+
| id | age | height | t1 | t2 |
+----+------------+--------+-----------+------------------+
| 1 | 18 | 182 | NULL | NULL |
| 2 | 20 | 184 | NULL | NULL |
| 3 | 22 | 183 | NULL | NULL |
| 4 | 2155 | NULL | NULL | NULL |
| 5 | 21550 | NULL | NULL | NULL |
| 6 | 1234679826 | NULL | NULL | NULL |
| 7 | NULL | NULL |` 123.12346 `| NULL |
| 8 | NULL | NULL | NULL |` 12346.1234567000 `|
+----+------------+--------+-----------+------------------+
8 rows in set (0.00 sec)
從第條插入數據看出,小數點後不到10位會用0補充,
如果超過定義的小數點後面的範圍即N的範圍 ,則不會顯示
mysql> insert into test2 (t1) values(12.12345678);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test2;
+----+------------+--------+-----------+------------------+
| id | age | height | t1 | t2 |
+----+------------+--------+-----------+------------------+
| 1 | 18 | 182 | NULL | NULL |
| 2 | 20 | 184 | NULL | NULL |
| 3 | 22 | 183 | NULL | NULL |
| 4 | 2155 | NULL | NULL | NULL |
| 5 | 21550 | NULL | NULL | NULL |
| 6 | 1234679826 | NULL | NULL | NULL |
| 7 | NULL | NULL | 123.12346 | NULL |
| 8 | NULL | NULL | NULL | 12346.1234567000 |
| 9 | NULL | NULL |` 12.12346 `| NULL |
+----+------------+--------+-----------+------------------+
9 rows in set (0.00 sec)
MySQL 日期/時間類型
- MySQL 有多種表示日期的數據類型,比如,當只記錄
年信息
的時候,可以使用 YEAR 類型,而沒有必要使用 DATE 類型 - 每一個類型都有合法的取值範圍,當指定確實不合法的值時系統將 “零” 值插入到數據庫中
YEAR
- 格式:以4位字符串格式表示的 YEAR ,範圍爲 ‘1901’ ~ ‘2155’
- 格式:以4位數字格式表示的 YEAR ,範圍爲 1901 ~ 2155
- 格式:以2位字符串格式表示的 YEAR ,範圍爲 ‘00’ ~ ‘99’ ,其中,
'00' ~ '69' 被轉換爲 2000 ~ 2069
,'70' ~ '99' 被轉換爲 1970 ~ 1999
- 格式:以2位數字格式表示的 YEAR ,範圍爲 1 ~ 99 ,其中,
1 ~ 69 被轉換爲 2001 ~ 2069
,70 ~ 99 被轉換爲 1970 ~ 1999
看不懂???
舉個例子一下就明白了
mysql> alter table classes add t1 YEAR;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into classes (t1) values ('1999'),('2008'),('89'),('20');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from classes;
+------+-----------+--------------+------+
| id | level | name | t1 |
+------+-----------+--------------+------+
| 1 | good | NULL | NULL |
| 2 | wxcellent | NULL | NULL |
| 3 | bad | NULL | NULL |
| NULL | NULL | lisi | NULL |
| NULL | NULL | chengjisihan | NULL |
| NULL | NULL | NULL | 1999 |
| NULL | NULL | NULL | 2008 |
| NULL | NULL | NULL | 1989 |
| NULL | NULL | NULL | 2020 |
+------+-----------+--------------+------+
9 rows in set (0.00 sec)
注意:這裏也是有範圍的,20世紀(1900)之前,22世紀中旬(2155)之後都不可用,那咋辦?
emm
等到2156年吧,我就去告訴你!!!
mysql> insert into classes (t1) values (2156);
ERROR 1264 (22003): Out of range value for column 't1' at row 1
mysql> insert into classes (t1) values (1900);
ERROR 1264 (22003): Out of range value for column 't1' at row 1
TIME
- TIME 類型的格式爲 HH:MM:SS ,HH 表示小時,MM 表示分鐘,SS 表示秒;
- 格式:以 ‘HHMMSS’ 格式表示的 TIME ,例如
'101112'
被理解爲10:11:12
,但如果插入不合法的時間,如 ‘109712’ ,則被存儲爲 00:00:00 - 格式:以 ‘D HH:MM:SS’ 字符串格式表示的 TIME ,
其中 D 表示日
,可以取 0 ~ 34 之間的值,在插入數據庫的時候 D 會被轉換成小時,如 ‘2 10:10’ 在數據庫中表示爲 58:10:00 ,即2x24+10 = 58
;
mysql> alter table classes add t2 time;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into classes (t2) values ("17:29:54");
Query OK, 1 row affected (0.00 sec)
mysql> select * from classes;
+------+-----------+--------------+------+----------+
| id | level | name | t1 | t2 |
+------+-----------+--------------+------+----------+
| 1 | good | NULL | NULL | NULL |
| 2 | wxcellent | NULL | NULL | NULL |
| 3 | bad | NULL | NULL | NULL |
| NULL | NULL | lisi | NULL | NULL |
| NULL | NULL | chengjisihan | NULL | NULL |
| NULL | NULL | NULL | 1999 | NULL |
| NULL | NULL | NULL | 2008 | NULL |
| NULL | NULL | NULL | 1989 | NULL |
| NULL | NULL | NULL | 2020 | NULL |
| NULL | NULL | NULL | NULL | 17:29:54 |
+------+-----------+--------------+------+----------+
10 rows in set (0.00 sec)
mysql> insert into classes (t2) values("2102450");
Query OK, 1 row affected (0.00 sec)
mysql> insert into classes (t2) values("2 10:24:50");
Query OK, 1 row affected (0.00 sec)
date
- DATE 類型的格式爲 YYYY-MM-DD ,其中,YYYY 表示年,MM 表示月,DD 表示日;
- 格式:
'YYYY-MM-DD' 或 'YYYYMMDD'
,取值範圍爲'1000-01-01' ~ '9999-12-3';
- 格式:
'YY-MM-DD' 或 'YYMMDD'
,這裏 YY 表示兩位的年值,範圍爲 ‘00’ ~ ‘99’ ,其中,'00' ~ '69' 被轉換爲 2000 ~ 2069
,'70' ~ '99' 被轉換爲 1970 ~ 1999
;
mysql> insert into test1 (日期) values('20200617');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test1 (日期) values('2020-06-16');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test1 (日期) values('200615');
Query OK, 1 row affected (0.01 sec)
mysql> select * from test1;
+---------+---------------------+------------+
| s | location | 日期 |
+---------+---------------------+------------+
| a | NULL | NULL |
| a,b,d | NULL | NULL |
| a,b,c,d | NULL | NULL |
| NULL | This is an example! | NULL |
| NULL | haha123.com! | NULL |
| NULL | NULL | 2020-06-17 |
| NULL | NULL | 2020-06-16 |
| NULL | NULL | 2020-06-15 |
+---------+---------------------+------------+
7 rows in set (0.00 sec)
DATETIME
- DATETIME 類型的格式爲
YYYY-MM-DD HH:MM:SS
,其中,YYYY 表示年,MM 表示月,DD 表示日,HH 表示小時,MM 表示分鐘,SS 表示秒 - 格式:‘YYYY-MM-DD HH:MM:SS’ 或 ‘YYYYMMDDHHMMSS’ ,字符串格式,取值範圍爲 ‘1000-01-0100:00:00’ ~ ‘9999-12-31 23:59:59’
- 格式:‘YY-MM-DD HH:MM:SS’ 或 ‘YYMMDDHHMMSS’ ,字符串格式,其中 YY 範圍爲 ‘00’ ~ ‘99’ ,其中,
'00' ~ '69' 被轉換爲 2000 ~ 2069
,'70' ~ '99' 被轉換爲 1970 ~ 1999
; - 格式:YYYYMMDDHHMMSS 或 YYMMDDHHMMSS ,數字格式,取值範圍同上
mysql> alter table test1 add datetime datetime;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into test1 (datetime) values ("2020-06-17 21:40:56");
Query OK, 1 row affected (0.00 sec)
mysql> select * from test1;
+---------+---------------------+------------+---------------------+
| s | location | 日期 | datetime |
+---------+---------------------+------------+---------------------+
| a | NULL | NULL | NULL |
| a,b,d | NULL | NULL | NULL |
| a,b,c,d | NULL | NULL | NULL |
| NULL | This is an example! | NULL | NULL |
| NULL | haha123.com! | NULL | NULL |
| NULL | NULL | 2020-06-17 | NULL |
| NULL | NULL | 2020-06-16 | NULL |
| NULL | NULL | 2020-06-15 | NULL |
| NULL | NULL | NULL | 2020-06-17 21:40:56 |
+---------+---------------------+------------+---------------------+
9 rows in set (0.00 sec)
TIMESTAMP
- TIMESTAMP 類型的格式爲
YYYY-MM-DD HH:MM:SS
,顯示寬度固定在19個字符; - TIMESTAMP 與 DATETIME 的區別在於,TIMESTAMP 的取值範圍
小於
DATETIME 的取值範圍; - TIMESTAMP 的取值範圍爲
1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC
,其中 UTC 是世界標準時間,存儲時會對當前時區進行轉換,檢索時再轉換回當前時區.
mysql> alter table test1 add timestamp timestamp;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into test1 (timestamp) values ("2020-06-18 00:00:01");
Query OK, 1 row affected (0.00 sec)
mysql> select * from test1;
+---------+---------------------+------------+---------------------+---------------------+
| s | location | 日期 | datetime | timestamp |
+---------+---------------------+------------+---------------------+---------------------+
| a | NULL | NULL | NULL | 2020-06-17 21:53:36 |
| a,b,d | NULL | NULL | NULL | 2020-06-17 21:53:36 |
| a,b,c,d | NULL | NULL | NULL | 2020-06-17 21:53:36 |
| NULL | This is an example! | NULL | NULL | 2020-06-17 21:53:36 |
| NULL | haha123.com! | NULL | NULL | 2020-06-17 21:53:36 |
| NULL | NULL | 2020-06-17 | NULL | 2020-06-17 21:53:36 |
| NULL | NULL | 2020-06-16 | NULL | 2020-06-17 21:53:36 |
| NULL | NULL | 2020-06-15 | NULL | 2020-06-17 21:53:36 |
| NULL | NULL | NULL | 2020-06-17 21:40:56 | 2020-06-17 21:53:36 |
| NULL | NULL | NULL | NULL | 2020-06-18 00:00:01 |
+---------+---------------------+------------+---------------------+---------------------+
10 rows in set (0.01 sec)
# 配置完會發現除了修改的時間戳其他的都已經改成了本地的時間
字符串類型
- 字符串類型用來存儲字符串數據,還可以存儲比如圖片和聲音的二進制數據
- MySQL 支持兩種字符串類型:
文本字符串
和二進制字符串
文本字符串如下:
CHAR 和 VARCHAR
- CHAR(M) 爲
固定長度的字符串
,在定義時指定字符串列長,當保存時在右側填充空格以達到指定的長度,M 表示列長度,取值範圍是 0~255 個字符
,例如,CHAR(4) 定義了一個固定長度的字符串列,其包含的字符個數最大爲 4,當檢索到 CHAR 值時,尾部的空格將被刪掉; - VARCHAR(M) 爲可變長度的字符串,M 表示最大列長度,
取值範圍是 0~65535
;
# CHAR固定字符串
mysql> alter table classes add name char(4);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into classes (name) values("lisi");
Query OK, 1 row affected (0.01 sec)
mysql> insert into classes (name) values("chengjisihan");
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql>
# VARCHAR可變字符串
mysql> alter table classes modify name varchar(25);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into classes (name) values("chengjisihan");
Query OK, 1 row affected (0.01 sec)
mysql> select * from classes
-> ;
+------+-----------+--------------+
| id | level | name |
+------+-----------+--------------+
| 1 | good | NULL |
| 2 | excellent | NULL |
| 3 | bad | NULL |
| NULL | NULL | lisi |
| NULL | NULL | chengjisihan |
+------+-----------+--------------+
5 rows in set (0.01 sec)
TEXT
- TINYTEXT 最大長度爲
255
個字符 - TEXT 最大長度爲
65536
個字符 - MEDIUMTEXT 最大長度爲
16777215
個字符 - LONGTEXT 最大長度爲
4294967295
個字符
注:TEXT家族用法都一樣,只是長度不同,就不一一舉例了,根據自己的需求改變長度即可
mysql> alter table test1 add location text;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc test1;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| s | set('a','b','c','d') | YES | | NULL | |
| location | text | YES | | NULL | |
+----------+----------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into test1(location) values("This is an example");
Query OK, 1 row affected (0.00 sec)
mysql> select * from test1;
+---------+--------------------+
| s | location |
+---------+--------------------+
| a | NULL |
| a,b,d | NULL |
| a,b,c,d | NULL |
| NULL | This is an example |
+---------+--------------------+
4 rows in set (0.00 sec)
ENUM
ENUM 是一個字符串對象,其值爲表創建時在列規定中枚舉(即列舉)的一列值
,即就像做多選題一樣,只能在給出的選項裏面選擇,語法格式爲:字段名 ENUM ('值1', '值2', ..... '值n')
字段名指將要定義的字段,值 n 指枚舉列表中的第 n 個值,ENUM類型的字段在取值時,只能在指定的枚舉列表中取
,而且一次只能取一個,列表值所允許的成員值從 1 開始編號,MySQL 存儲的就是這個索引編號。
mysql> create table classes
-> (
-> id int,
-> level enum('excellent','good','bad')
-> );
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> insert into classes values(1,'good'),(2,1),(3,3); #後兩個根據索引插入的
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from classes;
+------+-----------+
| id | level |
+------+-----------+
| 1 | good |
| 2 | excellent |
| 3 | bad |
+------+-----------+
3 rows in set (0.00 sec)
mysql> insert into classes values(4,'best'); // 如果插入一個沒有定義過的枚舉值'best'會報錯
ERROR 1265 (01000): Data truncated for column 'level' at row 1
SET
- SET 是一個字符串對象,可以有零個或多個值,SET 列最多可以有 64 個成員,其值爲表創建時規定的一列值,語法:
SET('值1','值2',...... '值n')
- 與 ENUM 類型相同,SET 值在內部用整數表示,列表中每一個值都有一個索引編號;
- 與 ENUM 類型不同的是,ENUM 類型的字段只能從定義的列值中選擇一個值插入,而 SET 類型的列可從定義的列值中選擇
多個字符的聯合
; - 如果插入 SET 字段中列值有重複,則 MySQL
自動刪除重複的值
,插入 SET 字段的值的順序並不重要,MySQL 會在存入數據庫時,按照定義的順序顯示
mysql> create table test1 (s set('a','b','c','d'));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test1 values ('a'),('a,b,a,d'),('d,b,a,c');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test1;
+---------+
| s |
+---------+
| a |
| a,b,d |
| a,b,c,d |
+---------+
3 rows in set (0.00 sec)
二進制字符串如下:
二進制字符串會應用到一些安全係數要求比較高的場景
BIT
- BIT 數據類型用來保存位字段值,即以
二進制的形式來保存數據
,如保存數據 13,則實際保存的是 13 的二進制值,即 1101; - BIT 是位字段類型,
BIT(M) 中的 M 表示每個值的位數
,範圍爲 1~64 ,如果 M 被省略,則默認爲 1 ,如果爲 BIT(M) 列分配的值的長度小於 M 位,則在值得左邊用 0 填充; - 如果需要位數至少爲 4 位的 BIT 類型,即可定義爲 BIT(4) ,則最大 可插入的數據爲15(1111);
mysql> create table test2(b BIT(4));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test2 values (2),(9),(15);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test2;
+------+
| b |
+------+
| |
| |
| |
+------+
3 rows in set (0.00 sec)
mysql> select BIN(b+0) from test2;
+----------+
| BIN(b+0) |
+----------+
| 10 |
| 1001 |
| 1111 |
+----------+
3 rows in set (0.00 sec)
mysql> insert into test2 values (16);
ERROR 1406 (22001): Data too long for column 'b' at row 1
mysql>
# M定義爲4最大十進制數爲15,至於爲什莫,參考100以內自然數二進制轉換
BINARY 和 VARBINARY
- BINARY 和 VARBINARY 類型類似於
CHAR 和 VARCHAR
,不同的是它們包含二進制字節字符串; - BINARY 類型的長度是固定的,指定長度之後,不足最大長度的,將在它們右邊填充 ‘\0’ 以補齊指定長度;
- VARBINARY 類型的長度是可變的,指定長度之後,其長度可以在
0 到最大值之間
,
mysql> create table test3
-> (
-> b binary(3), # 定義固定長度爲3的BINARY類型
-> vb varbinary(30) # 定義可變長度爲30的VARBINARY類型
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test3 values(5,5);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test3;
+------+------+
| b | vb |
+------+------+
| 5 | 5 |
+------+------+
1 row in set (0.00 sec)
mysql> select length(b),length(vb) from test3;
+-----------+------------+
| length(b) | length(vb) |
+-----------+------------+
| 3 | 1 | # BINARY佔用的空間爲固定的指定的值
| | | # VARBINARY佔用的空間爲可變的插入的值
+-----------+------------+
1 row in set (0.00 sec)
插入多行值以後,發現下面情況,定義的binary佔用空間是固定值,varbinary可變,並且定義長度爲30,包括的範圍是0到最大值;
mysql> select * from test3;
+------+--------+
| b | vb |
+------+--------+
| 5 | 5 |
| 2 | 5 |
| 8 | 5 |
| 8 | 8 |
| 25 | 100 |
| 100 | 625 |
| 100 | 1625 |
| 100 | 0 |
| 100 | 165254 |
+------+--------+
9 rows in set (0.00 sec)
mysql> select length(b),length(vb) from test3;
+-----------+------------+
| length(b) | length(vb) |
+-----------+------------+
| 3 | 1 |
| 3 | 1 |
| 3 | 1 |
| 3 | 1 |
| 3 | 3 |
| 3 | 3 |
| 3 | 4 |
| 3 | 1 |
| 3 | 6 |
+-----------+------------+
9 rows in set (0.00 sec)
運算符介紹
根據運算符的作用,我們大致可分爲4類
- 比較運算符
- 算術運算符
- 邏輯運算符
- 位移運算符
比較運算符
等於運算符 ( = )
等於運算符用來判斷數字
、字符串
和表達式
是否相等,如果相等,則返回值爲 1 ,否則返回值爲 0 ,如果有一個值是NULL
,則比較結果爲 NULL
mysql> select 1=0,'2'=2,(1+3)=(2+2),1=null;
+-----+-------+-------------+--------+
| 1=0 | '2'=2 | (1+3)=(2+2) | 1=null |
+-----+-------+-------------+--------+
| 0 | 1 | 1 | NULL |
+-----+-------+-------------+--------+
1 row in set (0.00 sec)
安全等於運算符 ( <=> )
這個操作符和等於運算符(=)的作用一致,只不過多了一個功能,就是可以判斷 NULL 值
mysql> select 1<=>0,'2'<=>2,(1+3)<=>(2+2),1<=>null;
+-------+---------+---------------+----------+
| 1<=>0 | '2'<=>2 | (1+3)<=>(2+2) | 1<=>null |
+-------+---------+---------------+----------+
| 0 | 1 | 1 | 0 |
+-------+---------+---------------+----------+
1 row in set (0.00 sec)
不等於運算符 ( <> 或 != )
不等於運算符用於判斷數字
、字符串
、表達式
是否不相等,如果不相等則返回 1
,否則返回0
,但是不能判斷NULL 值
;
mysql> select 'good'<>'god',1<>2,4!=4,null!=null;
+---------------+------+------+------------+
| 'good'<>'god' | 1<>2 | 4!=4 | null!=null |
+---------------+------+------+------------+
| 1 | 1 | 0 | NULL |
+---------------+------+------+------------+
1 row in set (0.01 sec)
IS NULL 、ISNULL 、IS NOT NULL
- IS NULL 和 ISNULL 檢驗一個值是否爲 NULL ,如果爲
NULL
,返回值爲1
,否則返回值爲0
; - IS NOT NULL 檢驗一個值是否不爲 NULL ,如果
不爲 NULL
,返回值爲1
,否則返回值爲0
;
樣板:
mysql> select * from test2;
+----+------------+--------+-----------+------------------+
| id | age | height | t1 | t2 |
+----+------------+--------+-----------+------------------+
| 1 | 18 | 182 | NULL | NULL |
| 2 | 20 | 184 | NULL | NULL |
| 3 | 22 | 183 | NULL | NULL |
| 4 | 2155 | NULL | NULL | NULL |
| 5 | 21550 | NULL | NULL | NULL |
| 6 | 1234679826 | NULL | NULL | NULL |
| 7 | NULL | NULL | 123.12346 | NULL |
| 8 | NULL | NULL | NULL | 12346.1234567000 |
| 9 | NULL | NULL | 12.12346 | NULL |
+----+------------+--------+-----------+------------------+
9 rows in set (0.00 sec)
mysql> select t1 is null from test2 where id=1;
+------------+
| t1 is null |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)
mysql> select t1 is not null from test2 where id=1;
+----------------+
| t1 is not null |
+----------------+
| 0 |
+----------------+
1 row in set (0.00 sec)
BETWEEN AND
用於判斷一個值是否落在兩個值之間,正確返回1,否則返回0;
mysql> select age between 16 and 20 from test2 where id=1;
+-----------------------+
| age between 16 and 20 |
+-----------------------+
| 1 |
+-----------------------+
1 row in set (0.00 sec)
mysql>
LEAST 、GREATEST
- LEAST :當有兩個或多個參數時,返回最小值,如果有一個值是 NULL ,則返回結果爲 NULL
- GREATEST :當有兩個或多個參數時,返回最大值,如果有一個值是 NULL ,則返回結果爲 NULL
mysql> select least (2,0);
+-------------+
| least (2,0) |
+-------------+
| 0 |
+-------------+
1 row in set (0.00 sec)
mysql> select greatest (2,0);
+----------------+
| greatest (2,0) |
+----------------+
| 2 |
+----------------+
1 row in set (0.01 sec)
IN 、NOT IN
- IN :判斷一個值是否是 IN 列表中的任意一個值
- NOT IN :判斷一個值是否不是 IN 列表中的任意一個值
mysql> select 2 in (1,3,5),2 not in (1,3,5);
+--------------+------------------+
| 2 in (1,3,5) | 2 not in (1,3,5) |
+--------------+------------------+
| 0 | 1 |
+--------------+------------------+
1 row in set (0.00 sec)
LIKE
- LIKE 運算符用來匹配字符串,如果匹配則返回
1
,如果不匹配則返回0
; - LIKE 使用兩種通配符:
'%'
用於匹配任何數目的字符,包括零字符 ;'_'
只能匹配一個字符
mysql> select height like '18%' from test2;
+-------------------+
| height like '18%' |
+-------------------+
| 1 |
| 1 |
| 1 |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
+-------------------+
9 rows in set (0.00 sec)
PS:這裏要注意和select查詢時的模糊查詢,在運算符裏面給你回傳的結果是1或0,只是有沒有的問題,模糊查詢回傳的是查詢結果,一般會和where條件語句連接詞一起使用,如下
mysql> select * from test2 where height like '18%';
+----+------+--------+------+------+
| id | age | height | t1 | t2 |
+----+------+--------+------+------+
| 1 | 18 | 182 | NULL | NULL |
| 2 | 20 | 184 | NULL | NULL |
| 3 | 22 | 183 | NULL | NULL |
+----+------+--------+------+------+
3 rows in set (0.00 sec)
REGEXP
- REGEXP 運算符用來匹配字符串,如果匹配則返回
1
,如果不匹配則返回0
; - REGEXP 使用幾種通配符:
‘^’ 用於匹配以什麼開頭的字符串
‘$’ 用於匹配以什麼結尾的字符串
‘.’ 用於匹配任何一個單字符串
‘[…]’ 用於匹配在方括號內的任何字符
‘*’ 用於匹配零個或多個在它前面的字符
mysql> select age regexp '^2' from test2;
+-----------------+
| age regexp '^2' |
+-----------------+
| 0 |
| 1 |
| 1 |
| 1 |
| 1 |
| 0 |
| NULL |
| NULL |
| NULL |
+-----------------+
9 rows in set (0.00 sec)
PS:通常也被應用到select查詢中,也叫正則表達式查詢,
mysql> select * from test2 where age regexp '^2';
+----+-------+--------+------+------+
| id | age | height | t1 | t2 |
+----+-------+--------+------+------+
| 2 | 20 | 184 | NULL | NULL |
| 3 | 22 | 183 | NULL | NULL |
| 4 | 2155 | NULL | NULL | NULL |
| 5 | 21550 | NULL | NULL | NULL |
+----+-------+--------+------+------+
4 rows in set (0.00 sec)
算術運算符
- +:加法運算
- -:減法運算
- *:乘法運算
- / :除法運算,返回商
- % :求餘運算,返回餘數
mysql> create table test3 (num int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test3 values(64);
Query OK, 1 row affected (0.00 sec)
mysql> select num,num+10,num-3,num*3,num/3,num%3 from test3;
+------+--------+-------+-------+---------+-------+
| num | num+10 | num-3 | num*3 | num/3 | num%3 |
+------+--------+-------+-------+---------+-------+
| 64 | 74 | 61 | 192 | 21.3333 | 1 |
+------+--------+-------+-------+---------+-------+
1 row in set (0.00 sec)
mysql>
邏輯運算符
邏輯非 ( NOT 或 !)
- 當操作數爲 0 時,所得值爲 1
- 當操作數爲非 0 時,所得值爲 0
- 當操作數爲 NULL 時,所得值爲 NULL
mysql> select not 10,not 10-10,!(10-5),! null;
+--------+-----------+---------+--------+
| not 10 | not 10-10 | !(10-5) | ! null |
+--------+-----------+---------+--------+
| 0 | 1 | 0 | NULL |
+--------+-----------+---------+--------+
1 row in set (0.00 sec)
邏輯與 ( AND 或 && )
- 當所有操作數均爲非零值、並且不爲 NULL 時,所得值爲 1
- 當一個或多個操作數爲 0 時,所得值爲 0
- 其餘情況所得值爲 NULL
mysql> select 10 and 5,(10-10) and 5,5 && null;
+----------+---------------+-----------+
| 10 and 5 | (10-10) and 5 | 5 && null |
+----------+---------------+-----------+
| 1 | 0 | NULL |
+----------+---------------+-----------+
1 row in set (0.00 sec)
邏輯或 ( OR 或 || )
- 當兩個操作數均爲非 NULL 值,且任意一個操作數爲非零值時,結果爲 1 ,否則爲 0
- 當有一個操作數爲 NULL ,且另一個操作數爲非零值時,則結果爲 1 ,否則結果爲 NULL
- 當兩個操作數均爲 NULL 時,則所得結果爲 NULL
mysql> select (5*2)||(0*5),(5*3)||(5-3),null||(5/2),null||null;
+--------------+--------------+-------------+------------+
| (5*2)||(0*5) | (5*3)||(5-3) | null||(5/2) | null||null |
+--------------+--------------+-------------+------------+
| 1 | 1 | 1 | NULL |
+--------------+--------------+-------------+------------+
1 row in set (0.00 sec)
邏輯異或 ( XOR )
a XOR b
的計算等同於( a AND (NOT b) )
或( (NOT a) AND b )
- 當任意一個操作數爲 NULL 時,返回值爲 NULL
- 對於非 NULL 的操作數,如果兩個操作數都是非 0 值或者都是 0 值,則返回結果爲 0
- 如果一個爲 0 值,另一個爲非 0 值,返回結果爲 1
mysql> select 1 xor 1,1 xor 0,1 xor null;
+---------+---------+------------+
| 1 xor 1 | 1 xor 0 | 1 xor null |
+---------+---------+------------+
| 0 | 1 | NULL |
+---------+---------+------------+
1 row in set (0.00 sec)
位運算符
全部針對二進制形式進行的操作
位或運算符 ( | )
對應的二進制位有一個或兩個爲 1 ,則該位的運算結果爲 1 ,否則爲 0
mysql> select 10 | 15 , 9 | 4 | 2 ;
+---------+-----------+
| 10 | 15 | 9 | 4 | 2 | # 10的二進制爲1010,15的二進制爲1111,按位或運算之後結果爲1111,即15
+---------+-----------+ # 9的二進制爲1001,4爲0100,2的二進制爲0010,按位或運算之後1111,也是15
| 15 | 15 |
+---------+-----------+
1 row in set (0.00 sec)
****************************************************************
爲什麼是15?我們來用二進制算一下,以第一組爲例
128 64 32 16 8 4 2 1 #二進制
1 0 1 0 #二進制10的表示
1 1 1 1 #二進制15的表示
根據位或規則得 `1 1 1 1`,對應起來十進制數就是15
位與運算符 ( & )
對應的二進制位都爲 1 ,則該位的運算結果爲 1 ,否則爲 0
mysql> select 10 & 15 , 9 & 4 & 2 ;
+---------+-----------+
| 10 & 15 | 9 & 4 & 2 |
+---------+-----------+
| 10 | 0 |
+---------+-----------+
1 row in set (0.00 sec)
位異或運算符 ( ^ )
對應的二進制位不相同時,結果爲 1 ,否則爲 0
mysql> select 10 ^ 15 , 9 ^ 4 ^ 2 ;
+---------+-----------+
| 10 ^ 15 | 9 ^ 4 ^ 2 |
+---------+-----------+
| 5 | 15 |
+---------+-----------+
1 row in set (0.00 sec)
位左移運算符 ( << )
使指定的二進制位都左移指定的位數,左移指定位之後,左邊高位的數值將被移出並丟棄,右邊低位空出的位置用 0 補齊
mysql> select 1<<2 , 4<<2 ;
+------+------+
| 1<<2 | 4<<2 | # 1的二進制值爲00000001,左移兩位之後變成00000100,即十進制數4
+------+------+ # 4的二進制值爲00000100,左移兩位之後變成00010000,即十進制數16
| 4 | 16 |
+------+------+
位右移運算符 ( >> )
使指定的二進制位都右移指定的位數,右移指定位之後,右邊低位的數值將被移出並丟棄,左邊高位空出的職位用 0 補齊
mysql> select 1>>1,16>>2;
+------+-------+
| 1>>1 | 16>>2 |
+------+-------+
| 0 | 4 |
+------+-------+
1 row in set (0.00 sec)
位取反運算符 ( ~ )
將對應的二進制數逐位反轉,即 1 取反後變 0 , 0 取反後變 1
mysql> select 5 & ~1;
+--------+
| 5 & ~1 |
+--------+
| 4 |
+--------+
1 row in set (0.00 sec)
************************************************************
4是怎麼得來的?
5=0101
~1=1110
位與以後得0100,換成十進制就是4
運算符優先級比較
從低到高:
=(賦值運算) || or
XOR
&& AND
NOT
BETWEEN
=(比較運算) , <=>, >=, <>, <=, < > , != ,IS, LIKE, IN ,REGEXP
|&
<< >>
- +
* / %
-(負號) ~(位取反) !