MySQL高級(jí)進(jìn)階sql語(yǔ)句總結(jié)大全
以下兩個(gè)表格做講解

SELECT
SELECT "字段" FROM "表名"; SELECT Store_Name FROM Store_Info; 顯示表格中的一個(gè)或數(shù)個(gè)字段的所有數(shù)據(jù)記錄

DISTINCT
SELECT DISTINCT "字段" FROM "表名"; select distinct store_name from store_info; 不顯示重復(fù)的數(shù)據(jù)記錄

WHERE
SELECT "字段" FROM "表名" WHERE "條件"; 查找store_info 表中 符號(hào)sales=700條件 的 store_name字段 有條件查詢(xún)

AND OR
SELECT "字段" FROM "表名" WHERE "條件1" select store_name,sales,date from store_info where sales > 1000 or (sales < 500 and sales > 200); 且 或
IN
SELECT "字段" FROM "表名" WHERE "字段" BETWEEN ('值1' AND '值2',...);
select * from store_info where store_name in ('Houston','Los Angeles');
顯示已知的值的數(shù)據(jù)記錄

BETWEEN
SELECT "字段" FROM "表名" WHERE "字段" BETWEEN '值1' AND '值2'; select * from store_info where sales between 200 and 500; 顯示兩個(gè)值范圍

通配符
% ;百分號(hào)表示零個(gè),一個(gè)或多個(gè)字符
_ :下劃線(xiàn)表示單個(gè)字符'A_Z':所有以‘A'起頭,另一個(gè)任何值的字符,且以‘Z為結(jié)尾的字符串。如,'ABZ’和'A2Z′都符合這一個(gè)模式,而'AKKZ'并不符合(因?yàn)樵贏和Z之間有兩個(gè)字符,而不是一個(gè)字符)。
'ABC%':所有以 'ABC’起頭的字符串。例如,'ABCD’和'ABCABC’都符合這個(gè)模式。
'%XYZ':所有以'XYZ’結(jié)尾的字符串。例如,'WXYZ’和‘ZZXYZ’都符合這個(gè)模式。
'%AN%':所有含有 'AN'這個(gè)模式的字符串。例如,'LOS ANGELES’和 'SAN FRANCISCo’都符合這個(gè)模式。
'_AN%':所有第二個(gè)字母為'A′和第三個(gè)字母為'N’的字符串。例如,'SAN FRANCIScO’符合這個(gè)模式,而'LoS ANGELES'則不符合這個(gè)模式。
LIke
SELECT "字段" FROM "表名" WHERE"字段" LIKE {模式};
select * from store_info where store_name like '%os%';
匹配一個(gè)模式來(lái)找出我們要的數(shù)據(jù)記錄

ORDER BY
SELECT "字段" FROM "表名" [WHERE "條件"] ORDER BY "字段" [ASC,DESC]; select * from store_info order by sales; select * from store_info order by sales desc; #ASC 是按照升序進(jìn)行排序的,是默認(rèn)的排序方式。 #DESC 是按降序方式進(jìn)行排序

函數(shù)
數(shù)學(xué)函數(shù);
abs (x) 返回x的絕對(duì)值 rand () 返回o到1的隨機(jī)數(shù) mod (x,y) 返回x除以y以后的余數(shù) power (x,y) 返回x的y次方 round (x) 返回離x最近的整數(shù) round (x,y) 保留x的y位小數(shù)四舍五入后的值 sqrt(x) 返回x的平方根 truncate (x, y) 返回?cái)?shù)字x截?cái)酁閥位小數(shù)的值 ceil(x) 返回大于或等于x的最小整數(shù) floor(x) 返回小于或等于x的最大整數(shù) greatest (x1,x2...) 返回集合中最大的值 least(x1,x2...) 返回集合中最小的值 聚合函數(shù): avg () 返回指定列的平均值 count () 返回指定列中非NULL值的個(gè)數(shù) min () 返回指定列的最小值 max () 返回指定列的最大值 sum (x) 返回指定列的所有值之和

city表格

#count(*)包括了所有的列的行數(shù),在統(tǒng)計(jì)結(jié)果的時(shí)候,不會(huì)忽略列值為NULL #count(列名)只包括列名那一列的行數(shù),在統(tǒng)計(jì)結(jié)果的時(shí)候,會(huì)忽略列值為NULL的行
字符串函數(shù)
trim () 返回去除指定格式的值 concat (x, y) 將提供的參數(shù)x和y拼接成一個(gè)字符串 substr(x,y) 獲取從字符串x中的第y個(gè)位置開(kāi)始的字符串,跟 substring()函數(shù)作用相同 substr(x,y,z) 獲取從字符串x中的第y個(gè)位置開(kāi)始長(zhǎng)度為z的字符串 length (x) 返回字符串x的長(zhǎng)度 replace (x,y,z) 將字符串z替代字符串x中的字符串y upper (x) 將字符串x的所有字母變成大寫(xiě)字母 lower (x) 將字符串x的所有字母變成小寫(xiě)字母 left (x, y) 返回字符串x的前y個(gè)字符 right (x, y) 返回字符串 x的后y個(gè)字符 repeat (x,y) 將字符串x重復(fù)y次 space (x) 返回x個(gè)空格 strcmp(x,y) 比較x和y,返回的值可以為-1,0,1 reverse (x) 將字符串x反轉(zhuǎn)
常用函數(shù)實(shí)例:
concat

如果sql_mode開(kāi)啟了PIPES_AS_CONCAT,’||’ 視為字符串的連接操作符而非或運(yùn)算符,和字符串的拼接函數(shù)Concat相類(lèi)似,這和Oracle相類(lèi)似,這和Oracle數(shù)據(jù)庫(kù)使用方法一樣

substr

trim

region

replace

group by
select "字段1",sum("字段2") from "表名" group by "字段1";
group by 有一個(gè)原則,就是select后面的所有列中,沒(méi)有使用聚合函數(shù)的列,必須出現(xiàn)在group by后面

having
用來(lái)過(guò)來(lái)由group by 語(yǔ)句返回的記錄集,通常與group by 語(yǔ)句聯(lián)合使用
having 語(yǔ)句的存在彌補(bǔ)了where關(guān)鍵字不能與聚合函數(shù)聯(lián)合使用的不足,如果被select的只有函數(shù)欄,那就不需要group by子句

別名
select "表格別名"."字段一" [AS] "字段別名" from "表格名" [AS] "表格別名"; 字段別名,表格別名

子查詢(xún)
select "字段1" from "表格" where "字段2" [比較運(yùn)算符] #外查詢(xún) select "字段1" from "表格2" where "條件"; 連接表格,在where 子句或 having 子句中插入另一個(gè) sql語(yǔ)句 可以是符號(hào)的運(yùn)算符,例如 = > < <= >= 也可以文字的運(yùn)算符 例如 LIKE IN BETWEEN

exists
用來(lái)測(cè)試內(nèi)查詢(xún)有沒(méi)有產(chǎn)生任何結(jié)果,類(lèi)似布爾值是否為真 #如果有的話(huà),系統(tǒng)就會(huì)執(zhí)行外查詢(xún)中的SQL語(yǔ)句,若是沒(méi)有的話(huà),那整個(gè)SQL語(yǔ)句就不會(huì)產(chǎn)生任何結(jié)果。 語(yǔ)法:SELECT "字段1" from "表格1" where exists (SELECT * FROM "表格2" WHERE "條件"); SELECT SUM(Sales) FROM Store_Info WHERE EXISTS (SELECT * FROM location WHERE Region = 'West');

表鏈接
以下兩表做實(shí)驗(yàn)

inner join(內(nèi)連接): 只返回兩個(gè)表中聯(lián)結(jié)字段相等的行
left join(左連接):返回包括左表中的所有記錄和右表中聯(lián)結(jié)字段相等的記錄
right join (右連接):返回包括右表中的所有記錄和左表中聯(lián)結(jié)字段相等的記錄

使用子查詢(xún)實(shí)現(xiàn)多表查詢(xún)

create view
視圖,可以當(dāng)作是虛擬表或存儲(chǔ)查詢(xún)
視圖跟表格的不同是,表格中有實(shí)際儲(chǔ)存數(shù)據(jù)記錄,而視圖是建立在表格之上的一個(gè)架構(gòu),它本身并不實(shí)際儲(chǔ)存數(shù)據(jù)記錄。臨時(shí)表在用戶(hù)退出或同數(shù)據(jù)庫(kù)的連接斷開(kāi)后就自動(dòng)消失了,而視圖不會(huì)消失。
視圖不含有數(shù)據(jù),只存儲(chǔ)它的定義,它的用途一般可以簡(jiǎn)化復(fù)雜的查詢(xún)。比如你要對(duì)幾個(gè)表進(jìn)行連接查詢(xún),而且還要進(jìn)行統(tǒng)計(jì)排序等操作,寫(xiě)SQL語(yǔ)句會(huì)很麻煩的,用視圖將幾個(gè)表聯(lián)結(jié)起來(lái),然后對(duì)這個(gè)視圖進(jìn)行查詢(xún)操作,就和對(duì)一個(gè)表查詢(xún)一樣,很方便。
視圖表不會(huì)像臨時(shí)表一樣,斷開(kāi)連接后自動(dòng)消失
視圖表保存的是select 語(yǔ)句查詢(xún)的結(jié)果,它本身不存儲(chǔ)數(shù)據(jù)
當(dāng)視圖表的結(jié)構(gòu)跟存儲(chǔ)數(shù)據(jù)的原始表結(jié)構(gòu)相同則可以修改或插入數(shù)據(jù),如果不一樣則不能修改或插入數(shù)據(jù)(比如多表連接查詢(xún)的結(jié)果)

union
union:生成結(jié)果的數(shù)據(jù)記錄值將沒(méi)有重復(fù),且按照字段的順序進(jìn)行排序
語(yǔ)法:[select 語(yǔ)句1] union [select 語(yǔ)句2];union all:將生成結(jié)果的數(shù)據(jù)記錄值都列出來(lái),無(wú)論有多少重復(fù)
語(yǔ)法:[select 語(yǔ)句1] union all [select 語(yǔ)句2];


交集值
取兩個(gè)SQL語(yǔ)句結(jié)果的交集 select A.store_name from location A inner join store_info B on A.store_name=B.store_name; select A.store_name from location A inner join store_info B using(store_name);

兩表其中的一個(gè)表沒(méi)有指定的行,而另一個(gè)表這個(gè)行有重復(fù)不適用,要求兩個(gè)表確實(shí)有交集的行的時(shí)候用

取兩個(gè)SQL語(yǔ)句結(jié)果的交集,且沒(méi)有重復(fù)

無(wú)交集值
顯示第一個(gè)SQL語(yǔ)句的結(jié)果,且與第二個(gè)SQL語(yǔ)句沒(méi)有交集的結(jié)果,且沒(méi)有重復(fù)

case
是SQL用來(lái)做為 if-then-else 之類(lèi)邏輯的關(guān)鍵字
語(yǔ)法:select casd("字段名")
when "條件1" then "結(jié)果2"
when "條件2" then "結(jié)果2"
....
[else "結(jié)果N"]
end
from "表名";
#條件可以是一個(gè)數(shù)值或公式。else 子句并不是必須的

空值(null) 和無(wú)值(’ ') 的區(qū)別
1.無(wú)值的長(zhǎng)度為0,不占用空間的;而 NULL值的長(zhǎng)度是NULL,是占用空間的。
2.IS NULL或者 IS NoT NULL,是用來(lái)判斷字段是不是為NULL或者不是 NULL,
不能查出是不是無(wú)值的。
3.無(wú)值的判斷使用=''或者<>''來(lái)處理。<>代表不等于。
4.在通過(guò) count()指定字段統(tǒng)計(jì)有多少行數(shù)時(shí),如果遇到NULL值會(huì)自動(dòng)忽略掉,遇到無(wú)值會(huì)加入到記錄中進(jìn)行計(jì)算。




正則表達(dá)式
| 匹配模式 | 描述 | 實(shí)例 |
|---|---|---|
| ^ | 匹配文本的開(kāi)始字符 | ‘^bd’ 匹配以bd開(kāi)頭的字符串 |
| $ | 匹配文本的結(jié)束字符 | ‘qn$’ 匹配以qn結(jié)尾的字符串 |
| . | 匹配任何單個(gè)字符 | 's.t’匹配任何s和t之間有一個(gè)字符的字符串 |
| * | 匹配零個(gè)或多個(gè)在它前面的字符 | ‘fo*t’ 匹配t前面有任意個(gè)o |
| + | 匹配前面的字符1次或多次 | ‘hom+’ 匹配ho開(kāi)頭,后面至少一個(gè)m的字符串 |
| 字符串 | 匹配包含指定的字符串 | ‘clo’ 匹配含有clo的字符串 |
| p1|p2 | 匹配p1或p2 | ‘bg | fg’ 匹配bg或fg |
| […] | 匹配字符集合中的任意一個(gè)字符 | ‘[abc]’ 匹配a或b或c |
| [^…] | 匹配不在括號(hào)中的任何字符 | ‘[ ^ ab]’ 匹配不含a或b的字符串 |
| {n} | 匹配前面的字符串n次 | ‘g{2}’ 匹配含有2個(gè)g的字符串 |
| {n,m} | 匹配前面的字符串至少n次,至多m次 | ‘f{1,3}’ 匹配f最少1次 最多3次 |
語(yǔ)法:select "字段" from "表名" where "字段" regexp {模式};


存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程是一組為了完成特定功能的SQL語(yǔ)句集合。
存儲(chǔ)過(guò)程在使用過(guò)程中是將常用或者復(fù)雜的工作預(yù)先使用SQL語(yǔ)句寫(xiě)好并用一個(gè)指定的名稱(chēng)存儲(chǔ)起來(lái),這個(gè)過(guò)程經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中。當(dāng)需要使用該存儲(chǔ)過(guò)程時(shí),只需要調(diào)用它即可。存儲(chǔ)過(guò)程在執(zhí)行上比傳統(tǒng)SQL速度更快、執(zhí)行效率更高。存儲(chǔ)過(guò)程的優(yōu)點(diǎn):
1、執(zhí)行一次后,會(huì)將生成的二進(jìn)制代碼駐留緩沖區(qū),提高執(zhí)行效率
2、SQL語(yǔ)句加上控制語(yǔ)句的集合,靈活性高
3、在服務(wù)器端存儲(chǔ),客戶(hù)端調(diào)用時(shí),降低網(wǎng)絡(luò)負(fù)載
4、可多次重復(fù)被調(diào)用,可隨時(shí)修改,不影響客戶(hù)端調(diào)用
5、可完成所有的數(shù)據(jù)庫(kù)操作,也可控制數(shù)據(jù)庫(kù)的信息訪問(wèn)權(quán)限
創(chuàng)建存儲(chǔ)過(guò)程
delimiter $$ ##將語(yǔ)句的結(jié)束符號(hào)從分號(hào);臨時(shí)改為兩個(gè)$$ 可以自定義
create procedure proc() ##創(chuàng)建存儲(chǔ)過(guò)程,過(guò)程名為proc,不帶參數(shù)
-> begin ##過(guò)程體以關(guān)鍵字 begin 開(kāi)始
-> select * from Store_info; ##過(guò)程體語(yǔ)句
-> end $$ ##過(guò)程體以關(guān)鍵字 end結(jié)束
delimiter; ##將語(yǔ)句的結(jié)束符號(hào)恢復(fù)為分號(hào)
call proc ##調(diào)用存儲(chǔ)過(guò)程
show create procedure [數(shù)據(jù)庫(kù).]存儲(chǔ)過(guò)程名;

存儲(chǔ)過(guò)程的參數(shù)
in 輸入?yún)?shù):表示調(diào)用折向過(guò)程傳入值(傳入值可以是字面量或變量)
out 輸出參數(shù):表示過(guò)程向調(diào)用者傳出值(可以返回多個(gè)值)(傳出值只能是變量)
inout 輸入輸出參數(shù):即表示調(diào)用者向過(guò)程傳入值,又表示過(guò)程向調(diào)用者傳出值(值只能是變量)

查看存儲(chǔ)過(guò)程
show create procedure [數(shù)據(jù)庫(kù).]存儲(chǔ)過(guò)程名;
刪除存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程內(nèi)容的修改方法是通過(guò)刪除原有存儲(chǔ)過(guò)程,之后再以相同的名詞創(chuàng)建新的存儲(chǔ)過(guò)程 drop procedure if exists Proc; #僅當(dāng)存在時(shí)刪除,不添加 if exists時(shí),如果指定的過(guò)程不存在,則產(chǎn)生一個(gè)錯(cuò)誤 drop procedure proc1;
存儲(chǔ)過(guò)程的控制語(yǔ)句
(1) 條件語(yǔ)句 if-then-else …end if
delimiter $$ create procedure proc2(in num int) begin declare var int; set var=num*2; if var >= 10 then update t set id=id+1; else update t set id=id-1; end if; end$$

(2)循環(huán)語(yǔ)句while… end while

總結(jié)
到此這篇關(guān)于MySQL高級(jí)進(jìn)階sql語(yǔ)句的文章就介紹到這了,更多相關(guān)Mysql高階sql語(yǔ)句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows server 2008 64位MySQL5.6免安裝版本配置方法圖解
這篇文章主要介紹了windows server 2008 64位MySQL5.6免安裝版本配置方法圖解,需要的朋友可以參考下2017-08-08
Mysql sql慢查詢(xún)監(jiān)控腳本代碼實(shí)例
這篇文章主要介紹了Mysql sql慢查詢(xún)監(jiān)控腳本代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
MySQL存儲(chǔ)引擎應(yīng)用場(chǎng)景MyISAM?vs?InnoDB優(yōu)勢(shì)選擇
這篇文章主要為大家介紹了MySQL存儲(chǔ)引擎應(yīng)用場(chǎng)景MyISAM?vs?InnoDB優(yōu)勢(shì)選擇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
解決Node.js mysql客戶(hù)端不支持認(rèn)證協(xié)議引發(fā)的問(wèn)題
這篇文章主要介紹了解決Node.js mysql客戶(hù)端不支持認(rèn)證協(xié)議引發(fā)的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06
MySQL對(duì)window函數(shù)執(zhí)行sum函數(shù)可能出現(xiàn)的一個(gè)Bug
這篇文章主要給大家介紹了關(guān)于MySQL對(duì)window函數(shù)執(zhí)行sum函數(shù)可能出現(xiàn)的一個(gè)Bug,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
MySQL之information_schema數(shù)據(jù)庫(kù)詳細(xì)講解
這篇文章主要介紹了MySQL之information_schema數(shù)據(jù)庫(kù)詳細(xì)講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

