閱讀165 返回首頁    go 人物


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

  上一篇:go hyper-v中linux更改時間問題
  下一篇:go FlashFXP解決雙線單IP主機上傳問題