【T-SQL基础】01.单表查询-几道sql查询题
概述:
本系列【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/
关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!