now() 是MySQL的內建函數,返回當前的日期和時間。在MySQL中能夠直接使用下列語句查詢:html
SELECT NOW();
可是某些數據庫規定查詢語句必須包含 from 子句,並在其中至少指定一個表名,好比普遍使用的 Oracle 數據庫。mysql
這時若是僅僅須要調用一個函數,Oracle 爲此提供了一個特殊的表 dual,該表只包含一個名爲 dummy(虛擬的)的列,而且只會有一個數據行。sql
爲了能與 Oracle 數據庫保持兼容,MySQL 也提供了 dual 表,因此當前時間查詢還能夠寫成下面的形式:數據庫
SELECT NOW() FROM DUAL;
字符型數據可使用定長或可變長字符串來實現,固定長度的字符串使用空格向右填充,以保證佔用一樣的字節數,變長字符串不須要向右填充,字節數可變。服務器
在全部主流數據庫中,char 和 varchar 的使用方式都是相似的,注意,Oracle 數據庫對 varchar 的使用是個特例,使用 varchar2 類型表示可變長字符串。cookie
char 列能夠設置的最大長度爲 255 個字節,varchar 最大長度爲 65535 個字節。函數
若是須要存儲最大長度不超過 20 個字符的字符串,能夠這樣定義:post
char(20) varchar(20)
對於拉丁系語言,好比英語,每一個字母只須要 1 個字節來存儲,其餘一些語言,好比漢語,日語,韓語等,每一個字符的存儲須要多個字節,這類字符集被稱爲多字符集。url
查看數據庫服務器支持的字符集,查詢結果中第四列 maxlen 大於 1,那麼該字符集爲多字符集。spa
SHOW CHARACTER SET;
能夠看到有兩個 utf8 和 utf8mb4,參考 MySQL 數據庫字符集 utf8 和 utf8mb4 的區別
能夠單獨爲表中某一列設置專用字符集,在類型定義的後邊加上字符集名稱便可,好比修改 username 列爲 utf8mb4:
`username` varchar(10) CHARACTER SET utf8mb4 NOT NULL,
若是須要存儲的數據超過 64KB(varchar 列所能容許的最大值),就須要使用文本類型。下面是 MySQL 的文本類型。
文本類型 | 最大長度字節 |
thinytext | 255 |
text | 65535 |
mediumtext | 16777215 |
longtext | 4294967295 |
注意事項:
(1)保存到文本類型列中的數據超出了該類型最大長度,數據會被截斷。
(2)向文本列保存數據的時候,不會消除數據的尾部空格。
(3)當使用文本列排序或分組的時候,只會使用前 1024 個字節,固然在須要時能夠放寬該限制。
(5)MySQL 中 varchar 最大爲 65535 字節,因此不須要使用 thinytext 和 text 類型了。
其餘數據庫:
(4)SQLServer 只提供 text 類型,DB2 和 Oracle 的文本類型爲 clob。
(5)Oracle 中 char 列最多 2000 字節,varchar2 列最大4000 字節,SQLServer 中 char 和 varchar 都能最大容納 8000 字節。
使用整數類型的時候,MySQL將爲存儲數據分配合適大小的空間,從1個字節到8個字節不等,因此咱們選擇整數類型的時候只須要確保可以容納預期的最大數字便可。
能夠在這些整數類型前面加上 UNSIGNED 關鍵字,指定該列數據 >=0。
在建立表時,輸入的 id int(11),後面的 11 表示的是該數據類型指定的顯示寬度。顯示寬度與數據類型的取值範圍無關,顯示寬度只是指明 mysql 最大可能顯示的數字個數。最大的合法的顯示寬度是 255,當數值的位數小於指定寬度時會由空格填充,若是插入的值大於顯示寬度,只要該值不超過該類型的取值範圍,數值依然能夠插入,也能夠完整顯示。若是不指定數值,則系統爲每一種類型指定默認的寬度值。
使用浮點類型時,能夠指定其精度(小數點左邊到右邊所容許的總位數)和有效位數(小數點右邊所容許的數字位數),不是必須的。
若是數字位數超過了該列所定義的精度或者有效位數,該數據將被四捨五入。
能夠在這些浮點類型前面加上 UNSIGNED 關鍵字,指定該列數據 >=0,不過和整型的區別是並無改變該列所存儲數據的範圍。
一個定義爲 float(4,2) 的列將會存儲四位有效數字,其中兩位在小數點左邊,兩位在小數點右邊。
若是向該列中添加數據 27.44 和 8.19 是容許的,可是添加 17.8675 將會被四捨五入爲 17.87, 添加 178.375 則會報錯。
TIME 類型的默認格式爲 HHH:MI:SS
DATETIME 類型的默認格式爲 YYYY-MM-DD HHH:MI:SS
TIMESTAMP 類型的默認格式爲 YYYY-MM-DD HHH:MI:SS
組成部分 | 定義 | 範圍 |
YYYY | 年份,包括世紀 | 1000~9999 |
MM | 月份 | 01~12 |
DD | 日 | 01~31 |
HH | 小時 | 00~23 |
HHH | 小時(過去的) | -838~838 |
MI | 分鐘 | 00~59 |
SS | 秒 | 00~59 |
Oracle 容許的日期範圍:公元前4712年~公元9999年。
MySQL 容許的日期範圍:公元前1000年~公元9999年。
SQLServer 容許的日期範圍:公元前1753年~公元9999年。
時間日期操做
MysQL數據庫涉及到日期的操做,能夠直接按照默認格式提供字符串,也能夠顯式的指定字符串格式,下面兩句SQL效果相同
(1)使用默認格式。例如 person 表中 birth_date 字段類型爲 date,則默認格式爲 YYYY-MM-DD
UPDATE person SET birth_date = '1980-12-21' WHERE person_id = 1;
(2)使用 str_to_date 函數指定字符串格式。
UPDATE person SET birth_date = STR_TO_DATE('DEC-21-1980', '%b-%d-%Y') WHERE person_id = 1;
詳細格式參考:MySQL 日期、字符串、時間戳互轉
CREATE TABLE person( person_id SMALLINT UNSIGNED, fname VARCHAR(20), lname VARCHAR(20), #gender CHAR(1) CHECK(gender IN ('M','F')), gender ENUM('M','F'), birth_date DATE, street VARCHAR(20), city VARCHAR(20), state VARCHAR(20), country VARCHAR(20), postal_code VARCHAR(20), CONSTRAINT pk_person PRIMARY KEY (person_id) );
喜歡的食物表
CREATE TABLE favorite_food( person_id SMALLINT UNSIGNED, food VARCHAR(20), CONSTRAINT pk_favorite_food PRIMARY KEY (person_id, food), CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id) REFERENCES person (person_id) );
(1)UNSIGNED 表示該列爲大於等於 0 的整數
person_id SMALLINT UNSIGNED
(2)性別,只有兩個值,因此使用了檢查約束。
gender CHAR(1) CHECK(gender IN ('M','F'))
對於大多數數據庫檢查約束都是能夠正常工做的,可是對於 MySQL 數據庫,雖然容許定義檢查約束,可是並不強制使用它,因此在 MySQL 中咱們使用枚舉 enum 字符數據類型,實現檢查約束的功能。因此能夠這樣定義性別
gender ENUM('M','F')
(3)複合主鍵,該主鍵包含了兩列,person_id 和 food。
CONSTRAINT pk_favorite_food PRIMARY KEY (person_id, food)
(4)外鍵,限制了 favorite_food 表中的 person_id 只能來自於 person 表
注意:外鍵約束只能在使用 InnoDB 存儲引擎建表時才起做用。
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id) REFERENCES person (person_id)
(5)建立完表以後,可使用 describe 命令檢查表定義,可簡寫爲 desc。
DESC person;
DESCRIBE favorite_food;
NULL 用於各類不能賦值的狀況,例如業務上不可行,不知道應賦何值,集合爲空等狀況。
(4)經過查看 Navicate 對象信息中的 DDL 中SQL語句,能夠看出和原始建表語句有一點點區別
CREATE TABLE `person` ( `person_id` smallint(5) unsigned NOT NULL, `fname` varchar(20) DEFAULT NULL, `lname` varchar(20) DEFAULT NULL, `gender` enum('M','F') DEFAULT NULL, `birth_date` date DEFAULT NULL, `street` varchar(20) DEFAULT NULL, `city` varchar(20) DEFAULT NULL, `state` varchar(20) DEFAULT NULL, `country` varchar(20) DEFAULT NULL, `postal_code` varchar(20) DEFAULT NULL, PRIMARY KEY (`person_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `favorite_food` ( `person_id` smallint(5) unsigned NOT NULL, `food` varchar(20) NOT NULL, PRIMARY KEY (`person_id`,`food`), CONSTRAINT `fk_fav_food_person_id` FOREIGN KEY (`person_id`) REFERENCES `person` (`person_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(1)生成主鍵
Oracle 數據庫提供了使用序列號(sequence)生成數字型主鍵
MySQL 只須要爲主鍵列打開自增特性(aoto-increment),默認從1開始自增。
使用 alter table 修改已存在的表的定義。
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED auto_increment;
提示如下錯誤,提示說 person_id 爲 favorite_food 表中的外鍵,不能修改。因此我先把 favorite_food 刪掉,等修改完 person_id 後再生成 favorite_food 表。
[SQL]ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED auto_increment; [Err] 1833 - Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'bank.favorite_food'
插入數據的時候能夠簡單的將 person_id 列賦值爲 null,MySQL 會爲該列提供下一個可用的數字主鍵。
(2)插入數據
INSERT INTO person(person_id, fname, lname, gender, birth_date) VALUES (NULL, 'William', 'Turner', 'M', '1972-05-27');
INSERT INTO person(person_id, fname, lname, gender, birth_date, street, city, state, country, postal_code) VALUES (NULL, 'Susan', 'Smith', 'F', '1975-11-02', '23 Maple st.', 'Arlington', 'VA', 'USA', '20220');
能夠看出,自動生成了主鍵,接着插入喜好的食物
INSERT INTO favorite_food(person_id, food) VALUES (1, 'pizza'),(1, 'cookies'),(1, 'nachos');
(3)更新數據
UPDATE person SET street = '1225 Tremont St.', city = 'Boston', state = 'MA', country = 'USA', postal_code = '02138' WHERE person_id = 1;
(4)刪除數據
DELETE FROM person WHERE person_id = 2;
(5)查詢數據
SELECT * FROM person;
查看數據庫中可用的表
SHOW TABLES;
刪除表
DROP TABLE person;