博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQLServer2012单表查询练习
阅读量:6090 次
发布时间:2019-06-20

本文共 3192 字,大约阅读时间需要 10 分钟。

hot3.png

表结构与数据:

练习1

练习内容:编写一个对Sales.Orders表的查询,返回2015年6月的订单
涉及的表:Sales.Orders
输出的列:orderid, orderdate, custid, empid
正确结果:30行
SELECT orderid, orderdate, custid, empid  FROM Sales.Orders WHERE orderdate BETWEEN '20150601' AND '20150630';SELECT orderid, orderdate, custid, empid  FROM Sales.Orders WHERE orderdate >= '20150601' AND orderdate < '20150701';

练习2

练习内容:编写一个对Sales.Orders表的查询,返回每月最后一天的订单
涉及的表:Sales.Orders
输出的列:orderid, orderdate, custid, empid
正确结果:26行
SELECT orderid, orderdate, custid, empid  FROM Sales.Orders WHERE orderdate = EOMONTH(orderdate);

    上面的代码中,函数EOMONTH是SQLServer2012加入的函数,如果在之前的版本则使用不了该函数,需要用到以下方式指定时期的月份的最后一天:

SELECT orderid, orderdate, custid, empid  FROM Sales.Orders WHERE orderdate = DATEADD(MONTH, DATEDIFF(month, '20151231', orderdate), '20151231');

    先使用DATEFIDD函数计算固定的某月的最后一天与指定日期orderdate的月数差,在添加月数差到固定日期得到指定日期orderdate月份的最后一天。

练习3

练习内容:编写一个对HR.Employees表的查询,返回姓氏包含字母"e"两次及以上次数的雇员
涉及的表:HR.Employees
输出的列:empid, firstname, lastname
正确结果:2行
SELECT empid, firstname, lastname FROM HR.Employees WHERE lastname LIKE '%e%e%';

练习4

练习内容:编写一个对Sales.OrderDetails表的查询,返回订单总价(qty*unitprice)大于10000的订单,按总价排序
涉及的表:Sales.OrderDetails
输出的列:orderid, totalvalue
正确结果:14行
SELECT orderid, SUM(qty*unitprice) AS totalvalue FROM Sales.OrderDetails GROUP BY orderid HAVING SUM(qty * unitprice) > 10000 ORDER BY totalvalue;

    总价为订单总价,应该先对订单进行分组,在通过聚合函数SUM计算订单总价。

练习5

练习内容:编写一个对Sales.Orders表的查询,返回2015年中平均运费最高的3个国家
涉及的表:Sales.Orders
输出的列:shipcountry, avgfreight
正确结果:3行
SELECT TOP 3 shipcountry, AVG(freight) AS avgfreight FROM Sales.Orders WHERE orderdate >= '20150101' AND orderdate < '20160101' GROUP BY shipcountry ORDER BY avgfreight DESC;

    在SQLServer2012中,可以使用OFFSET来提取前三名:

SELECT shipcountry, AVG(freight) AS avgfreight FROM Sales.Orders WHERE orderdate >= '20150101' AND orderdate < '20160101' GROUP BY shipcountry ORDER BY avgfreight DESC OFFSET 0 ROWS FETCH FIRST 3 ROWS ONLY;

练习6

练习内容:编写一个对Sales.Orders表的查询,分别对每个客户的订单按订单日期排序(使用订单ID作为决胜属性),为每个用户的订单添加排序编号。
涉及的表:Sales.Orders
输出的列:custid, orderdate, orderid, rownum
正确结果:830行
SELECT custid, orderdate, orderid, 	ROW_NUMBER() OVER(PARTITION BY custid ORDER BY orderdate, orderid) AS rownum FROM Sales.Orders ORDER BY custid, rownum;

练习7

练习内容:使用HR.Employees表,根据称谓推测每个雇员的性别。"Ms."和"Mrs."返回"Female","Mr."返回"Male",所有其他情况返回"Unknown"
涉及的表:HR.Employees
输出的列:empid, firstname, lastname, titleofcourtesy, gender
正确结果:9行
SELECT empid, firstname, lastname, titleofcourtesy, 	CASE  		WHEN titleofcourtesy ='Ms.' THEN 'Female' 		WHEN titleofcourtesy = 'Mrs.' THEN 'Female' 		WHEN titleofcourtesy = 'Mr.' THEN 'Male' 		ELSE 'Unknown' 	END AS gender FROM HR.Employees;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;

练习8

练习内容:编写一个对Sales.Customers表的查询,返回客户的ID和地区。按地区排序输出行,具有NULL标记的行最后进行排序。
涉及的表:Sales.Customers
输出的列:custid, region
正确结果:91行
SELECT custid, region FROM Sales.Customers ORDER BY 	CASE WHEN region IS NULL THEN 1 ELSE 0 END, region;

    SQLServer会把NULL放在前面,这里需要处理这个问题,在ORDER BY子句中使用CASE,返回NULL返回1,否则返回0,先通过0和1排序,在通过region排序,这样NULL就会被排到下面。

转载于:https://my.oschina.net/u/2450666/blog/785925

你可能感兴趣的文章
http://mongoexplorer.com/ 一个不错的 mongodb 客户端工具。。。
查看>>
上传jar包到nexus私服
查看>>
Why Namespace? - 每天5分钟玩转 OpenStack(102)
查看>>
Project:如何分析项目中的资源分配情况
查看>>
HDU 4803 Poor Warehouse Keeper (贪心+避开精度)
查看>>
小错误汇总
查看>>
Spring源码系列 — Envoriment组件
查看>>
java正则表达式去除html标签,Java中正则表达式去除html标签
查看>>
使用Cobbler批量部署Linux操作系统
查看>>
zabbix企业应用之服务端与客户端的安装
查看>>
实例讲解遗传算法——基于遗传算法的自动组卷系统【理论篇】
查看>>
无法在web服务器上启动调试。调试失败,因为没有启用集成windows身份验证
查看>>
Bat相关的项目应用
查看>>
Django为数据库的ORM写测试例(TestCase)
查看>>
web.xml中的contextConfigLocation在spring中的作用
查看>>
NYOJ-107 A Famous ICPC Team
查看>>
与众不同 windows phone (44) - 8.0 位置和地图
查看>>
Visual Studio Code 使用 ESLint 增强代码风格检查
查看>>
iOS设备中的推送(二):证书
查看>>
敏捷 - #3 原则:经常提供工作软件 ( #3 Agile - Principle)
查看>>