165
人物
SQL基礎語句總結
寫在前麵:本節主要講述一些基本的,常用的SQL語句,而非數據庫方麵的基本知識。數據庫方麵的知識留待以後再講,現在就我們平常常用的一些SQL語句展開論述。
本節會涉及到SQL的基本句法,SQL的執行順序,SQL之間的組合,動態SQL語句四個方麵。這四個方麵之間沒有前後順序之分,是相輔相成,其內在還是有很多聯係的。
一. 四種基本的SQL語句
1. 查詢
select * from table
2. 更新
update table set field=value
3. 插入
insert [into] table (field) values(value)
4. 刪除
delete [from] table
二.語句的執行順序
1.語法分析
分析語句中語法是否符合規範,衡量語句中各表達式的意義。
2.語義分析
檢查語句中涉及的所有數據庫對象是否存在,且用戶有相應的權限。
3.選擇優化器
不同的數據庫有不同的算法(這個涉及到數據結構),數據庫會根據自己的理解(數據庫本身)為 SQL語句選擇不同的優化器,不同的優化器會選擇不同的“執行計劃”
4.運行“執行計劃”
根據“執行計劃”執行SQL語句。
以上所述是數據執行時的大體路線。
5.select 語句的執行順序
借用ItZik Ben-Gan、Lubor Kollar、Dejan Sarka所著的《Sql Server 2005 技術內幕:T-SQL查詢》的一段話足以說明:
(8) select (9) distinct (11) <top_specification > <select_list>
(1)from<lef t_table>
(3) <join_type> join <right_table>
(2) on <join _condition>
(4) where <where_condition>
(5)group by <group_by_list>
(6) with {cube|rollup}
(7)having(having_condition)
(10) order by <order_by_condition>
從這個順序可以看出,所有的查詢語句都是從from開始執行的。在執行過程中,每個步驟都會為下一個步驟生成一個虛擬表,這個虛擬表將作為下一個執行步驟的基礎。
第一步:from
首先對from子句中的前兩個表執行一個笛卡爾乘積,此時生成虛擬表vt1 .
第二步:on
接下來便是應用on篩選器,on 中的邏輯表達式將應用到 vt1 中的各個行,篩選出滿足on邏輯表達式的行,生成虛擬表 vt2 .
第三步:join
如果是outer join 那麼這一步就將添加外部行,left outer jion 就把左表在第二步中過濾的添加進來,如果是right outer join 那麼就將右表在第二步中過濾掉的行添加進來,這樣生成虛擬表 vt3.
第四步:多表
如果 from 子句中的表數目多餘兩個表,那麼就將vt3和第三個表連接從而計算笛卡爾乘積,生成虛擬表,該過程就是一個重複1-3的步驟,最終得到一個新的虛擬表 vt3.
第五步:where
應用where篩選器,對上一步生產的虛擬表引用where篩選器,生成虛擬表vt4,在這有個比較重要的細節不得不說一下,對於包含outer join子句的查詢,就有一個讓人感到困惑的問題,到底在on篩選器還是用where篩選器指定邏輯表達式呢?on和where的最大區別在於,如果在on應用邏輯表達式那麼在第三步outer join中還可以把移除的行再次添加回來,而where的移除的最終的。
第六步:group by
分組,生成虛擬表 vt4
第七步:having
對vt4應用having篩選器,生成虛擬表 vt5
第八步:select
處理select 列表,生成虛擬表vt6
第九步:distinct
將vt6 中重複的行去掉,生成虛擬表vt7
第十步:order by
將vt7中的行按order by 子句中的列列表排序,生成一個遊標vc8
第十一步:top
從vc8的開始處選擇指定數量或比例的行,生成虛擬表vt9,並返回給調用者
三. SQL語句擴展
1.select
1.1 選擇性插入語句
1.1.1 Insert into table1 (field1 ) Select field2 from table2
要求table1必須存在。
1.1.2 select field1 into table1 from table2
要求table1不存在,在運行時會自動創建表名為table1,字段名為field1的一個表。
1.2打開其它數據源
/* OracleSvr為鏈接服務器名 ,本示例假定已經創建了一個名為 ORCLDB 的 Oracle 數據庫別名。*/
EXEC sp_addlinkedserver ‘OracleSvr’, –鏈接服務器名OracleSvr,sysname類型
‘MSDAORA’, –provider_name數據源提供程序,此處為oracle
‘ORCLDB’ –數據源名稱
GO
Select * from OPENQUERY(OracleSvr, ‘SELECT name, id FROM joe.titles’)
如果有多個sql server實例:
SELECT *FROM [servername\instancename.]pubs.dbo.authors.
注意:一個對象的完整名稱包括四個標識符:服務器名稱、數據庫名稱、所有者名稱和對象名稱。其格式如下:
[ [ [ server. ] [ database ] .] [ owner_name ] .] object_name
中間的名稱可以省略,但是.不可以省略。如:server…object_name
2.update
2.1多表更新
Update table1 set table1.field 1=table2.field2 from
table1,table2 /*猜測下連接方式全聯接 FULL [OUTER] JOIN */
where table1.field3= table2 .filed3
知識:SQL Server的update語句中from後可跟多個表,Oracle則不支持該用法
Oracle 中:Update table1 set table1.field1=
(select table2.field2 from table2 where .field3= table2 .filed3)
3.insert
3.1 插入語句的規範問題
在sql server 2000,sql server 2005中
標準語句:insert into table(field) values (value)
提示:在access中不正確,原因sql語句不規範,因此在書寫sql語句的過程中一定要按正規的語法來寫。
4.delete
4.1標準刪除
標準語句:delete from table where condition
提示:同insert
4.2其它刪除
4.2.1 truncate
語法:truncate table table_name
刪除表中所有行,不記錄單個行刪除操作,不記錄日誌,,所有速度比Delete快。
4.2.2 drop
語句: Drop table table_name
刪除表及相關,有fk約束的不能刪,先去年fk;係統表不能使用。
5.order by
功能:排序
技巧:order by newid() 隨機排序
四. 動態SQL語句
4.1基本原則
4.1.1預編譯問題
在EXECUTE執行之前,數據庫不會編譯 EXECUTE 語句內的語句,動態SQL語句就是放到存儲過程中,它也不會預先編譯。
4.1.2什麼時候使用動態SQL語句
字段名,表名,數據庫名作為變量時,必須用動態SQl語句
4.2.exec[ute]
4.2.1語法
exec (‘select * from table_name where name=’’’+@name+’’’’) –括號不能少
4.2.2傳遞參數
–假設存儲過程test_sp中需要一個參數:類型nvarchar(50) 名稱 @parm
Declare @parms nvarchar(50)
Set @parms=’測試變量’
Exec test_sp [@parm=]@parms –方括號內的可以省略
如果是批處理中的第一句,則可以省略Exec
4.2.3輸出參數
declare @num int, @field int,
@sqls nvarchar(4000)
Set @field=1
set @sqls=’select @a=count(*) from table_name where field=@field’
exec sp_executesql @sqls,N’@a int output,@field int’,@num output ,@field
select @num
4.3.sp_executesql
語法:exec[ute] sp_executesql N’select * from table_name where field=@field’,N’@field int’,@field=1
使用sp_exexutesql比使用exec更有效率.
結束語:以上是SQL中常用的語句,及其執行時的順序。不管是SQL Server係列,mysql,access,Oracle係列這些都基本相同。如果要在數據庫方麵做高深的研究,則多看一下其自帶的幫助,多練習,多看一些數據庫原理方麵的書。來源:風雨人生博客
最後更新:2017-01-04 22:34:37