概述:
本系列【T-SQL基础】主要是针对T-SQL基础的总结。
【T-SQL基础】06.透视、逆透视、分组集
【T-SQL基础】07.数据修改
【T-SQL基础】09.可编程对象
----------------------------------------------------------
【T-SQL进阶】01.好用的SQL TVP~~独家赠送[增-删-改-查]的例子
----------------------------------------------------------
【T-SQL性能调优】02.Transaction Log的使用和性能问题
【T-SQL性能调优】03.执行计划
【T-SQL性能调优】04.死锁分析
持续更新......欢迎关注我!
本篇主要总结了常见的对单表查询的SQL查询题目。
在做下面的题目之前,我们可以先把环境准备好,以下的SQL脚本可以帮助大家创建数据库,创建表,插入数据。
下载脚本文件:TSQLFundamentals2008.zip
题目:
1.返回2007年6月生成的订单:
(30 row(s) affected)
本题考察的是过滤日期范围
参考答案:
方案一:
如果要过滤日期范围(比如,整年或正月),比较自然的方法就是使用YEAR和MONTH之类的函数。
1
2
3
4
|
SELECT
orderid, orderdate, custid, empid
FROM
Sales.Orders
WHERE
YEAR
(orderdate)= 2007
AND
MONTH
(orderdate)=6;
|
不过,应该小心的一点是:在大多数情况下,当对过滤条件中的列应用了一定的处理后,就不能以有效的方式来使用索引了。为了潜在地有效利用索引,就需要对为此进行调整,以便对过滤条件中的列不进行处理。
使用一个范围过滤条件:
orderdate >= '20070601'
AND orderdate < '20070701'
方案二:
1
2
3
4
|
SELECT
orderid, orderdate, custid, empid
FROM
Sales.Orders
WHERE
orderdate >=
'20070601'
AND
orderdate <
'20070701'
;
|
2.返回每个月的最后一天生成的订单
涉及的表:Sales.Orders表
本题主要考察DATEADD和DATEDIFF的用法
参考答案:
方案一:
1
2
3
|
SELECT
*
FROM
Sales.Orders
WHERE
MONTH
(DATEADD(
DAY
,1,orderdate)) <>
MONTH
(orderdate)
|
方案二:
1
2
3
|
SELECT
orderid, orderdate, custid, empid
FROM
Sales.Orders
WHERE
orderdate = DATEADD(
month
, DATEDIFF(
month
,
'20051231'
, orderdate),
'20051231'
);
|
得到每月的最后一天的日期:
1
|
DATEADD(
month
, DATEDIFF(
month
,
'20051231'
, orderdate),
'20051231'
)
|
3.返回姓氏(last name)中包含字母'a'两次获更多次的雇员
涉及的表:HR.Employees表
本题主要考察%(百分号)通配符的用法
百分号代表任意长度的字符串,包括空字符串。
参考答案:
1
2
3
|
SELECT
empid, firstname, lastname
FROM
HR.Employees
WHERE
lastname
LIKE
'%a%a%'
;
|
4.返回总价格(数量*单价)大于10000的所有订单,并按总价格排序
涉及的表:Sales.OrderDetails表
参考答案:
1
2
3
4
5
6
|
SELECT
orderid,
SUM
(unitprice*qty)
AS
totalValue
FROM
Sales.OrderDetails
GROUP
BY
orderid
HAVING
SUM
(unitprice*qty)>10000
ORDER
BY
totalValue
desc
;
|
5.返回2007年平均运费最高的发货国家
涉及的表:Sales.Orders表
参考答案:
1
2
3
4
5
|
SELECT
TOP
(3) shipcountry,
AVG
(freight)
AS
avgfreight
FROM
Sales.Orders
WHERE
orderdate >=
'20070101'
AND
orderdate <
'20080101'
GROUP
BY
shipcountry
ORDER
BY
avgfreight
DESC
;
|
6.为每个顾客单独根据订单日期的顺序(用order ID作为附加属性)来计算其订单的行号。
涉及的表:Sales.Orders表
(830 row(s) affected)
参考答案:
1
2
3
4
5
6
7
|
SELECT
custid ,
orderdate ,
orderid ,
ROW_NUMBER() OVER ( PARTITION
BY
custid
ORDER
BY
orderdate, orderid )
AS
rownum
FROM
Sales.Orders
ORDER
BY
custid ,
rownum;
|
7.构造一个SELECT语句,让它根据每个雇员的友好称谓,而返回其性别
涉及的表:HR.Employees表
1.搜索格式的CASE表达式
1
2
3
4
5
6
7
8
9
|
SELECT
empid ,
firstname ,
lastname ,
titleofcourtesy ,
CASE
WHEN
titleofcourtesy
IN
(
'Ms.'
,
'Mrs.'
)
THEN
'Female'
WHEN
titleofcourtesy =
'Mr.'
THEN
'Male'
ELSE
'Unknown'
END
AS
gender
FROM
HR.Employees
|
2.简单的CASE表达式格式
1
2
3
4
5
6
7
8
9
10
11
|
SELECT
empid ,
firstname ,
lastname ,
titleofcourtesy ,
CASE
titleofcourtesy
WHEN
'Ms.'
THEN
'Female'
WHEN
'Mrs.'
THEN
'Female'
WHEN
'Mr.'
THEN
'Male'
ELSE
'Unknown'
END
AS
gender;
FROM
HR.Employees
|
8.返回每个客户的客户ID和所在区域。对输出中的行按区域排序,NULL值排在最后
注意,T-SQL中NULL值的默认行为是把NULL值排在前面(所有非NULL值之前)。
涉及的表:Sales.Customers表。
参考答案:
1
2
3
4
5
6
7
|
SELECT
custid ,
region
FROM
Sales.Customers
ORDER
BY
CASE
WHEN
region
IS
NULL
THEN
1
ELSE
0
END
,
region;
|
参考资料:
《SQL2008技术内幕:T-SQL语言基础》
原文出自:【T-SQL基础】01.单表查询-几道sql查询题
作 者: Jackson0714
出 处:http://www.cnblogs.com/jackson0714/
关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!