SQL學(xué)習(xí):初級(jí)

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恨憎。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市郊楣,隨后出現(xiàn)的幾起案子憔恳,更是在濱河造成了極大的恐慌,老刑警劉巖净蚤,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钥组,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡今瀑,警方通過查閱死者的電腦和手機(jī)程梦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橘荠,“玉大人屿附,你說我怎么就攤上這事「缤” “怎么了挺份?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贮懈。 經(jīng)常有香客問我匀泊,道長(zhǎng),這世上最難降的妖魔是什么朵你? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任探赫,我火速辦了婚禮,結(jié)果婚禮上撬呢,老公的妹妹穿的比我還像新娘伦吠。我一直安慰自己,他們只是感情好魂拦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布毛仪。 她就那樣靜靜地躺著,像睡著了一般芯勘。 火紅的嫁衣襯著肌膚如雪箱靴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天荷愕,我揣著相機(jī)與錄音衡怀,去河邊找鬼棍矛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛抛杨,可吹牛的內(nèi)容都是我干的够委。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怖现,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼茁帽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屈嗤,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤潘拨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后饶号,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铁追,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年茫船,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琅束。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡透硝,死狀恐怖狰闪,靈堂內(nèi)的尸體忽然破棺而出疯搅,到底是詐尸還是另有隱情濒生,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布幔欧,位于F島的核電站罪治,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏礁蔗。R本人自食惡果不足惜觉义,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浴井。 院中可真熱鬧晒骇,春花似錦、人聲如沸磺浙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撕氧。三九已至瘤缩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伦泥,已是汗流浹背剥啤。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工锦溪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人府怯。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓刻诊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親富腊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坏逢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容