mysql學習筆記(四)——數據類型與運算符(詳細)

前言

內容比較多,一下子可能會看不完,建議收藏,怕你們以後找不到我了。
在這裏插入圖片描述

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)

浮點數類型和定點數類型

  1. MySQL 中使用浮點數和定點數來表示小數,浮點數有兩種類型:單精度浮點數(FLOAT)和雙精度浮點數(DOUBLE),定點數只有 DECIMAL;
  2. 浮點數和定點數都可以用(M,N) 來表示,其中 M 是精度,表示總共的位數,N 是標度,表示小數的位數;
  3. DECIMAL 實際是以字符串形式存放的,在對精度要求比較高的時候(如貨幣、科學數據等)使用DECIMAL 類型會比較好;
  4. 浮點數相對於定點數的優點是在長度一定的情況下,浮點數能夠表示更大的數據範圍,它的缺點是會引起精度問題

在這裏插入圖片描述
例子:

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 日期/時間類型

  1. MySQL 有多種表示日期的數據類型,比如,當只記錄年信息的時候,可以使用 YEAR 類型,而沒有必要使用 DATE 類型
  2. 每一個類型都有合法的取值範圍,當指定確實不合法的值時系統將 “零” 值插入到數據庫中

在這裏插入圖片描述

YEAR

  1. 格式:以4位字符串格式表示的 YEAR ,範圍爲 ‘1901’ ~ ‘2155’
  2. 格式:以4位數字格式表示的 YEAR ,範圍爲 1901 ~ 2155
  3. 格式:以2位字符串格式表示的 YEAR ,範圍爲 ‘00’ ~ ‘99’ ,其中,'00' ~ '69' 被轉換爲 2000 ~ 2069'70' ~ '99' 被轉換爲 1970 ~ 1999
  4. 格式:以2位數字格式表示的 YEAR ,範圍爲 1 ~ 99 ,其中,1 ~ 69 被轉換爲 2001 ~ 206970 ~ 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

  1. TIME 類型的格式爲 HH:MM:SS ,HH 表示小時,MM 表示分鐘,SS 表示秒;
  2. 格式:以 ‘HHMMSS’ 格式表示的 TIME ,例如 '101112'被理解爲 10:11:12,但如果插入不合法的時間,如 ‘109712’ ,則被存儲爲 00:00:00
  3. 格式:以 ‘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

  1. DATE 類型的格式爲 YYYY-MM-DD ,其中,YYYY 表示年,MM 表示月,DD 表示日;
  2. 格式:'YYYY-MM-DD' 或 'YYYYMMDD',取值範圍爲 '1000-01-01' ~ '9999-12-3';
  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

  1. DATETIME 類型的格式爲YYYY-MM-DD HH:MM:SS ,其中,YYYY 表示年,MM 表示月,DD 表示日,HH 表示小時,MM 表示分鐘,SS 表示秒
  2. 格式:‘YYYY-MM-DD HH:MM:SS’ 或 ‘YYYYMMDDHHMMSS’ ,字符串格式,取值範圍爲 ‘1000-01-0100:00:00’ ~ ‘9999-12-31 23:59:59’
  3. 格式:‘YY-MM-DD HH:MM:SS’ 或 ‘YYMMDDHHMMSS’ ,字符串格式,其中 YY 範圍爲 ‘00’ ~ ‘99’ ,其中,'00' ~ '69' 被轉換爲 2000 ~ 2069'70' ~ '99' 被轉換爲 1970 ~ 1999;
  4. 格式: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

  1. TIMESTAMP 類型的格式爲 YYYY-MM-DD HH:MM:SS,顯示寬度固定在19個字符;
  2. TIMESTAMP 與 DATETIME 的區別在於,TIMESTAMP 的取值範圍小於DATETIME 的取值範圍;
  3. 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)
# 配置完會發現除了修改的時間戳其他的都已經改成了本地的時間

字符串類型

  1. 字符串類型用來存儲字符串數據,還可以存儲比如圖片和聲音的二進制數據
  2. MySQL 支持兩種字符串類型:文本字符串二進制字符串

文本字符串如下:
在這裏插入圖片描述

CHAR 和 VARCHAR

  1. CHAR(M) 爲固定長度的字符串,在定義時指定字符串列長,當保存時在右側填充空格以達到指定的長度,M 表示列長度,取值範圍是 0~255 個字符,例如,CHAR(4) 定義了一個固定長度的字符串列,其包含的字符個數最大爲 4,當檢索到 CHAR 值時,尾部的空格將被刪掉;
  2. 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

  1. TINYTEXT 最大長度爲 255 個字符
  2. TEXT 最大長度爲65536 個字符
  3. MEDIUMTEXT 最大長度爲 16777215個字符
  4. 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

  1. SET 是一個字符串對象,可以有零個或多個值,SET 列最多可以有 64 個成員,其值爲表創建時規定的一列值,語法:SET('值1','值2',...... '值n')
  2. 與 ENUM 類型相同,SET 值在內部用整數表示,列表中每一個值都有一個索引編號;
  3. 與 ENUM 類型不同的是,ENUM 類型的字段只能從定義的列值中選擇一個值插入,而 SET 類型的列可從定義的列值中選擇多個字符的聯合
  4. 如果插入 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

  1. BIT 數據類型用來保存位字段值,即以二進制的形式來保存數據,如保存數據 13,則實際保存的是 13 的二進制值,即 1101;
  2. BIT 是位字段類型,BIT(M) 中的 M 表示每個值的位數,範圍爲 1~64 ,如果 M 被省略,則默認爲 1 ,如果爲 BIT(M) 列分配的值的長度小於 M 位,則在值得左邊用 0 填充;
  3. 如果需要位數至少爲 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

  1. BINARY 和 VARBINARY 類型類似於 CHAR 和 VARCHAR,不同的是它們包含二進制字節字符串;
  2. BINARY 類型的長度是固定的,指定長度之後,不足最大長度的,將在它們右邊填充 ‘\0’ 以補齊指定長度;
  3. 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

  1. IS NULL 和 ISNULL 檢驗一個值是否爲 NULL ,如果爲 NULL ,返回值爲 1,否則返回值爲 0;
  2. 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

  1. LEAST :當有兩個或多個參數時,返回最小值,如果有一個值是 NULL ,則返回結果爲 NULL
  2. 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

  1. IN :判斷一個值是否是 IN 列表中的任意一個值
  2. 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

  1. LIKE 運算符用來匹配字符串,如果匹配則返回1,如果不匹配則返回 0;
  2. 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

  1. REGEXP 運算符用來匹配字符串,如果匹配則返回 1,如果不匹配則返回 0;
  2. 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 或 !)

  1. 當操作數爲 0 時,所得值爲 1
  2. 當操作數爲非 0 時,所得值爲 0
  3. 當操作數爲 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 或 && )

  1. 當所有操作數均爲非零值、並且不爲 NULL 時,所得值爲 1
  2. 當一個或多個操作數爲 0 時,所得值爲 0
  3. 其餘情況所得值爲 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 或 || )

  1. 當兩個操作數均爲非 NULL 值,且任意一個操作數爲非零值時,結果爲 1 ,否則爲 0
  2. 當有一個操作數爲 NULL ,且另一個操作數爲非零值時,則結果爲 1 ,否則結果爲 NULL
  3. 當兩個操作數均爲 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 )

  1. a XOR b 的計算等同於( a AND (NOT b) )( (NOT a) AND b )
  2. 當任意一個操作數爲 NULL 時,返回值爲 NULL
  3. 對於非 NULL 的操作數,如果兩個操作數都是非 0 值或者都是 0 值,則返回結果爲 0
  4. 如果一個爲 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
|&
<< >>
- +
* / %
-(負號) ~(位取反) !
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章