love fish大鵬一曰同風(fēng)起,扶搖直上九萬里

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          friends

          link

          最新評(píng)論

          transact---sql高級(jí)查詢

          transact---sql高級(jí)查詢(上)
          1:多表的查詢和笛卡兒積
          2:表格別名的用法
          3:使用sql server的統(tǒng)計(jì)函數(shù)
          4:用group by子句實(shí)現(xiàn)分組的查詢

          A:多表查詢和笛爾兒積
          到目前為止,我們所用的都是單個(gè)表查詢,但是在更多的情況的下,需要對(duì)多個(gè)表進(jìn)行同時(shí)查詢,這時(shí)可以把多個(gè)表的名字全部填寫在from子句中.
          ? 比如:查詢出每個(gè)職工的姓名,學(xué)歷,所在部門名稱.由于我們需要的結(jié)果來自于兩個(gè)表,所以必須用多表查詢
          ?????? select 姓名,學(xué)歷,部門名稱,負(fù)責(zé)人 from work,部門 [分析為什么是錯(cuò)誤的]
          ? 原因:問題出在對(duì)表格連接條件的限制上.在上面的語句中,沒能對(duì)表格連接條件作任何限制,所以sql會(huì)在work表中每取出一條記錄,就與部門表中的所有記錄組合一次,那么假設(shè)work表有m條記錄,而部門表中有n條記錄,則得出的結(jié)果為m*n條記錄這就是笛爾兒積,所以笛爾兒積返回的大多數(shù)的結(jié)果是冗余的、無用的,所以應(yīng)該避免笛爾兒積的產(chǎn)生.
          ? 解決笛爾兒積的方法:事實(shí)上由于笛爾兒積是因?yàn)閮蓚€(gè)表的連接條件沒有限制造成的,所以只要我們對(duì)兩個(gè)表的連接進(jìn)行條件限制,就可以避免笛爾兒積的產(chǎn)生.可以通過一個(gè)where子句,來連接兩個(gè)表的公共的字段就可以了.
          ? 所以將上面的語句改成:select 姓名,學(xué)歷,部門名稱,負(fù)責(zé)人 from work,部門 where work.部門編號(hào)=部門.部門編號(hào)

          B:使用表格的別名
          ? A:當(dāng)使用多個(gè)表進(jìn)行查詢時(shí),如果有兩個(gè)表中有相同的列,應(yīng)該指明選中的是哪個(gè)表中的列.
          ??? 比如:在work表檢索出在address表中都有的職工的職工號(hào),姓名,學(xué)歷,基本工資
          ???????? select 職工號(hào),姓名,學(xué)歷,基本工資 from work,address where work.職工號(hào)=address.職工號(hào)
          ???????? 上面的語句是錯(cuò)誤的,原因是對(duì)于work和address表都有職工號(hào),姓名列,所以應(yīng)該指明是哪個(gè)表的職工號(hào)和姓名.
          ??? 改成:select work.職工號(hào),work.姓名,學(xué)歷,基本工資 from work,address where work.職工號(hào)=address.職工號(hào)
          ??? 或者:select address.職工號(hào),address.姓名,學(xué)歷,基本工資 from work,address where work.職工號(hào)=address.職工號(hào)
          ??? 想一想:為什么對(duì)于學(xué)歷,基本工資沒有指明表名:即:work.學(xué)歷,work.基本工資[只有一個(gè)表有這些列]
          ? B:允許使用別名來訪問表.
          ??? 格式:1:表名 as 別名
          ???????? 2:表名 別名
          ??? 例如:上面的語句可改寫成:
          ???????? select w.職工號(hào),w.姓名,學(xué)歷,基本工資 from work as w,address as a where w.職工號(hào)=a.職工號(hào)
          上面的語句中在from中引用兩個(gè)表,并且為表work指明了別名w,為表address指明了別名a,所以就可以用w來代表work表,用a來代表address表.或者省略as直接改成:select w.職工號(hào),w.姓名,學(xué)歷,基本工資 from work w,address a where w.職工號(hào)=a.職工號(hào)
          ? C:如果使用了別名,則以后所有查詢語句中,都必須使用別名列
          ??? 比如:select work.職工號(hào),work.姓名,學(xué)歷,基本工資 from work w,address a where w.職工號(hào)=a.職工號(hào) [是錯(cuò)誤的]

          C:使用統(tǒng)計(jì)函數(shù):
          ? sql跟我們提供了以下幾個(gè)統(tǒng)計(jì)函數(shù):
          ???? sum:返回一個(gè)數(shù)字列的總和
          ???? avg:對(duì)一個(gè)數(shù)字列求平均值
          ???? min:對(duì)一個(gè)數(shù)字列求最小值
          ???? max:對(duì)一個(gè)數(shù)字列求最大值
          ???? count:返回滿足select語句中指定的條件的記錄個(gè)數(shù)
          ????? 舉列:1:求出work表中所有男職工的基本工資的和
          ???????????? select sum(基本工資) as 性別為男的基本工資 from work where 性別=\'男\(zhòng)'
          ?????????? 2:求出work表中所有職稱是經(jīng)理的最高工資和最低工資,平均工資
          ???????????? select max(基本工資) as 最高工資,min(基本工資) as 最低工資,avg(平均工資) as 平均工資 from work???
          ?????????? 3:與統(tǒng)計(jì)函數(shù)一起使用distinct關(guān)鍵字[通常只與count函數(shù)使用]
          ???????????? 例:1:檢索出work表中學(xué)歷的個(gè)數(shù)
          ????????????????? select count(學(xué)歷) from work
          ??????????????? 2:檢索出work表中學(xué)歷的種類的個(gè)數(shù)
          ????????????????? select count(distinct 學(xué)歷) from work
          ????????????????? 試一試:select distinct count(學(xué)歷) from work 可行否?
          ??????????????? 3:有work和部門表,檢索出在銷售部工作的員工的個(gè)數(shù)
          ????????????????? select \'銷售部的人數(shù)\'=count(職工號(hào)) from work a,部門 b
          ????????????????? where a.部門編號(hào)=b.部門編號(hào) and b.部門名稱=\'銷售部\'
          ??????????????? 4:在work表中檢索出其基本工資小于職工平均工資的人數(shù)
          ????????????????? select count(職工號(hào)) as 人數(shù) from work
          ????????????????? where 基本工資<(select avg(基本工資) from work)
          ??????????????? 5:有學(xué)科表和學(xué)費(fèi)表,從學(xué)費(fèi)表檢索出有多少個(gè)學(xué)網(wǎng)頁設(shè)計(jì)的人
          ????????????????? select count(學(xué)號(hào)) as 網(wǎng)頁設(shè)計(jì)的人數(shù) from 學(xué)費(fèi) a,學(xué)科 b
          ????????????????? where a.所學(xué)專業(yè)代號(hào)=b.課程編號(hào) and b.課程名稱=\'網(wǎng)頁設(shè)計(jì)\'

          D:使用group by子句對(duì)結(jié)果進(jìn)行分類[只用于統(tǒng)計(jì)函數(shù)]
          ??? 舉列:1:檢索出work表各職稱的人數(shù).
          ?????????? select 職稱,count(職稱) as 職稱人數(shù) from work group by 職稱
          ???????? 2:檢索出各學(xué)歷的平均工資.
          ?????????? select 學(xué)歷,avg(基本工資) from work group by 學(xué)歷
          ???????? 3:有學(xué)科表和學(xué)費(fèi)表,要求統(tǒng)計(jì)出各學(xué)科的學(xué)生數(shù)目.
          ?????????? select 所學(xué)專業(yè)代號(hào),count(所學(xué)專業(yè)代號(hào)) as 人數(shù) into #abc from 學(xué)費(fèi) group by 所學(xué)專業(yè)代號(hào)
          ?????????? select 課程名稱,人數(shù) from #abc,學(xué)科 where 所學(xué)專業(yè)代號(hào)=課程編號(hào)
          ???????? 4:有職工表和商品銷售表,要求檢索出每個(gè)職工的職工號(hào),姓名,銷售總量.
          ?????????? select 職工號(hào),sum(銷售量) as 銷售總量 into #abcd from 商品銷售 group by 職工號(hào)
          ?????????? select 職工.職工號(hào),姓名,銷售總量 from 職工,#abcd where #abcd.職工號(hào)=職工.職工號(hào)
          ???????? 5:查詢出每個(gè)部門最高的基本工資,顯示部門名稱和最高基本工資
          ?????????? select 部門名稱,max(基本工資) from work group by 部門名稱
          ?????????? 說明:1:在group by中不支持對(duì)列名的分配的別名
          ?????????????????? select 學(xué)歷 as 職工學(xué)歷,count(學(xué)歷) from work group by 職工學(xué)歷 [錯(cuò)錯(cuò)]
          ?????????????????? 改為:select 學(xué)歷 as 職工學(xué)歷,count(學(xué)歷) from work group by 學(xué)歷
          ??????????????? 2:select后面每一列數(shù)據(jù)除了在統(tǒng)計(jì)函數(shù)中的列以外都必須在group by子句出現(xiàn)
          ?????????????????? 比如:select 學(xué)歷,性別,sum(基本工資) from work group by 學(xué)歷[錯(cuò)錯(cuò)]
          ?????????????????? 改為:select 學(xué)歷,性別,sum(基本工資) from work group by 學(xué)歷,性別?????
          ?????????????????? 意義:各學(xué)歷各性別的基本工資之和


          transact---sql高級(jí)查詢(下)
          5:使用having關(guān)鍵字來篩選結(jié)果
          6:使用compute和compute by子句
          7:使用嵌套查詢
          8:分布式查詢

          E:使用having關(guān)鍵字來篩選結(jié)果
          ??? 當(dāng)完成對(duì)數(shù)據(jù)結(jié)果的查詢和統(tǒng)計(jì)后,可以使用having關(guān)鍵字來對(duì)查詢和計(jì)算的結(jié)果進(jìn)行一步的篩選
          ????? 例:檢索出work表中學(xué)歷是大專或者是中專的人數(shù)
          ????????? select 學(xué)歷,count(學(xué)歷) from work group by 學(xué)歷 having 學(xué)歷 in(\'大專\',\'中專\')
          ????????? 說明:1:having關(guān)鍵字都與group by用在一起.
          ?????????????? 2:having不支持對(duì)列分配的別名
          ????????? 例如:select 學(xué)歷,\'大于5的人數(shù)\'=count(學(xué)歷) from work group by 學(xué)歷 having 大于5的人數(shù)>5 [錯(cuò)錯(cuò)]
          ????????? 改為:select 學(xué)歷,\'大于5的人數(shù)\'=count(學(xué)歷) from work group by 學(xué)歷 having count(學(xué)歷)>5

          F:使用compute和compute by
          ? 使用compute子句允許同時(shí)觀察查詢所得到各列的數(shù)據(jù)的細(xì)節(jié)以及統(tǒng)計(jì)各列數(shù)據(jù)所產(chǎn)生的匯總列
          ????? select * from work [查詢所得到的各列的數(shù)據(jù)的細(xì)節(jié)]
          ????? compute max(基本工資),min(基本工資) [統(tǒng)計(jì)之后的結(jié)果]
          ? 這個(gè)例子中沒有使用by關(guān)鍵字,返回的結(jié)果是最后添加了一行基本工資的最大值和最小值,也可增加by關(guān)鍵字.
          ??????? 例:select * from work order by 學(xué)歷
          ?????????? compute max(基本工資),min(基本工資) by 學(xué)歷
          ??????? 比較:select 學(xué)歷,max(基本工資),min(基本工資) from work group by 學(xué)歷
          ??????? 說明:1:compute子句必須與order by子句用在一起
          ???????????? 2:compute子句可以返回多種結(jié)果集.一種是體現(xiàn)數(shù)據(jù)細(xì)節(jié)的數(shù)據(jù)集,可以按分類要求進(jìn)行正確的分類;另一種在分類的基礎(chǔ)上進(jìn)行匯總產(chǎn)生結(jié)果.
          ???????????? 3:而group by子句對(duì)每一類數(shù)據(jù)分類之后只能產(chǎn)生一個(gè)結(jié)果,不能知道細(xì)節(jié)

          G:使用嵌套查詢
          ? 查詢中再查詢,通常是以一個(gè)查詢作為條件來供另一個(gè)查詢使用
          ????? 例:有work表和部門表
          ???????? A:檢索出在部門表中登記的所有部門的職工基本資料
          ?????????? select * from work where 部門編號(hào) in [not in](select 部門編號(hào) from dbo.部門)
          ???????? B:檢索出在work表中每一個(gè)部門的最高基本工資的職工資料
          ?????????? select * from work a where 基本工資=(select max(基本工資) from work b where a.部門名稱=b.部門名稱)
          ?????????? 說明:由外查詢提供一個(gè)部門名稱給內(nèi)查詢,內(nèi)查詢利用這個(gè)部門名稱找到該部門的最高基本工資,然后外查詢根據(jù)基本工資判斷是否等于最高工資,如果是的,則顯示出來.
          ?????????? 相當(dāng)于:select * from work,(select 部門名稱,max(基本工資) as 基本工資 from work group by 部門名稱 as t) where work.基本工資=t.基本工資 and work.部門名稱=t.部門名稱
          ???????? C:用嵌套work表和嵌套部門表,在嵌套work表中檢索出姓名和職工號(hào)都在嵌套部門存在的職工資料
          ?????????? select * from 嵌套work where 職工號(hào) in (select 職工號(hào) from 嵌套部門) and 姓名 in (select 姓名 from 嵌套部門) [察看結(jié)果,分析原因]
          ?????????? 改:select * from 嵌套work a,嵌套部門 b where a.職工號(hào)=b.職工號(hào) and a.姓名=b.姓名
          ?????????? 改:select * from 嵌套work where 職工號(hào)=(select 職工號(hào) from 嵌套部門) and 姓名=(select 姓名 from 嵌套部門) [行嗎?為什么,分析原因?]

          在嵌套中使用exists關(guān)鍵字[存在]
          例:1:用嵌套work表和嵌套部門表,在嵌套work表中檢索出姓名和職工號(hào)都在嵌套部門存在的職工資料
          ???? select * from 嵌套work a where exists (select * from 嵌套部門 b where a.姓名=b.姓名 and a.職工號(hào)=b.職工號(hào))
          ?? 2:在work表檢索出在部門表沒有的職工
          ???? select * from work where not exists (select * from 部門 where 部門.部門編號(hào)=work.部門編號(hào))
          ???? 能否改成:select * from work where exists (select * from 部門 where 部門.部門編號(hào)<>work.部門編號(hào))
          ??????????????????????
          在列清單中使用select
          例:1:在work1表和部門表中檢索出所有部門的部門名稱和基本工資總和
          ??? select 部門名稱,(select sum(基本工資) from work1 b where a.部門編號(hào)=b.部門編號(hào)) from 部門 a
          ?? 2:檢索各部門的職工人數(shù)
          ??? select 部門編號(hào),部門名稱,(select count(職工號(hào)) from work1 a where a.部門編號(hào)=b.部門編號(hào)) as 人數(shù) from 部門 b
          ?? 3:在商品表和銷售表中查詢每一職工的姓名,所屬部門,銷售總量??????????????????
          ??? select 姓名,所屬部門,(select sum(銷售量) from 商品銷售 a where a.職工號(hào)=b.職工號(hào)) as 銷售總量 from 嵌套部門 b

          H:分布式查詢
          我們以前的查詢都只是基于一個(gè)服務(wù)器中的一個(gè)數(shù)據(jù)庫(kù)的查詢,如果一個(gè)查詢是要跨越一個(gè)服務(wù)器,像這樣的查詢就是分布式查詢,那么我們以看到分布查詢就是數(shù)據(jù)源自于兩個(gè)服務(wù)器.要進(jìn)行分布式查詢必須先創(chuàng)建一個(gè)“鏈接服務(wù)器”,以便讓本地的用戶能夠映射到過程服務(wù)器.
          “鏈接服務(wù)器”的創(chuàng)立
          ???? A:在“鏈接服務(wù)器”里面輸入以后為了方便訪問該鏈接服務(wù)器的名稱[任意]
          ???? B:在“提供程序名稱”里面選擇“Microsoft OLE DB Provider for SQL Server”
          ???? C:在“數(shù)據(jù)源”里面輸入服務(wù)器的網(wǎng)絡(luò)名
          ???? D:本地登錄,遠(yuǎn)程用戶和遠(yuǎn)程密碼里面分別輸入一個(gè)本地登錄用戶,遠(yuǎn)程登錄和遠(yuǎn)程密碼以便讓本地SQL Server登錄映射為鏈接服務(wù)器上的用戶
          ???? E:訪問方法:格式:鏈接服務(wù)器的名稱.數(shù)據(jù)庫(kù)名.dbo.表名
          ?????? 鏈接服務(wù)器有兩個(gè)特點(diǎn):
          ?????????? 1:通過鏈接服務(wù)器不能刪除鏈接源服務(wù)器的任何對(duì)像.
          ?????????? 2:能過鏈接服務(wù)器可以對(duì)鏈接源服務(wù)器的表進(jìn)行insert,updae,delete操作.

          ?


          視圖
          1:什么是視圖
          2:視圖和查詢的區(qū)別
          3:視圖的優(yōu)點(diǎn)
          4:如何創(chuàng)建和管理視圖
          5:如何通過視圖修改基本表的數(shù)據(jù)
          6:如何通過視圖實(shí)現(xiàn)數(shù)據(jù)的安全性

          A:什么是視圖:
          視圖(view):從一個(gè)或幾個(gè)基本表中根據(jù)用戶需要而做成一個(gè)虛表
          ??? 1:視圖是虛表,它在存儲(chǔ)時(shí)只存儲(chǔ)視圖的定義,而沒有存儲(chǔ)對(duì)應(yīng)的數(shù)據(jù)
          ??? 2:視圖只在剛剛打開的一瞬間,通過定義從基表中搜集數(shù)據(jù),并展現(xiàn)給用戶

          B:視圖與查詢的區(qū)別:
          視圖和查詢都是用由sql語句組成,這是他們相同的地方,但是視圖和查詢有著本質(zhì)區(qū)別:
          它們的區(qū)別在于:1:存儲(chǔ)上的區(qū)別:視圖存儲(chǔ)為數(shù)據(jù)庫(kù)設(shè)計(jì)的一部分,而查詢則不是.
          ????????????? 2:更新限制的要求不一樣
          ??????????????? 要注意:因?yàn)橐晥D來自于表,所以通過視圖可以間接對(duì)表進(jìn)行更新,我們也可以通過update語句對(duì)表進(jìn)行更新,但是對(duì)視圖和查詢更新限制是不同的,以下我們會(huì)知道雖然通過視圖可以間接更新表但是有很多限制.
          ????????????? 3:排序結(jié)果:通過sql語句,可以對(duì)一個(gè)表進(jìn)行排序,而視圖則不行.
          ??????????????? 比如:創(chuàng)建一個(gè)含有order by子句的視圖,看一下可以成功嗎?

          C:視圖的優(yōu)點(diǎn):?
          為什么有了表還要引入視圖呢?這是因?yàn)橐晥D具有以下幾個(gè)優(yōu)點(diǎn):
          1:能分割數(shù)據(jù),簡(jiǎn)化觀點(diǎn)
          ? 可以通過select和where來定義視圖,從而可以分割數(shù)據(jù)基表中某些對(duì)于用戶不關(guān)心的數(shù)據(jù),使用戶把注意力集中到所關(guān)心的數(shù)據(jù)列.進(jìn)一步簡(jiǎn)化瀏覽數(shù)據(jù)工作.
          2:為數(shù)據(jù)提供一定的邏輯獨(dú)立性
          ? 如果為某一個(gè)基表定義一個(gè)視圖,即使以后基本表的內(nèi)容的發(fā)生改變了也不會(huì)影響“視圖定義”所得到的數(shù)據(jù)
          3:提供自動(dòng)的安全保護(hù)功能
          ? 視圖能像基本表一樣授予或撤消訪問許可權(quán).
          4:視圖可以間接對(duì)表進(jìn)行更新,因此視圖的更新就是表的更新

          D:視圖的創(chuàng)建和管理
          ? 視圖的創(chuàng)建
          ? 1:通過sql語句
          ??? 格式:create view 視圖名 as select 語句
          ???????? 試一試:分別創(chuàng)建關(guān)于一個(gè)表或多個(gè)表的視圖[因?yàn)橐晥D可以來自于多表]
          ? 2:通過企業(yè)管理器??
          ??? 說明:1:在完成視圖的創(chuàng)立之后,就可以像使用基本表一樣來使用視圖
          ???????? 2:在創(chuàng)建視圖時(shí),并非所有的select子查詢都可用
          ?????????? 如:compute和compute by,order by[除非與top一起連用]?
          ???????? 3:但在查詢時(shí),依然都可以用在創(chuàng)建時(shí)禁用的select子查詢
          ???????? 4:在視圖創(chuàng)建時(shí),必須為沒有標(biāo)題列指定標(biāo)題[思考:能否不用select語句來創(chuàng)建一個(gè)視圖]
          ?
          ? 視圖的刪除:
          ? 1:通過sql語句:drop view 視圖名
          ? 2:通過企業(yè)管理器
          ??? 說明:與刪除表不同的是,刪除視圖后只是刪除了視圖了定義,并沒有刪除表中的數(shù)據(jù).[查看相關(guān)性]
          ?
          ? 修改視圖的定義
          ? 1:通過企業(yè)管理器
          ? 2:通過sql語句:
          ??? 格式:alter view 視圖名 as 新的select語句

          瀏覽視圖信息 sp_helptext 視圖名 [查看視圖創(chuàng)建的語句]

          E:如何通過視圖修改基本表的數(shù)據(jù).
          ? 1:在視圖上使用insert語句
          ??? 通過視圖插入數(shù)據(jù)與直接在表中插入數(shù)據(jù)一樣,但視圖畢竟不是基本表.因此在進(jìn)行數(shù)據(jù)插入時(shí)還是有一定的限制
          ????? 1:如果視圖上沒有包括基本表中屬性為not null[不能為空]的列,那么插入操作會(huì)因?yàn)槟切┝惺莕ull值而失敗.
          ????? 2:如果某些列因?yàn)槟承┮?guī)則或約束的限制而不能直接接受從視圖插入的列時(shí),插入會(huì)失敗
          ????? 3:如果在視圖中包含了使用統(tǒng)計(jì)函數(shù)的結(jié)果,或是包含計(jì)算列,則插入操作會(huì)失敗
          ????? 4:不能在使用了distinct語句的視圖中插入值
          ????? 5:不能在使用了group by語句的視圖中插入值

          ? 2:使用update更新視圖中的數(shù)據(jù)
          ?????? 1:更新視圖與更新表格一樣,但是在視圖中使用了多個(gè)基本表連接的情況下,每次更新操作只能更新來自基本表的一個(gè)數(shù)據(jù)列
          ???????? 例如:創(chuàng)建以下視圖:create view del as
          ????????????????????????? select 職工號(hào),姓名,部門名稱,負(fù)責(zé)人 from work1,部門
          ????????????????????????? where work1.部門編號(hào)=部門.部門編號(hào)
          ????????????? 如果再執(zhí)行下面的語句時(shí):
          ??????????????????????? update del set 職工號(hào)=\'001\',部門名稱=\'wenda\' where 職工號(hào)=\'01\'[出現(xiàn)錯(cuò)誤]
          ????????????? 只能夠改成:update del set 職工號(hào)=\'001\' where 職工號(hào)=\'01\'
          ??????????????????????? update del set 部門名稱=\'wenda\' where 職工號(hào)=\'01\'
          ?????? 2:不能在使用了distinct語句的視圖中更新值
          ?????? 3:不能在使用了group by語句的視圖中更新值
          ?
          ? 3:使用delete刪除視圖中數(shù)據(jù).
          ??? 通過視圖刪除數(shù)據(jù)最終體現(xiàn)為從基本表中刪除數(shù)據(jù)
          ??? 格式:delete 視圖名 [where 條件]
          ??? 說明:當(dāng)視圖由兩個(gè)以上的基表構(gòu)成時(shí),不允許刪除視圖的數(shù)據(jù)
          ??? 例如:建一個(gè)視圖kk
          ???????? create view kk as
          ???????? select 職工號(hào),姓名,性別,部門名稱 from work1,部門 where work1.部門編號(hào)=部門.部門編號(hào) [試著去刪除]

          ??? 使用with check option的視圖
          ??? 如果不了解視圖定義內(nèi)容,則常常會(huì)發(fā)生向視圖中輸入不符合視圖定義的數(shù)據(jù)的情況.
          ??? 比如:create view xm as
          ???????? select * from work where 性別=\'男\(zhòng)'
          ???????? 完全可以插入insert xm values(\'001\',\'女\',23,\'2400\'....)
          盡管從意義上來說是不合理的,但是上述語句是正確的.為了防止這種情況的發(fā)生,可以使用with check option子句來對(duì)插入的或更改的數(shù)據(jù)進(jìn)行限制.
          ??? 比如:create view xm as
          ???????? select * from work where 性別=\'男\(zhòng)' with check option

          ??? 使用schemabinding的視圖[使用綁定到構(gòu)架]
          我們知道視圖是依賴于表,如果在一個(gè)表中創(chuàng)建一個(gè)視圖,今后如果這個(gè)表被刪除了,則這個(gè)視圖將不可再用了.為了防止用戶刪除一個(gè)有視圖在引用的表,可以在創(chuàng)建視圖的時(shí)候加上schemabinding關(guān)鍵字.
          ??? 比如:create view 基本工資 with SCHEMABINDING
          ???????? as select 姓名,性別,基本工資 from dbo.work
          ??? 說明:1:不能使用“*”來創(chuàng)建此類型的視圖
          ???????? 2:創(chuàng)建此類型的視圖時(shí),一定要加上dbo.表名.
          ???????? 3:如果在某個(gè)表中定義了此類視圖,則用戶將不能對(duì)表的結(jié)構(gòu)進(jìn)行修改,否則會(huì)刪除這些綁定
          ???????? 4:如果用戶對(duì)表的結(jié)構(gòu)進(jìn)行列改名,則會(huì)刪除綁定而且視圖不可用.
          ???????? 5:如果用戶對(duì)表的結(jié)構(gòu)進(jìn)行列的類型或者大小修改,則會(huì)刪除綁定但視圖可用,此時(shí)用戶可以刪除視圖所引用的表.
          ??
          ??? 使用with encryption對(duì)視圖進(jìn)行加密
          為了保護(hù)創(chuàng)建視圖定義的原代碼,可以對(duì)視圖進(jìn)行加密.
          ??? 比如:create view kk with encryption
          ???????? as select * from work where 職稱=\'經(jīng)理\'
          ??? 用sp_helptext來查看一下.或用企業(yè)管理器查看一下.
          ??? 說明:如果應(yīng)用此項(xiàng)用戶將無法設(shè)計(jì)視圖

          F:使用視圖加強(qiáng)數(shù)據(jù)的安全
          ? 一般通過使用視圖共有三種途徑加強(qiáng)數(shù)據(jù)的安全性????
          ???? A:對(duì)不同用戶授予不同的使用權(quán).
          ???? B:通過使用select子句限制用戶對(duì)某些底層基表的列的訪問
          ???? C:通過使用where子句限制用戶對(duì)某些底層基表的行的訪問
          ? 對(duì)不同用戶授予不同的權(quán)限



          連接查詢

          通過連接運(yùn)算符可以實(shí)現(xiàn)多個(gè)表查詢。連接是關(guān)系數(shù)據(jù)庫(kù)模型的主要特點(diǎn),也是它區(qū)別于其它類型數(shù)據(jù)庫(kù)管理系統(tǒng)的一個(gè)標(biāo)志。

          在關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)中,表建立時(shí)各數(shù)據(jù)之間的關(guān)系不必確定,常把一個(gè)實(shí)體的所有信息存放在一個(gè)表中。當(dāng)檢索數(shù)據(jù)時(shí),通過連接操作查詢出存放在多個(gè)表中的不同實(shí)體的信息。連接操作給用戶帶來很大的靈活性,他們可以在任何時(shí)候增加新的數(shù)據(jù)類型。為不同實(shí)體創(chuàng)建新的表,爾后通過連接進(jìn)行查詢。

          連接可以在SELECT 語句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出連接時(shí)有助于將連接操作與WHERE子句中的搜索條件區(qū)分開來。所以,在Transact-SQL中推薦使用這種方法。

          SQL-92標(biāo)準(zhǔn)所定義的FROM子句的連接語法格式為:

          FROM join_table join_type join_table

          [ON (join_condition)]

          其中join_table指出參與連接操作的表名,連接可以對(duì)同一個(gè)表操作,也可以對(duì)多表操作,對(duì)同一個(gè)表操作的連接又稱做自連接。

          join_type 指出連接類型,可分為三種:內(nèi)連接、外連接和交叉連接。內(nèi)連接(INNER JOIN)使用比較運(yùn)算符進(jìn)行表間某(些)列數(shù)據(jù)的比較操作,并列出這些表中與連接條件相匹配的數(shù)據(jù)行。根據(jù)所使用的比較方式不同,內(nèi)連接又分為等值連接、自然連接和不等連接三種。

          外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN)、右外連接(RIGHT OUTER JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOIN或FULL JOIN)三種。與內(nèi)連接不同的是,外連接不只列出與連接條件相匹配的行,而是列出左表(左外連接時(shí))、右表(右外連接時(shí))或兩個(gè)表(全外連接時(shí))中所有符合搜索條件的數(shù)據(jù)行。

          交叉連接(CROSS JOIN)沒有WHERE 子句,它返回連接表中所有數(shù)據(jù)行的笛卡爾積,其結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。

          連接操作中的ON (join_condition) 子句指出連接條件,它由被連接表中的列和比較運(yùn)算符、邏輯運(yùn)算符等構(gòu)成。

          無論哪種連接都不能對(duì)text、ntext和image數(shù)據(jù)類型列進(jìn)行直接連接,但可以對(duì)這三種列進(jìn)行間接連接。例如:

          SELECT p1.pub_id,p2.pub_id,p1.pr_info

          FROM pub_info AS p1 INNER JOIN pub_info AS p2

          ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

          ?

          (一)內(nèi)連接

          內(nèi)連接查詢操作列出與連接條件匹配的數(shù)據(jù)行,它使用比較運(yùn)算符比較被連接列的列值。內(nèi)連接分三種:

          1、等值連接:在連接條件中使用等于號(hào)(=)運(yùn)算符比較被連接列的列值,其查詢結(jié)果中列出被連接表中的所有列,包括其中的重復(fù)列。

          2、不等連接: 在連接條件使用除等于運(yùn)算符以外的其它比較運(yùn)算符比較被連接的列的列值。這些運(yùn)算符包括>、>=、<=、<、!>、!<和<>。

          3、自然連接:在連接條件中使用等于(=)運(yùn)算符比較被連接列的列值,但它使用選擇列表指出查詢結(jié)果集合中所包括的列,并刪除連接表中的重復(fù)列。

          例,下面使用等值連接列出authors和publishers表中位于同一城市的作者和出版社:

          SELECT *

          FROM authors AS a INNER JOIN publishers AS p

          ON a.city=p.city

          ?

          又如使用自然連接,在選擇列表中刪除authors 和publishers 表中重復(fù)列(city和state):

          SELECT a.*,p.pub_id,p.pub_name,p.country

          FROM authors AS a INNER JOIN publishers AS p

          ON a.city=p.city

          ?

          (二)外連接

          內(nèi)連接時(shí),返回查詢結(jié)果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和連接條件的行。而采用外連接時(shí),它返回到查詢結(jié)果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時(shí))、右表(右外連接時(shí))或兩個(gè)邊接表(全外連接)中的所有數(shù)據(jù)行。

          如下面使用左外連接將論壇內(nèi)容和作者信息連接起來:

          SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b

          ON a.username=b.username

          ?

          下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:

          SELECT a.*,b.*

          FROM city as a FULL OUTER JOIN user as b

          ON a.username=b.username

          ?

          (三)交叉連接

          交叉連接不帶WHERE 子句,它返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積,返回到結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。

          例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數(shù)將等

          于6*8=48行。

          SELECT type,pub_name

          FROM titles CROSS JOIN publishers

          ORDER BY typ

          posted on 2006-09-14 08:49 liaojiyong 閱讀(703) 評(píng)論(0)  編輯  收藏 所屬分類: MSSQL

          主站蜘蛛池模板: 宁安市| 莲花县| 五家渠市| 遂宁市| 方正县| 屯门区| 安丘市| 弥渡县| 东港市| 钟祥市| 桂平市| 密云县| 河源市| 清远市| 九龙县| 黎平县| 慈利县| 临沭县| 都昌县| 长春市| 巴彦淖尔市| 海阳市| 嘉善县| 桃园市| 连州市| 抚州市| 天镇县| 鹿泉市| 苍溪县| 巴林右旗| 毕节市| 奉化市| 渭南市| 辽中县| 阳江市| 天峨县| 怀来县| 富裕县| 文成县| 呼玛县| 通山县|