1.UNION,EXCEPT,INTERSECT運算符
A,UNION 運算符
UNION 運算符經過組合其餘兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重複行而派生出一個結果表。
當 ALL 隨 UNION 一塊兒使用時(即 UNION ALL),不消除重複行。兩種狀況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
B, EXCEPT 運算符
EXCEPT 運算符經過包括全部在 TABLE1 中但不在 TABLE2 中的行並消除全部重複行而派生出一個結果表。
當 ALL 隨 EXCEPT 一塊兒使用時 (EXCEPT ALL),不消除重複行。
C,INTERSECT 運算符
INTERSECT 運算符經過只包括 TABLE1 和 TABLE2 中都有的行並消除全部重複行而派生出一個結果表。
當 ALL 隨 INTERSECT 一塊兒使用時 (INTERSECT ALL),不消除重複行。
注:使用運算詞的幾個查詢結果行必須是一致的。
----------------------------------------------------------------------------------------------------
2.外鏈接
A、left outer join:
左外鏈接(左鏈接):結果集幾包括鏈接表的匹配行,也包括左鏈接表的全部行。
sql: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外鏈接(右鏈接):結果集既包括鏈接表的匹配鏈接行,也包括右鏈接表的全部行。
C:full outer join:
全外鏈接:不只包括符號鏈接表的匹配行,還包括兩個鏈接表中的全部記錄。
----------------------------------------------------------------------------------------------------
其次,你們來看一些不錯的sql語句
一、說明:複製表(只複製結構,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
二、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
三、說明:
跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具體數據庫’ where 條件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
四、說明:子查詢(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b )
或者: select a,b,c from a where a IN (1,2,3)
五、說明:顯示文章、提交人和最後回覆時間
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
六、說明:外鏈接查詢(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
七、說明:在線視圖查詢(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
八、說明:between的用法,between限制查詢數據範圍時包括了邊界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 數值1 and 數值2
九、說明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
十、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
十一、說明:四表聯查問題:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
十二、說明:日程安排提早五分鐘提醒
sql: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5
1三、說明:一條sql 語句搞定數據庫分頁
select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,
表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段
1四、說明:前10條記錄
select top 10 * form table1 where 範圍
1五、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的全部信息
(相似這樣的用法能夠用於論壇每個月排行榜,每個月熱銷產品分析,按科目成績排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
1六、說明:包括全部在 TableA 中但不在 TableB和TableC 中的行並消除全部重複行而派生出一個結果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
1七、說明:隨機取出10條數據
select top 10 * from tablename order by newid()
1八、說明:隨機選擇記錄
select newid()
1九、說明:刪除重複記錄
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
20、說明:列出數據庫裏全部的表名
select name from sysobjects where type='U'
2一、說明:列出表裏的全部的
select name from syscolumns where id=object_id('TableName')
2二、說明:列示type、vender、pcs字段,以type字段排列,case能夠方便地實現多重選擇,相似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),
sum(case vender when 'C' then pcs else 0 end),
sum(case vender when 'B' then pcs else 0 end)
FROM tablename group by type
顯示結果:
type vender pcs
電腦 A 1
電腦 A 1
光盤 B 2
光盤 A 2
手機 B 3
手機 C 3
2三、說明:初始化表table1
TRUNCATE TABLE table1
2四、說明:選擇從10到15的記錄
select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc
隨機選擇數據庫記錄的方法(使用Randomize函數,經過SQL語句實現)
對存儲在數據庫中的數據來講,隨機數特性能給出上面的效果,但它們可能太慢了些。
你不能要求ASP「找個隨機數」而後打印出來。實際上常見的解決方案是創建以下所示的循環:
Randomize
RNumber = Int(Rnd*499) +1
While Not objRec.EOF
If objRec("ID") = RNumber THEN
... 這裏是執行腳本 ...
end if
objRec.MoveNext
Wend
這很容易理解。首先,你取出1到500範圍以內的一個隨機數(假設500就是數據庫內記錄的總數)。
而後,你遍歷每一記錄來測試ID 的值、檢查其是否匹配RNumber。知足條件的話就執行由THEN 關鍵字開始的那一塊代碼。
假如你的RNumber 等於495,那麼要循環一遍數據庫花的時間可就長了。
雖然500這個數字看起來大了些,但相比更爲穩固的企業解決方案這仍是個小型數據庫了,後者一般在一個數據庫內就包含了成千上萬條記錄。
這時候不就死定了?
採用SQL,你就能夠很快地找出準確的記錄而且打開一個只包含該記錄的recordset,以下所示:
Randomize
RNumber = Int(Rnd*499) + 1
sql = "SELECT * FROM Customers WHERE ID = " & RNumber
set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
沒必要寫出RNumber 和ID,你只須要檢查匹配狀況便可。
只要你對以上代碼的工做滿意,你自可按需操做「隨機」記錄。
Recordset沒有包含其餘內容,所以你很快就能找到你須要的記錄這樣就大大下降了處理時間。
--------------------------------------------------------------------------------------
再談隨機數
如今你下定決心要榨乾Random 函數的最後一滴油,那麼你可能會一次取出多條隨機記錄或者想採用必定隨機範圍內的記錄。
把上面的標準Random 示例擴展一下就能夠用SQL應對上面兩種狀況了。
爲了取出幾條隨機選擇的記錄並存放在同一recordset內,你能夠存儲三個隨機數,而後查詢數據庫得到匹配這些數字的記錄:
sql = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3
假如你想選出10條記錄(也許是每次頁面裝載時的10條連接的列表),
你能夠用BETWEEN 或者數學等式選出第一條記錄和適當數量的遞增記錄。
這一操做能夠經過好幾種方式來完成,可是 SELECT 語句只顯示一種可能(這裏的ID 是自動生成的號碼):
sql = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"
注意:以上代碼的執行目的不是檢查數據庫內是否有9條併發記錄。
隨機讀取若干條記錄,
測試過
Access語法:SELECT top 10 * From 表名 ORDER BY Rnd(id)
sql server:select top n * from 表名 order by newid()
mysqlelect * From 表名 Order By rand() Limit n
Access左鏈接語法(最近開發要用左鏈接,Access幫助什麼都沒有,網上沒有Access的SQL說明,只有本身測試, 如今記下以備後查)
語法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
使用SQL語句 用...代替過長的字符串顯示
語法:
SQL數據庫:
select case when len(field)>10 then left(field,10)+'...'
else field end as news_name,news_id from tablename
Access數據庫:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
Conn.Execute說明
Execute方法該方法用於執行SQL語句。根據SQL語句執行後是否返回記錄集,該方法的使用格式分爲如下兩種:
1.執行SQL查詢語句時,將返回查詢獲得的記錄集。
用法爲:Set 對象變量名=鏈接對象.Execute("SQL 查詢語言")
Execute方法調用後,會自動建立記錄集對象,並將查詢結果存儲在該記錄對象中,
經過Set方法,將記錄集賦給指定的對象保存,之後對象變量就表明了該記錄集對象。
2.執行SQL的操做性語言時,沒有記錄集的返回。此時用法爲:
鏈接對象.Execute "SQL 操做性語句" [, RecordAffected][, Option]
·RecordAffected 爲可選項,此出可放置一個變量,SQL語句執行後,所生效的記錄數會自動保存到該變量中。
經過訪問該變量,就可知道SQL語句隊多少條記錄進行了操做。
·Option 可選項,該參數的取值一般爲adCMDText,它用於告訴ADO,應該將Execute方法以後的第一個字符解釋爲命令文本。
經過指定該參數,可以使執行更高效。
·BeginTrans、RollbackTrans、CommitTrans方法
這三個方法是鏈接對象提供的用於事務處理的方法。BeginTrans用於開始一個事物;RollbackTrans用於回滾事務;
CommitTrans用於提交全部的事務處理結果,即確認事務的處理。
事務處理能夠將一組操做視爲一個總體,只有所有語句都成功執行後,事務處理纔算成功;
若其中有一個語句執行失敗,則整個處理就算失敗,並恢復處處裏前的狀態。
BeginTrans和CommitTrans用於標記事務的開始和結束,在這兩個之間的語句,就是做爲事務處理的語句。
判斷事務處理是否成功,可經過鏈接對象的Error集合來實現,若Error集合的成員個數不爲0,則說明有錯誤發生,事務處理失敗。
Error集合中的每個Error對象,表明一個錯誤信息。
-------------------------------------------------------------------------------------------------
transact---sql高級查詢(下)
5:使用having關鍵字來篩選結果
6:使用compute和compute by子句
7:使用嵌套查詢
8:分佈式查詢
E:使用having關鍵字來篩選結果
當完成對數據結果的查詢和統計後,可使用having關鍵字來對查詢和計算的結果進行一步的篩選
例:檢索出work表中學歷是大專或者是中專的人數
select 學歷,count(學歷) from work group by 學歷 having 學歷 in(\'大專\',\'中專\')
說明:1:having關鍵字都與group by用在一塊兒.
2:having不支持對列分配的別名
例如:select 學歷,\'大於5的人數\'=count(學歷) from work group by 學歷 having 大於5的人數>5 [錯錯]
改成:select 學歷,\'大於5的人數\'=count(學歷) from work group by 學歷 having count(學歷)>5
F:使用compute和compute by
使用compute子句容許同時觀察查詢所獲得各列的數據的細節以及統計各列數據所產生的彙總列
select * from work [查詢所獲得的各列的數據的細節]
compute max(基本工資),min(基本工資) [統計以後的結果]
這個例子中沒有使用by關鍵字,返回的結果是最後添加了一行基本工資的最大值和最小值,也可增長by關鍵字.
例:select * from work order by 學歷
compute max(基本工資),min(基本工資) by 學歷
比較:select 學歷,max(基本工資),min(基本工資) from work group by 學歷
說明:1:compute子句必須與order by子句用在一塊兒
2:compute子句能夠返回多種結果集.一種是體現數據細節的數據集,能夠按分類要求進行正確的分類;另外一種在分類的基礎上進行彙總產生結果.
3:而group by子句對每一類數據分類以後只能產生一個結果,不能知道細節
G:使用嵌套查詢
查詢中再查詢,一般是以一個查詢做爲條件來供另外一個查詢使用
例:有work表和部門表
A:檢索出在部門表中登記的全部部門的職工基本資料
select * from work where 部門編號 in [not in](select 部門編號 from dbo.部門)
B:檢索出在work表中每個部門的最高基本工資的職工資料
select * from work a where 基本工資=(select max(基本工資) from work b where a.部門名稱=b.部門名稱)
說明:由外查詢提供一個部門名稱給內查詢,內查詢利用這個部門名稱找到該部門的最高基本工資,而後外查詢根據基本工資判斷是否等於最高工資,若是是的,則顯示出來.
至關於:select * from work,(select 部門名稱,max(基本工資) as 基本工資 from work group by 部門名稱 as t) where work.基本工資=t.基本工資 and work.部門名稱=t.部門名稱
C:用嵌套work表和嵌套部門表,在嵌套work表中檢索出姓名和職工號都在嵌套部門存在的職工資料
select * from 嵌套work where 職工號 in (select 職工號 from 嵌套部門) and 姓名 in (select 姓名 from 嵌套部門) [察看結果,分析緣由]
改:select * from 嵌套work a,嵌套部門 b where a.職工號=b.職工號 and a.姓名=b.姓名
改:select * from 嵌套work where 職工號=(select 職工號 from 嵌套部門) and 姓名=(select 姓名 from 嵌套部門) [行嗎?爲何,分析緣由?]
在嵌套中使用exists關鍵字[存在]
例:1:用嵌套work表和嵌套部門表,在嵌套work表中檢索出姓名和職工號都在嵌套部門存在的職工資料
select * from 嵌套work a where exists (select * from 嵌套部門 b where a.姓名=b.姓名 and a.職工號=b.職工號)
2:在work表檢索出在部門表沒有的職工
select * from work where not exists (select * from 部門 where 部門.部門編號=work.部門編號)
可否改爲:select * from work where exists (select * from 部門 where 部門.部門編號<>work.部門編號)
在列清單中使用select
例:1:在work1表和部門表中檢索出全部部門的部門名稱和基本工資總和
select 部門名稱,(select sum(基本工資) from work1 b where a.部門編號=b.部門編號) from 部門 a
2:檢索各部門的職工人數
select 部門編號,部門名稱,(select count(職工號) from work1 a where a.部門編號=b.部門編號) as 人數 from 部門 b
3:在商品表和銷售表中查詢每一職工的姓名,所屬部門,銷售總量
select 姓名,所屬部門,(select sum(銷售量) from 商品銷售 a where a.職工號=b.職工號) as 銷售總量 from 嵌套部門 b
H:分佈式查詢
咱們之前的查詢都只是基於一個服務器中的一個數據庫的查詢,若是一個查詢是要跨越一個服務器,像這樣的查詢就是分佈式查詢,那麼咱們以看到分佈查詢就是數據源自於兩個服務器.要進行分佈式查詢必須先建立一個「連接服務器」,以便讓本地的用戶可以映射到過程服務器.
「連接服務器」的創立
A:在「連接服務器」裏面輸入之後爲了方便訪問該連接服務器的名稱[任意]
B:在「提供程序名稱」裏面選擇「Microsoft OLE DB Provider for SQL Server」
C:在「數據源」裏面輸入服務器的網絡名
D:本地登陸,遠程用戶和遠程密碼裏面分別輸入一個本地登陸用戶,遠程登陸和遠程密碼以便讓本地SQL Server登陸映射爲連接服務器上的用戶
E:訪問方法:格式:連接服務器的名稱.數據庫名.dbo.表名
連接服務器有兩個特色:
1:經過連接服務器不能刪除連接源服務器的任何對像.
2:能過連接服務器能夠對連接源服務器的表進行insert,updae,delete操做.
視圖
1:什麼是視圖
2:視圖和查詢的區別
3:視圖的優勢
4:如何建立和管理視圖
5:如何經過視圖修改基本表的數據
6:如何經過視圖實現數據的安全性
A:什麼是視圖:
視圖(view):從一個或幾個基本表中根據用戶須要而作成一個虛表
1:視圖是虛表,它在存儲時只存儲視圖的定義,而沒有存儲對應的數據
2:視圖只在剛剛打開的一瞬間,經過定義從基表中搜集數據,並展示給用戶
B:視圖與查詢的區別:
視圖和查詢都是用由sql語句組成,這是他們相同的地方,可是視圖和查詢有着本質區別:
它們的區別在於:1:存儲上的區別:視圖存儲爲數據庫設計的一部分,而查詢則不是.
2:更新限制的要求不同
要注意:由於視圖來自於表,因此經過視圖能夠間接對錶進行更新,咱們也能夠經過update語句對錶進行更新,可是對視圖和查詢更新限制是不一樣的,如下咱們會知道雖然經過視圖能夠間接更新表可是有不少限制.
3:排序結果:經過sql語句,能夠對一個表進行排序,而視圖則不行.
好比:建立一個含有order by子句的視圖,看一下能夠成功嗎?
C:視圖的優勢:
爲何有了表還要引入視圖呢?這是由於視圖具備如下幾個優勢:
1:能分割數據,簡化觀點
能夠經過select和where來定義視圖,從而能夠分割數據基表中某些對於用戶不關心的數據,使用戶把注意力集中到所關心的數據列.進一步簡化瀏覽數據工做.
2:爲數據提供必定的邏輯獨立性
若是爲某一個基表定義一個視圖,即便之後基本表的內容的發生改變了也不會影響「視圖定義」所獲得的數據
3:提供自動的安全保護功能
視圖能像基本表同樣授予或撤消訪問許可權.
4:視圖能夠間接對錶進行更新,所以視圖的更新就是表的更新
D:視圖的建立和管理
視圖的建立
1:經過sql語句
格式:create view 視圖名 as select 語句
試一試:分別建立關於一個表或多個表的視圖[由於視圖能夠來自於多表]
2:經過企業管理器
說明:1:在完成視圖的創立以後,就能夠像使用基本表同樣來使用視圖
2:在建立視圖時,並不是全部的select子查詢均可用
如:compute和compute by,order by[除非與top一塊兒連用]
3:但在查詢時,依然均可以用在建立時禁用的select子查詢
4:在視圖建立時,必須爲沒有標題列指定標題[思考:可否不用select語句來建立一個視圖]
視圖的刪除:
1:經過sql語句:drop view 視圖名
2:經過企業管理器
說明:與刪除表不一樣的是,刪除視圖後只是刪除了視圖了定義,並無刪除表中的數據.[查看相關性]
修改視圖的定義
1:經過企業管理器
2:經過sql語句:
格式:alter view 視圖名 as 新的select語句
瀏覽視圖信息 sp_helptext 視圖名 [查看視圖建立的語句]
E:如何經過視圖修改基本表的數據.
1:在視圖上使用insert語句
經過視圖插入數據與直接在表中插入數據同樣,但視圖畢竟不是基本表.所以在進行數據插入時仍是有必定的限制
1:若是視圖上沒有包括基本表中屬性爲not null[不能爲空]的列,那麼插入操做會由於那些列是null值而失敗.
2:若是某些列由於某些規則或約束的限制而不能直接接受從視圖插入的列時,插入會失敗
3:若是在視圖中包含了使用統計函數的結果,或是包含計算列,則插入操做會失敗
4:不能在使用了distinct語句的視圖中插入值
5:不能在使用了group by語句的視圖中插入值
2:使用update更新視圖中的數據
1:更新視圖與更新表格同樣,可是在視圖中使用了多個基本錶鏈接的狀況下,每次更新操做只能更新來自基本表的一個數據列
例如:建立如下視圖:create view del as
select 職工號,姓名,部門名稱,負責人 from work1,部門
where work1.部門編號=部門.部門編號
若是再執行下面的語句時:
update del set 職工號=\'001\',部門名稱=\'wenda\' where 職工號=\'01\'[出現錯誤]
只可以改爲:update del set 職工號=\'001\' where 職工號=\'01\'
update del set 部門名稱=\'wenda\' where 職工號=\'01\'
2:不能在使用了distinct語句的視圖中更新值
3:不能在使用了group by語句的視圖中更新值
3:使用delete刪除視圖中數據.
經過視圖刪除數據最終體現爲從基本表中刪除數據
格式:delete 視圖名 [where 條件]
說明:當視圖由兩個以上的基表構成時,不容許刪除視圖的數據
例如:建一個視圖kk
create view kk as
select 職工號,姓名,性別,部門名稱 from work1,部門 where work1.部門編號=部門.部門編號 [試着去刪除]
使用with check option的視圖
若是不瞭解視圖定義內容,則經常會發生向視圖中輸入不符合視圖定義的數據的狀況.
好比:create view xm as
select * from work where 性別=\'男\'
徹底能夠插入insert xm values(\'001\',\'女\',23,\'2400\'....)
儘管從意義上來講是不合理的,可是上述語句是正確的.爲了防止這種狀況的發生,可使用with check option子句來對插入的或更改的數據進行限制.
好比:create view xm as
select * from work where 性別=\'男\' with check option
使用schemabinding的視圖[使用綁定到構架]
咱們知道視圖是依賴於表,若是在一個表中建立一個視圖,從此若是這個表被刪除了,則這個視圖將不可再用了.爲了防止用戶刪除一個有視圖在引用的表,能夠在建立視圖的時候加上schemabinding關鍵字.
好比:create view 基本工資 with SCHEMABINDING
as select 姓名,性別,基本工資 from dbo.work
說明:1:不能使用「*」來建立此類型的視圖
2:建立此類型的視圖時,必定要加上dbo.表名.
3:若是在某個表中定義了此類視圖,則用戶將不能對錶的結構進行修改,不然會刪除這些綁定
4:若是用戶對錶的結構進行列更名,則會刪除綁定並且視圖不可用.
5:若是用戶對錶的結構進行列的類型或者大小修改,則會刪除綁定但視圖可用,此時用戶能夠刪除視圖所引用的表.
使用with encryption對視圖進行加密
爲了保護建立視圖定義的原代碼,能夠對視圖進行加密.
好比:create view kk with encryption
as select * from work where 職稱=\'經理\'
用sp_helptext來查看一下.或用企業管理器查看一下.
說明:若是應用此項用戶將沒法設計視圖
F:使用視圖增強數據的安全
通常經過使用視圖共有三種途徑增強數據的安全性
A:對不一樣用戶授予不一樣的使用權.
B:經過使用select子句限制用戶對某些底層基表的列的訪問
C:經過使用where子句限制用戶對某些底層基表的行的訪問
對不一樣用戶授予不一樣的權限
注:若是配置不在classspath中而在WEB-INf中,那麼註解應該這麼寫「@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/applicationContext.xml"})」mysql