上面幾篇討論的是數據庫方面的事務和鎖方面的一些內容,實際上我們在實際中最常用的就是基本的sql語句了,實際上我個人感覺sql很難記憶(哈哈,語法和編程語言差太多了),所以往往有時候寫些複雜的sql語句就必須google一下語法了,雖然現在有不錯的ORM的工具,但還是覺得簡單得數據庫操作使用ORM比較方便,但太複雜的應用就不太爽了,當然我們可以利用面向對象的思路把複雜的sql語句給拆分成簡單的。
1.數據定義語言(DDL)
常用的DDL語句
Create Table 創建數據庫對象
Create Index 創建數據庫表索引
Drop Table 刪除數據庫表
Drop Index 刪除數據庫表索引
Truncate 刪除表中所有行業
Alert Table 增加表列,重定義表列,更改存儲分配
Alert Table ADD CONSTRAINT 在已有的表上增加約束
2.數據操縱語言(DML)
Insert 增加數據行到表
Delete 從表中刪除數據行
Update 更改表中數據
Select 從表或視圖中檢索數據行
3.數據控制語言(DCL)
DCL用於規定數據庫用戶的各種權限
GRANT 將權限或角色授予用戶或其他角色
REVOKE 從用戶或數據庫角色回收權限
Set ROLE 禁止或允許一個角色
4.數據庫事務控制
常用的事務語句包括
COMMIT WORK 把當前事務更改永久化(寫入磁盤)
ROLLBACK 作廢上次提交以來的所有更改
SQL語句基本語法
每條SQL語句必須以分號結束.
每條SQL語句可以單獨寫成一行,但爲了清楚,也可以分成若干行.
SQL語句對大小寫不敏感,對於SQL語句的關鍵字(例如,Insert,Select 等),
表名、列名等,可以大小寫混寫;但是對列的內容是大小寫敏感的。
別名
數據表名稱 AS 數據表別名
或者是:
數據表名稱 數據表別名
Eg:
Use SAMPLE
Select e.員工編號 ,e.員工姓名
From 員工數據表 AS e
Select 語句
Select 語句基本結構如下:
Select select_list
[INTO new_table_name]
From table_list
[Where search_conditions]
[GROUP BY group_by_list]
[Having search_conditions]
[ODER BY order_list[ASC|DESC]]
1.DISTINCT關鍵字
eg:
Use SAMPLE
Select DISTINCT 所屬部門
from 員工數據表
2.TOP 關鍵字
From子句
聯接條件---on子句
派生表---sp
Select 員工數據表.員工編號,項目數據表.項目名稱
From 員工數據表 join 項目數據表 ON
(員工數據表.員工編號 = 項目數據表.負責人)
Select EMP.員工編號,EMP.員工姓名,SP.部門名稱
From 員工數據表 AS EMP ,
(Select 部門數據表.部門編號,部門數據表.部門名稱
From 部門數據表
Where 部門數據表.部門編號>2
) AS SP
Where EMP.部門編號=SP.部門編號
Where 子句
Where子句中查詢和限定的條件可以是
比較運算符(如常=、<>、<和>).
範圍說明(BETWEEN 和 NOT BETWEEN)。
可選列表(IN、NOT IN)
模式匹配(Like 和NOT Like).
是否爲空值(IS NULL 和 IS NOT NULL)。
上述條件的邏輯組合(AND 、OR和NOT)。
GROUP BY 子句
GROUP BY 子句的主要作用是可以將數據記錄依據設置的條件分成多個組,
而且只有使用了GROUP BY
子句,SELECT中所使用的彙總函數(例如SUM、COUNT、MIN、MAX等)
纔會起作用。
eg:
Select 所屬部門,AVG(工資) AS 平均工資 From 員工數據表 GROUP BY
所屬部門
HAVING 關鍵字
HAVING子句將對GROUP BY 子句選擇出來的結果進行再次篩選,最後輸出符
合HAVING 子句中條件的記錄。
eg:
Select 所屬部門,AVG(工資) AS 平均工資 From 員工數據表 GROUP BY
所屬部門 HAVING 平均工資>2000
Where 子句用來篩選From子句中指定的操作所產生的記錄
GROUP BY 子句將Where子句中結果驚醒分組
HAVING 子句將從經過分組後的中間結果集中篩選記錄
ALL關鍵字
CUBE關鍵字
WITH CUBE 關鍵字的主要作用是自動對GROUP BY 子句中列出的字段進行
分組彙總運算。
EG:
Select 所屬部門 ,性別,AVG(工資) From 員工數據表 GROUP BY
所屬部門,性別 WITH CUBE
ROLLUP 關鍵字
ORDER BY 子句
ASC ---升序
DESC --降序
COMPUTE 和COMPUTE BY 子句
使用UNION 子句
UNION運算符可以用來將2個或多個查詢結果集組合起來,成爲一個結果集
。使用UNION運算符的結果集都必須滿足下列條件:
具有相同的結構
字段數目相同
結果集中相對應的數據類型必須兼容
UNION運算符指定的格式如下:
Select 語句
UNION[ALL]
Select 語句
彙總函數
SUM函數
AVG函數
COUNT函數
COUNT(*)函數
MAX函數
MIN函數
聯接查詢
通過使用聯接產尋可以根據各個數據表之間的邏輯關係從2個或多個
數據表中檢索數據。
如何提高Select語句的效率
(1).使用EXISTS關鍵字檢查結果集
(2).使用標準的連接代替嵌套查詢
(3).有效避免整表掃描
聯接的類型
內聯接
內聯結的格式爲:
數據表1 INNER JOIN 數據表2 ON 聯接表達式
內聯接將通過使用比較運算符根據需要聯接的數據表的公共的字段
值來匹配二表中的記錄。
eg:
Select * From 員工數據表 INNER JOIN 項目數據表
ON 員工數據表.員工編號 = 項目數據表.負責人
外聯接
外聯接包括3種 左向外聯接、右向外聯接、完整外部聯接
左向外聯接的格式爲:
數據表1 LEFT JOIN 數據表2 ON 連接表達式
或者是:
數據表1 LEFT OUTER JOIN 數據表2 ON 連接表達式
使用左向聯接進行查詢的結果集將包括數據表1中所有的記錄,而僅僅是連
接字段所匹配的記錄,那麼結果集想對應的有關數據表2的所有字段將爲空值
.例如下面將檢索員工數據表中所有記錄,並將項目表中顯得負責人字段匹配
的記錄輸出到結果集:
Select *
From 員工數據表 LEFT JION 項目數據表
ON 員工數據表.員工編號 =項目數據表.負責人
右向外聯接
右向外聯接的格式:
數據表1 RIGHT JOIN 數據表2 ON 表達式
或者是:
數據表1 RIGHT OUTER JOIN 數據表2 ON 表達式
和左向外聯接相反.
完整外聯接
完整外聯接的格式
數據表1 FULL JOIN 數據表2 ON 表達式
或者是:
數據表1 FULL OUTER JOIN 數據表2 ON 表達式
交叉聯接
交叉連接的格式爲:
數據表1 CROSS JOIN 數據表2
如果在Select語句中沒有使用Where子句,那麼交叉聯接將返回數據表1和數
據表2的卡笛爾積,即交叉聯接返回數據表1中的所有記錄,以及數據表1中所
有的記錄與數據表2中所有句路的組合.結果集的記錄數等於數據表1的記錄
數目乘以數據表2的記錄數目.
在From和Where分句中指定聯接
嵌套查詢
嵌套查詢指的是一個外層查詢中包含一個內層查詢.其中外層查詢稱爲主
查詢,內層查詢稱爲子查詢.
使用IN 和 NOT IN 關鍵字
Use SAMPLE
Select 員工姓名
From 員工數據表
Where 員工編號 IN
(Select DISTINCT 負責人
From 項目數據表
Where 結束日期<'January 1,1,2006')
使用比較運算符
主要是返回單個值
Use SAMPLE
Select 員工姓名
From 員工數據表
Where 員工編號 =
(Select DISTINCT 負責人
From 項目數據表
Where 項目名稱='Demo1')
使用EXISTS 和 NOT EXISTS 關鍵字
數據更改
Insert
Update
Delete
下面是sql語句優化的一些提示要點,也是google來的,感謝提供者。
IN 操作符
NOT IN操作符
<> 操作符(不等於)
IS NULL 或IS NOT NULL操作(判斷字段是否爲空)
> 及 < 操作符(大於或小於操作符)
同一功能同一性能不同寫法SQL的影響
WHERE後面的條件順序影響
查詢表順序的影響
SQL語句索引的利用
對操作符的優化(見上節)
採用函數處理的字段不能利用索引,如:
trunc(sk_rq)=trunc(sysdate), 優化處理:
sk_rq>=trunc(sysdate) and sk_rq<trunc(sysdate+1)
進行了顯式或隱式的運算的字段不能進行索引,如:
條件內包括了多個本表的字段運算時不能進行索引,如:
應用ORACLE的HINT(提示)處理
目標方面的提示:
執行方法的提示:
索引提示:
其它高級提示(如並行處理等等)
declare
@nAccountPer bigint,
@nAllAccount bigint,
@nflag int,
@ntableName varchar(2),
@selectSentense nvarchar(4000)
begin
set @nflag=1
set @nAccountPerZone=0
set @nAllAccount=0
while(@nflag<3)
begin
if(@nflag<10)
set @ntableName='0'+convert(varchar(2),@nflag)
else
set @ntableName=convert(varchar(2),@nflag)
set @selectSentense='select @nAccountPer=count(distinct uid) from zone'+@ntableName+' where end_date<'+"'"+'1905-1-1'+"'"
print @selectSentense
exec sp_executesql @selectSentense, N'@nAccountPer bigint out', @nAccountPer out
set @nAllAccount=@nAllAccount+@nAccountPer
set @nflag=@nflag+1
end
print @nAllAccount
end
GO
如何需要兩個輸出參數的話,要這樣設定