国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

記錄幾個基礎的SQL開發(fā)題

2024-07-21 02:49:41
字體:
來源:轉載
供稿:網(wǎng)友
記錄幾個基礎的SQL開發(fā)題

一些很基礎,但是在第一時間,不借助工具我卻沒能全答對的問題。

1. 表A有5行數(shù)據(jù),表B有7行數(shù)據(jù),問Inner Join最多返回幾行數(shù)據(jù),Left Join最多返回幾行數(shù)據(jù),分別在什么情況下?

Inner Join 是返回關聯(lián)表的Cartesian PRoduct,然后根據(jù)On條件剔除掉不符合的行。這樣的話,返回最多行的情況就是保留整個Cartesian product,On對每一行都為True.

即最多返回5*7=35行。

Outer Join 是返回關聯(lián)表的Cartesian product,然后根據(jù)On條件剔除掉不符合的行,再將添加外部行。

外部行是指保留表中根據(jù)On條件在非保留表中找不到與之匹配行的行,非保留表的行數(shù)據(jù)用NULL值占位。

返回最多行的情況也是返回整個Cartesian product=35行。

最大返回行的示例代碼:

CodeCREATE TABLE tb1 (id INT,val NVARCHAR(10))CREATE TABLE tb2 (id INT,val NVARCHAR(10))GOINSERT INTO tb1 VALUES(1,'a'),(1,'b'),(1,'c'),(1,'d'),(1,'e')INSERT INTO tb2 VALUES(1,'a'),(1,'b'),(1,'c'),(1,'d'),(1,'e'),(1,'f'),(1,'g')GOSELECT * FROM tb2 a JOIN  tb1 bON a.id=b.id;SELECT * FROM tb2 a  LEFT OUTER JOIN  tb1 bON a.id=b.idGO

2. 有表Tb如下,寫出SELECT COUNT(*),COUNT(col1),COUNT(col2),COUNT(DISTINCT col1),COUNT(DISTINCT col2),COUNT(col1+col2),COUNT(col1-col2) FROM Tb的返回結果。

col1col2
11
1NULL
Null1
NullNull

這是一個非?;A和細節(jié)性的問題,如果能用電腦,試一下就知道答案了,但是試題上碰到,很少人能全寫對。定義問題,COUNT函數(shù)的定義如下:

返回組中的項。

COUNT(*) 返回組中的項數(shù)。包括 NULL 值和重復項。

COUNT(ALL expression) 對組中的每一行都計算 expression 并返回非空值的數(shù)量。

COUNT(DISTINCT expression) 對組中的每一行都計算 expression 并返回唯一非空值的數(shù)量。

同時,NULL參與的運算,結果始終為NULL。這樣結果就比較明顯了:4 2 2 1 1 1 1

3.如何得到一個1~9之間的隨機整數(shù)(包含1和9)?表Tb只有一列col,包含很多個這種整數(shù),查詢Tb得到如下結果,Range隨機整數(shù)的范圍,Count表示計數(shù)

RangeCount
1~3
4~5
6~9

1~9之間隨機整數(shù):SELECT cast(ceiling(rand() * 9) AS INT )

rand()返加始終會是大于0且小于1的float,ceiling取大于或者等于給定表達式的最小整數(shù),所以會得1~9之間的隨機整數(shù)。

CodeCREATE TABLE tb4 (id INT)GODECLARE @i INT =100WHILE @i>0BEGIN INSERT INTO tb4 VALUES(cast(ceiling(rand() * 9) AS  INT )); SET @i=@i-1ENDGO--先根據(jù)不同區(qū)段分組統(tǒng)計并給數(shù)據(jù)打上flag,再根據(jù)flag去sum得到總數(shù);WITH cte AS (SELECT ID,COUNT(id)AS counts,( CASE WHEN id BETWEEN 1 AND 3 THEN 1      WHEN id BETWEEN 4 AND 5 THEN 2      WHEN id BETWEEN 6 AND 9 THEN 3 END  ) as flag FROM tb4 GROUP BY id)SELECT ( CASE flag WHEN 1 THEN '1~3'      WHEN 2  THEN '4~5'  WHEN 3 THEN '6~9' END  ) as [Range],SUM(counts)AS [Count]FROM cte GROUP BY flag
4. Server1上有數(shù)據(jù)庫A,其鏡像數(shù)據(jù)庫是服務器Server2上的AM。Server2上定時生成AM的Snapshot庫AS。Server2上有一個庫AU,這個庫中沒有表,全是指向的AS的視圖。

用戶只能通過AU庫的視圖去訪問AS的數(shù)據(jù)。請問該如何實現(xiàn)這種安全性要求。

這其實是一個Ownership chain的問題。參考資料:Ownership Chains

分析:

a. 必需有一個login(就叫tb吧)對于數(shù)據(jù)庫A,AS和AU具有訪問權限.假設某個用戶的login叫做vw,它必需是庫A和AS的public成員,同時還要對庫AU中視圖具有查詢權限.

b. login tb在庫A和AU中必需相應表和視圖的Owner

c. 由于Mirroring db和Snapshot的安全配置繼承自主庫A且不可修改,所以在Server2上必需創(chuàng)建同名和同SID的login.

d. 在Server2上啟用cross db ownership chaining,允許跨庫的所有權鏈接.

測試代碼:

測試代碼中主庫為MirrorTest,鏡像庫也是MirrorTest,快照庫是MT_SS,視圖庫為MT_VIEW

a. 在Server1上創(chuàng)建庫和相關配置

Code--create the testing database and tablesuse mastergoCREATE DATABASE [MirrorTest] gouse [MirrorTest] goEXEC dbo.sp_changedbowner @loginame = N'sa', @map = falsegoselect * into dbo.tb1 from sys.objectsselect * into dbo.tb2 from sys.indexesgo--create login and configure securityuse mastergocreate login tb with passWord ='joe123',check_policy=offcreate login vw with password ='joe123',check_policy=off--select name,sid from sys.server_principals where name in('vw','tb')--tb0xEF38C47530A81041A4F0455F7DCE71E9--vw0x1652B3E456CAE549B263C6C06D6D61B1gouse [MirrorTest] go create user tbcreate user vw--set USER tb as the owner of tb1&tb2ALTER AUTHORIZATION ON dbo.tb1 TO tbALTER AUTHORIZATION ON dbo.tb2 TO tbgo

b. 在成功配置鏡像會話之后,再在SERVER2上配置

Codeuse mastergocreate login tb with password ='joe123',check_policy=off,sid=0xEF38C47530A81041A4F0455F7DCE71E9create login vw with password ='joe123',check_policy=off,sid=0x1652B3E456CAE549B263C6C06D6D61B1go--drop database MT_SS--create Snapshot of Mirroring db MirrorTestcreate database MT_SS on(Name='MirrorTest',filename='F:/SQL-DATA/MT.mdf')as snapshot of MirrorTestgo--create viewuse mastergocreate database MT_Viewgouse MT_Viewgocreate user tbcreate user vwgocreate view dbo.v1 as select * from MT_ss.dbo.tb1gocreate view dbo.v2 as select * from MT_ss.dbo.tb2go--set USER tb as the owner of v1&vv2ALTER AUTHORIZATION ON dbo.v1 TO tbALTER AUT
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 洛川县| 苍梧县| 尼木县| 阿荣旗| 偏关县| 五家渠市| 勐海县| 罗田县| 犍为县| 南开区| 沛县| 云梦县| 新野县| 青海省| 施秉县| 伊通| 曲沃县| 镇平县| 陆河县| 肇源县| 府谷县| 繁峙县| 沛县| 阿克陶县| 离岛区| 绩溪县| 淳化县| 博野县| 新密市| 财经| 岫岩| 静乐县| 华池县| 顺平县| 墨脱县| 福清市| 西平县| 抚州市| 通渭县| 岚皋县| 德庆县|