1. 在sql Server2005中如何運行SQL語句
1、首先打開SQL Server 軟體,然後,單擊圖中的「資料庫」前面的「+」號,展開資料庫。
2. MySql中Sql的執行過程
如果查詢緩存沒有命中,那麼SQL請求會進入分析器,分析器是用來分辨SQL語句的執行目的,其執行過程大致分為兩步:
表1 語法分析關鍵字然後再通過語法規則解析,判斷輸入的SQL 語句是否滿足MySQL語法,並且生成圖5的語法樹。由SQL語句生成的四個單詞中,識別出兩個關鍵字,分別是select 和from。根據MySQL的語法Select 和 from之間對應的是fields 欄位,下面應該掛接username;在from後面跟隨的是Tables欄位,其下掛接的是userinfo。
優化器的作用是對SQL進行優化,生成最有的執行方案。如圖6所示,前面提到的SQL解析器通過語法分析和語法規則生成了SQL語法樹。這個語法樹作為優化器的輸入,而優化器(黃色的部分)包含了邏輯變換和代價優化兩部分的內容。在優化完成以後會生成SQL執行計劃作為整個優化過程的輸出,交給執行器在存儲引擎上執行。
所處的位置如上圖所示,這節的重點在優化器中的邏輯變換和代價優化上。
邏輯變換也就是在關系代數基礎上進行變換,其目的是為了化簡,同時保證SQL變化前後的結果一致,也就是邏輯變化並不會帶來結果集的變化。其主要包括以下幾個方面:
這樣講概念或許有些抽象,通過圖7 來看看邏輯變化如何在SQL中執行的吧。
如圖7所示,從上往下共有4個步驟:
1. 針對存在的SQL語句,首先通過「否定消除」,去掉條件判斷中的「NOT」。語句由原來的「or」轉換成「and」,並且大於小於符號進行變號。藍色部分為修改前的SQL,紅色是修改以後的SQL。2. 等值傳遞,這一步很好理解分別降」t2.a=9」 和」t2.b=5」分別替換掉SQL中對應的值。3. 接下來就是常量表達式計算,將「5+7」計算得到「12」。4. 最後是常量表達式計算後的化簡,將」9<=10」化簡為」true」帶入到最終的SQL表達式中完成優化。
代價優化是用來確定每個表,根據條件是否應用索引,應用哪個索引和確定多表連接的順序等問題。為了完成代價優化,需要找到一個代價最小的方案。因此,優化器是通過基於代價的計算方法來決定如何執行查詢的(Cost-based Optimization)。簡化的過程如下:
這里將配置操作的代價分為MySQL 服務層和MySQL 引擎層,MySQL 服務層主要是定義CPU的代價,而MySQL 引擎層主要定義IO代價。MySQL 5.7 引入了兩個系統表mysql.server_cost和mysql.engine_cost來分別配置這兩個層的代價。如下:MySQL 服務層代價保存在表server_cost中,其具體內容如下:
由上可以看出創建臨時表的代價是很高的,尤其是內部的myisam或innodb臨時表。MySQL 引擎層代價保存在表engine_cost中,其具體內容如下:
目前io_block_read_cost和memory_block_read_cost默認值均為1,實際生產中建議酌情調大memory_block_read_cost,特別是對普通硬碟的場景。MySQL會根據SQL查詢生成的查詢計劃中對應的操作從上面兩張代價表中查找對應的代價值,並且進行累加形成最終執行SQL計劃的代價。再將多種可能的執行計劃進行比較,選取最小代價的計劃執行。
當分析器生成查詢計劃,並且經過優化器以後,就到了執行器。執行器會選擇執行計劃開始執行,但在執行之前會校驗請求用戶是否擁有查詢的許可權,如果沒有許可權,就會返回錯誤信息,否則將會去調用MySQL引擎層的介面,執行對應的SQL語句並且返回結果。例如SQL:「SELECT * FROM userinfo WHERE username = 'Tom';「假設 「username「 欄位沒有設置索引,就會調用存儲引擎從第一條開始查,如果碰到了用戶名字是」 Tom「, 就將結果集返回,沒有查找到就查看下一行,重復上一步的操作,直到讀完整個表或者找到對應的記錄。需要注意SQL語句的執行順序並不是按照書寫順序來的,順序的定義會在分析器中做好,一般是按照如下順序:
如果命中的記錄比較多,應用會從MySql Server一批批獲取數據
本文從MySQL中SQL語句的執行過程作為切入點,首先介紹了查詢請求的執行流程,其中將MySQL的處理分為MySQL Server層和MySQL存儲引擎層。通過介紹SQL語句的流轉,引出了後面要介紹的5大組件,他們分別是:連接器、查詢緩存、分析器、優化器、執行器。後面的內容中對每個組件進行了詳細的介紹。連接器,負責身份認證和許可權鑒別;查詢緩存,將查詢的結果集進行緩存,提高查詢效率;分析器,對SQL語句執行語法分析和語法規則,生成語法樹和執行計劃;優化器,包括邏輯變換和代價優化;執行器,在檢查用戶許可權以後對數據進行逐條查詢,整個過程遵守SQL語句的執行順序。
3. 怎麼執行sql命令
執行sql命令步驟如下:
1、點擊頁面中的【SQL】。
以上就是執行sql命令的步驟。
4. SQL資料庫的簡單操作
一 簡單查詢 簡單的Transact SQL查詢只包括選擇列表 FROM子句和WHERE子句 它們分別說明所查詢列 查詢的 表或視圖 以及搜索條件等 例如 下面的語句查詢testtable表中姓名為 張三 的nickname欄位和email欄位 SELECT nickname emailFROM testtableWHERE name= 張三 (一)選擇列表 選擇列表(select_list)指出所查詢列 它可以是一組列名列表 星號 表達式 變數(包括局部變數和全局變數)等構成 選擇所有列例如 下面語句顯示testtable表中所有列的數據 SELECT *FROM testtable 選擇部分列並指定它們的顯示次序查詢結果集合中數據的排列順序與選擇列表中所指定的列名排列順序相同 例如 SELECT nickname emailFROM testtable 更改列標題在選擇列表中 可重新指定列標題 定義格式為 列標題=列名列名 列標題如果指定的列標題不是標準的標識符格式時 應使用引號定界符 例如 下列語句使用漢字顯示列標題 SELECT 昵稱=nickname 電子郵件=emailFROM testtable 刪除重復行SELECT語句中使用ALL或DISTINCT選項來顯示表中符合條件的所有行或刪除其中重復的數據行 默認為ALL 使用DISTINCT選項時 對於所有重復的數據行在SELECT返回的結果集合中只保留一行 限制返回的行數使用TOP n [PERCENT]選項限制返回的數據行數 TOP n說明返回n行 而TOP n PERCENT時 說明n是表示一百分數 指定返回的行數等於總行數的百分之幾 例如 SELECT TOP *FROM testtable SELECT TOP PERCENT *FROM testtable(二)FROM子句 FROM子句指定SELECT語句查詢及與查詢相關的表或視圖 在FROM子句中最多可指定 個表或視圖 它們之間用逗號分隔 在FROM子句同時指定多個表或視圖時 如果選擇列表中存在同名列 這時應使用對象名限定這些列所屬的表或視圖 例如在usertable和citytable表中同時存在cityid列 在查詢兩個表中的cityid時應使用下面語句格式加以限定 SELECT username citytable cityidFROM usertable citytableWHERE usertable cityid=citytable cityid在FROM子句中可用以下兩種格式為表或視圖指定別名 表名 as 別名表名 別名例如上面語句可用表的別名格式表示為 SELECT username b cityidFROM usertable a citytable bWHERE a cityid=b cityidSELECT不僅能從表或視圖中檢索數據 它還能夠從其它查詢語句所返回的結果集合中查詢數據 例如 SELECT a au_fname+a au_lnameFROM authors a titleauthor ta(SELECT title_id titleFROM titlesWHERE ytd_sales> ) AS tWHERE a au_id=ta au_idAND ta title_id=t title_id此例中 將SELECT返回的結果集合給予一別名t 然後再從中檢索數據 (三)使用WHERE子句設置查詢條件 WHERE子句設置查詢條件 過濾掉不需要的數據行 例如下面語句查詢年齡大於 的數據 SELECT *FROM usertableWHERE age> WHERE子句可包括各種條件運算符 比較運算符(大小比較) > >= = < <= <> !> !<范圍運算符(表達式值是否在指定的范圍) BEEEN…AND…NOT BEEEN…AND…列表運算符(判斷表達式是否為列表中的指定項) IN (項 項 ……)NOT IN (項 項 ……)模式匹配符(判斷值是否與指定的字元通配格式相符):LIKE NOT LIKE空值判斷符(判斷表達式是否為空) IS NULL NOT IS NULL邏輯運算符(用於多條件的邏輯連接) NOT AND OR 范圍運算符例 age BEEEN AND 相當於age>= AND age<= 列表運算符例 country IN ( Germany China ) 模式匹配符例 常用於模糊查找 它判斷列值是否與指定的字元串格式相匹配 可用於char varchar text ntext datetime和 *** alldatetime等類型查詢 可使用以下通配字元 百分號% 可匹配任意類型和長度的字元 如果是中文 請使用兩個百分號即%% 下劃線_ 匹配單個任意字元 它常用來限製表達式的字元長度 方括弧[] 指定一個字元 字元串或范圍 要求所匹配對象為它們中的任一個 [^] 其取值也[] 相同 但它要求所匹配對象為指定字元以外的任一個字元 例如 限制以Publishing結尾 使用LIKE %Publishing 限制以A開頭 LIKE [A]% 限制以A開頭外 LIKE [^A]% 空值判斷符例WHERE age IS NULL 邏輯運算符 優先順序為NOT AND OR(四)查詢結果排序 使用ORDER BY子句對查詢返回的結果按一列或多列排序 ORDER BY子句的語法格式為 ORDER BY {column_name [ASC|DESC]} [ …n]其中ASC表示升序 為默認值 DESC為降序 ORDER BY不能按ntext text和image數據類型進行排序 例如 SELECT *FROM usertableORDER BY age desc userid ASC另外 可以根據表達式進行排序 二 聯合查詢 UNION運算符可以將兩個或兩個以上上SELECT語句的查詢結果集合合並成一個結果集合顯示 即執行聯合查詢 UNION的語法格式為 select_statementUNION [ALL] selectstatement[UNION [ALL] selectstatement][…n]其中selectstatement為待聯合的SELECT查詢語句 ALL選項表示將所有行合並到結果集合中 不指定該項時 被聯合查詢結果集合中的重復行將只保留一行 聯合查詢時 查詢結果的列標題為第一個查詢語句的列標題 因此 要定義列標題必須在第一個查詢語句中定義 要對聯合查詢結果排序時 也必須使用第一查詢語句中的列名 列標題或者列序號 在使用UNION 運算符時 應保證每個聯合查詢語句的選擇列表中有相同數量的表達式 並且每個查詢選擇表達式應具有相同的數據類型 或是可以自動將它們轉換為相同的數據類型 在自動轉換時 對於數值類型 系統將低精度的數據類型轉換為高精度的數據類型 在包括多個查詢的UNION語句中 其執行順序是自左至右 使用括弧可以改變這一執行順序 例如 查詢 UNION (查詢 UNION 查詢 )三 連接查詢 通過連接運算符可以實現多個表查詢 連接是關系資料庫模型的主要特點 也是它區別於其它類型資料庫管理系統的一個標志 在關系資料庫管理系統中 表建立時各數據之間的關系不必確定 常把一個實體的所有信息存放在一個表中 當檢索數據時 通過連接操作查詢出存放在多個表中的不同實體的信息 連接操作給用戶帶來很大的靈活性 他們可以在任何時候增加新的數據類型 為不同實體創建新的表 爾後通過連接進行查詢 連接可以在SELECT 語句的FROM子句或WHERE子句中建立 似是而非在FROM子句中指出連接時有助於將連接操作與WHERE子句中的搜索條件區分開來 所以 在Transact SQL中推薦使用這種方法 SQL 標准所定義的FROM子句的連接語法格式為 FROM join_table join_type join_table[ON (join_condition)]其中join_table指出參與連接操作的表名 連接可以對同一個表操作 也可以對多表操作 對同一個表操作的連接又稱做自連接 join_type 指出連接類型 可分為三種 內連接 外連接和交叉連接 內連接(INNER JOIN)使用比較運算符進行表間某(些)列數據的比較操作 並列出這些表中與連接條件相匹配的數據行 根據所使用的比較方式不同 內連接又分為等值連接 自然連接和不等連接三種 外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN) 右外連接(RIGHT OUTER JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOIN或FULL JOIN)三種 與內連接不同的是 外連接不只列出與連接條件相匹配的行 而是列出左表(左外連接時) 右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數據行 交叉連接(CROSS JOIN)沒有WHERE 子句 它返回連接表中所有數據行的笛卡爾積 其結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數 連接操作中的ON (join_condition) 子句指出連接條件 它由被連接表中的列和比較運算符 邏輯運算符等構成 無論哪種連接都不能對text ntext和image數據類型列進行直接連接 但可以對這三種列進行間接連接 例如 SELECT p pub_id p pub_id p pr_infoFROM pub_info AS p INNER JOIN pub_info AS p ON DATALENGTH(p pr_info)=DATALENGTH(p pr_info)(一)內連接內連接查詢操作列出與連接條件匹配的數據行 它使用比較運算符比較被連接列的列值 內連接分三種 等值連接 在連接條件中使用等於號(=)運算符比較被連接列的列值 其查詢結果中列出被連接表中的所有列 包括其中的重復列 不等連接 在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值 這些運算符包括> >= <= < !> ! 和> 自然連接 在連接條件中使用等於(=)運算符比較被連接列 lishixin/Article/program/SQLServer/201311/21994 <!-- /和 -->
5. SQL執行順序
查詢語句中select from where group by having order by的執行順序
1.查詢中用到的關鍵詞主要包含六個,並且他們的順序依次為
select--from--where--group by--having--order by
其中select和from是必須的,其他關鍵詞是可選的,這六個關鍵詞的執行順序
與sql語句的書寫順序並不是一樣的,而是按照下面的順序來執行
from--where--group by--having--select--order by,
from:需要從哪個數據表檢索數據
where:過濾表中數據的條件
group by:如何將上面過濾出的數據分組
having:對上面已經分組的數據進行過濾的條件
select:查看結果集中的哪個列,或列的計算結果
order by :按照什麼樣的順序來查看返回的數據
2.from後面的表關聯,是自右向左解析的
而where條件的解析順序是自下而上的。
也就是說,在寫SQL文的時候,盡量把數據量大的表放在最右邊來進行關聯,
而把能篩選出大量數據的條件放在where語句的最下面。
SQL Select語句完整的 執行順序 【從DBMS使用者角度】:
1、from子句組裝來自不同數據源的數據;
2、where子句基於指定的條件對記錄行進行篩選;
3、group by子句將數據劃分為多個分組;
4、使用聚集函數進行計算;
5、使用having子句篩選分組;
6、計算所有的表達式;
7、使用order by對結果集進行排序 。
from 子句--執行順序為從後往前、從右到左
表名(最後面的那個表名為驅動表,執行順序為從後往前, 所以數據量較少的表盡量放後)
oracle 的解析器按照從右到左的順序處理,FROM 子句中的表名,FROM 子句中寫在最後的表(基礎表 driving
table)將被最先處理,即最後的表為驅動表,在FROM 子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。如果有3
個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指被其他表所引用的表
多表連接時,使用表的別名並把別名前綴於每個Column上。可以減少解析的時間並減少那些由Column 歧義引起的語法錯誤.
where子句--執行順序為自下而上、從右到左
ORACLE 採用自下而上從右到左的順序解析Where 子句,根據這個原理,表之間的連接必須寫在其他Where 條件之前, 可以過濾掉最大數量記錄的條件必須寫在Where 子句的末尾。
group by--執行順序從左往右分組
提高GROUP BY 語句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉。即在GROUP BY前使用WHERE來過慮,而盡量避免GROUP BY後再HAVING過濾。
having 子句----很耗資源,盡量少用
避免使用HAVING 子句, HAVING 只會在檢索出所有記錄之後才對結果集進行過濾. 這個處理需要排序,總計等操作.
如果能通過Where 子句在GROUP BY前限制記錄的數目,那就能減少這方面的開銷.
(非oracle 中)on、where、having 這三個都可以加條件的子句中,on 是最先執行,where 次之,having 最後,因為on 是先把不符合條件的記錄過濾後才進行統計,它就可以減少中間運算要處理的數據,按理說應該速度是最快的,
where 也應該比having 快點的,因為它過濾數據後才進行sum,在兩個表聯接時才用on 的,所以在一個表的時候,就剩下where 跟having比較了。
在這單表查詢統計的情況下,如果要過濾的條件沒有涉及到要計算欄位,那它們的結果是一樣的,只是where 可以使用rushmore 技術,而having 就不能,在速度上後者要慢。
如果要涉及到計算的欄位,就表示在沒計算之前,這個欄位的值是不確定的,where 的作用時間是在計算之前就完成的,而having 就是在計算後才起作用的,所以在這種情況下,兩者的結果會不同。
在多表聯接查詢時,on 比where 更早起作用。系統首先根據各個表之間的聯接條件,把多個表合成一個臨時表後,再由where 進行過濾,然後再計算,計算完後再由having 進行過濾。
由此可見,要想過濾條件起到正確的作用,首先要明白這個條件應該在什麼時候起作用,然後再決定放在那裡。
select子句--少用*號,盡量取欄位名稱 。
ORACLE 在解析的過程中, 會將依次轉換成所有的列名, 這個工作是通過查詢數據字典完成的, 使用列名意味著將減少消耗時間。
sql 語句用大寫的;因為 oracle 總是先解析 sql 語句,把小寫的字母轉換成大寫的再執行
order by子句--執行順序為從左到右排序,很耗資源
6. 簡介mysql之mysql語句執行流程
1.一條查詢語句如何執行?
2.一條更新語句如何執行?
3.innodb的redolog是什麼?
4.什麼是寫緩沖
5.寫緩沖一定好嗎?
6.什麼情況會引發刷臟頁
關於一條mysql查詢語句在mysql中的執行流程
如select name from test where id=10;
1.連接器---先與mysql服務端連接器建立連接,若查詢緩存命中則直接返回 (查詢緩存的弊端:查詢緩存的失效非常頻繁,只要有對一個表的更新,這個表上所有的查詢緩存都會被清空。)
2.分析器---詞法分析告訴服務端你要干什麼(我要找 test表中id為10的名字) ( 其中sql語法錯誤在這塊暴露 )
3.優化器---服務端會思考該怎麼執行最優(索引的選擇)
4.執行器---檢查用戶對庫對表的許可權
5.存儲引擎--存儲數據,提供讀寫介面
以update a set name=1 where id=1;
主要區別在於在查詢到數據之後(select name from a where id=1),如果是innodb引擎它會進行日誌的兩階段提交:
1.開啟事務,寫入redolog(innodb引擎特有),並更新內存
3.寫入binlog,提交事務,commit
我們知道mysql數據存儲包含內存與磁碟兩個部分,innodb是按數據頁(通常為16k)從磁碟讀取到內存中的(剩餘操作在內存中執行),當要更新數據時,若目標數據的數據頁剛好在內存中,則直接更新。不在呢?
將這個更新操作(也可能是插入) 緩存在change buffer中 (redolog也會記錄這個change buffer操作)等到下一次查詢要用到這些數據時,再執行這些操作,改變數據(稱為合並操作記錄稱為merge)。
innodb_change_buffer_max_size
innodb_change_buffering
先介紹兩個概念
因為redolog是環形日誌,當redolog寫滿時,就需要「擦掉」開頭的一部分數據來達到循環寫,這里的擦掉指,指將redolog日誌的checkpoint位置從 CP推進到CP『 ,同時將兩點之間的臟頁刷到磁碟上(flush操作),此時系統要停止所有的更新操作(防止更新操作丟失)
1.系統內存不足。當要讀取新的內存頁時就要淘汰一些數據頁,如果淘汰的正好是臟頁,就要執行一次flush操作
2.Mysql認為系統處於「空閑狀態」
3.正常關閉Mysql
上述後兩者場景(系統空閑和正常關閉)對於性能都沒太大影響。
當為第一種redolog寫滿時,系統無法執行更新操作,所有操作都會堵塞
當為第二種內存不夠用時,如果淘汰臟頁太多,影響mysql響應時間
後兩者刷臟頁會影響性能,所以Mysql需要有刷臟頁控制策略,可以從以下幾個設置項考慮
1.設置innodb_io_capacity告訴innodb所在主機的IO能力