SQL基礎(chǔ)瀏覽

SQL基礎(chǔ)

SQL 簡(jiǎn)介

SQL是用于訪問和處理數(shù)據(jù)庫的標(biāo)準(zhǔn)的計(jì)算機(jī)語言

SQL是什么?

  • SQL堪滨,指結(jié)構(gòu)化查詢語言赖阻,全稱是 Structured Query Language浊闪。
  • SQL 讓您可以訪問和處理數(shù)據(jù)庫。
  • SQL 是一種 ANSI(American National Standards Institute 美國國家標(biāo)準(zhǔn)化組織)標(biāo)準(zhǔn)的計(jì)算機(jī)語言感憾。

SQL能做什么?

  • SQL 面向數(shù)據(jù)庫執(zhí)行查詢
  • SQL 可從數(shù)據(jù)庫取回?cái)?shù)據(jù)
  • SQL 可在數(shù)據(jù)庫中插入新的記錄
  • SQL 可更新數(shù)據(jù)庫中的數(shù)據(jù)
  • SQL 可從數(shù)據(jù)庫刪除記錄
  • SQL 可創(chuàng)建新數(shù)據(jù)庫
  • SQL 可在數(shù)據(jù)庫中創(chuàng)建新表
  • SQL 可在數(shù)據(jù)庫中創(chuàng)建存儲(chǔ)過程
  • SQL 可在數(shù)據(jù)庫中創(chuàng)建視圖
  • SQL 可以設(shè)置表回右、存儲(chǔ)過程和視圖的權(quán)限

常用的MySQL管理命令:

  • USE Databasename 用于在MySQL工作區(qū)內(nèi)選擇具體某個(gè)數(shù)據(jù)庫斤蔓。
  • SHOW DATABASES 列出 MySQL DBMS 所能訪問的數(shù)據(jù)庫植酥。
  • SHOW TABLES 一旦數(shù)據(jù)庫被 use 命令選中,顯示數(shù)據(jù)庫中的表附迷。
  • SHOW COLUMNS FROM tablename 顯示表的屬性惧互、屬性類型、鍵信息喇伯、是否允許 NULL 值,默認(rèn)值拨与,以及其他一些信息稻据。
  • SHOW INDEX FROM tablename 顯示表中所有索引的細(xì)節(jié)信息,包括PRIMARY KEY买喧。
  • SHOW TABLE STATUS LIKE tablename\G 報(bào)告MySQL DBMS的性能及統(tǒng)計(jì)的細(xì)節(jié)信息捻悯。

SQL SELECT

SELECT語句用于從數(shù)據(jù)庫中選取數(shù)據(jù),結(jié)果被存儲(chǔ)在一個(gè)結(jié)果表中,稱為結(jié)果集

SQL SELECT IDSTINCT

返回唯一不同的值(去除重復(fù)的值).

SQL WHERE

用于過濾記錄.

WHERE字句中的運(yùn)算符

運(yùn)算符 描述
= 等于
<> 不等于。注釋:在 SQL 的一些版本中淤毛,該操作符可被寫成 !=
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某個(gè)范圍內(nèi)
LIKE 搜索某種模式
IN 指定針對(duì)某個(gè)列的多個(gè)可能值

特殊條件

  1. 空值判斷: is null
  2. between and (在 ... 之間的值)
  3. in
  4. like

SQL AND & OR

ORDER BY 用于對(duì)結(jié)果集進(jìn)行排序

默認(rèn)按照升序?qū)τ涗涍M(jìn)行排序.

  • DESC 升序
  • ASC 降序

SQL INSERT INTO

用于向表中插入新記錄今缚。

INSERT INTO 語句可以有兩種編寫形式。
第一種形式無需指定要插入數(shù)據(jù)的列名低淡,只需提供被插入的值即可:

INSERT INTO table_name
VALUES (value1,value2,value3,...);

第二種形式需要指定列名及被插入的值:

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

SQL UPDATE

用于更新表中已經(jīng)存在的記錄

SQL DELETE

用于刪除表中已經(jīng)存在的記錄

SQL 高級(jí)函數(shù)

SQL SELECT TOP

MySQL中 TOP 無效.

MySQL語法:

SELECT column_name(s) FROM table_name LIMIT number;

Oracle 語法

SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;

SQL SELECT TOP PERCENT 示例: 使用百分比作為參數(shù)

SELECT TOP 50 PERCENT * FROM Websites;

SQL LIKE

搜索列中的制定模式

SQL LIKE 語法

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;

SQL 通配符

通配符用于替換字符串中任何其他字符

MySQL中使用REGEXP或NOT REGEXP運(yùn)算符(或者LIKE和NOT LIKE)來操作正則表達(dá)式

SQL中可以使用一下通配符

通配符 描述
% 替代0個(gè)或者多個(gè)字符
- 替代一個(gè)字符
[charlist] 字符列中的任何單一字符
[^charlist]或者[!charlis] 不在字符列中的任何單一字符

SQL IN

SQL BETWEEN

SQL BETWEEN 語法(兩頭都包括):

BETWEEN 操作符選取介于兩個(gè)值之間的數(shù)據(jù)范圍內(nèi)的值姓言。這些值可以是數(shù)值、文本或者日期蔗蹋。

SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

NOT BETWEEN , NOT IN: 不在范圍內(nèi)

SQL 別名

通過使用SQL,可以為表名或者列名指定列名.基本上何荚,創(chuàng)建別名是為了讓列名稱的可讀性更強(qiáng)。

將多個(gè)列和在一起:

SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info
FROM Websites;

在下面的情況下猪杭,使用別名很有用:

  • 在查詢中涉及超過一個(gè)表
  • 在查詢中使用了函數(shù)
  • 列名稱很長(zhǎng)或者可讀性差
  • 需要把兩個(gè)列或者多個(gè)列結(jié)合在一起

SQL 連接(JOIN)

SQL join 用于把來自兩個(gè)或者多個(gè)表的行結(jié)合起來.

在我們繼續(xù)講解實(shí)例之前餐塘,我們先列出您可以使用的不同的 SQL JOIN 類型:

  • INNER JOIN:如果表中有至少一個(gè)匹配,則返回行
  • LEFT JOIN:即使右表中沒有匹配皂吮,也從左表返回所有的行
  • RIGHT JOIN:即使左表中沒有匹配戒傻,也從右表返回所有的行
  • FULL JOIN:只要其中一個(gè)表中存在匹配税手,則返回行

1.SQL INNER JOIN 語法

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

或:

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;

注釋:INNER JOIN 與 JOIN 是相同的。

2. SQL LEFT JOIN 語法

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

或:

SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;

注釋:在某些數(shù)據(jù)庫中需纳,LEFT JOIN 稱為 LEFT OUTER JOIN冈止。

3. SQL RIGHT JOIN 語法

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;

或:

SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;

注釋:在某些數(shù)據(jù)庫中,RIGHT JOIN 稱為 RIGHT OUTER JOIN候齿。

4. SQL FULL OUTER JOIN 語法

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

SQL UNION 操作符

SQL UNION 操作符合并兩個(gè)或者多個(gè)SELECT語句的結(jié)果,
注意: UNION內(nèi)部的每個(gè)SELECT語句必須擁有相同數(shù)量的列.列也必須擁有相似的數(shù)據(jù)類型.同事每個(gè)SELECT語句中的列的順序也必須相同.

SQL UNION 語法

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

注釋:默認(rèn)地熙暴,UNION 操作符選取不同的值。如果允許重復(fù)的值慌盯,請(qǐng)使用 UNION ALL周霉。

SQL UNION ALL 語法

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

注釋:UNION 結(jié)果集中的列名總是等于 UNION 中第一個(gè) SELECT 語句中的列名。

SQL SELECT INTO 語句

通過SQL,您可以從一個(gè)表復(fù)制信息到另一個(gè)表.

MySQL 數(shù)據(jù)庫不支持 SELECT ... INTO 語句亚皂,但支持 INSERT INTO ... SELECT 俱箱。
當(dāng)然你可以使用以下語句來拷貝表結(jié)構(gòu)及數(shù)據(jù):

CREATE TABLE 新表 SELECT * FROM 舊表

SQL INSERT INTO SELECT 語句

INSERT INTO SELECT 語句從一個(gè)表復(fù)制數(shù)據(jù),然后把數(shù)據(jù)插入到一個(gè)已存在的表中灭必。目標(biāo)表中任何已存在的行都不會(huì)受影響狞谱。

SQL INSERT INTO SELECT 語法
我們可以從一個(gè)表中復(fù)制所有的列插入到另一個(gè)已存在的表中:

INSERT INTO table2
SELECT * FROM table1;

或者我們可以只復(fù)制希望的列插入到另一個(gè)已存在的表中:

INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;

SQL CREATE DATABASE 語句

用于創(chuàng)建數(shù)據(jù)庫

CREATE DATABASE dbname;

SQL CREATE TABLE 語句

CREATE TABLE 語句用于創(chuàng)建數(shù)據(jù)庫中的表。

實(shí)例

CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

SQL 約束

SQL約束用于規(guī)定表中的數(shù)據(jù)規(guī)則.

在SQL中有如下約束:

  • NOT NULL -只是某列不能存儲(chǔ)null值
  • UNIQUE - 保證某列的每行必須有唯一的值
  • PRIMARY KEY - NOT NULL 和 UNIQUE 的結(jié)合,確保某列的值有唯一標(biāo)識(shí),有助于更快速的找到表中的一個(gè)特定的記錄.
  • FOREIGN KEY -保證一個(gè)表中的數(shù)據(jù)匹配到另一個(gè)表中的值得參照完整性.
  • CHECK -保證列中的值負(fù)荷指定的條件.
  • DEFAULT - 規(guī)定沒有給列賦值時(shí)的默認(rèn)值.

ALERT TABLE 時(shí)的 SQL約束(修改約束)

當(dāng)表已被創(chuàng)建時(shí)禁漓,如需在 "P_Id" 列創(chuàng)建 UNIQUE 約束跟衅,請(qǐng)使用下面的 SQL:

ALTER TABLE Persons
ADD UNIQUE (P_Id)

撤銷約束

如需撤銷 UNIQUE 約束,請(qǐng)使用下面的 SQL:
MySQL:

ALTER TABLE Persons
DROP INDEX uc_PersonID

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID

SQL CREATE INDEX

用于創(chuàng)建索引.在不讀取整表的情況下,索引使數(shù)據(jù)庫應(yīng)用程序可以更快的查找數(shù)據(jù).

注釋:更新一個(gè)包含索引的表需要比更新一個(gè)沒有索引的表花費(fèi)更多的時(shí)間播歼,這是由于索引本身也需要更新伶跷。因此,理想的做法是僅僅在常常被搜索的列(以及表)上面創(chuàng)建索引秘狞。

CREATE INDEX 實(shí)例

下面的 SQL 語句在 "Persons" 表的 "LastName" 列上創(chuàng)建一個(gè)名為 "PIndex" 的索引:

CREATE INDEX PIndex
ON Persons (LastName)

如果您希望索引不止一個(gè)列叭莫,您可以在括號(hào)中列出這些列的名稱,用逗號(hào)隔開:

CREATE INDEX PIndex
ON Persons (LastName, FirstName)

SQL CREATE UNIQUE INDEX 語法:在表上創(chuàng)建一個(gè)唯一的索引烁试。不允許使用重復(fù)的值:唯一的索引意味著兩個(gè)行不能擁有相同的索引值.

SQL DROP

使用DROP語句,刪除索引,表和數(shù)據(jù)庫.

  • 刪除數(shù)據(jù)庫
DROP DATABASE database_name
  • 刪除表
DROP TABLE table_name
  • 刪除索引
ALTER TABLE table_name DROP INDEX index_name
  • TRUNCATE TABLE 語句(清空表內(nèi)數(shù)據(jù))
TRUNCATE TABLE table_name

SQL ALTER TABEL語句

用于在已有的表中添加,刪除或者修改列.

  • 添加列
ALTER TABLE table_name
ADD column_name datatype
  • 刪除列
ALTER TABLE table_name
DROP COLUMN column_name
  • 修改列的數(shù)據(jù)類型
ALTER TABLE table_name
MODIFY COLUMN column_name datatype

SQL AUTO INCREMENT 字段

自增的字段.

  • 設(shè)置表內(nèi)自增字段起始值
ALTER TABLE Persons AUTO_INCREMENT=100

SQL 視圖.

可以理解為對(duì)查詢的封裝;

  • 添加視圖
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
  • 刪除視圖
DROP VIEW view_name
  • 修改視圖
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

使用視圖

select * from view_name; 

SQL 日期

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

日期函數(shù):

函數(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 NULL

NULL代表遺漏的未知數(shù)據(jù). 使用 IS NULL 和 NOT IS NULL 作為篩選條件.

  • IS NULL
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
  • IS NOT NULL
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL

SQL NULL 函數(shù)

MySQL中使用IFNULL()函數(shù).當(dāng)所選字段值為NULL時(shí) 給予默認(rèn)值.

SELECT (1+IFNULL(fee,0))as a from ss_order

SQL 函數(shù)

SQL Aggregate 函數(shù)

SQL Aggregate 函數(shù)計(jì)算從列中取得的值雇初,返回一個(gè)單一的值。
有用的 Aggregate 函數(shù):

  • AVG() - 返回平均值
  • COUNT() - 返回行數(shù)
  • FIRST() - 返回第一個(gè)記錄的值
  • LAST() - 返回最后一個(gè)記錄的值
  • MAX() - 返回最大值
  • MIN() - 返回最小值
  • SUM() - 返回總和
  • SQL Scalar 函數(shù)

SQL Scalar 函數(shù)基于輸入值减响,返回一個(gè)單一的值靖诗。
有用的 Scalar 函數(shù):

  • UCASE() - 將某個(gè)字段轉(zhuǎn)換為大寫
  • LCASE() - 將某個(gè)字段轉(zhuǎn)換為小寫
  • MID() - 從某個(gè)文本字段提取字符
  • LEN() - 返回某個(gè)文本字段的長(zhǎng)度
  • ROUND() - 對(duì)某個(gè)數(shù)值字段進(jìn)行指定小數(shù)位數(shù)的四舍五入
  • NOW() - 返回當(dāng)前的系統(tǒng)日期和時(shí)間
  • FORMAT() - 格式化某個(gè)字段的顯示方式
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辩蛋,隨后出現(xiàn)的幾起案子呻畸,更是在濱河造成了極大的恐慌,老刑警劉巖悼院,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伤为,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绞愚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門叙甸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人位衩,你說我怎么就攤上這事裆蒸。” “怎么了糖驴?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵僚祷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我贮缕,道長(zhǎng)辙谜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任感昼,我火速辦了婚禮装哆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘定嗓。我一直安慰自己蜕琴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布宵溅。 她就那樣靜靜地躺著凌简,像睡著了一般。 火紅的嫁衣襯著肌膚如雪层玲。 梳的紋絲不亂的頭發(fā)上号醉,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音辛块,去河邊找鬼。 笑死铅碍,一個(gè)胖子當(dāng)著我的面吹牛润绵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胞谈,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼尘盼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了烦绳?” 一聲冷哼從身側(cè)響起卿捎,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎径密,沒想到半個(gè)月后午阵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年底桂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了植袍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡籽懦,死狀恐怖于个,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暮顺,我是刑警寧澤厅篓,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站捶码,受9級(jí)特大地震影響羽氮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宙项,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一乏苦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尤筐,春花似錦汇荐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至油昂,卻和暖如春革娄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冕碟。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工拦惋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人安寺。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓厕妖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親挑庶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子言秸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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