mysql怎么執(zhí)行分支 mysql的三種分頁(yè)方法

MySQL各部分的執(zhí)行順序

前幾天參加了一個(gè)公司的面試,到了后面面試官出了一個(gè)SQL相關(guān)的題目:

創(chuàng)新互聯(lián)專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、行唐網(wǎng)絡(luò)推廣、小程序制作、行唐網(wǎng)絡(luò)營(yíng)銷(xiāo)、行唐企業(yè)策劃、行唐品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供行唐建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

數(shù)據(jù)的形式類(lèi)似于以下這樣(表名為views):

當(dāng)時(shí)為了穩(wěn)妥起見(jiàn),我的第一反應(yīng)是使用窗口函數(shù),

然后面試官問(wèn):“還有沒(méi)有什么簡(jiǎn)便的方法么?”

很明顯他的意思是要用傳統(tǒng)的groupby來(lái)完成這個(gè)查詢(xún),確實(shí)我之前的查詢(xún)又是用窗口函數(shù)又是加了distinct確實(shí)是復(fù)雜一些。

于是我用group by再寫(xiě)了一遍。

看完我的查詢(xún)之后,面試官又問(wèn)了一句:“可以不需要使用嵌套查詢(xún)嗎?”

當(dāng)時(shí)我的回答是”應(yīng)該不行,如果不使用嵌套而直接在group by后面加having的話sql會(huì)報(bào)錯(cuò),就和where如果使用別名查詢(xún)就會(huì)報(bào)錯(cuò)一樣“

后面面試完想了一下,發(fā)現(xiàn)自己當(dāng)時(shí)回答得不好,不是正確的但也不完全錯(cuò),不是正確的原因是按照sql的規(guī)則having后面是可以拿聚合函數(shù)做判斷的,但是不完全錯(cuò)的原因是如果having用的是像我之前設(shè)置的別名來(lái)判斷的話,確實(shí)是會(huì)出錯(cuò)的。(雖然mysql在5.6之后基于sql的規(guī)則對(duì)group by進(jìn)行拓展,支持這種寫(xiě)法。但在其它sql上面用別名having還是不行的)

我們可以從SQL運(yùn)行時(shí)各部分的執(zhí)行順序來(lái)進(jìn)行分析,當(dāng)我們選擇執(zhí)行一個(gè)SQL語(yǔ)句的時(shí)候,它會(huì)按照以下的順序來(lái)進(jìn)行操作,

這個(gè)執(zhí)行順序的設(shè)計(jì)是很巧妙的,我說(shuō)一下我自己對(duì)于上述順序的理解,

1. FROM

顧名思義,當(dāng)執(zhí)行查詢(xún)語(yǔ)句的時(shí)候,首先需要知道的是它需要哪些表,正如我們?nèi)ヒ粋€(gè)地方需要知道它的具體位置一樣。如果需要多個(gè)表的話在這一部分也需要按照一定的順序進(jìn)行表的join操作。

2. WHERE

當(dāng)確定我們需要讀取哪一張表(或者多張表)的數(shù)據(jù)之后,我們就需要進(jìn)行where的filter操作,根據(jù)filter盡量減少讀取的數(shù)據(jù)數(shù)量。

那么問(wèn)題來(lái)了,為什么where的優(yōu)先級(jí)要比group by,having, select之類(lèi)的要高呢?

第一個(gè)原因是可以減少不必要的查詢(xún)量,加快執(zhí)行語(yǔ)句的速度,類(lèi)似于Apache Spark在對(duì)查詢(xún)語(yǔ)句進(jìn)行邏輯優(yōu)化時(shí)需要用到的謂詞下推類(lèi)似的道理。舉個(gè)栗子,比如我們可能需要userid從100到300的用戶(hù)對(duì)于某一個(gè)頁(yè)面的瀏覽次數(shù),那么如果先執(zhí)行g(shù)roup by再執(zhí)行where的話,userid小于100的用戶(hù)的數(shù)據(jù)也會(huì)被匯總進(jìn)去,但實(shí)際上這些部分的數(shù)據(jù)是完全不需要的,計(jì)算它們完全是浪費(fèi)系統(tǒng)資源(而且group by操作本身就是很耗資源的操作)

3. GROUP BY

在完成where操作的過(guò)濾之后,如果語(yǔ)句中有g(shù)roup by的話則會(huì)對(duì)過(guò)濾后的數(shù)據(jù)進(jìn)行聚合操作,聚合操作是多對(duì)一的轉(zhuǎn)換,因此在聚合操作過(guò)后,除了用于group by的字段之外,其它字段的原始數(shù)據(jù)將會(huì)丟失,只能得到它們相應(yīng)的聚合結(jié)果(比如sum(), avg()這樣)

在完成聚合操作之后,參與group by的字段以及其它字段對(duì)應(yīng)的聚合值已經(jīng)處于已知狀態(tài),后續(xù)的操作可以直接使用它們。

4. HAVING

HAVING操作主要做的是對(duì)group by之后的分組結(jié)果進(jìn)行過(guò)濾,可以根據(jù)參與group by的字段進(jìn)行過(guò)濾,也可以根據(jù)其它字段的聚合值進(jìn)行過(guò)濾。(因?yàn)榫酆现翟谶@里已經(jīng)算是已知數(shù)據(jù))因此這里是可以拿聚合函數(shù)做判斷的,比如最開(kāi)始的那個(gè)查詢(xún)的例子,可以直接寫(xiě)成以下的形式,

HAVING并不是一定要和group by成對(duì)出現(xiàn)的,它也可以單獨(dú)存在,在沒(méi)有g(shù)roup by的時(shí)候,此時(shí)默認(rèn)只有一個(gè)組,但是需要注意的是這時(shí)having里面參與過(guò)濾的字段需要在select里面存在,不然having會(huì)不知道這是分組里面的內(nèi)容而導(dǎo)致報(bào)錯(cuò)。

5. SELECT

選取結(jié)果集中相對(duì)應(yīng)的字段,在select中為字段設(shè)置的別名在此階段及之后的操作中生效。

6. DISTINCT

去重操作,放在select之后有個(gè)原因是去重操作是要根據(jù)select里面所選字段來(lái)進(jìn)行的。

7. ORDER BY

對(duì)得到的結(jié)果按照特定字段順序進(jìn)行排列,這里可以使用別名

8. LIMIT

設(shè)置顯示結(jié)果集中的幾條數(shù)據(jù)

通過(guò)分析MySQL中各部分的執(zhí)行順序,我們就不難理解為什么where不能有別名,而having可以用聚合函數(shù)來(lái)判斷的原因,而且借此機(jī)會(huì)重新溫習(xí)一遍SQL各部分對(duì)應(yīng)的功能,加深理解,可以說(shuō)是一舉兩得。

mysql存儲(chǔ)過(guò)程中分支語(yǔ)句有哪些

存儲(chǔ)過(guò)程:

create procedure p()

begin

/*thi procedure does nothing*/

end;

1.參數(shù)

Parameters 參數(shù)

讓我們更進(jìn)一步的研究怎么在存儲(chǔ)過(guò)程中定義參數(shù)1. CREATE PROCEDURE p5

() ...

2. CREATE PROCEDURE p5

([IN] name data-type) ...

3. CREATE PROCEDURE p5

(OUT name data-type) ...

4. CREATE PROCEDURE p5

(INOUT name data-type) ...

2.Conditions and if-then-else 條件式和 if-then-else

3.Loops 循環(huán)語(yǔ)句

WHILE ... END WHILE

LOOP ... END LOOP

REPEAT ... END REPEAT

GOTO

4.DECLARE HANDLER syntax 聲明異常處理的語(yǔ)法

DECLARE

{ EXIT | CONTINUE }

HANDLER FOR

{ error-number | { SQLSTATE error-string } | condition }

SQL statement

5.Cursors 游標(biāo)

游標(biāo)實(shí)現(xiàn)功能摘要:

DECLARE cursor-name CURSOR FOR SELECT ...;

OPEN cursor-name;

FETCH cursor-name INTO variable [, variable];

CLOSE cursor-name;

已現(xiàn)經(jīng)在可我以們完開(kāi)成始基著本眼的游事標(biāo)了務(wù)如。聲雖明然游我標(biāo)們,的打存開(kāi)儲(chǔ)游過(guò)標(biāo)程,中從的游游標(biāo)標(biāo)里語(yǔ)法讀取還,并關(guān)沒(méi)閉有完游整標(biāo)。

6.Functions 函數(shù)

Summary:

摘要 CREATE FUNCTION

Limitations of functions

函數(shù)的限制

我們已經(jīng)很清楚可以在存儲(chǔ)過(guò)程中使用的元素了。下面我要講的是前面沒(méi)有提到的函數(shù)。

mysql怎么一次執(zhí)行多條SQL語(yǔ)句

工具/材料:NavicatForMysql。

1、首先在桌面上,點(diǎn)擊“NavicatForMysql”圖標(biāo)。

2、然后在該界面中,點(diǎn)擊“新建查詢(xún)”按鈕。

3、之后在該界面中,輸入多條SQL語(yǔ)句。

4、接著在該界面中,點(diǎn)擊上方“執(zhí)行”按鈕。

5、最后在該界面中,顯示多條SQL語(yǔ)句執(zhí)行成功。

網(wǎng)站欄目:mysql怎么執(zhí)行分支 mysql的三種分頁(yè)方法
當(dāng)前URL:http://muchs.cn/article40/dohejeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)外貿(mào)建站、ChatGPTApp開(kāi)發(fā)、小程序開(kāi)發(fā)、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)