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. maven 项目转 gradle

    打开maven 项目的根目录,CMD 执行命令:gradle init --type pom maven项目就变成了gradle项目

  2. centos 安装 mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz 详细步骤

    1.卸载Linux系统上自带的mysql插件(old版本) 查找mysql相关安装: rpm -qa|grep -i mysql 可能会出现以下的一个或多个,没有更好,说明你的系统很干净,但是以防万一 ...

  3. 低版本C++ string的万能转换,从long string 之间的转换来看看

    string 转 long 那必须是万年atoi(),不过得配合c_str()使用! [plain] view plain copy #include <string> #include  ...

  4. 二路归并排序,利用递归,时间复杂度o(nlgn)

    public class MergeSort { public void mergeSort(int[]data, int left, int right) { if(left >= right ...

  5. Web Service和Servlet的区别

    没接触过web service今天看了一篇文章转过来. 在最开始学习Web Service时候,总觉得Web Service和Servlet没有什么区别,觉得Servlet可以对Http请求进行相应并 ...

  6. TF卡.购买(20180925)

    1.准备买 2个 一个 用于 老的手机"红米Note",一个用于现在我的手机"红米Note4X". 之前,这2个手机都是用的 那个坏掉的64g的tf卡 2.刚问 ...

  7. 测绘类SCI

    GeoInformatica(国际地理信息系统计算机科学进展杂志)美国International Journal of Geographical Information Science(国际地理信息科 ...

  8. angular-schema-form 自动表单生成

    基本用法 通过bower安装之后,将schemaForm模块载入到模块定义中,fuse中安装第三方包需要在app/core/core.module.js中声明. 然后在controller里面,将sc ...

  9. PHP超级全局变量、魔术变量和魔术函数的区别和联系

    PHP超级全局变量.魔术变量和魔术函数的区别和联系 一.总结 一句话总结:PHP超级全局变量主要用于web开发,魔术变量主要用于输出当前对象的信息,魔术函数则是对象的常用方法 相同点: 1.PHP超级 ...

  10. Linux 任务控制(bg job fg nohup &) (转)

    常用命令 & 将指令丢到后台中去执行[ctrl]+z 將前台任务丟到后台中暂停jobs 查看后台的工作状态fg %jobnumber 将后台的任务拿到前台来处理bg %jobnumber 将任 ...