sql語句執行時有幾個步驟
(8)select (9)distinct (11)
我想已經寫得很清楚明白了。給分哦!。
誰能具體說一下這個sql語句執行的詳細過程
declare @sql varchar(8000)
set @sql = 'select level ' ------賦值@sql
print @sql ---執行的第一步,打印出來
select @sql = @sql+', Min(case months when ''' + months + ''' then times else 0 end) [' + months + ']'
from (select distinct months from M) as a ----使用select 的給@sql在次賦值
print @sql ----執行的第二步 ,打印出來
set @sql = @sql + ' from M group by level' ----在一次@sql賦值
print @sql ----執行的第三步,打印出來
exec(@sql) ---使用EXEC調用字符串
print @sql -----打引出EXEC調用的SQL語句
Select * From M ---查詢M表
在查詢分析器里執行上面的你就知道它在做什么了!!
其實就是字符串拼湊!
一條sql的整個過程是怎樣的
SQL語句執行過程詳解 一、SQL語句執行原理:第一步:客戶端把語句發給服務器端執行當我們在客戶端執行 select 語句時,客戶端會把這條 SQL 語句發送給服務器端,讓服務器端的進程來處理這語句。
也就是說,Oracle 客戶端是不會做任何的操作,他的主要任務就是把客戶端產生的一些 SQL 語句發送給服務器端。雖然在客戶端也有一個數據庫進程,但是,這個進程的作用跟服務器上的進程作用事不相同的。
服務器上的數據庫進程才會對SQL 語句進行相關的處理。不過,有個問題需要說明,就是客戶端的進程跟服務器的進程是一一對應的。
也就是說,在客戶端連接上服務器后,在客戶端與服務器端都會形成一個進程,客戶端上的我們叫做客戶端進程;而服務器上的我們叫做服務器進程。第二步:語句解析當客戶端把 SQL 語句傳送到服務器后,服務器進程會對該語句進行解析。
同理,這個解析的工作,也是在服務器端所進行的。雖然這只是一個解析的動作,但是,其會做很多“小動作”。
1. 查詢高速緩存(library cache)。服務器進程在接到客戶端傳送過來的 SQL 語句時,不會直接去數據庫查詢。
而是會先在數據庫的高速緩存中去查找,是否存在相同語句的執行計劃。如果在數據高速緩存中,則服務器進程就會直接執行這個 SQL 語句,省去后續的工作。
所以,采用高速數據緩存的話,可以提高 SQL 語句的查詢效率。一方面是從內存中讀取數據要比從硬盤中的數據文件中讀取數據效率要高,另一方面,也是因為這個語句解析的原因。
不過這里要注意一點,這個數據緩存跟有些客戶端軟件的數據緩存是兩碼事。有些客戶端軟件為了提高查詢效率,會在應用軟件的客戶端設置數據緩存。
由于這些數據緩存的存在,可以提高客戶端應用軟件的查詢效率。但是,若其他人在服務器進行了相關的修改,由于應用軟件數據緩存的存在,導致修改的數據不能及時反映到客戶端上。
從這也可以看出,應用軟件的數據緩存跟數據庫服務器的高速數據緩存不是一碼事。2. 語句合法性檢查(data dict cache)。
當在高速緩存中找不到對應的 SQL 語句時,則服務器進程就會開始檢查這條語句的合法性。這里主要是對 SQL 語句的語法進行檢查,看看其是否合乎語法規則。
如果服務器進程認為這條 SQL 語句不符合語法規則的時候,就會把這個錯誤信息,反饋給客戶端。在這個語法檢查的過程中,不會對 SQL 語句中所包含的表名、列名等等進行 SQL 他只是語法上的檢查。
3. 語言含義檢查(data dict cache)。若 SQL 語句符合語法上的定義的話,則服務器進程接下去會對語句中的字段、表等內容進行檢查。
看看這些字段、表是否在數據庫中。如果表名與列名不準確的話,則數據庫會就會反饋錯誤信息給客戶端。
所以,有時候我們寫 select 語句的時候,若語法與表名或者列名同時寫錯的話,則系統是先提示說語法錯誤,等到語法完全正確后,再提示說列名或表名錯誤。4. 獲得對象解析鎖(control structer)。
當語法、語義都正確后,系統就會對我們需要查詢的對象加鎖。這主要是為了保障數據的一致性,防止我們在查詢的過程中,其他用戶對這個對象的結構發生改變。
5. 數據訪問權限的核對(data dict cache)。當語法、語義通過檢查之后,客戶端還不一定能夠取得數據。
服務器進程還會檢查,你所連接的用戶是否有這個數據訪問的權限。若你連接上服務器的用戶不具有數據訪問權限的話,則客戶端就不能夠取得這些數據。
有時候我們查詢數據的時候,辛辛苦苦地把 SQL 語句寫好、編譯通過,但是,最后系統返回個 “沒有權限訪問數據”的錯誤信息,讓我們氣半死。這在前端應用軟件開發調試的過程中,可能會碰到。
所以,要注意這個問題,數據庫服務器進程先檢查語法與語義,然后才會檢查訪問權限。6. 確定最佳執行計劃 。
當語句與語法都沒有問題,權限也匹配的話,服務器進程還是不會直接對數據庫文件進行查詢。服務器進程會根據一定的規則,對這條語句進行優化。
不過要注意,這個優化是有限的。一般在應用軟件開發的過程中,需要對數據庫的 sql 語言進行優化,這個優化的作用要大大地大于服務器進程的自我優化。
所以,一般在應用軟件開發的時候,數據庫的優化是少不了的。當服務器進程的優化器確定這條查詢語句的最佳執行計劃后,就會將這條 SQL 語句與執行計劃保存到數據高速緩存(library cache)。
如此的話,等以后還有這個查詢時,就會省略以上的語法、語義與權限檢查的步驟,而直接執行 SQL 語句,提高 SQL 語句處理效率。第三步:語句執行語句解析只是對 SQL 語句的語法進行解析,以確保服務器能夠知道這條語句到底表達的是什么意思。
等到語句解析完成之后,數據庫服務器進程才會真正的執行這條 SQL 語句。這個語句執行也分兩種情況。
一是若被選擇行所在的數據塊已經被讀取到數據緩沖區的話,則服務器進程會直接把這個數據傳遞給客戶端,而不是從數據庫文件中去查詢數據。若數據不在緩沖區中,則服務器進程將從數據庫文件中查詢相關數據,并把這些數據放入到數據緩沖區中(buffer cache)。
第四步:提取數據當語句執行完成之后,查詢。
哪位大哥能不能給小弟解釋一下這段SQL語句的執行過程是怎樣的
select是一個功能強大而復雜的命令,我知道你是那個具體地方不明白,給你發下面的資料,希望對你有用。
祝你成功,可以給我留言。 語法 SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]] [Alias.] Select_Item [AS Column_Name] [, [Alias.] Select_Item [AS Column_Name] 。
] FROM [FORCE] [DatabaseName!]Table [[AS] Local_Alias] [[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN DatabaseName!]Table [[AS] Local_Alias] [ON JoinCondition …] [[INTO Destination] | [TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]] [PREFERENCE PreferenceName] [NOCONSOLE] [PLAIN] [NOWAIT] [WHERE JoinCondition [AND JoinCondition 。] [AND | OR FilterCondition [AND | OR FilterCondition 。
]]] [GROUP BY GroupColumn [, GroupColumn 。]] [HAVING FilterCondition] [UNION [ALL] SELECT命令] [ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] 。
]] 參數 SELECT 在 SELECT 子句中指定在查詢結果中包含的字段、常量和表達式。ALL 查詢結果中包含所有行 ( 包括重復值 )。
ALL 是默認設置。DISTINCT 在查詢結果中剔除重復的行。
注意 每一個 SELECT 子句只能使用一次 DISTINCT。TOP nExpr [PERCENT] 在符合查詢條件的所有記錄中,選取指定數量或百分比的記錄。
TOP 子句必須與 ORDER BY 子句同時使用。ORDER BY 子句指定查詢結果中包含的列上由Top字句決定的行數, TOP 子句根據此排序選定最開始的 nExpr個或 nExpr% 的記錄。
您可以指定選取 1 到 32767 個記錄。使用 ORDER BY 子句指定的字段進行排序,會產生并列的情況,比如,可能有多個記錄,它們在選定的字段上相同;所以,如果您指定 nExpr 為 10,在查詢結果中可能多于 10 個記錄,因為可能有幾個記錄位置并列。
如果包含 PERCENT 關鍵字指定查詢結果中的記錄數,得到記錄數的可能是小數,這時進行取整。包含 PERCENT 關鍵字時,nExpr 的范圍是 0.01 到 99.99。
Alias.限定匹配項的名稱。 Select_Item 指定的每一項在查詢結果中都生成一列。
如果多個項具有相同的名稱,則應在這些項名前加上表的別名和一個句點,以防止出現重復的列。Select_Item 指定包括在查詢結果中的項。
一個項可以是:FROM 子句所包含的表中的字段名稱。一個常量,查詢結果中每一行都出現這個常量值。
一個表達式,可以是用戶自定義函數名。 AS Column_Name 指定查詢結果中列的標題。
當 Select_Item 是一個表達式或一個字段函數時,如果要給此列取一個有含義的名稱,一般可以使用這個子句。Column_Name可以是一個表達式,但不能包含那些表字段名稱中不允許出現的字符(如空格)。
FROM 列出所有從中檢索數據的表。如果沒有打開表, Visual FoxPro 顯示“打開”對話框以便指定文件位置。
表打開以后,直到查詢結束時才關閉。 如果您包含 FORCE 關鍵字,Visual FoxPro 在建立查詢時會嚴格按照您在FROM 子句中聲明的順序連接表;若不包含 FORCE 關鍵字,Visual FoxPro 會試圖對查詢進行優化。
使用 FORCE 子句,避免了優化過程,可能加快查詢執行的速度。DatabaseName!當包含表的數據庫不是當前數據庫時,DatabaseName! 指定這個數據庫的名稱。
如果數據庫不是當前數據庫,就必須指定包含表的數據庫名稱。應在數據庫名稱之后表名之前加上感嘆號(!)分隔符。
[AS] Local_Alias 為 Table 中的表指定一個臨時名稱。如果指定了本地別名,那么在整個SELECT 語句中必須都用這個別名代替表名。
本地別名不影響 Visual FoxPro環境。INNER JOIN 只有在其他表中包含對應記錄(一個或多個)的記錄才出現在查詢結果中。
INNER JOIN 只有在其他表中包含對應記錄(一個或多個)的記錄才出現在查詢結果中。LEFT [OUTER] JOIN 在查詢結果中包含:JOIN 左側表中的所有記錄,以及JOIN 右側表中匹配的記錄。
OUTER 關鍵字可被省略;包含 OUTER 強調這是一個外連接 (outer join)。RIGHT [OUTER] JOIN 在查詢結果中包含:JOIN 右側表中的所有記錄,以及 JOIN 左側表中匹配的記錄。
OUTER 關鍵字可被省略;包含 OUTER 強調這是一個外連接接 (outer join)。FULL [OUTER] JOIN 在查詢結果中包含:JOIN 兩側所有的匹配記錄,和不匹配的記錄;包含 OUTER 強調這是一個外連接 (outer join)。
ON JoinCondition 指定連接條件。INTO Destination 指定在何處保存查詢結果。
如果在同一個查詢中同時包括了 INTO 子句和 TO 子句,則 TO 子句不起作用。如果沒有包括 INTO 子句,查詢結果顯示在“瀏覽”窗口中。
也可以用 TO 將查詢結果定向輸出到打印機或文件。Destination 可以是下列子句之一:ARRAY ArrayName ,將查詢結果保存到變量數組中。
如果查詢結果中不包含任何記錄,則不創建這個數組。CURSOR CursorName將查詢結果保存到臨時表中。
如果指定了一個已打開表的名稱,則 Visual FoxPro 產生錯誤信息。執行完 SELECT 語句后,臨時表仍然保持打開、活動但只讀。
一旦關閉臨時表,則自動刪除它。臨時表作為 。
求幫忙解釋一下 這個SQL語句的執行過程
CASE WHEN [no] = 1 THEN title + ',' ELSE '' END
如果no字段數據是1, 那么該數據結果為 title字段后面加逗號,否則該數據顯示為空字符串
例1:
no字段數據是數: 1
title 為 'world'+','
結果為'world,'
否則為''
以下該數據簡稱 數據1
CASE WHEN [no] = 2 THEN title ELSE '' END
如果no字段數據是2, 那么該數據結果為該行 title字段的數據,否則該數據顯示為空字符串
例2:
no字段數據是數: 2
title 為 'world'
結果為'world'
否則為''
以下該數據簡稱 數據2
max(數據1)+max(數據2)
取數據1的行中,字符最多的行與數據2中字符最多的行組合
例三:以例一例二為該字段字符的數據最多為例,其結果為'world,world'
以下該數據簡稱 數據3
WHEN COUNT(title) = 2 THEN
數據3
END
根據后面的[name]分組統計
當title行數等于2行,該數據為數據3,否則為空
以下簡稱 數據4
SELECT [name]
,
數據4 AS new_title
FROM
table1
GROUP BY [NAME]
查詢 table1中[name]字段,數據4字段并起字段名為new_title
并按[name]分組統計
SQL 語句的執行順序 問題
SELECT
從數據庫中檢索行,并允許從一個或多個表中選擇一個或多個行或列。雖然 SELECT 語句的完整語法較復雜,但是其主要的子句可歸納如下:
SELECT select_list
[ INTO new_table ]
FROM table_source
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
可以在查詢之間使用 UNION 運算符,以將查詢的結果組合成單個結果集。
語法
SELECT statement ::=
< query_expression >
[ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }
[ ,。n ] ]
[ COMPUTE
{ { AVG | COUNT | MAX | MIN | SUM } ( expression ) } [ ,。n ]
[ BY expression [ ,。n ] ]
]
[ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }
[ , XMLDATA ]
[ , ELEMENTS ]
[ , BINARY base64 ]
}
]
[ OPTION ( < query_hint > [ ,。n ]) ]
< query expression > ::=
{ < query specification > | ( < query expression > ) }
[ UNION [ ALL ] < query specification | ( < query expression > ) [。n ] ]
< query specification > ::=
SELECT [ ALL | DISTINCT ]
[ { TOP integer | TOP integer PERCENT } [ WITH TIES ] ]
< select_list >
[ INTO new_table ]
[ FROM { < table_source > } [ ,。n ] ]
[ WHERE < search_condition > ]
[ GROUP BY [ ALL ] group_by_expression [ ,。n ]
[ WITH { CUBE | ROLLUP } ]
]
[HAVING <search_condition>]
詳細的請看一下sql的幫助文件。