本文将展示一些练习SQL的重要问题和答案。
绪论
SQL是处理不同数据库的基础。甚至一些NoSQL数据库也使用SQL的扩展来查询数据。数据科学家,商业智能分析师,商业智能开发人员,DBA,数据库开发人员,数据工程师,报告分析师,以及其他一些工作都需要SQL知识作为所需知识的一部分。对于数据管理,SQL知识是处理数据库的基础,与数据库相关的工作数量每天都在增长。包括数据库在内的软件行业是世界上需求量最大的职业。这就是为什么在这篇文章中,我们将展示一些练习SQL的问题和答案。
要求
为了开始,你需要安装SQL服务器,并安装Adventureworks样本数据库。如果你没有安装它们,下面的链接可以帮助你。
Q1.请选择名称以A开头的人表的所有信息。
A1.你将用select *来显示所有的列,where [FirstName] like 'a%' 将过滤所有名字以a开头的人的数据,使用的查询如下。
SELECT * 从 [个人]。[Person]. WHERE [FirstName] LIKE 'a%' |
LIKE操作符在SQL查询中非常常见。Like 'a%' 将显示所有以字母a开头的名字。 还有其他几个运算符需要练习,如EXISTS, IN, =, <>, ANY。下面的链接提供了更多关于运算符的信息。
请注意,对于大表来说,使用*是一种不好的做法,但在这种情况下,它是一个小表,所以它不会影响性能。一般来说,尽量只选择需要的列,而不是全部。
Q2.创建一个存储过程,接收人表的名字作为输入,姓氏作为输出。
在SQL实践中,有必要提到存储过程,因为它们在SQL Server中经常被使用。存储过程是T-SQL句子,不能应用于其他数据库,如Oracle、MySQL、PostgreSQL。下面的代码示例显示了如何创建一个名为GetLastName的存储过程。它接收参数@firstname并返回所提供的firstname的最后一个名字。它查询Person表。
ALTER PROCEDURE GetLastName @firstname varchar(50), @lastname varchar(50) OUTPUT 作为 开始 SELECT @lastname=lastname FROM [Person].[列表] WHERE FirstName = @firstname 结束 |
为了使用T-SQL调用存储过程,你需要声明一个变量来存储输出变量。我们使用execute命令来调用一个存储过程。John是名字的参数值,姓氏是存储过程的输出值。
DECLARE @mylastname nvarchar(50) 执行 dbo.GetLastName 'John', @mylastname out SELECT @mylastname as lastname |
这个存储过程的调用所显示的结果将是这样的。

关于创建存储过程的更多信息,请参考这个链接。
Q3.你会执行哪一个查询来删除人表中的所有行,并使批量登录的活动最少?
A3.截断表的句子是在不记录个别行删除的情况下删除数据。这是最有效的删除所有数据的方法。另一方面,如果我们有多条行,删除命令会记录大量的数据,并且会在事务日志文件中消耗大量的空间。 所以,代码将是以下内容。
Truncate table person.person
为了练习SQL,可以尝试截断和删除语句。关于Truncate和delete句子的区别的更多详细信息,请参考这个链接。
Q4.创建一个查询,从客户表中显示没有销售订单的客户的帐号和customerid。
A4.该查询将是这样的。
SELECT c.[AccountNumber],c.客户ID FROM [销售].[客户] c LEFT JOIN [Sales].[SalesOrderHeader] s ON c.customerid=s.customerid WHERE s.salesorderid IS NULL |
显示的结果将是这样的。

我们使用左连接来寻找所有没有销售的客户,所以salesorderid将为空。在SQL实践中,你需要知道不同JOINS的使用,如LEFT JOIN、RIGHT JOIN、CROSS JOIN。我们在这里创建了一些关于不同类型的JOIN的文章。对你来说,检查、练习和研究所有的选项是非常重要的。
我们也可以使用EXISTS或IN操作符,而不是使用JOINS。根据不同的情况,其性能是不同的。查询中的性能不在本SQL实践的范围之内。然而,我们在这里有一整篇关于这个主题的文章。
Q5.你有一个表,上面有一些病人的温度,单位是摄氏度。创建一个函数或一个存储过程来获得华氏温度转换为摄氏温度。你会使用一个函数还是一个存储过程?
A5.基本上,这里的问题是创建一个存储过程或一个函数来将摄氏度转换成华氏度。如果你已经有一个表,里面有一些摄氏度的记录,最简单的选择是使用一个函数。这个函数可以是这样的。
CREATE FUNCTION ConvertToCelcius(@Temperature decimal(14,8)) 返回 Int 作为 开始 声明 @fahrenheit decimal(14,8) 设置 @fahrenheit = ((@Temperature * (9.0/5.0)) + 32) 返回 (@fahrenheit) 结束 |
调用一个函数比一个存储过程更容易。关于使用函数与存储过程的更多信息,请参考这个链接。
Q6.创建一个查询,显示拥有更多订单的用户的前10个客户ID。
A6.在这个练习测试中,我们将使用TOP10来获得有更多订单的客户ID。我们将使用SUM来对订单数量列进行求和。注意,对于像SUM这样的聚合函数,需要使用别名来定义查询中的列名。另外,SUM是按客户ID分组的。通常聚合函数都带有GROUP BY子句。最后,我们使用order by来对结果进行降序排序。
SELECT TOP 10 SUM([OrderQty]) as orderqty,CustomerID 从 [Sales].[SalesOrderHeader] sh INNER JOIN [Sales].[SalesOrderDetail] sd on sh.销售订单ID=sd.销售订单ID GROUP BY CustomerID ORDER BY SUM([OrderQty]) desc |
显示的结果将是这样的。

关于SUM、MAX、MIN、AVG等聚合函数的更多信息,请参考这个链接。
结语
在这篇文章中,我们展示了不同的SQL练习问题。我们展示了一些练习SQL的问题和答案,以提高知识水平。如果你有更多关于这个主题的问题,不要犹豫,请联系我们。
Daniel Calbimonte是微软最有价值的专家,微软认证培训师和微软认证的SQL服务器IT专家。他是一个成功的SSIS作者,是IT学院的老师,有超过13年的不同数据库的工作经验。
他曾为政府、石油公司、网站、杂志和世界各地的大学工作。Daniel还经常在SQL Server会议和博客上发言。他为认证考试编写SQL Server培训材料。
他还帮助将SQLShack的文章翻译成西班牙语。