1. 資料型別
MySQL支援多種資料型別,主要有數值型別、日期/時間型別和字串型別。
(1)數值型別:包括整數型別:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,
浮點小數型別:FLOAT和DOUBLE,
定點小數型別:DECIMAL。
(2)日期/時間型別:包括 YEAR、TIME、DATE、DATETIME和TIMESTAMP。
(3)字串型別:包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。
1.1 整數型別
整數型別的欄位可以新增AUTO_INCREMENT自增約束條件。
整數型別:
mysql> CREATE TABLE product -> ( -> id INT AUTO_INCREMENT PRIMARY KEY, -> product_name VARCHAR (100) NOT NULL -> );
mysql> DESC product; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | product_name | varchar(100) | NO | | NULL | | +--------------+--------------+------+-----+---------+----------------+
整數型別無符號:
mysql> CREATE TABLE product -> ( -> id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -> product_name VARCHAR (100) NOT NULL -> );
mysql> DESC product; +--------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | product_name | varchar(100) | NO | | NULL | | +--------------+------------------+------+-----+---------+----------------+
1.2 浮點數型別和定點數型別
MySQL中使用浮點數和定點數來表示小數。
浮點型別包括:單精度浮點型別(FLOAT)和雙精度浮點型別(DOUBLE)。
定點型別只有:DECIMAL。
浮點型別和定點型別都可以使用(M, N)來表示,其中M為精度,表示總位數;N為標度,表示小數的位數。
FLOAT和DOUBLE在不指定精度時,預設會按照實際的精度,DECIMAL不指定精度預設為(10,0)。
1.3 日期與時間型別
MySQL中表示日期的資料型別:DATETIME、DATE、TIMESTAMP、TIME和YEAR。
CURRENT_DATE():返回當前日期
NOW():返回當前日期 + 時間
mysql> SELECT CURRENT_DATE(), NOW(); +----------------+---------------------+ | CURRENT_DATE() | NOW() | +----------------+---------------------+ | 2017-11-01 | 2017-11-01 19:40:58 | +----------------+---------------------+
1.4 字串型別
(1)CHAR和VARCHAR型別
CHAR(m):固定長度字串,m表示列長度,取值範圍 0~255(28-1)。
VARCHAR(m):長度可變的字串,m表示列長度,取值範圍 0~65535(216-1)。
(2)ENUM型別
ENUM是一個字串物件,其值為表建立時在列規定中列舉的一列值。
語法格式:
column_name ENUM('value1', 'value2', ...)
ENUM型別欄位只能在指定的列舉列表中取值,一次只能取一個。
ENUM值在內部使用整數表示,每個列舉值都有一個索引值,列舉列表索引值從1開始。MySQL儲存索引編號。
列舉最多可以有65535(216-1)個元素。
mysql> CREATE TABLE product -> ( -> id INT AUTO_INCREMENT PRIMARY KEY, -> product_name VARCHAR(10), -> size ENUM('x-small', 'small', 'medium', 'large', 'x-large') NOT NULL DEFAULT 'small' -> );
mysql> DESC product; +--------------+----------------------------------------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------------------------------------------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | product_name | varchar(10) | YES | | NULL | | | size | enum('x-small','small','medium','large','x-large') | NO | | small | | +--------------+----------------------------------------------------+------+-----+---------+----------------+ 3 rows in set (0.06 sec)
ENUM型別的取值範圍,示例:size
值 | 索引 |
---|---|
NULL | NULL |
'' | 0 |
x-small | 1 |
small | 2 |
medium | 3 |
large | 4 |
x-large | 5 |
ENUM值按照索引順序排列,並且空字串排在非空字串前,NULL值排在其他所有列舉值前。
ENUM列總有一個預設值。如果ENUM列定義為NULL,則NULL則為該列的一個有效值,並且預設為NULL。如果ENUM列定義為NOT NULL,則預設值為允許的值列表的第1個元素。
mysql> INSERT INTO product(product_name, size) VALUES ('最小碼', 1);
mysql> INSERT INTO product(product_name, size) VALUES ('小碼', 'small');
mysql> SELECT * FROM product; +----+--------------+---------+ | id | product_name | size | +----+--------------+---------+ | 1 | 最小碼 | x-small | | 2 | 小碼 | small | +----+--------------+---------+ 2 rows in set
2. 運算子
MySQL運算子是執行特定算術或邏輯操作的符號,主要分四大類:算術運算子、比較運算子、邏輯運算子及位操作運算子。
2.1 算術運算子
MySQL中的算術運算子:
運算子 | 說明 |
---|---|
+ | 加法運算 |
- | 減法運算 |
* | 乘法運算 |
/ | 除法運算,返回商 |
% | 求餘運算,返回餘數 |
2.2 比較運算子
比較運算子的結果總是1、0或者NULL,比較運算子常在SELECT查詢條件子句中使用,用來查詢滿足指定條件的記錄。
3. 函式
3.1 數學函式
3.2 字串函式
3.3 日期和時間函式
(1)獲取當前日期
mysql> SELECT CURDATE(), CURRENT_DATE(); +------------+----------------+ | CURDATE() | CURRENT_DATE() | +------------+----------------+ | 2018-03-27 | 2018-03-27 | +------------+----------------+
(2)獲取當前時間
mysql> SELECT CURTIME(), CURRENT_TIME(); +-----------+----------------+ | CURTIME() | CURRENT_TIME() | +-----------+----------------+ | 18:52:52 | 18:52:52 | +-----------+----------------+
(3)獲取當前日期時間
mysql> SELECT SYSDATE(), NOW(), CURRENT_TIMESTAMP(), LOCALTIME();
+---------------------+---------------------+---------------------+---------------------+ | SYSDATE() | NOW() | CURRENT_TIMESTAMP() | LOCALTIME() | +---------------------+---------------------+---------------------+---------------------+ | 2018-03-27 19:16:51 | 2018-03-27 19:16:51 | 2018-03-27 19:16:51 | 2018-03-27 19:16:51 | +---------------------+---------------------+---------------------+---------------------+
(4)UNIX時間戳
UNIX_TIMESTAMP(date):返回一個Unix時間戳(1970-01-01 00:00:00 GMT之後的秒數)作為無符號整數。
mysql> SELECT UNIX_TIMESTAMP(), UNIX_TIMESTAMP(NOW()), UNIX_TIMESTAMP('2018-03-27'); +------------------+-----------------------+------------------------------+ | UNIX_TIMESTAMP() | UNIX_TIMESTAMP(NOW()) | UNIX_TIMESTAMP('2018-03-27') | +------------------+-----------------------+------------------------------+ | 1522149805 | 1522149805 | 1522080000 | +------------------+-----------------------+------------------------------+
FROM_UNIXTIME(date):把UNIX時間戳轉換為普通格式的時間,與UNIX_TIMESTAMP(date)互為反函式。
mysql> SELECT FROM_UNIXTIME(1522149805); +---------------------------+ | FROM_UNIXTIME(1522149805) | +---------------------------+ | 2018-03-27 19:23:25 | +---------------------------+
(5)獲取月份:MONTH(date)
mysql> SELECT MONTH(NOW()), NOW(); +--------------+---------------------+ | MONTH(NOW()) | NOW() | +--------------+---------------------+ | 3 | 2018-03-27 19:31:15 | +--------------+---------------------+
mysql> SELECT MONTHNAME(NOW()), NOW(); +------------------+---------------------+ | MONTHNAME(NOW()) | NOW() | +------------------+---------------------+ | March | 2018-03-27 19:32:46 | +------------------+---------------------+
(6)獲取星期
DAYNAME(date):返回對應的星期英文名稱
mysql> SELECT DAYNAME(NOW()), NOW(); +----------------+---------------------+ | DAYNAME(NOW()) | NOW() | +----------------+---------------------+ | Tuesday | 2018-03-27 19:36:17 | +----------------+---------------------+
DAYOFWEEK(date):返回date對應的一週中的索引,1表示週日,...,7表示週六
mysql> SELECT DAYOFWEEK(NOW()), NOW(); +------------------+---------------------+ | DAYOFWEEK(NOW()) | NOW() | +------------------+---------------------+ | 3 | 2018-03-27 19:37:32 | +------------------+---------------------+
WEEKDAY(date):返回date對應的工作日索引,0表示週一,...,6表示週日。
mysql> SELECT WEEKDAY(NOW()), NOW(); +----------------+---------------------+ | WEEKDAY(NOW()) | NOW() | +----------------+---------------------+ | 1 | 2018-03-27 19:40:58 | +----------------+---------------------+
(7)日期計算
DATE_ADD(date,INTERVAL expr unit)
mysql> SELECT DATE_ADD(NOW(),INTERVAL 1 DAY), NOW(); +--------------------------------+---------------------+ | DATE_ADD(NOW(),INTERVAL 1 DAY) | NOW() | +--------------------------------+---------------------+ | 2018-03-28 19:47:46 | 2018-03-27 19:47:46 | +--------------------------------+---------------------+
ADDDATE(expr,days)
mysql> SELECT ADDDATE(NOW(),1), NOW(); +---------------------+---------------------+ | ADDDATE(NOW(),1) | NOW() | +---------------------+---------------------+ | 2018-03-28 19:49:38 | 2018-03-27 19:49:38 | +---------------------+---------------------+
DATE_SUB(date,INTERVAL expr unit)
mysql> SELECT DATE_SUB(NOW(),INTERVAL 1 DAY),NOW(); +--------------------------------+---------------------+ | DATE_SUB(NOW(),INTERVAL 1 DAY) | NOW() | +--------------------------------+---------------------+ | 2018-03-26 19:51:01 | 2018-03-27 19:51:01 | +--------------------------------+---------------------+
SUBDATE(expr,days)
日期與時間格式化:DATE_FORMAT(date,format)
mysql> SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%m:%s'); +----------------------------------------+ | DATE_FORMAT(NOW(),'%Y-%m-%d %H:%m:%s') | +----------------------------------------+ | 2018-03-27 19:03:59 | +----------------------------------------+
3.4 條件判斷函式
3.5 系統資訊函式
(1)VERSION():獲取MySQL版本號
mysql> SELECT VERSION(); +------------+ | VERSION() | +------------+ | 5.7.20-log | +------------+
(2)CONNECTION_ID():獲取MySQL伺服器當前連線的次數,每個連線都有各自唯一的ID
mysql> SELECT CONNECTION_ID(); +-----------------+ | CONNECTION_ID() | +-----------------+ | 12 | +-----------------+
mysql> SHOW PROCESSLIST;
mysql> SHOW FULL PROCESSLIST; +----+------+-----------------+------+---------+------+----------+-----------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------------+------+---------+------+----------+-----------------------+ | 3 | root | localhost:16352 | NULL | Sleep | 1723 | | NULL | | 4 | root | localhost:16424 | test | Sleep | 1679 | | NULL | | 12 | root | localhost:17521 | test | Query | 0 | starting | SHOW FULL PROCESSLIST | | 13 | root | localhost:20898 | test | Sleep | 745 | | NULL | | 14 | root | localhost:20916 | test | Sleep | 154 | | NULL | +----+------+-----------------+------+---------+------+----------+-----------------------+
SHOW PROCESSLIST與SHOW FULL PROCESSLIST區別:
如果是root賬號,能看到所有使用者的當前連線;如果是普通賬號,則只能看到自己佔用的連線。
SHOW PROCESSLIST:只顯示前100條;
SHOW FULL PROCESSLIST:檢視全部記錄。
(3)檢視當前所使用的資料庫
mysql> SELECT DATABASE(), SCHEMA();
(4)獲取當前登入使用者名稱
mysql> SELECT USER(), CURRENT_USER(), SYSTEM_USER(); +----------------+----------------+----------------+ | USER() | CURRENT_USER() | SYSTEM_USER() | +----------------+----------------+----------------+ | root@localhost | root@localhost | root@localhost | +----------------+----------------+----------------+
(5)LAST_INSERT_ID():獲取最後一個自動生成的ID值
LAST_INSERT_ID()自動返回最後一個INSERT或UPDATE為AUTO_INCREMENT列設定的第一個發生的值。
一次插入一條記錄:返回最後一條插入記錄的ID值。
mysql> INSERT INTO product(product_name, size) VALUES ('最小碼', 'x-small');
mysql> INSERT INTO product(product_name, size) VALUES ('小碼', 'small');
mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 2 | +------------------+ 1 row in set
一次插入多條記錄:當使用一條INSERT語句插入多行時,LAST_INSERT_ID()只返回插入第一行資料時產生的值。
mysql> INSERT INTO product(product_name, size) VALUES ('中碼', 'medium'), ('大碼', 'large'), ('最大碼', 'x-large');
mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 3 | +------------------+
mysql> SELECT * FROM product; +----+--------------+---------+ | id | product_name | size | +----+--------------+---------+ | 1 | 最小碼 | x-small | | 2 | 小碼 | small | | 3 | 中碼 | medium | | 4 | 大碼 | large | | 5 | 最大碼 | x-large | +----+--------------+---------+