操作數(shù)據(jù)表中的數(shù)據(jù)記錄(DML語(yǔ)句)
使用INSERT語(yǔ)句向數(shù)據(jù)表中添加數(shù)據(jù)
插入數(shù)據(jù)是向已經(jīng)存在的數(shù)據(jù)表中添加一條新的記錄吏夯,應(yīng)該使用INSERT INTO語(yǔ)句循未。
格式:
INSERT INTO 表名 [(字段名1,字段名2,…字段名n)] VALUES(‘值1’,‘值2’,…,’值n’);
或者
INSERT INTO 表名 [(字段名1,字段名2,…字段名n)] VALUES(‘值1’,‘值2’,…皿淋,‘值n’),(‘值1’,‘值2’,…,’值n’);
使用UPDATE語(yǔ)句更新數(shù)據(jù)表中已存在的數(shù)據(jù)
SQL語(yǔ)句可以使用UPDATE語(yǔ)句對(duì)表中的一列或多列數(shù)據(jù)進(jìn)行修改帝洪,必須指定需要修改的字段哲身,并且需要賦予的新值纲酗。還要給出必要的WHERE子句指定要更新的數(shù)據(jù)行衰腌。
格式:
UPDATE 表名 SET 字段名=表達(dá)式 [,…][WHERE 條件]
[ORDER BY 字段][LIMIT 行數(shù)]
使用DELETE語(yǔ)句刪除數(shù)據(jù)表中不需要的數(shù)據(jù)記錄
DELETE語(yǔ)句用來(lái)刪除數(shù)據(jù)表中的一條或多條數(shù)據(jù)記錄。
格式:
DELETE FROM 表名 [WHERE 條件][ORDER BY 字段][LIMIT 行數(shù)]
通過(guò)DQL命令查詢數(shù)據(jù)表中的數(shù)據(jù)
查詢語(yǔ)句可以完成簡(jiǎn)單的單表查詢觅赊,也可以完成復(fù)雜的多表查詢和嵌套查詢右蕊。SELECT語(yǔ)句主要用于數(shù)據(jù)的查詢檢索,是SQL語(yǔ)言的核心茉兰,在SQL語(yǔ)言中SELECT語(yǔ)句的使用頻率是最高的。
格式:
SELECT [ALL|DISTINCT]{*|table.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}FROM 表名
[WHERE子句]
[GROUP BY..][HAVING..][ORDER BY..][LIMIT count];
選擇特定的字段
最簡(jiǎn)單的查詢語(yǔ)句是使用SELECT語(yǔ)句檢索記錄的特定字段欣簇,多個(gè)字段可以用逗號(hào)分隔规脸,例如:
SELECT username,password FROM user;
也可以使用*
從表中檢索出所有字段坯约,使用SELECT *
主要是針對(duì)用戶的書寫方便而言的。如果一張表當(dāng)中的數(shù)據(jù)多大幾百萬(wàn)莫鸭,就意味著資源的浪費(fèi)和漫長(zhǎng)的查詢等待闹丐,所以實(shí)際應(yīng)用時(shí)要盡量避免使用它,而把查詢的列名準(zhǔn)確地列出來(lái)被因,也可以按自己指定的列順序輸出卿拴。
使用AS子句為字段取別名
如果想為返回的列取一個(gè)新的標(biāo)題,以及經(jīng)過(guò)對(duì)字段的計(jì)算或總結(jié)之后梨与,產(chǎn)生了一個(gè)新的值堕花,希望把它放到一個(gè)新的列里顯示,則用AS
保留粥鞋。例如:在上例的輸出結(jié)果中使用中文字段名缘挽,可以在MySQL控制臺(tái)中輸入的命令如下所示:
SELECT username as '用戶名' FROM user;
定義別名時(shí)一定要使用單引號(hào)引起來(lái),其中AS
關(guān)鍵字是可選的呻粹,在原字段名和別名之間使用一個(gè)空格即可壕曼。
SELECT username ‘用戶名’ FROM user;
DISTINCT關(guān)鍵字的使用
如果在使用SELECT語(yǔ)句返回的記錄結(jié)果中包含重復(fù)的記錄等浊,可以使用DISTINCT
關(guān)鍵字取消重復(fù)的數(shù)據(jù)腮郊,只返回一個(gè)。另外筹燕,要注意DISTINCT關(guān)鍵字的作用是整個(gè)查詢的列表轧飞,而不是單獨(dú)的一列。DISTINCT會(huì)消耗一定的服務(wù)器資源庄萎,如果不指定踪少,會(huì)默認(rèn)使用ALL關(guān)鍵字作為檢索模式
SELECT DISTINCT gid FROM user_group;
在SELECT語(yǔ)句中使用表達(dá)式的列
在SQL中的表達(dá)式用法和PHP程序相似糠涛,主要包括算術(shù)表達(dá)式援奢、邏輯表達(dá)式,以及使用SQL函數(shù)表達(dá)式等忍捡。
例如:
SELECT version(),1.23*10;
使用WHERE子句按條件檢索
在SELECT語(yǔ)句中集漾,可以使用WHERE子
句指定搜索條件,實(shí)現(xiàn)從數(shù)據(jù)表中檢索出符合條件的記錄砸脊。其中具篇,搜索條件可以由一個(gè)或多個(gè)邏輯表達(dá)式組成,這些表達(dá)式指定關(guān)于某一記錄是真或假的條件凌埂。在WHERE子句中驱显,可以通過(guò)邏輯操作符和比較操作符指定基本的表達(dá)式條件。
- 邏輯操作符
操作符 | 語(yǔ)法 | 描述 |
---|---|---|
AND 或 && | a AND b 或 a && b | 邏輯與,若兩個(gè)操作數(shù)同時(shí)為真,則為真 |
OR 或 丨丨 | a OR b 或 a丨丨b | 邏輯或,只要有一個(gè)操作數(shù)為真埃疫,則為真 |
XOR | a XOR b | 邏輯異或,若有且僅有一個(gè)操作數(shù)為真伏恐,則為真 |
NOT 或 ! | NOT a 或 栓霜!a | 邏輯非,若操作數(shù)為假翠桦,則為真 |
- 比較操作符
數(shù)據(jù)列類型 | 存儲(chǔ)空間 說(shuō)明 | 取值范圍 |
---|---|---|
= | a=b | 若操作數(shù)a與操作數(shù)b相等,則為真 |
<=> | a<=>b | 若a與b相等胳蛮,則為真销凑,可以用于NULL值比較 |
!=或<> | a!=b或a<>b | 若操作數(shù)a與b不相等,為真 |
< | a<b | 若操作數(shù)a小于b仅炊,為真 |
<= | a<=b | 若操作數(shù)a大于b斗幼,為真 |
> | a>b | 若操作數(shù)a大于b,為真 |
>= | a>=b | 若操作數(shù)a大于等于b茂洒,為真 |
IS NULL | a IS NULL | 若操作數(shù)a為NULL孟岛,為真 |
IS NOT NULL | a IS NOT NULL | 若操作數(shù)a不為NULL,為真 |
BETWEEN | a BETWEEN b AND c | 若a在b和c之間督勺,為真 |
NOT BETWEEN | a NOT BETWEEN b AND c | 若操作數(shù)a不在b和c之間渠羞,為真 |
LIKE | a LIKE b | SQL模式匹配,若a匹配b智哀,為真 |
NOT LIKE | a NOT LIKE b | SQL模式匹配次询,若a不匹配b,則為真 |
IN | a IN (b1,b2….) | 若a等于b1,b2,b3,…中的某一個(gè)瓷叫,則為真 |
在構(gòu)造搜索條件時(shí)屯吊,要注意只能對(duì)數(shù)值數(shù)據(jù)類型的記錄進(jìn)行算術(shù)運(yùn)算,并且只能在相同的數(shù)據(jù)類型之間進(jìn)行記錄的比較摹菠。
根據(jù)空值(NULL)確定檢索條件
空值只能定義在允許NULL字段中出現(xiàn)盒卸,NULL值是特殊的值,代表“無(wú)值”次氨,與零值(0)和空字符串('')都不相同蔽介。當(dāng)在不支持默認(rèn)值的字段中未輸入值,或在字段中顯式的設(shè)置為空煮寡,就會(huì)出現(xiàn)空值虹蓄,但不能用處理已知值的方式來(lái)處理NULL。為了進(jìn)行NULL值的搜索幸撕,必須采用特殊的語(yǔ)法薇组。如果要檢索NULL值,必須使用IS NULL和IS NOT NULL關(guān)鍵字坐儿。
使用BEETWEEN AND進(jìn)行范圍比較查詢
如果需要對(duì)某個(gè)字段通過(guò)范圍的值進(jìn)行比較查詢律胀,可以使用BETWEEN AND
關(guān)鍵字實(shí)現(xiàn)宋光,其中AND是多重條件符號(hào),比較時(shí)也包括邊界條件炭菌。也可以使用>=
和<=
完成同樣的功能跃须。
使用IN進(jìn)行范圍比對(duì)查詢
在WHERE子句中,使用IN
關(guān)鍵字并在后面的括號(hào)()
中提供一個(gè)值的列表娃兽,以供與相應(yīng)的字段進(jìn)行比較。該列表中至少應(yīng)該存在一個(gè)值尽楔,如果有多個(gè)值可以使用逗號(hào),
分隔投储。
使用LIKE進(jìn)行模糊查詢
在SELECT語(yǔ)句的WHERE子句中,可以使用LIKE
關(guān)鍵字對(duì)數(shù)據(jù)表中的記錄進(jìn)行模糊查詢阔馋,將查詢結(jié)果鎖定在一個(gè)范圍內(nèi)玛荞。在查詢條件中通常會(huì)與_
和%
兩個(gè)通配符一起使用,可以實(shí)現(xiàn)復(fù)雜的檢索查詢呕寝。這兩個(gè)通配符的含義分別如下:
- 百分號(hào)“%”:表示0個(gè)或任意多個(gè)字符勋眯。
- 下畫線“_”:表示單個(gè)的任意一個(gè)字符。
相反的下梢,不匹配我們使用NOT LIKE
多表查詢(連接查詢)
多表查詢給用戶帶來(lái)很大的靈活性客蹋,可以在任何時(shí)候增加新的數(shù)據(jù)類型,為不同實(shí)體創(chuàng)建新的表孽江,然后通過(guò)連接進(jìn)行查詢讶坯。包括兩種形式:
-
非等值和等值的多表查詢
多表查詢和普通的單表查詢相似,都是使用SELECT語(yǔ)句岗屏。只不過(guò)在多表查詢時(shí)需要把多張表的名字辆琅,全部填寫在FROM子句中,并用逗號(hào),
將表名分開这刷。同時(shí)婉烟,也可以對(duì)數(shù)據(jù)表使用別名進(jìn)行引用。另外暇屋,為了在查詢時(shí)區(qū)分多個(gè)表中出現(xiàn)的重復(fù)字段名似袁,可以在字段列表中使用表名.列名
的形式,如果不存在重名的列率碾,可以省略表名叔营。
-
自身連接查詢
連接查詢操作不僅可以用于多個(gè)表之間,也可以是一個(gè)表與其自己進(jìn)行連接所宰,稱為自身連接查詢绒尊。當(dāng)一個(gè)表所代表的實(shí)體之間有關(guān)系時(shí),就可以使用自身連接查詢仔粥。
-
復(fù)合連接查詢
前面介紹的多表查詢是兩個(gè)表之間婴谱,只有一個(gè)WHERE子句查詢條件蟹但。如果在FROM子句后面有n個(gè)表需要查詢,則在WHERE子句中就需要有多個(gè)連接條件谭羔。至少要比出現(xiàn)的表格數(shù)量少1個(gè)华糖,也就是不能少于n?1個(gè)查詢條件,多個(gè)條件使用AND
關(guān)鍵詞連接即可瘟裸。
嵌套查詢(子查詢)
這種查詢是在一個(gè)SELECT語(yǔ)句的WHERE子句中客叉,包含另一個(gè)SELECT語(yǔ)句,也可以稱為子查詢话告。在子查詢中只能返回一列兼搏,并將形成的結(jié)果又作為父查詢的條件,在主句中進(jìn)行進(jìn)一步查詢沙郭。 SQL語(yǔ)言允許多層嵌套查詢佛呻,即一個(gè)子查中還可以有其他子查詢。嵌套查詢的求解方法是由里向外處理病线,即每個(gè)子查詢都是在上一級(jí)查詢處理之前求解吓著,子查詢的結(jié)果用于建立其父查詢的查找條件。
使用ORDER BY對(duì)查詢結(jié)果排序
使用SELECT語(yǔ)句獲取數(shù)據(jù)表中的數(shù)據(jù)時(shí)送挑,返回的記錄一般是無(wú)規(guī)則排列的绑莺,有可能每次獲取的查詢記錄截然不同。為了使用檢索的結(jié)果方便閱讀惕耕,可以在SELECT語(yǔ)句中使用ORDER BY子句
紊撕,對(duì)檢索的結(jié)果進(jìn)行排序。
ORDER BY后面可以接一列或多列用于排序的字段赡突,并且使用DESC
或ASC
關(guān)鍵字設(shè)計(jì)字段排序的方式对扶。默認(rèn)情況下按照升序排列,即使用ASC關(guān)鍵字惭缰。否則要按照降序排列浪南,必須使用DESC關(guān)鍵字。ORDER BY子句可以和SELECT語(yǔ)句中的其他子句一起使用漱受,但在子查詢中不能有ORDER BY子句络凿,因?yàn)镺RDER BY子句只能對(duì)最終查詢結(jié)果排序。
使用LIMIT
如果在數(shù)據(jù)表中的記錄數(shù)非常多昂羡,一次從表中返回大量的記錄不僅檢索的速度慢絮记,用戶閱讀也很不方便。所以在通過(guò)SELECT語(yǔ)句檢索時(shí)虐先,使用LIMIT
子句一次取少量的記錄怨愤,而用分頁(yè)的方式繼續(xù)閱讀后面的數(shù)據(jù)。
LIMIT子句也可以和其他的SELECT子句一起使用蛹批,它可以指定兩個(gè)參數(shù)撰洗,分別用以設(shè)置返回記錄的起始位置篮愉,和返回記錄的數(shù)量。
LIMIT子句也可以只使用一個(gè)參數(shù)差导,表示從開頭位置试躏,即偏移量為0的位置返回指定數(shù)量的記錄,在上例中使用的“LIMIT 0, 5”等價(jià)于“LIMIT 5”设褐。
使用統(tǒng)計(jì)函數(shù)
在數(shù)據(jù)庫(kù)系統(tǒng)中提供了一系列的內(nèi)置統(tǒng)計(jì)函數(shù)颠蕴,在SQL查詢中使用這些統(tǒng)計(jì)函數(shù)可以更有效地處理數(shù)據(jù)。這些統(tǒng)計(jì)函數(shù)把存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)助析,描述為一個(gè)整體而不是一行行孤立的記錄裁替。
統(tǒng)計(jì)函數(shù) | 描述 |
---|---|
COUNT() | 返回滿足SELECT語(yǔ)句中指定條件的記錄數(shù),例如貌笨,COUNT(*)返回找到的記錄行數(shù) |
SUM() | 通常為數(shù)值字段或表達(dá)列作統(tǒng)計(jì),返回一列的總和 |
AVG() | 通常為數(shù)值字段或表達(dá)列作統(tǒng)計(jì)襟沮,返回一列的平均值 |
MAX() | 可以為數(shù)值字段锥惋、字符字段或表達(dá)列作統(tǒng)計(jì),返回一列中最大的值 |
MIN() | 可以為數(shù)值字段开伏、字符字段或表達(dá)列統(tǒng)計(jì)膀跌,返回一列中最小的值 |
這些函數(shù)通常用在SELECT子句中,作為結(jié)果數(shù)據(jù)集的字段返回的結(jié)果固灵。在SELECT語(yǔ)句的SELECT子句中使用函數(shù)的語(yǔ)法如下:
SELECT 函數(shù)名(列名1 或*)捅伤,...函數(shù)名(列名n) FROM 表名;
使用GROUP BY對(duì)查詢結(jié)果分組
前面使用統(tǒng)計(jì)函數(shù)返回的是所有記錄的統(tǒng)計(jì)結(jié)果,如果要對(duì)數(shù)據(jù)進(jìn)行分組統(tǒng)計(jì)巫玻,就需要使用GROUP BY
子句丛忆。這將可以允許用戶在對(duì)數(shù)據(jù)進(jìn)行分類的基礎(chǔ)上,進(jìn)行再查詢仍秤。GROUP BY子句將表按列值分組熄诡,列的值相同的分為一組。如果GROUP BY后面有多個(gè)列名诗力,則先按第一個(gè)列名分組凰浮,再在每組中按第二個(gè)列名分組。
需要注意的是苇本,在GROUP BY子句中不支持對(duì)字段分配別名袜茧,也不支持任何使用了統(tǒng)計(jì)函數(shù)的集合列。
在完成數(shù)據(jù)結(jié)果的分組查詢和統(tǒng)計(jì)后瓣窄,還可以使用HAVING
子句來(lái)對(duì)查詢的結(jié)果笛厦,進(jìn)行進(jìn)一步的篩選。
在SELECT語(yǔ)句的子句中:WHERE子句選擇所需要的行俺夕;GROUP BY子句進(jìn)行了必要的分組整理递递;而HAVING子句對(duì)最后的分組結(jié)果進(jìn)行了重新篩選喷橙。
查詢優(yōu)化
EXPLAIN
語(yǔ)句是檢測(cè)索引和查詢能否良好匹配的簡(jiǎn)便方法。
EXPLAIN SELECT * FROM table WHERE a>’0’ AND b<’1’ ORDER BY c;
各個(gè)屬性的含義
- id
select查詢的序列號(hào)
- select_type
select查詢的類型登舞,主要是區(qū)別普通查詢和聯(lián)合查詢贰逾、子查詢之類的復(fù)雜查詢。
- table
輸出的行所引用的表菠秒。
- type
聯(lián)合查詢所使用的類型疙剑。
type顯示的是訪問類型,是較為重要的一個(gè)指標(biāo)践叠,結(jié)果值從好到壞依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般來(lái)說(shuō)言缤,得保證查詢至少達(dá)到range級(jí)別,最好能達(dá)到ref禁灼。
- possible_keys
指出MySQL能使用哪個(gè)索引在該表中找到行管挟。如果是空的,沒有相關(guān)的索引弄捕。這時(shí)要提高性能僻孝,可通過(guò)檢驗(yàn)WHERE子句,看是否引用某些字段守谓,或者檢查字段不是適合索引穿铆。
- key
顯示MySQL實(shí)際決定使用的鍵。如果沒有索引被選擇斋荞,鍵是NULL荞雏。
- key_len
顯示MySQL決定使用的鍵長(zhǎng)度。如果鍵是NULL平酿,長(zhǎng)度就是NULL凤优。文檔提示特別注意這個(gè)值可以得出一個(gè)多重主鍵里mysql實(shí)際使用了哪一部分。
- ref
顯示哪個(gè)字段或常數(shù)與key一起被使用蜈彼。
- rows
這個(gè)數(shù)表示mysql要遍歷多少數(shù)據(jù)才能找到别洪,在innodb上是不準(zhǔn)確的。
- Extra
如果是Only index柳刮,這意味著信息只用索引樹中的信息檢索出的挖垛,這比掃描整個(gè)表要快掸读。
如果是where used却邓,就是使用上了where限制和措。
如果是impossible where 表示用不著where背桐,一般就是沒查出來(lái)啥独榴。
如果此信息顯示Using filesort或者Using temporary的話會(huì)很吃力搅荞,WHERE和ORDER BY的索引經(jīng)常無(wú)法兼顧柱彻,如果按照WHERE來(lái)確定索引何之,那么在ORDER BY時(shí)菇怀,就必然會(huì)引起Using filesort凭舶,這就要看是先過(guò)濾再排序劃算晌块,還是先排序再過(guò)濾劃算。
在命令行模式下登錄MySQL數(shù)據(jù)庫(kù)帅霜,使用SQL實(shí)現(xiàn)下面要求(寫出對(duì)應(yīng)sql語(yǔ)句):
- 創(chuàng)建留言數(shù)據(jù)庫(kù): liuyandb;
- 在liuyandb數(shù)據(jù)庫(kù)中創(chuàng)建留言表liuyan匆背,結(jié)構(gòu)如下
表名 liuyan 留言信息表
序號(hào) 字段名稱 字段說(shuō)明 類型 屬性 備注
1 id 編號(hào) int(4) 非空 主鍵,自增1
2 title 標(biāo)題 varchar(32) 非空
3 author 作者 varchar(16) 可以空
4 addtime 留言時(shí)間 datatime 非空
5 content 留言內(nèi)容 text 非空 - 為留言表添加>15條測(cè)試數(shù)據(jù)身冀,要求分三個(gè)用戶添加.
- 查詢所有留言信息钝尸。
- 查詢某一用戶的留言信息。
- 查詢所有數(shù)據(jù)搂根,按時(shí)間降序排序珍促。
- 獲取id在2到6之間的留言信息,并按時(shí)間降序排序剩愧。
- 統(tǒng)計(jì)每個(gè)用戶留了多少條留言猪叙,并對(duì)數(shù)量按從小到大排序。
- 將id為8仁卷、9的兩條數(shù)據(jù)的作者改為’doudou’.
- 取出最新的三條留言穴翩。(使用limit)。
- 查詢留言者中包含”d”字母的留言信息五督,并按留言時(shí)間從小到大排序。
- 退出sql瓶殃,將數(shù)據(jù)庫(kù)導(dǎo)出充包,并以liuyanban.sql保存上交。
- 擴(kuò)展(自己發(fā)揮):設(shè)計(jì)一個(gè)博客的都需要哪些功能遥椿。