1. 表A有5行数据,表B有7行数据,问Inner Join最多返回几行数据,Left Join最多返回几行数据,分别在什么情况下?

Inner Join 是返回关联表的Cartesian product,然后根据On条件剔除掉不符合的行。这样的话,返回最多行的情况就是保留整个Cartesian product,On对每一行都为True.

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

Outer Join 是返回关联表的Cartesian product,然后根据On条件剔除掉不符合的行,再将添加外部行。

外部行是指保留表中根据On条件在非保留表中找不到与之匹配行的行,非保留表的行数据用NULL值占位。

返回最多行的情况也是返回整个Cartesian product=35行。

最大返回行的示例代码:

CodeCREATE TABLE tb1 (id INT,val NVARCHAR(10))
CREATE TABLE tb2 (id INT,val NVARCHAR(10))
GO
INSERT 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')
GO
SELECT * FROM tb2 a JOIN tb1 b
ON a.id=b.id;
SELECT * FROM tb2 a LEFT OUTER JOIN tb1 b
ON a.id=b.id
GO

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

col1 col2
1 1
1 NULL
Null 1
Null Null

这是一个非常基础和细节性的问题,如果能用电脑,试一下就知道答案了,但是试题上碰到,很少人能全写对。定义问题,COUNT函数的定义如下:

返回组中的项。

COUNT(*) 返回组中的项数。包括 NULL 值和重复项。

COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。

COUNT(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非空值的数量。

同时,NULL参与的运算,结果始终为NULL。这样结果就比较明显了:4    2    2    1    1    1    1

3.如何得到一个1~9之间的随机整数(包含1和9)?表Tb只有一列col,包含很多个这种整数,查询Tb得到如下结果,Range随机整数的范围,Count表示计数

Range Count
1~3  
4~5  
6~9  

1~9之间随机整数:SELECT cast(ceiling(rand() * 9) AS  INT )

rand()返加始终会是大于0且小于1的float,ceiling取大于或者等于给定表达式的最小整数,所以会得1~9之间的随机整数。

CodeCREATE TABLE tb4 (id INT)
GO
DECLARE @i INT =100
WHILE @i>0
BEGIN
INSERT INTO tb4 VALUES(cast(ceiling(rand() * 9) AS INT ));
SET @i=@i-1
END
GO
--先根据不同区段分组统计并给数据打上flag,再根据flag去sum得到总数
;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上有数据库A,其镜像数据库是服务器Server2上的AM。Server2上定时生成AM的Snapshot库AS。Server2上有一个库AU,这个库中没有表,全是指向的AS的视图。

   用户只能通过AU库的视图去访问AS的数据。请问该如何实现这种安全性要求。

这其实是一个Ownership chain的问题。参考资料:Ownership Chains

   分析:

a. 必需有一个login(就叫tb吧)对于数据库A,AS和AU具有访问权限.假设某个用户的login叫做vw,它必需是库A和AS的public成员,同时还要对库AU中视图具有查询权限.

b. login tb在库A和AU中必需相应表和视图的Owner

c. 由于Mirroring db和Snapshot的安全配置继承自主库A且不可修改,所以在Server2上必需创建同名和同SID的login.

d. 在Server2上启用cross db ownership chaining,允许跨库的所有权链接.

测试代码:

测试代码中主库为MirrorTest,镜像库也是MirrorTest,快照库是MT_SS,视图库为MT_VIEW

a. 在Server1上创建库和相关配置

Code--create the testing database and tables
use master
go
CREATE DATABASE [MirrorTest]
go
use [MirrorTest]
go
EXEC dbo.sp_changedbowner @loginame = N'sa', @map = false
go
select * into dbo.tb1 from sys.objects
select * into dbo.tb2 from sys.indexes
go --create login and configure security
use master
go
create login tb with password ='joe123',check_policy=off
create login vw with password ='joe123',check_policy=off
--select name,sid from sys.server_principals where name in('vw','tb')
--tb 0xEF38C47530A81041A4F0455F7DCE71E9
--vw 0x1652B3E456CAE549B263C6C06D6D61B1
go
use [MirrorTest]
go
create user tb
create user vw
--set USER tb as the owner of tb1&tb2
ALTER AUTHORIZATION ON dbo.tb1 TO tb
ALTER AUTHORIZATION ON dbo.tb2 TO tb
go

b. 在成功配置镜像会话之后,再在SERVER2上配置

Codeuse master
go
create login tb with password ='joe123',check_policy=off,sid=0xEF38C47530A81041A4F0455F7DCE71E9
create login vw with password ='joe123',check_policy=off,sid=0x1652B3E456CAE549B263C6C06D6D61B1
go
--drop database MT_SS
--create Snapshot of Mirroring db MirrorTest
create database MT_SS on
(Name='MirrorTest',filename='F:\SQL-DATA\MT.mdf')
as snapshot of MirrorTest
go --create view
use master
go
create database MT_View
go
use MT_View
go
create user tb
create user vw
go
create view dbo.v1
as
select * from MT_ss.dbo.tb1
go
create view dbo.v2
as
select * from MT_ss.dbo.tb2
go --set USER tb as the owner of v1&vv2
ALTER AUTHORIZATION ON dbo.v1 TO tb
ALTER AUTHORIZATION ON dbo.v2 TO tb
grant select on v1 to vw
grant select on v2 to vw
go --select * from sys.configurations where name='cross db ownership chaining'
exec sp_configure 'cross db ownership chaining',1
reconfigure with override

这个时候以vw登录SERVER2就可以实现题目所要求的.没将USER tb和vm添加到某个role中,但是tb做为对象的owner,具有较高权限.vm只是相关库public和视图的查询权限,不能直接访问主库和快照中的数据.

小结:

基础知识很重要,不然就会用时方恨少.

记录几个基础的SQL开发题的更多相关文章

  1. 【T-SQL基础】01.单表查询-几道sql查询题

    概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...

  2. SQL开发中容易忽视的一些小地方(一)

    原文:SQL开发中容易忽视的一些小地方(一) 写此系列文章缘由: 做开发三年来(B/S),发现基于web 架构的项目技术主要分两大方面: 第一:C#,它是程序的基础,也可是其它开发语言,没有开发语言也 ...

  3. 第87节:Java中的Bootstrap基础与SQL入门

    第87节:Java中的Bootstrap基础与SQL入门 前言复习 什么是JQ? : write less do more 写更少的代码,做更多的事 找出所有兄弟: $("div" ...

  4. 最强最全面的Hive SQL开发指南,超四万字全面解析

    本文整体分为两部分,第一部分是简写,如果能看懂会用,就直接从此部分查,方便快捷,如果不是很理解此SQL的用法,则查看第二部分,是详细说明,当然第二部分语句也会更全一些! 第一部分: hive模糊搜索表 ...

  5. SQL开发技巧(二)

    本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上-- 文章系列目录 SQL开发技巧(一) SQL开 ...

  6. 笔试测试开发题三道(python)

    笔试遇到的三道测试开发题,虽然都不难,但关键还是思路吧!我想在开发东西的时候应该具备的就是思路,有了思路尝试去写,或查相关文档或代码,在此基础上需要不断调整最终达到需求.思路又是在不断练习中获得的. ...

  7. SQL开发技巧(二) 【转】感觉他写的很好

    本文转自: http://www.cnblogs.com/marvin/p/DevelopSQLSkill_2.html 本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列 ...

  8. SQL开发中容易忽视的一些小地方(二)

    原文:SQL开发中容易忽视的一些小地方(二) 目的:继上一篇:SQL开发中容易忽视的一些小地方(一) 总结SQL中的null用法后,本文我将说说表联接查询. 为了说明问题,我创建了两个表,分别是学生信 ...

  9. SQL开发中容易忽视的一些小地方(六)

    原文:SQL开发中容易忽视的一些小地方(六) 本文主旨:条件列上的索引对数据库delete操作的影响. 事由:今天在博客园北京俱乐部MSN群中和网友讨论了关于索引对delete的影响问题,事后感觉非常 ...

随机推荐

  1. uvm学习杂记

    一个类,只定义了而没有实例化,是没有任何意义的,但也有特殊情况,对于一个静态类,即其成员变量都是静态的,不实例化也可以正常使用: 类要想和DUT通信,不能在类里定义接口,会报错,只能在类里定义虚拟接口 ...

  2. awk分割列-【AWK学习之旅】

    ---===AWK学习之旅===--- awk 内置分割函数:split,将列按照指定分割符,分割成数组 用法:split(str1,array,"分隔符") 文件内容: [roo ...

  3. Maven:Eclipse上Maven的配置

    Eclipse上Maven的配置: 步骤: ①Maven下载地址: http://maven.apache.org/download.cgi# ②解压apache-maven-3.5.0-bin.zi ...

  4. sed 案例

    sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器.能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上 ...

  5. jQuery的序列化元素 serialize()方法 serializeArray()方法 param()方法

    当提交的表单元素较多时用serialize()方法,serialize()方法也是作用于一个jQuery的对象,它能够将DOM元素内容序列化为字符串,用于Ajax请求. serialize() 方法通 ...

  6. openlayers2地图控件扩展:图例控件LegendControl

    因项目需要在地图中增加图例,以便专题地图查看或输出. 实现思路,折线和多边形图例直接由样式属性创建,多边形直接设置div的样式:折线通过创建svg,设置polyline的样式:点要素的图例比较复杂,目 ...

  7. linux下gzip压缩同样内容大小不一样

    一份数据,两种传输方式进行收集. 一份数据:有多台数据采集节点或者多个数据源 两种方式:一种是从依次多个采集节点或者多个数据源将数据拷贝过来,合并为一个文件 另外一种是多个采集节点或者数据源同时向汇总 ...

  8. JQuery中选择元素的方法:

    document.getElementById('div1');document.getElementsByTagName('div');getByClass(document,'box'); $(' ...

  9. Spring获取bean的几种方式

    工作中需要对一个原本加载属性文件的工具类修改成对数据库的操作当然,ado层已经写好,但是需要从Spring中获取bean,然而,工具类并没有交给Spring来管理,所以需要通过方法获取所需要的bean ...

  10. python学习笔记(threading接口性能压力测试)

    又是新的一周 延续上周的进度 关于多进程的学习 今天实践下 初步设计的接口性能压力测试代码如下: #!/usr/bin/env python # -*- coding: utf_8 -*- impor ...