编写 SELECT 查询
介绍
SELECT 语句是 SQL 开发人员中最常用的命令。SELECT 语句可用于查询表和视图。此外,您还可以使用 SELECT 语句操作从 SQL Server 接收的数据。
在本指南中,您将了解:
如何编写简单的 SELECT 语句。
如何使用 DISTINCT 子句消除重复项。
如何使用列和表别名。
如何使用案例表达式。
选择语句的元素包括:
SELECT:指定返回哪一列。
FROM:指定从哪个表中获取数据。
WHERE:指定如何过滤数据。
GROUP BY:按组排列要返回的数据。'
HAVING:根据谓词对群组进行过滤。
ORDER BY:对结果进行排序。
虽然查询通常按上述顺序编写,但务必注意 SQL Server 执行查询的顺序。请记住,查询引擎会先评估 FROM、WHERE、GROUP BY 和 HAVING 子句,然后再评估 SELECT 子句的内容。因此,您在 SELECT 子句中编写的元素对其他子句不可见;这对于计算列和别名尤其重要。要了解有关 SQL 查询执行顺序的更多信息,请阅读我之前的指南。
FROM 子句
SELECT 子句用于指定从表或视图返回的列。FROM 子句确定 SQL Server 将从何处找到这些列。通常,您会从视图的表中选择数据。但是,在 SQL Server 中,您可以拥有多个共享相同名称的表或视图;这可能会导致混淆,并且 SQL Server 将返回错误。为了避免这些错误,请考虑使用 SCHEMA 名称和表或视图名称来查询表。
在下面的查询中,“sales”是模式名称,“orders”是表名称。
SELECT itemid, itemprice, itemquantity
FROM sales.orders
如上所示,要显示查询中的列,您需要用逗号分隔列名。列表中列的顺序将决定它们在输出中的显示方式,而不管它们在表中如何列出。
您还可以使用 SELECT * 子句从表中选择所有列。
SELECT *
FROM sales.orders
这适合快速测试和最佳实践,但您应避免在生产工作中使用它。对表所做的更改将导致查询以表的当前定义顺序检索所有当前列。这可能会导致报告或应用程序中出现错误或其他故障,这些报告或应用程序需要以定义的顺序返回已知数量的列。
使用计算列
SELECT 子句不仅可以帮助您从源表中检索列,还允许您进行计算并动态创建计算列。
物品编号 | 商品价格 | 商品数量 |
---|---|---|
1 | 10 | 3 |
2 | 5 | 4 |
Using the table above, you could easily calculate the total price (itemprice x itemquantity)l by multiplying the column itemprice by itemquantity. The result would be as follows:
```sql
SELECT itemid, itemprice, itemquantity, (itemprice*itemquantity)
FROM sales.orders
物品编号 | 商品价格 | 商品数量 | |
---|---|---|---|
1 | 10 | 3 | 三十 |
2 | 5 | 4 | 20 |
结果将出现在新列中,该列将在结果集的每一行中重复一次。SELECT 子句中的计算表达式必须是标量 - 它们必须仅返回单个值。以下操作可用于计算列。
| Operator | Description |
|----------|-------------------|
| + | Add/Concatenate |
| - | Subtract |
| * | Multiply |
| / | Divide |
| % | Modulo |
使用 DISTINCT 删除重复项
即使表使用主键强制唯一性,T-SQL 查询也可能显示重复的行。这是因为默认情况下,SELECT 语句会从表中提取所有行。
例如,考虑一个客户表。
SELECT city FROM customer
下面是该表的部分结果。您可能会注意到,即使客户表使用主键强制唯一性,在这种情况下,“城市”列也有重复项,因为多个客户可能住在同一个城市。
| City |
|-------------------|
| New York |
| Cape Town |
| New York |
| Delhi |
| New York |
要获取客户表中唯一的城市列表,我们应该使用关键字 DISTINCT。通过用 SELECT DISTINCT 替换默认的 SELECT ALL 子句,结果集中的所有重复项都将被删除。
SELECT DISTINCT 指定结果集必须仅包含唯一行。但是,需要注意的是,DISTINCT 选项仅适用于 SELECT 子句返回的列集。它不考虑表中的任何其他唯一列。
请参见下面的如何使用 DISTINCT 的示例。
SELECT DISTINCT city FROM customer
| City |
|-------------------|
| New York |
| Cape Town |
| Delhi |
此外,DISTINCT 还适用于多列。在这些情况下,DISTINCT 将返回每列的唯一组合。
例如,考虑一个值表。
SELECT category, subcategory
FROM values
| Category | Subcategory |
|---------------|-------------------|
| A | X |
| A | X |
| B | Y |
| C | Y |
| B | Y |
因此,选择不同的类别和子类别将返回这些列的唯一组合。
SELECT DISTINCT category, subcategory
FROM values
| Category | Subcategory |
|---------------|-------------------|
| A | X |
| B | Y |
| C | Y |
列和表别名
从表或视图中选择数据时,SQL Server 将使用与源相同的名称命名每列。但是,您可以使用别名将每列重命名为您选择的名称。对于表,您可以在 FROM 子句中使用别名,以提供一种在查询中的其他地方引用表的便捷方式;从而提高可读性。
在查询中可以使用别名的三种方式:
使用 AS 关键字 SELECT city AS location FROM customer
使用等号 SELECT location = city FROM customer
使用列名后的别名
选择客户所在的城市
以上所有操作将产生如下结果
| Location |
|-------------------|
| New York |
| Cape Town |
| New York |
| Delhi |
| New York |
此外,别名也可用于计算字段。如果您还记得,在上一个我们使用计算列的示例中,结果的标题是空白的。要解决此问题,请考虑为计算列使用别名。
SELECT itemid, itemprice, itemquantity, (itemprice*itemquantity) AS total
FROM sales.orders
| itemid | itemprice | itemquantity | total |
|---------|-----------|--------------|---------|
| 1 | 10 | 3 | 30 |
| 2 | 5 | 4 | 20 |
还可以在 FROM 子句中使用别名来引用表。这通常用于提高可读性,并且当 SQL 开发人员需要在查询中多次引用长表名时,可以作为简写。
表别名可以按如下方式使用:
使用 AS 关键字 SELECT city FROM customer as c
没有 AS 关键字 SELECT city FROM customer c
组合表和列别名 SELECT c.city as location FROM customer as c
使用别名时,务必注意 SQL Server 上查询的逻辑处理顺序。如果使用不当,可能会导致一些问题。
您可能还记得我之前的指南中提到,SQL Server 按以下顺序执行查询:
从
在哪里
分组依据
拥有
选择
排序依据
考虑下面的查询。它不会执行,因为别名 total 位于在 WHERE 子句之后执行的 SELECT 语句中。也就是说,当执行 WHERE 子句时,SQL Server 不会知道别名“total”。
SELECT itemid, itemprice, itemquantity, (itemprice*itemquantity) AS total
FROM sales.orders
WHERE total > 10
但是,下面的代码可以正常工作,因为在执行 SELECT 后,ORDER BY 是最后执行的。在此示例中,SQL Server 知道别名“total”。
SELECT itemid, itemprice, itemquantity, (itemprice*itemquantity) AS total
FROM sales.orders
ORDER BY total
使用 CASE 表达式
CASE 表达式增强了 SELECT 子句在检索数据时处理数据的能力。编写查询时,您经常需要用另一个值替换列中的值;这就是使用 CASE 表达式的地方。
例如,假设您正在从 sales.orders 表中选择数据,并且由于某种原因,当价格低于 50 时,您需要显示“低”,而当价格大于或等于 50 时,您需要显示“高”。然后,您将使用 CASE 表达式,如下所示:
SELECT itemid, itemprice, itemquantity,
CASE itemquantity
WHEN < 50 THEN 'LOW'
ELSE 'HIGH'
END AS price_category
FROM sales.orders
结果将如下所示:
| itemid | itemprice | itemquantity | price_category |
|---------|-----------|--------------|----------------|
| 1 | 10 | 350 | HIGH |
| 2 | 5 | 4 | LOW |
结论
在本指南中,您学习了如何在 SQL Server 中查询数据。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~