关闭

一些有趣的SQL题目

187人阅读 评论(0) 收藏 举报
分类:

题目来自: 点击打开链接

下面是本人的答案:

--一下语句中用到的表tb均指这个测试表
--1、你猜下面这条语句能得到什么结果,这个很常用
if object_id('tb') is not null
drop table tb
go select getdate()
create table tb(id int identity ,name varchar(10))
insert into tb select '张三'
union all select '李四'
union all select '王五'
union all select '赵六'
go
select * into ta from tb where 1<>1
--得到相同结构的空表

--2、下面这条语句会报错吗?为什么,怎么修改才能让它输出 “正确” 这两个字
select case when 1>1 then 1 
	when 1=1 then '正确'
	when 1<1 then 2
END
--会报错,因为then 后面的类型不一致,改成 1=>'1',2=>'2' 即可

--3、 怎么才能做到下面的三条同时执行得到的结果是命令已成功完成。
    --而不是select附近有语法错误
select 
SELECT 1
select
--菜单:工具->选项->查询执行 "批处理分隔符" 改为 select, 改完后要重开查询窗口
--或改成:SELECT (SELECT 1) [select] 


--4、 思考一下这个问题
--在master中建个表,在其它库里访问(同一服务器),不允许使用限定名,如何才能直接访问此表?
--在其它库中用视图指向master库这个表即可。

--5、 datalength() 返回用于表示任何表达式的字节数。
-- 你猜下面的结果会是什么?为什么
select datalength('1'),datalength(1),datalength(getdate()),datalength('2010-01-23 13:01:37.280')
--1, 4, 8, 23
--1,23 为字符串
--int 4, datetime 8

--6、你可以试试下面的三个语句,为什么第一个会有语法错误,而第二个结果是正确的
--Ⅰ:
select * from tb order by name
union all 
select * from tb
--Ⅱ:
select * from tb 
union all 
select * from tb order by NAME
--提示:执行下面的语句得到的错误信息会对你有用
select * from (select * from tb order by name) a
--从下面的测试可以看出 order by 放后面其实相当于对最后的结果在排序
DECLARE @t1 TABLE (id INT);
DECLARE @t2 TABLE (id INT);
INSERT INTO @t1 SELECT 11 UNION SELECT 13 
INSERT INTO @t2 SELECT 12 UNION SELECT 14 
SELECT * FROM @t1
UNION ALL
SELECT * FROM @t2 ORDER BY id
/*
id
11
12
13
14
*/

--7、
--再name列上创建一个简单的聚集索引
if exists (select  name from sys.indexes where name = N'ix_tb_name')
    drop index ix_tb_name on tb;
GO
create index ix_tb_name on tb(name) 
--你猜下面两个语句哪个效率会高(当然是数据量比较大的时候)
select name from tb where left(name,1)='张'
select name from tb where name like '张%' 
--1.索引扫描
--2.索引查找
--2更好

--扩展: 如果不加索引呢?
--不加索引则全是表扫描,一样

--8、如果你是第一次见到下面的执行结果会让你感到惊讶的,但是它很常用
--这又是什么原理呢?
declare @s varchar(100)
select @s=isnull(@s+',','') + name from tb 
select @s
--因为第一次 NULL + ',' 还是 NULL,由ISNULL转成了空串

--9、怎么快捷简便的将还有英文日期转化为纯数字格式的
--如:将23 January 2010 或者  January 232010 转化为 2010-01-23
--提示可以巧用 set language 指令
SET LANGUAGE English
SELECT CAST('23 January 2010' AS DATETIME)
SET LANGUAGE 简体中文
--下面的循环了所有的语言,也没办法得到第二个字符串
DECLARE @t TABLE (rowNum INT IDENTITY(1,1) PRIMARY KEY ,alias NVARCHAR(100),setSQL AS 'SET LANGUAGE '+alias+';'
,date1IsMatch BIT DEFAULT(0) NOT NULL
,date2IsMatch BIT DEFAULT(0) NOT NULL
)
DECLARE @i INT,@imax INT,@sql NVARCHAR(MAX),@date1Str VARCHAR(100),@date2Str VARCHAR(100)
INSERT INTO @t(alias)
SELECT s.alias FROM sys.syslanguages AS s
SELECT @i=1,@imax=MAX(rowNum) FROM @t
SET @date1Str='23 January 2010'
SET @date2Str='January 232010'

WHILE @i<=@imax
BEGIN
	SELECT @sql=setSQL+' print cast('''+@date1Str+''' AS datetime)' FROM @t WHERE rowNum=@i
	BEGIN TRY
		EXEC(@sql)	
		UPDATE @t SET date1IsMatch = 1 WHERE rowNum=@i
	END TRY
	BEGIN CATCH
	END CATCH
	
	SELECT @sql=setSQL+' print cast('''+@date2Str+''' AS datetime)' FROM @t WHERE rowNum=@i
	BEGIN TRY
		EXEC(@sql)	
		UPDATE @t SET date2IsMatch = 1 WHERE rowNum=@i
	END TRY
	BEGIN CATCH
	END CATCH
	
	SET @i=@i+1
END
SELECT * FROM @t WHERE date1IsMatch=1 OR date2IsMatch=1
/*
rowNum	alias	setSQL	date1IsMatch	date2IsMatch
1	English	SET LANGUAGE English;	1	0
*/

--10、一个比较好玩的sql语句,再查询分析器里try一下
declare @sql varchar(max);
select @sql=text 
from master.sys.dm_exec_requests  a
CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle)
print @sql
--这个之所以能输出自身sql,是因为在自己本机,只有你自己在操作而已。如果在生产环境或其它查询在正在运行的sql,是没办法正好得到自己的sql的。

--11、怎么往下面的表中插入数据
--前提:不使用alter table 语句和set identity_insert 指令
create table t(id int not null identity(1,1))
--INSERT INTO t DEFAULT VALUES

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1901929次
    • 积分:26436
    • 等级:
    • 排名:第248名
    • 原创:767篇
    • 转载:302篇
    • 译文:1篇
    • 评论:187条