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的幫助文件。
SQL語句是按什么順序執行的
分析器會先看語句的第一個詞,當它發現第一個詞是SELECT關鍵字的時候,它會跳到FROM關鍵字,然后通過FROM關鍵字找到表名并把表裝入內存。
接著是找WHERE關鍵字,如果找不到則返回到SELECT找字段解析,如果找到WHERE,則分析其中的條件,完成后再回到SELECT分析字段。 最后形成一張我們要的虛表。
其它的先不說了,只說WHERE。 WHERE關鍵字后面的是條件表達式。
如果學過C語言等編程語言就會知道,條件表達式計算完成后,會有一個返回值,即非0或0,非0即為真(true),0即為假(false)。同理WHERE后面的條件也有一個返回值,真或假,來確定接下來執不執行SELECT。
例: SELECT * FROM STUDENT WHERE SNO = '1'; 分析器先找到關鍵字SELECT,然后跳到FROM關鍵字將STUDENT表導入內存,并通過指針p1找到第一條記錄,接著找到WHERE關鍵字計算它的條件表達式,如果為真那么把這條記錄裝到一個虛表當中,p1再指向下一條記錄。 如果為假那么p1直接指向下一條記錄,而不進行其它操作。
一直檢索完整個表,關把虛表返回給用戶。 再說EXISTS謂詞,EXISTS謂詞也是條件表達式的一部分。
當然它也有一個返回值(true或false)。 例: SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE SC。
Sno = Student。Sno AND SC。
Cno = '1'); 這是一個SQL語句的嵌套使用,但和上面說的SQL語句的執行過程也是相同的。嵌套的意思也就是說當分析主SQL語句(外面的那個SELECT,我們權且先這么叫它)到WHERE關鍵字的時候,又進入了另一個SQL語句中。
那么也就是說,分析器先找到表Student并裝入內存,一個指針(例如p1)指向Student表中的第一條記錄。然后進入WHERE里分析里面的SQL語句,再把SC表裝入內存,另一個指針(例如p2)指向SC表中的第一條記錄,分析WHERE后面的條件表達式,依次進行分析,最后分析出一個虛表2,也就變成 SELECT Sname FROM Student WHERE EXISTS 虛表2 如果虛表為空表,EXISTS 虛表2 也就為false,不返回到SELECT,而p1指向下一條記錄。
如果虛表2不為空也就是有記錄,那么EXISTS 虛表2 為true同,返回到SELECT并把p1指向的記錄添加到主SQL語句的虛表1當中。
請教一條sql語句的執行順序
這個我正好有收藏O(∩_∩)O哈哈~
1、FROM:對FROM子句中的前兩個表執行笛卡爾積(Cartesian product)(交叉聯接),生成虛擬表VT1
2、ON:對VT1應用ON篩選器。只有那些使<join_condition>;為真的行才被插入VT2。
3、outer(JOIN):如 果指定了OUTER JOIN(相對于CROSS JOIN 或(INNER JOIN),
保留表(preserved table:左外部聯接把左表標記為保留表,右外部聯接把右表標記為保留表,
完全外部聯接把兩個表都標記為保留表)
中未找到匹配的行將作為外部行添加到 VT2,生成VT3.如果FROM子句包含兩個以上的表,
則對上一個聯接生成的結果表和下一個表重復執行步驟1到步驟3,直到處理完所有的表為止。
4、WHERE:對VT3應用WHERE篩選器。只有使<where_condition>;為true的行才被插入VT4.
5、 group by:按GROUP BY子句中的列列表對VT4中的行分組,生成VT5.
6、CUBE|ROLLUP:把超組(Suppergroups)插入VT5,生成VT6.
7、HAVING:對VT6應用HAVING篩選器。只有使<having_condition>;為true的組才會被插入VT7.
8、SELECT:處理SELECT列表,產生VT8.
9、DISTINCT:將重復的行從VT8中移除,產生VT9.
10、order by:將VT9中的行按ORDER BY 子句中的列列表排序,生成游標(VC10).
TOP:從VC1
請問這個sql語句的執行順序是怎么樣的
子查詢優先,這個是先執行select avg(degree) from score b,由于你將where *=* 放在了括號里面,導致下一步執行的是 select * from score a 然后再執行where *=*,最后執行了where degree < (略)。
根據你的查詢語句,我推斷你的目的是查找score表中低于平均分的cno, 因此你后面的where *=* 并不需要。直接可以寫成:select * from score a where degree < (select avg(degree) from score b)。
SQL中SELECT語句的執行順序是什么
標準的 SQL 的解析順序為: (1)。
FROM 子句, 組裝來自不同數據源的數據 (2)。WHERE 子句, 基于指定的條件對記錄進行篩選 (3)。
GROUP BY 子句, 將數據劃分為多個分組 (4)。使用聚合函數進行計算 (5)。
使用 HAVING 子句篩選分組 (6)。計算所有的表達式 (7)。
使用 ORDER BY 對結果集進行排序 舉例說明: 在學生成績表中 (暫記為 tb_Grade), 把 "考生姓名"內容不為空的記錄按照 "考生姓名" 分組, 并且篩選分組結果, 選出 "總成績" 大于 600 分的。 標準順序的 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 成績" 進行排序。
oracle sql 語句執行順序
where 里面條件 and 是先執行 and 前面 還是后面條件這個其實和你寫的順序不大,這個先后順序,是數據庫來根據表/索引的信息來決定的。
例如一個 學生表, 有學號,姓名,性別其中 學號是主鍵, 姓名上面有個索引。找 名字叫 強妹 的女生:SELECT * FROM 學生 WHERE 姓名='強妹' AND 性別 = '女'與SELECT * FROM 學生 WHERE 性別 = '女' AND 姓名='強妹' 數據庫在處理 SQL 以前,都會去分析, 發現 查詢的條件中, 姓名上面有索引,而性別上面沒有。
那么優先根據 姓名的條件, 去檢索,然后再去把通過索引得到的數據,去篩選 性別=女的比如表里面共有10000行。姓名叫 '強妹' 的只有一個。
那么通過索引,一步就定位到那一行。然后再判斷這一行數據的 性別字段, 是不是 = '女'假如 姓名/性別 都沒有索引呢?那就是執行 全表掃描。
不分先后。什么意思呢?就是假如 表里面10000行數據。
那就是從第一行開始, 查看 姓名與性別 條件。 滿足的返回。
不滿足的丟棄。 直到100行都處理完。
并不是一口氣把所有的數據,都放到內存里面,然后 姓名判斷一次, 去掉部分, 性別判斷一次,再去掉部分。
轉載請注明出處華閱文章網 » sql語句的執行順序