SQL:結(jié)構(gòu)化查詢語言 RDBMS:關(guān)系型數(shù)據(jù)庫管理系統(tǒng)
SQL可以分為兩個(gè)部分:數(shù)據(jù)操作語言(DML)和數(shù)據(jù)定義語言(DDL)派桩。
查詢和更新指令構(gòu)成了 SQL 的 DML 部分:
SELECT - 從數(shù)據(jù)庫表中獲取數(shù)據(jù)
UPDATE - 更新數(shù)據(jù)庫表中的數(shù)據(jù)
DELETE - 從數(shù)據(jù)庫表中刪除數(shù)據(jù)
INSERT INTO - 向數(shù)據(jù)庫表中插入數(shù)據(jù)
SQL 中最重要的 DDL 語句:
CREATE DATABASE - 創(chuàng)建新數(shù)據(jù)庫
ALTER DATABASE - 修改數(shù)據(jù)庫
CREATE TABLE - 創(chuàng)建新表
ALTER TABLE - 變更(改變)數(shù)據(jù)庫表
DROP TABLE - 刪除表
CREATE INDEX - 創(chuàng)建索引(搜索鍵)
DROP INDEX - 刪除索引
SQL:
SELECT DISTINCT : 去除重復(fù)的數(shù)據(jù)。
ORDER BY :根據(jù)指定的列隊(duì)結(jié)果集進(jìn)行排序徘层,默認(rèn)為升序(ASC)排列,可以設(shè)置為降序(DESC)利职。
Top子句:用于規(guī)定要返回的記錄的數(shù)目趣效。
語法:
SQL Server:
SELECT TOP number | percent column_name(s) FROM table_name;
MySQL:
SELECT column_name(s) FROM table_name LIMIT number;
Oracle:
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number;
通配符
SQL中的通配符必須與LIKE運(yùn)算符一起使用:
描述
- %:替代一個(gè)或多個(gè)字符
- _ :僅替代一個(gè)字符
- [charlist]:字符列中的任何單一字符
- [^charlist] 或者[!charlist]:不在字符列中的任何單一字符
BETWEEN 操作符:
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
- 重要事項(xiàng):不同的數(shù)據(jù)庫對(duì) BETWEEN...AND 操作符的處理方式是有差異的。某些數(shù)據(jù)庫會(huì)列出介于 "Adams" 和 "Carter" 之間的人猪贪,但不包括 "Adams" 和 "Carter" 跷敬;某些數(shù)據(jù)庫會(huì)列出介于 "Adams" 和 "Carter" 之間并包括 "Adams" 和 "Carter" 的人;而另一些數(shù)據(jù)庫會(huì)列出介于 "Adams" 和 "Carter" 之間的人热押,包括 "Adams" 西傀,但不包括 "Carter" 斤寇。所以,請(qǐng)檢查你的數(shù)據(jù)庫是如何處理 BETWEEN....AND 操作符的拥褂!
Join:
下面列出了您可以使用的 JOIN 類型娘锁,以及它們之間的差異。
- JOIN: 如果表中有至少一個(gè)匹配饺鹃,則返回行(INNER JOIN)
- LEFT JOIN: 即使右表中沒有匹配莫秆,也從左表返回所有的行
- RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
- FULL JOIN: 只要其中一個(gè)表中存在匹配悔详,就返回行
INNER JOIN 關(guān)鍵字:
在表中存在至少一個(gè)匹配時(shí)镊屎,INNER JOIN 關(guān)鍵字返回行。
語法
SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name
- 注釋:INNER JOIN 與 JOIN 是相同的茄螃。
LEFT JOIN 關(guān)鍵字
LEFT JOIN 關(guān)鍵字會(huì)從左表 (table_name1) 那里返回所有的行杯道,即使在右表 (table_name2) 中沒有匹配的行。
語法
SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
注釋:在某些數(shù)據(jù)庫中责蝠, LEFT JOIN 稱為 LEFT OUTER JOIN党巾。
RIGHT JOIN 關(guān)鍵字
RIGHT JOIN 關(guān)鍵字會(huì)右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中沒有匹配的行霜医。
語法
SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
注釋:在某些數(shù)據(jù)庫中齿拂, RIGHT JOIN 稱為 RIGHT OUTER JOIN。
FULL JOIN 關(guān)鍵字
只要其中某個(gè)表存在匹配肴敛,F(xiàn)ULL JOIN 關(guān)鍵字就會(huì)返回行署海。
語法
SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name
- 注釋:在某些數(shù)據(jù)庫中, FULL JOIN 稱為 FULL OUTER JOIN医男。
UNION 和 UNION ALL 操作符
UNION 操作符
UNION 操作符用于合并兩個(gè)或多個(gè) SELECT 語句的結(jié)果集砸狞。
請(qǐng)注意,UNION 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列镀梭。列也必須擁有相似的數(shù)據(jù)類型刀森。同時(shí),每條 SELECT 語句中的列的順序必須相同报账。
UNION 語法
SELECT column_name(s) FROM table_name1UNIONSELECT column_name(s) FROM table_name2
注釋:默認(rèn)地研底,UNION 操作符選取不同的值。如果允許重復(fù)的值透罢,請(qǐng)使用 UNION ALL榜晦。
UNION ALL 語法
SELECT column_name(s) FROM table_name1UNION ALLSELECT column_name(s) FROM table_name2
另外,UNION 結(jié)果集中的列名總是等于 UNION 中第一個(gè) SELECT 語句中的列名羽圃。
SELECT INTO 語句
SELECT INTO 語句從一個(gè)表中選取數(shù)據(jù)乾胶,然后把數(shù)據(jù)插入另一個(gè)表中。
SELECT INTO 語句常用于創(chuàng)建表的備份復(fù)件或者用于對(duì)記錄進(jìn)行存檔。
SQL 約束
約束用于限制加入表的數(shù)據(jù)的類型识窿。
可以在創(chuàng)建表時(shí)規(guī)定約束(通過 CREATE TABLE 語句)牙躺,或者在表創(chuàng)建之后也可以(通過 ALTER TABLE 語句)。
我們將主要探討以下幾種約束:
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK
- DEFAULT
當(dāng)表已被創(chuàng)建時(shí)腕扶,如需在 "Id_P" 列創(chuàng)建 UNIQUE 約束,請(qǐng)使用下列 SQL:
ALTER TABLE Persons ADD UNIQUE (Id_P)
如需命名 UNIQUE 約束吨掌,并定義多個(gè)列的 UNIQUE 約束半抱,請(qǐng)使用下面的 SQL 語法:
ALTER TABLE PersonsADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
如需撤銷 UNIQUE 約束,請(qǐng)使用下面的 SQL:
MySQL:
ALTER TABLE Persons DROP INDEX uc_PersonID
SQL Server / Oracle / MS Access:
ALTER TABLE Persons DROP CONSTRAINT uc_PersonID
CHECK 約束:
CHECK 約束用于限制列中的值的范圍膜宋。
如果對(duì)單個(gè)列定義 CHECK 約束窿侈,那么該列只允許特定的值。
如果對(duì)一個(gè)表定義 CHECK 約束秋茫,那么此約束會(huì)在特定的列中對(duì)值進(jìn)行限制史简。
DEFAULT 約束:
DEFAULT 約束用于向列中插入默認(rèn)值。
如果沒有規(guī)定其他的值肛著,那么會(huì)將默認(rèn)值添加到所有的新記錄圆兵。
索引
您可以在表中創(chuàng)建索引,以便更加快速高效地查詢數(shù)據(jù)枢贿。
用戶無法看到索引殉农,它們只能被用來加速搜索/查詢。
注釋:更新一個(gè)包含索引的表需要比更新一個(gè)沒有索引的表更多的時(shí)間局荚,這是由于索引本身也需要更新超凳。因此,理想的做法是僅僅在常常被搜索的列(以及表)上面創(chuàng)建索引耀态。
CREATE INDEX 語法
在表上創(chuàng)建一個(gè)簡(jiǎn)單的索引轮傍。允許使用重復(fù)的值:
CREATE INDEX index_name ON table_name (column_name)
CREATE UNIQUE INDEX 語法
在表上創(chuàng)建一個(gè)唯一的索引。唯一的索引意味著兩個(gè)行不能擁有相同的索引值首装。
CREATE UNIQUE INDEX index_name ON table_name (column_name)
MySQL 上刪除索引 DROP INDEX:
ALTER TABLE table_name DROP INDEX index_name
TRUNCATE TABLE 語句
僅僅需要除去表內(nèi)的數(shù)據(jù)创夜,但并不刪除表本身, 使用 TRUNCATE TABLE 命令(僅僅刪除表格中的數(shù)據(jù)):
TRUNCATE TABLE 表名稱
視圖是可視化的表
什么是視圖仙逻?
在 SQL 中挥下,視圖是基于 SQL 語句的結(jié)果集的可視化的表。
視圖包含行和列桨醋,就像一個(gè)真實(shí)的表棚瘟。視圖中的字段就是來自一個(gè)或多個(gè)數(shù)據(jù)庫中的真實(shí)的表中的字段。我們可以向視圖添加 SQL 函數(shù)喜最、WHERE 以及 JOIN 語句偎蘸,我們也可以提交數(shù)據(jù),就像這些來自于某個(gè)單一的表。
注釋:數(shù)據(jù)庫的設(shè)計(jì)和結(jié)構(gòu)不會(huì)受到視圖中的函數(shù)迷雪、where 或 join 語句的影響限书。
CREATE VIEW view_name ASSELECT column_name(s) FROM table_name WHERE condition
MySQL Date 函數(shù)
下面的表格列出了 MySQL 中最重要的內(nèi)建日期函數(shù):
NOW()
返回當(dāng)前的日期和時(shí)間
CURDATE()
返回當(dāng)前的日期
CURTIME()
返回當(dāng)前的時(shí)間
DATE()
提取日期或日期/時(shí)間表達(dá)式的日期部分
EXTRACT()
返回日期/時(shí)間按的單獨(dú)部分
DATE_ADD()
給日期添加指定的時(shí)間間隔
DATE_SUB()
從日期減去指定的時(shí)間間隔
DATEDIFF()
返回兩個(gè)日期之間的天數(shù)
DATE_FORMAT()
用不同的格式顯示日期/時(shí)間
SQL Server Date 函數(shù)
下面的表格列出了 SQL Server 中最重要的內(nèi)建日期函數(shù):
GETDATE()
返回當(dāng)前日期和時(shí)間
DATEPART()
返回日期/時(shí)間的單獨(dú)部分
DATEADD()
在日期中添加或減去指定的時(shí)間間隔
DATEDIFF()
返回兩個(gè)日期之間的時(shí)間
CONVERT()
用不同的格式顯示日期/時(shí)間
SQL Date 數(shù)據(jù)類型
MySQL 使用下列數(shù)據(jù)類型在數(shù)據(jù)庫中存儲(chǔ)日期或日期/時(shí)間值:
- DATE - 格式 YYYY-MM-DD
- DATETIME - 格式: YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
- YEAR - 格式 YYYY 或 YY
SQL Server 使用下列數(shù)據(jù)類型在數(shù)據(jù)庫中存儲(chǔ)日期或日期/時(shí)間值:
- DATE - 格式 YYYY-MM-DD
- DATETIME - 格式: YYYY-MM-DD HH:MM:SS
- SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式: 唯一的數(shù)字
NULL 值是遺漏的未知數(shù)據(jù)。
默認(rèn)地章咧,表的列可以存放 NULL 值倦西。
提示:請(qǐng)始終使用 IS NULL 來查找 NULL 值。
MySQL 數(shù)據(jù)類型
在 MySQL 中赁严,有三種主要的類型:文本扰柠、數(shù)字和日期/時(shí)間類型。
Text 類型:
- CHAR(size)
保存固定長(zhǎng)度的字符串(可包含字母疼约、數(shù)字以及特殊字符)卤档。在括號(hào)中指定字符串的長(zhǎng)度。最多 255 個(gè)字符程剥。 - VARCHAR(size)
保存可變長(zhǎng)度的字符串(可包含字母劝枣、數(shù)字以及特殊字符)。在括號(hào)中指定字符串的最大長(zhǎng)度织鲸。最多 255 個(gè)字符舔腾。
注釋:如果值的長(zhǎng)度大于 255,則被轉(zhuǎn)換為 TEXT 類型搂擦。 - TINYTEXT
存放最大長(zhǎng)度為 255 個(gè)字符的字符串琢唾。 - TEXT
存放最大長(zhǎng)度為 65,535 個(gè)字符的字符串。 - BLOB
用于 BLOBs (Binary Large OBjects)盾饮。存放最多 65,535 字節(jié)的數(shù)據(jù)采桃。 - MEDIUMTEXT
存放最大長(zhǎng)度為 16,777,215 個(gè)字符的字符串。 - MEDIUMBLOB
用于 BLOBs (Binary Large OBjects)丘损。存放最多 16,777,215 字節(jié)的數(shù)據(jù)普办。 - LONGTEXT
存放最大長(zhǎng)度為 4,294,967,295 個(gè)字符的字符串。 - LONGBLOB
用于 BLOBs (Binary Large OBjects)徘钥。存放最多 4,294,967,295 字節(jié)的數(shù)據(jù)衔蹲。 - ENUM(x,y,z,etc.)
允許你輸入可能值的列表〕蚀。可以在 ENUM 列表中列出最大 65535 個(gè)值舆驶。如果列表中不存在插入的值,則插入空值而钞。
注釋:這些值是按照你輸入的順序存儲(chǔ)的沙廉。
可以按照此格式輸入可能的值:ENUM('X','Y','Z') - SET
與 ENUM 類似,SET 最多只能包含 64 個(gè)列表項(xiàng)臼节,不過 SET 可存儲(chǔ)一個(gè)以上的值撬陵。
Number 類型:
- TINYINT(size)
-128 到 127 常規(guī)珊皿。0 到 255 無符號(hào)*。在括號(hào)中規(guī)定最大位數(shù)巨税。 - SMALLINT(size)
-32768 到 32767 常規(guī)蟋定。0 到 65535 無符號(hào)*。在括號(hào)中規(guī)定最大位數(shù)草添。 - MEDIUMINT(size)
-8388608 到 8388607 普通驶兜。0 to 16777215 無符號(hào)*。在括號(hào)中規(guī)定最大位數(shù)远寸。 - INT(size)
-2147483648 到 2147483647 常規(guī)抄淑。0 到 4294967295 無符號(hào)*。在括號(hào)中規(guī)定最大位數(shù)而晒。 - BIGINT(size)
-9223372036854775808 到 9223372036854775807 常規(guī)。0 到 18446744073709551615 無符號(hào)*阅畴。在括號(hào)中規(guī)定最大位數(shù)倡怎。 - FLOAT(size,d)
帶有浮動(dòng)小數(shù)點(diǎn)的小數(shù)字。在括號(hào)中規(guī)定最大位數(shù)贱枣。在 d 參數(shù)中規(guī)定小數(shù)點(diǎn)右側(cè)的最大位數(shù)监署。 - DOUBLE(size,d)
帶有浮動(dòng)小數(shù)點(diǎn)的大數(shù)字。在括號(hào)中規(guī)定最大位數(shù)纽哥。在 d 參數(shù)中規(guī)定小數(shù)點(diǎn)右側(cè)的最大位數(shù)钠乏。 - DECIMAL(size,d)
作為字符串存儲(chǔ)的 DOUBLE 類型,允許固定的小數(shù)點(diǎn)春塌。
注:這些整數(shù)類型擁有額外的選項(xiàng) UNSIGNED晓避。通常,整數(shù)可以是負(fù)數(shù)或正數(shù)只壳。如果添加 UNSIGNED 屬性俏拱,那么范圍將從 0 開始,而不是某個(gè)負(fù)數(shù)吼句。
Date 類型:
- DATE()
日期锅必。格式:YYYY-MM-DD
注釋:支持的范圍是從 '1000-01-01' 到 '9999-12-31' - DATETIME()
*日期和時(shí)間的組合。格式:YYYY-MM-DD HH:MM:SS
注釋:支持的范圍是從 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' - TIMESTAMP()
*時(shí)間戳惕艳。TIMESTAMP 值使用 Unix 紀(jì)元('1970-01-01 00:00:00' UTC) 至今的描述來存儲(chǔ)搞隐。格式:YYYY-MM-DD HH:MM:SS
注釋:支持的范圍是從 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC - TIME()
時(shí)間。格式:HH:MM:SS 注釋:支持的范圍是從 '-838:59:59' 到 '838:59:59' - YEAR()
2 位或 4 位格式的年远搪。
注釋:4 位格式所允許的值:1901 到 2155劣纲。2 位格式所允許的值:70 到 69,表示從 1970 到 2069谁鳍。
注: 即便 DATETIME 和 TIMESTAMP 返回相同的格式味廊,它們的工作方式很不同蒸甜。在 INSERT 或 UPDATE 查詢中,TIMESTAMP 自動(dòng)把自身設(shè)置為當(dāng)前的日期和時(shí)間余佛。TIMESTAMP 也接受不同的格式柠新,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS辉巡、YYYYMMDD 或 YYMMDD恨憎。