选择特定列

之前的章节显示了如何选择和排序表中所有的数据。然而,您经常希望看到的是一个或多个特定列的数据。并且,公式是使用 Projection 和 FROM 子句指定列和表,并可以使用 ORDER BY 子句按照升序或降序对数据进行排序。

如果想要操作 orders 表中的所有客户号,那么使用以下查询中的语句。

图: 查询

SELECT customer_num FROM orders; 
该结果显示了语句如何只选择 orders 表中 customer_num 列中的所有数据,并列出所有订单上的客户号,包括重复的客户号。

图: 查询结果

customer_num 
          
          104
          101
          104
          ⋮
          122
          123
          124
          126
          127

输出包括若干重复,原因是某些客户下了多个订单。有时您想要在投影中看到重复的行。而有时您却只想看到特异值,而不是每个值都出的频率。

要抑制重复行,可在选择列表的开头包括关键字 DISTINCT 或其同义词 UNIQUE,每个查询级别一次,如以下查询所示。

图: 查询

SELECT DISTINCT customer_num FROM orders;
          
          SELECT UNIQUE customer_num FROM orders;
要生成更可读的表,图 3将显示限制为仅显示一次 orders 表中的每个客户号。如下所示。

图: 查询结果

customer_num 
          
          101
          104
          106
          110
          111
          112
          115
          116
          117
          119
          120
          121
          122
          123
          124
          126
          127
假设您正在处理客户电话,并且想要找到购买订单号 DM354331。要列出 orders 表中的所有购买订单号,使用诸如以下查询所示的语句。

图: 查询

SELECT po_num FROM orders;
该结果显示了如何检索到 orders 表中 po_num 列的数据。

图: 查询结果

po_num     
          
          B77836    
          9270      
          B77890    
          8006      
          2865      
          Q13557    
          278693      
          ⋮
然而,该列表顺序无用。可以添加 ORDER BY 子句来以升序对列数据进行排序,使得查找特定 po_num 更容易,如下所示。

图: 查询

SELECT po_num FROM orders ORDER BY po_num;

图: 查询结果

po_num     
            
            278693
            278701
            2865
            429Q
            4745
            8006
            8052
            9270
            B77836
            B77890
            ⋮
要从表中选择多个列,请在 Projection 子句的投影列表中列出它们。以下查询显示了选择列的顺序就是检索列的顺序,从左到右。

图: 查询

SELECT ship_date, order_date, customer_num, 
          order_num, po_num
          FROM orders
          ORDER BY order_date, ship_date;
对多个列进行排序所示,可以使用 ORDER BY 子句来以升序或降序对数据进行排序和执行嵌套排序。此结果显示了升序。

图: 查询结果

ship_date  order_date customer_num   order_num po_num
          
          06/01/1998 05/20/1998          104        1001 B77836
          05/26/1998 05/21/1998          101        1002 9270
          05/23/1998 05/22/1998          104        1003 B77890
          05/30/1998 05/22/1998          106        1004 8006
          06/09/1998 05/24/1998          116        1005 2865
          05/30/1998          112        1006 Q13557
          06/05/1998 05/31/1998          117        1007 278693
          07/06/1998 06/07/1998          110        1008 LZ230
          06/21/1998 06/14/1998          111        1009 4745
          06/29/1998 06/17/1998          115        1010 429Q
          06/29/1998 06/18/1998          117        1012 278701
          07/03/1998 06/18/1998          104        1011 B77897
          07/10/1998 06/22/1998          104        1013 B77930
          07/03/1998 06/25/1998          106        1014 8052
          07/16/1998 06/27/1998          110        1015 MA003
          07/12/1998 06/29/1998          119        1016 PC6782
          07/13/1998 07/09/1998          120        1017 DM354331
          07/13/1998 07/10/1998          121        1018 S22942
          07/16/1998 07/11/1998          122        1019 Z55709
          07/16/1998 07/11/1998          123        1020 W2286
          07/25/1998 07/23/1998          124        1021 C3288
          07/30/1998 07/24/1998          126        1022 W9925
          07/30/1998 07/24/1998          127        1023 KF2961
当对表中的若干列使用 SELECT 和 ORDER BY 时,您会发现使用整数来在 ORDER BY 子句中表示列的位置非常有用。当整数是 ORDER BY 列表中的元素时。数据库服务器将它看作是投影列表中的位置。例如,在 ORDER BY 列表中使用 3(ORDER BY 3)表示投影列表中的第三项。以下查询中的语句检索和显示相同数据,如下图 12所示。

图: 查询

SELECT customer_num, order_num, po_num, order_date
          FROM orders
          ORDER BY 4, 1;
          
          SELECT customer_num, order_num, po_num, order_date
          FROM orders
          ORDER BY order_date, customer_num;

图: 查询结果

customer_num   order_num po_num     order_date 
          
          104        1001 B77836     05/20/1998
          101        1002 9270       05/21/1998
          104        1003 B77890     05/22/1998
          106        1004 8006       05/22/1998
          116        1005 2865       05/24/1998
          112        1006 Q13557     05/30/1998
          117        1007 278693     05/31/1998
          110        1008 LZ230      06/07/1998
          111        1009 4745       06/14/1998
          115        1010 429Q       06/17/1998
          104        1011 B77897     06/18/1998
          117        1012 278701     06/18/1998
          104        1013 B77930     06/22/1998
          106        1014 8052       06/25/1998
          110        1015 MA003      06/27/1998
          119        1016 PC6782     06/29/1998
          120        1017 DM354331   07/09/1998
          121        1018 S22942     07/10/1998
          122        1019 Z55709     07/11/1998
          123        1020 W2286      07/11/1998
          124        1021 C3288      07/23/1998
          126        1022 W9925      07/24/1998
          127        1023 KF2961     07/24/1998
当将整数指定给列名时,可以在 ORDER BY 子句中包括 DESC 关键字。如下所示。

图: 查询

SELECT customer_num, order_num, po_num, order_date
          FROM orders
          ORDER BY 4 DESC, 1;

在此示例中,数据先按 order_date 以降序排序再按 customer_num 以升序排序。