程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> 關於sql和mysql關於別號不克不及挪用的一些懂得

關於sql和mysql關於別號不克不及挪用的一些懂得

編輯:MSSQL

關於sql和mysql關於別號不克不及挪用的一些懂得。本站提示廣大學習愛好者:(關於sql和mysql關於別號不克不及挪用的一些懂得)文章只能為提供參考,不一定能成為您想要的結果。以下是關於sql和mysql關於別號不克不及挪用的一些懂得正文


在寫sql的時刻,因為有部門語句別號不克不及挪用,百度了一下緣由,本來是因為別號機制分歧惹起的。為了不下一次再犯異樣的毛病,明天把網上找到材料總結了一下,sql和mysql履行次序,發明外部機制是一樣的。最年夜差別是在別號的援用上。

1、sql履行次序
(1)from
(3) join
(2) on
(4) where
(5)group by
(6) avg,sum....
(7)having
(8) select
(9) distinct
(10) order by

從這個次序中我們不難發明,一切的 查詢語句都是從from開端履行的,在履行進程中,每一個步調都邑為下一個步調生成一個虛擬表,這個虛擬表將作為下一個履行步調的輸出。
第一步:起首對from子句中的前兩個表履行一個笛卡爾乘積,此時生成虛擬表 vt1(選擇絕對小的表做基本表)
第二步:接上去就是運用on挑選器,on 中的邏輯表達式將運用到 vt1 中的各個行,挑選出知足on邏輯表達式的行,生成虛擬表 vt2
第三步:假如是outer join 那末這一步就將添加內部行,left outer jion 就把左表在第二步中過濾的添加出去,假如是right outer join 那末就將右表在第二步中過濾失落的行添加出去,如許生成虛擬表 vt3
第四步:假如 from 子句中的表數量過剩兩個表,那末就將vt3和第三個表銜接從而盤算笛卡爾乘積,生成虛擬表,該進程就是一個反復1-3的步調,終究獲得一個新的虛擬表 vt3。
第五步:運用where挑選器,對上一步臨盆的虛擬表援用where挑選器,生成虛擬表vt4,在這有個比擬主要的細節不能不說一下,關於包括outer join子句的查詢,就有一個讓人覺得迷惑的成績,究竟在on挑選器照樣用where挑選器指定邏輯表達式呢?on和where的最年夜差別在於,假如在on運用邏輯表達式那末在第三步outer join中還可以把移除的行再次添加回來,而where的移除的終究的。舉個簡略的例子,有一個先生表(班級,姓名)和一個成就表(姓名,成就),我如今須要前往一個x班級的全部同窗的成就,然則這個班級有幾個先生缺考,也就是說在成就表中沒有記載。為了獲得我們預期的成果我們就須要在on子句指定先生和成就表的關系(先生.姓名=成就.姓名)那末我們能否發明在履行第二步的時刻,關於沒有加入測驗的先生記載就不會湧現在vt2中,由於他們被on的邏輯表達式過濾失落了,然則我們用left outer join便可以把左表(先生)中沒有加入測驗的先生找回來,由於我們想前往的是x班級的一切先生,假如在on中運用先生.班級='x'的話,那末在left outer join 中就會將不會把x班級的先生的一切記載找回來,所以只能在where挑選器中運用先生.班級='x' 由於它的過濾是終究的。
第六步:group by 子句將中的獨一的值組分解為一組,獲得虛擬表vt5。假如運用了group by,那末前面的一切步調都只能獲得的vt5的列或許是聚合函數(count、sum、avg等)。緣由在於終究的成果集中只為每一個組包括一行。這一點請切記。
第七步:運用cube或許rollup選項,為vt5生成超組,生成vt6.
第八步:運用having挑選器,生成vt7。having挑選器是第一個也是為獨一一個運用到已分組數據的挑選器。
第九步:處置select子句。將vt7中的在select中湧現的列挑選出來。生成vt8.
第十步:運用distinct子句,vt8中移除雷同的行,生成vt9。現實上假如運用了group by子句那末distinct是過剩的,緣由異樣在於,分組的時刻是將列中獨一的值分紅一組,同時只為每組前往一行記載,那末所以的記載都將是不雷同的。
第十一步:運用order by子句。依照order_by_condition排序vt9,此時前往的一個游標,而不是虛擬表。sql是基於聚集的實際的,聚集不會事後對他的行排序,它只是成員的邏輯聚集,成員的次序是可有可無的。對表停止排序的查詢可以前往一個對象,這個對象包括特定的物理次序的邏輯組織。這個對象就叫游標。正由於前往值是游標,那末應用order by 子句查詢不克不及運用於表表達式。排序是很須要本錢的,除非你必需要排序,不然最好不要指定order by,最初,在這一步中是第一個也是獨一一個可使用select列表中別號的步調。
第十二步:運用top選項。此時才前往成果給要求者即用戶。

2、mysql的履行次序
SELECT語句界說
一個完成的SELECT語句包括可選的幾個子句。SELECT語句的界說以下:
SQL代碼

<SELECT clause> [<FROM clause>] [<WHERE clause>] [<GROUP BY clause>] [<HAVING clause>] [<ORDER BY clause>] [<LIMIT clause>]


SELECT子句是必選的,其它子句如WHERE子句、GROUP BY子句等是可選的。
一個SELECT語句中,子句的次序是固定的。例如GROUP BY子句不會位於WHERE子句的後面。

SELECT語句履行次序
SELECT語句中子句的履行次序與SELECT語句中子句的輸出次序是紛歧樣的,所以其實不是從SELECT子句開端履行的,而是依照上面的次序履行:
開端->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->終究成果
每一個子句履行後都邑發生一個中央成果,供接上去的子句應用,假如不存在某個子句,就跳過
比較了一下,mysql和sql履行次序根本是一樣的, 尺度次序的 SQL 語句為:

SQL代碼

select 考生姓名, max(總成就) as max總成就

from tb_Grade

where 考生姓名 is not null

group by 考生姓名

having max(總成就) > 600

order by max總成就

   在下面的示例中 SQL 語句的履行次序以下:

   (1). 起首履行 FROM 子句, 從 tb_Grade 表組裝數據源的數據

   (2). 履行 WHERE 子句, 挑選 tb_Grade 表中一切數據不為 NULL 的數據

   (3). 履行 GROUP BY 子句, 把 tb_Grade 表按 "先生姓名" 列停止分組

   (4). 盤算 max() 集合函數, 按 "總成就" 求出總成就中最年夜的一些數值

   (5). 履行 HAVING 子句, 挑選課程的總成就年夜於 600 分的.

   (7). 履行 ORDER BY 子句, 把最初的成果按 "Max 成就" 停止排序.

上面以一個實例來講明別號不克不及用的基本緣由:

例子 一

SQL代碼

select m.mname as username,
avg(s.score) as rscore,
(case
when avg(s.score) < 60 then
'差'
when avg(s.score) >= 60 and avg(s.score) <= 80 then
'良'
when avg(s.score) > 80 and avg(s.score) <= 100 then
'優'
else
'不正當'
end)
from score s, student m
where s.mid = m.mid
group by m.mname
order by rscore desc;

假設把case 外面avg(s.score)改成別號rscore 在sql下運轉就報錯了

例子二

SQL代碼

select count( *) as c from score group by mid having count(*)>2;

假設把having 外面的count( *)換成別號c,這句在sql外面就釀成毛病的了,在 mysql下是准確的,百思不得其解,給同伙指導了一下,終究懂得通了,上面是解釋:
GroupBy和Having,Where,Orderby語句的履行次序:
最初要解釋一下的GroupBy,Having,Where,Orderby幾個語句的履行次序。一個SQL語句常常會發生多個暫時視圖,那末這些症結字的履行次序就異常主要了,由於你必需懂得這個症結字是在對應視圖構成前的字段停止操作照樣對構成的暫時視圖停止操作,這個成績在應用了別號的視圖特別主要。以上羅列的症結字是依照以下次序停止履行的:Where,GroupBy,Having,Orderby。起首where將最原始記載中不知足前提的記載刪除,然後經由過程GroupBy症結字前面指定的分組前提將挑選獲得的視圖停止分組,接著體系依據Having症結字前面指定的挑選前提,將分組視圖後不知足前提的記載挑選失落,然後依照OrderBy語句對視圖停止排序,如許終究的成果就發生了。在這四個症結字中,只要在OrderBy語句中才可使用終究視圖的列名,如:

SQL代碼

SELECT FruitName,ProductPlace,Price,ID AS IDE,Discount FROMT_TEST_FRUITINFO WHERE ORDER BY IDE

這裡只要在ORDERBY語句中才可使用IDE,其他前提語句中假設須要援用列名則只能應用ID,而不克不及應用IDE。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved