做網(wǎng)站建設(shè)優(yōu)化的公司優(yōu)化教程網(wǎng)下載
目錄
一 插入
1 基本語法
①全列插入
②指定列插入
③多條記錄插入
④沖突更新
二 查詢
?查詢?nèi)繑?shù)據(jù)
?指定列查詢
顯示
拼接?
取別名
去重查找
where
邏輯運算符和比較運算符
結(jié)果排序
Limit
group by 分組
聚合函數(shù)
??對于count
??對于sum
對于group by
??相關(guān)的語法細(xì)節(jié):
? ??①如果有多個分組條件?
? ??②關(guān)于顯示
? ??③關(guān)于分組后篩選
關(guān)于執(zhí)行順序
三 UPDATE 更新
四 DELETE/TRUNCATE?刪除
DELETE
語法
注意:
TRUNCATE
?
一 插入
1 基本語法
先創(chuàng)建一個表之后插入
有幾種寫法,可以基本分類成是否帶上列名,是否是多條記錄插入,是否有沖突更新
①全列插入
不帶列名,默認(rèn)是一一對應(yīng)的全列插入
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
示例
?全插入的話自增的值也是要指定的
②指定列插入
帶上列名,默認(rèn)插入的值是和自己指定的列名的順序一一對應(yīng)
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
?可以省略自增的值
注意:
此時如果默認(rèn)省略了列名,進(jìn)行全列插入的話,不能夠省略自增字段的值,不會自動更新
此時如果指定了列名進(jìn)行插入的話,可以省略自增長的值,會自動補充
③多條記錄插入
?在上述兩種插入的基礎(chǔ)上增加新的記錄
INSERT INTO table_name
VALUES (value1, value2, value3, ...),(value1, value2, value3, ...),(value1, value2, value3, ...);
或者
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...),(value1, value2, value3, ...),(value1, value2, value3, ...);?
④沖突更新
沖突理解
如果表中已經(jīng)存在的主鍵或者唯一鍵和我要插入的值是一樣的,此時就發(fā)生了沖突,如果發(fā)生沖突的話,mysql就會直接進(jìn)行攔截,不允許該信息的插入。
本質(zhì):插入沖突是因為我們之前存在相同的值,如果不想讓操作失敗的話,可以先進(jìn)行更新再插入。
其實就是一種替換,可以選擇刪除之前的數(shù)據(jù)再插入新的值。但是主鍵和唯一鍵不被修改,其他的被修改
語法
INSERT INTO ……
ON DUPLICATE KEY UPDATE column = values [,column = value]……
其實replace可以替換掉上述的語句,兩者的意思是一樣的
示例
有沖突,并且沖突值不一樣
有沖突但是沖突值和之前是一樣的
沒有沖突直接插入
?和replace是一樣的
影響
此時分為幾種情況:
①插入的時候無沖突,直接插入,一行受影響-----》只有自己插入的這一行受影響
②插入的時候發(fā)生鍵值沖突了,但是沖突的值和之前的是一樣的,此時0行受影響
③插入的時候發(fā)生鍵值沖突了,并且沖突的值不一致,這時候就會刪除之前的,然后插入新的,(假設(shè)之前只有1行記錄沖突),那么就是兩行受影響
二 查詢
在一個數(shù)據(jù)庫內(nèi),做一個表的組合查詢
語法
SELECT
{* | <字段列名>}
[
FROM <表 1>, <表 2>…
[WHERE <表達(dá)式>
[GROUP BY <group by definition>
[HAVING <expression> [{<operator> <expression>}…]]
[ORDER BY <order by definition>]
[LIMIT[<offset>,] <row count>]
]
先來簡單介紹一下這些意思,
from就是要指明在哪些表中進(jìn)行查找
where的話設(shè)定對應(yīng)的查詢條件,通過邏輯運算符或者算數(shù)運算符進(jìn)行設(shè)置
order by的話是排序的意思,有升序和降序,默認(rèn)是升序
limit的話,是篩選出指定行。我們可以和order by搭配使用,這樣的話,就可以選出符合條件的前幾條或者最后幾條數(shù)據(jù)
演示一下對應(yīng)的操作,先創(chuàng)建一個表并且插入數(shù)據(jù)做準(zhǔn)備
?
?1 查詢?nèi)繑?shù)據(jù)
后面不帶任何的篩選條件就是查詢所有的數(shù)據(jù)。但是這樣的話,如果對于數(shù)據(jù)量非常大的表來說的話,數(shù)據(jù)量非常大,而且篩選不出符合自己條件的。?
?指定列查詢
可以只查詢自己關(guān)心的列。但是也是所有數(shù)據(jù)的。
顯示
我們在查詢列的時候,顯示結(jié)果是跟著自己的指定列的,而非創(chuàng)建表的時候的順序?
?
拼接?
我們查找的時候還可以拼接常數(shù)或者計算式或者字符串
取別名
as 取別名 (取別名的時候也可以不加as)
去重查找
規(guī)則:要根據(jù)對應(yīng)查找的內(nèi)容整體來判斷的
比如這里根據(jù)名字和數(shù)學(xué)成績一起去重,雖然數(shù)學(xué)成績有重復(fù)的,但是名字是沒有重復(fù)的,也沒有數(shù)據(jù)被篩選掉,都被看成不重復(fù)的
?
?這樣才會去重
where
主要使用兩大類運算符來進(jìn)行篩選:
邏輯運算符和比較運算符
以下是比較運算符的種類
運算符 | 說明 |
> >= < <= | 大于 大于等于 小于 小于等于 |
= | 等于 不能對NULL運算 |
<=> | 等于 可以用來比較NULL |
!= , <> | 不等于 |
BETWEEN AND | 閉區(qū)間內(nèi)的一個值 |
IN(option1,option2,……) | 如果是option中的任意一個,就可以返回TRUE |
IS NULL | 是NULL |
IS NOT NULL | 不是NULL |
LIKE | 模糊匹配 %匹配多個 _匹配一個 |
>,>=,<,<=一般來說是可以來比較整數(shù)或者浮點數(shù)的大小的
比如這個語句就篩選出了薪水大于1000的?
=除了比較數(shù)字之外,還可以用來比較字符串,但是不能對NULL進(jìn)行比較
注意:mysql中的等于是=,而非語言中的==
對于NULL值的運算可以使用<=> 或者 IS (NOT)NUL
注意null值和空串的區(qū)分對于空串是可以使用 = ' '進(jìn)行篩選出來的,但是null的話只能使用<=> 或者IS(NOT)NULL運算
‘ ’表示的是空串,他是個字符串類型,只不過內(nèi)容是空的
NULL一般不參與計算,=這個運算符只能比較存在的數(shù)據(jù),因此對于這個不存在的NULL不能進(jìn)行比較??
查找一個區(qū)間內(nèi)的數(shù)字?
一般整數(shù)和浮點數(shù)才能進(jìn)行查找
比如篩選出工資在1000到2000的
?這個其實和這個查找語句是等同的
查找在一個集合內(nèi)的
成功找到就返回1,找不到就返回-1
?也可以查看某一條記錄的某個數(shù)據(jù)是否在集合范圍內(nèi)
模糊匹配
%多個匹配
-一個匹配
查找以A開頭的姓名的人的所有信息
?查找姓名中有A的
邏輯運算符
這個是用來連接多個條件的,有時候查詢條件可能不止符合一個
運算符 | 注釋 |
AND | 多個條件都必須為真才為真 |
OR | 任意一個條件為真就可以為真 |
NOT | 如果為真,結(jié)果就是假 |
其他的使用也是類似的
需要注意的是,最終結(jié)果的顯示和查找的條件中的列數(shù)可以不相等。比如想查找符合某條件的,但是最終顯示的時候不顯示對應(yīng)列也是可以的
比如這個查找的對應(yīng)工資要大于1000的,但是最后只顯示工資大于1000的人的對應(yīng)的姓名
結(jié)果排序
我們可以對查找的結(jié)果按照某些順序進(jìn)行排序,比如可以按照薪資的多少進(jìn)行排序,默認(rèn)是升序,如果我們想按照降序排列帶上des
?排序不是篩選條件是顯示條件
?這里一些sal相同的也有順序,其實是因為這個排序是以排序的關(guān)鍵字為key值進(jìn)行排序,把整條記錄都進(jìn)行排序了。
對于NULL的話,默認(rèn)是最小的,如果是升序排序就出現(xiàn)在最上面,降序排序就出現(xiàn)在最下面
Limit
如何查找符合某些條件的前幾名
這樣就選出了工資最少的前三名?
?
也可以指定一個區(qū)間,起始下標(biāo)從0開始
?
?利用這個條件篩選可以實現(xiàn)分批取出數(shù)據(jù)的目的,一頁limit多少數(shù)據(jù),這一頁放不下就放到下一頁
group by 分組
在講這個的時候,引入聚合函數(shù)的概念。因為聚合函數(shù)一般都是和group by搭配使用的
聚合函數(shù)
mysql內(nèi)部本身就挺了一些數(shù)據(jù)庫的函數(shù)以供我們使用。
對于聚合函數(shù)的理解
聚合函數(shù)是直接或者簡介對列的數(shù)據(jù)進(jìn)行統(tǒng)計。由于是列的數(shù)據(jù),那么就具有相同的屬性。換句話說,相同屬性的就具有了聚合函數(shù)統(tǒng)計的前提
并且由于是列統(tǒng)計,那么對于一個表的數(shù)據(jù)進(jìn)行統(tǒng)計一定是一行或者多行的(一批數(shù)據(jù))
總結(jié):對列,具有相同屬性 對于一批數(shù)據(jù)
函數(shù) | 注釋 |
COUNT | 返回查詢到的數(shù)據(jù)的數(shù)量 |
SUM | 返回查詢到的數(shù)據(jù)的總和,必須是數(shù)字 |
AVG | 返回查詢到的數(shù)據(jù)的平均值,必須是數(shù)字 |
MAX | 返回查詢到的數(shù)據(jù)的最大值,必須是數(shù)字 |
MIN | 返回查詢到的數(shù)據(jù)的最小值,必須是數(shù)字 |
對于count
想查詢有多少條記錄
也可以進(jìn)行重命名
其他的寫法
所有的記錄*
Select 1的時候其實已經(jīng)把所有的數(shù)據(jù)都篩選出來了,只不過顯示的時候只顯示1
這樣我們有多少條記錄,就有多少個1。
?
?注意直接篩選的時候,null是不參與運算的,也要注意‘ ’為了避免空串的統(tǒng)計可以在條件中設(shè)置
?去重
如果不想統(tǒng)計的數(shù)據(jù)中有重復(fù)的,我們就可以使用這個進(jìn)行去重
?
?執(zhí)行的時候先去選出符合條件的不重復(fù)的數(shù)據(jù),之后再進(jìn)行統(tǒng)計是比較好的;如果先統(tǒng)計再計算的話,不符合要求,去重之后還需要再次統(tǒng)計,沒意義
如果是distinct count(math)的話,是先去統(tǒng)計math的,已經(jīng)統(tǒng)計了重復(fù)的。之后選出數(shù)據(jù)之后再去重,只不過此時不顯示,這樣的話我們看到的是7(統(tǒng)計沒去重的)
如果是count(distinct math)的話, 是要先對count內(nèi)部的math做去重之后再進(jìn)行統(tǒng)計
總結(jié):count的話,是先執(zhí)行count內(nèi)的
count都是先有最后的結(jié)果數(shù)據(jù)再統(tǒng)計的
對于sum
也是差不多的,可以計算總和,總和計算出來之后可以計算平均值?
?
這個相當(dāng)于
同理,其他的聚合函數(shù)也是這么使用的
都是遍歷列之后聚合的
對于group by
對指定列分組查詢。
之間我們select查詢的時候,都是將數(shù)據(jù)作為一個整體來查詢的。其實,mysql也可以支持按照指定的列對數(shù)據(jù)進(jìn)行分組,在分組的數(shù)據(jù)中操作。
比如,可以查找某個部門的最高,最低工資,平均工資
group by和聚合函數(shù)搭配使用,執(zhí)行的順序是先去執(zhí)行g(shù)roup by對結(jié)果進(jìn)行分組,之后再去每一組里面進(jìn)行聚合。如果先執(zhí)行聚合的話,是對所有數(shù)據(jù)的,而非組的。
比如上面的,就是先按照部門把人分出來,之后在每一個部門里面分別查找最高最低和平均的工資
相關(guān)的語法細(xì)節(jié):
①如果有多個分組條件?
比如這個按照部門和工作進(jìn)行分組,就是先對部門進(jìn)行分組,再在部門內(nèi)部根據(jù)工作進(jìn)行分組?
其實相當(dāng)于一棵多叉樹的結(jié)構(gòu),先按照一個分組的依據(jù),分成一個一個的小表,之后再在小表的內(nèi)部繼續(xù)分。
②關(guān)于顯示
只有g(shù)roup by作為分組條件的列之后在顯示的時候才能夠顯示出來。比如我這里顯示想顯示部門號和工作,但是我在輸入分組條件的時候沒有把工作作為分組的依據(jù),因此就不能
?③關(guān)于分組后篩選
由于where篩選的時候是先有對應(yīng)的條件才會去對數(shù)據(jù)進(jìn)行篩選;但是聚合函數(shù)是先有了對應(yīng)的數(shù)據(jù)才會去聚合,分組。因此where后面是不能夠帶上group by的
如果想對group by的結(jié)果進(jìn)行篩選的話,應(yīng)該需要使用having語句
這里是對group by分組出來的數(shù)據(jù),再進(jìn)行having條件的篩選
?總結(jié)
group by的話一定會和聚合函數(shù)搭配使用統(tǒng)計
如果需要對分組后的條件再進(jìn)行篩選的話,需要用having語句進(jìn)行篩選。只有g(shù)roup by才使用having
having與where的區(qū)別
where對數(shù)據(jù)進(jìn)行初篩;having 對where篩選和group by分組之后的數(shù)據(jù)再次進(jìn)行篩選
where的話,執(zhí)行語句是比較靠前的,是在分組之前先按照where的條件進(jìn)行篩選,符合條件才會進(jìn)入group by 的having
having之前通常有聚合函數(shù)統(tǒng)計和group by分組
舉例子:比如我需要篩選出工資>1000的人,在這條件之下按照部門分組,平均工資<2000的人的相關(guān)信息
①先去from emp找到對應(yīng)的表的數(shù)據(jù)
②where 對表的數(shù)據(jù)進(jìn)行篩選
③group by分組
④avg聚合
⑤對這樣分組和聚合的數(shù)據(jù)進(jìn)行 having條件篩選
關(guān)于執(zhí)行順序
where條件設(shè)置的時候嗎,是按照這樣的一個邏輯來查找數(shù)據(jù)的:
①我們先要去找到對應(yīng)的表,因此是from先找到表
②之后利用where進(jìn)行數(shù)據(jù)的篩選
③group by分組,以便執(zhí)行聚合函數(shù)和having
④執(zhí)行聚合函數(shù),如果之后有having篩選條件在having最后顯示的時候篩選
⑤這樣我們就完成了對應(yīng)的條件的篩選,再去執(zhí)行select找出符合的對應(yīng)的列
⑥有了這樣的數(shù)據(jù)才會知道有沒有重復(fù)的,再去考慮distinct去重
⑦最后order by排序,因為還有一個limit是要在所有的數(shù)據(jù)都執(zhí)行的差不多了的情況下才會去找出對應(yīng)的幾條數(shù)據(jù)
from -》where-》group by -》聚合函數(shù)-》having -》 select -》 distinct-》as-》order by -》limit
我們可以這樣分類了之后去理解,有兩類查詢:where和having。與where相關(guān)的先用紅色標(biāo)出,橙色的也屬于紅色,只不過select后面可以重命名和去重比較特殊單獨再拎出來
我們執(zhí)行的時候先去執(zhí)行where的執(zhí)行條件,再去看having的
要執(zhí)行where必須有數(shù)據(jù),數(shù)據(jù)從表來,因此最開始from
from找得出數(shù)據(jù)后就可以where先進(jìn)行一輪篩選,篩選的數(shù)據(jù)如果還需要分組等的篩選,就去執(zhí)行藍(lán)色的邏輯
這樣就相當(dāng)于完成了兩輪的篩選,然后我們再根據(jù)一些顯示的要求進(jìn)行設(shè)置
order by在select之后是因為必須有select選出的數(shù)據(jù)再去排序才有意義,防止了一些重復(fù)的工作
最后limit一定是最后的,完成了所有工作之后才能去選出符合條件的
三 UPDATE 更新
UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ]
[ORDER BY 子句] [LIMIT 子句]
更新一般是搭配查詢來使用的,把符合條件的數(shù)據(jù)進(jìn)行更新。因為只有有了對應(yīng)的數(shù)據(jù),才能對符合條件的數(shù)據(jù)進(jìn)行更新。因為如果不配合對應(yīng)的WHERE語句的話,就把所有的數(shù)據(jù)都更新了
?這樣就把對應(yīng)的名字為KING的員工的薪水修改成了99999;
相應(yīng)的,數(shù)據(jù)一旦被修改,那么按照之前的條件進(jìn)行篩選的話,很有可能會產(chǎn)生差異
四 DELETE/TRUNCATE?刪除
刪除這個操作,一般會帶來比較嚴(yán)重的后果,所以不能夠輕易地進(jìn)行刪除,只有特定權(quán)限的才能刪除。
與UPDATE同理,刪除的時候一定要注意篩選條件,否則很有可能就把所有的數(shù)據(jù)都刪除了
DELETE
語法
DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
注意:
刪除數(shù)據(jù)僅僅是把對應(yīng)的記錄刪除了,但是對于auto_increment并不改變,下一次插入的數(shù)據(jù)也是接著上一個auto_increment的值繼續(xù)往后插入的
比如我這邊有5個數(shù)據(jù),我現(xiàn)在刪除了1個數(shù)據(jù),auto_increment的值并不會變成5,也就是說下一次插入的時候,會被自動分配6
TRUNCATE
TRUNCATE TABLE name
這個操作的特點是不能像DELETE一樣,設(shè)置刪除的條件,只能整體刪除
這一個操作導(dǎo)致的后果就是表被清空的同時,auto_increment的值也會被修改,從初始值開始。
因為TRUNCATE在刪除的時候,比DELETE更快,因為他不經(jīng)過真正的事務(wù),所以無法進(jìn)行回滾。它不是對數(shù)據(jù)進(jìn)行操作,也不會更新日志,直接把表清空,比delete要快是因為她的工作量更少。他直接干掉表數(shù)據(jù),對應(yīng)的索引結(jié)構(gòu),日志信息。沒法回滾了。