编写 SELECT 查询

发布日期:2026-07-10 18:49:05   来源 : 杭州电子商务研究院    浏览量 :7
杭州电子商务研究院 发布日期:2026-07-10 18:49:05  
7

介绍

SELECT 语句是 SQL 开发人员中最常用的命令。SELECT 语句可用于查询表和视图。此外,您还可以使用 SELECT 语句操作从 SQL Server 接收的数据。

在本指南中,您将了解:

  1. 如何编写简单的 SELECT 语句。

  2. 如何使用 DISTINCT 子句消除重复项。

  3. 如何使用列和表别名。

  4. 如何使用案例表达式。

选择语句的元素包括:

  1. SELECT:指定返回哪一列。

  2. FROM:指定从哪个表中获取数据。

  3. WHERE:指定如何过滤数据。

  4. GROUP BY:按组排列要返回的数据。'

  5. HAVING:根据谓词对群组进行过滤。

  6. 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 子句中使用别名,以提供一种在查询中的其他地方引用表的便捷方式;从而提高可读性。

在查询中可以使用别名的三种方式:

  1. 使用 AS 关键字 SELECT city AS location FROM customer

  2. 使用等号 SELECT location = city FROM customer

  3. 使用列名后的别名

    选择客户所在的城市

以上所有操作将产生如下结果

      | 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 开发人员需要在查询中多次引用长表名时,可以作为简写。

表别名可以按如下方式使用:

  1. 使用 AS 关键字 SELECT city FROM customer as c

  2. 没有 AS 关键字 SELECT city FROM customer c

  3. 组合表和列别名 SELECT c.city as location FROM customer as c

使用别名时,务必注意 SQL Server 上查询的逻辑处理顺序。如果使用不当,可能会导致一些问题。

您可能还记得我之前的指南中提到,SQL Server 按以下顺序执行查询:

  1. 在哪里

  2. 分组依据

  3. 拥有

  4. 选择

  5. 排序依据

考虑下面的查询。它不会执行,因为别名 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 中查询数据。

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据