SELECT 语句中的 select_expr 子句适用于啥? [复制]

Posted

技术标签:

【中文标题】SELECT 语句中的 select_expr 子句适用于啥? [复制]【英文标题】:What select_expr clause in SELECT statements is good for? [duplicate]SELECT 语句中的 select_expr 子句适用于什么? [复制] 【发布时间】:2012-11-18 22:12:51 【问题描述】:

可能重复:What is the reason not to use select *?

您能解释一下SELECT 语句中的select_expr 子句有什么用吗?我一直在使用*select_expr 像这样

SELECT * FROM table_name WHERE ...

这就够了。

【问题讨论】:

如果其中一列是 BIG BLOG,包含几百 MB 的数据.. 而您实际上不需要此列怎么办? 【参考方案1】:

有几个原因:

您可以添加计算列:select a, b, a+b FROM table 您可以限制传输的数据量。 您可以为各个列指定一个新名称。 您可以更安全、更高效地进行编程。

添加到第一点和第二点:特别是通常需要列限制。

补充第四点:在进行临时查询时,我几乎总是使用*。但是程序应该总是枚举列。这可以防止令人惊讶的列重新排序,并清楚地表明实际使用了哪些数据。

【讨论】:

【参考方案2】:

一个超越其他已经建议的例子:

你需要使用聚合函数:

SELECT ID, COUNT(*) AS Num_Total
  FROM OrderItem
 GROUP BY OrderID;

您需要从 UNION 查询的两个部分获取信息。我最近在answer 中使用了这个来回答另一个问题:

SELECT v1.ID AS OrderID_1, v1.NA AS NS, v2.ID AS OrderID_2, v2.NB AS NL, v3.NC AS NC
  FROM (SELECT ID, COUNT(*) AS NA
          FROM OrderItem
         WHERE OrderID = <specified order ID>
         GROUP BY OrderID
       ) AS v1
  JOIN (SELECT ID, COUNT(*) AS NB
          FROM OrderItem
         WHERE OrderID != <specified order ID>
         GROUP BY OrderID
       ) AS v2
    ON v1.NA <= v2.NB
  JOIN (SELECT I1.ID, COUNT(*) AS NC
          FROM OrderItem AS I1
          JOIN OrderItem AS I2 ON I2.ItemID = I1.ItemID AND I2.OrderID = <specified order ID>
         WHERE I1.OrderID != <specified order ID>
         GROUP BY I1.ID
       ) AS v3
    ON v3.ID = v2.ID
UNION
SELECT v2.ID AS OrderID_1, v2.NB AS NS, v1.ID AS OrderID_2, v2.NA AS NL, v3.NC AS NC
  FROM (SELECT ID, COUNT(*) AS NA
          FROM OrderItem
         WHERE OrderID = <specified order ID>
         GROUP BY OrderID
       ) AS v1
  JOIN (SELECT ID, COUNT(*) AS NB
          FROM OrderItem
         WHERE OrderID != <specified order ID>
         GROUP BY OrderID
       ) AS v2
    ON v1.NA > v2.NB
  JOIN (SELECT I1.ID, COUNT(*) AS NC
          FROM OrderItem AS I1
          JOIN OrderItem AS I2 ON I2.ItemID = I1.ItemID AND I2.OrderID = <specified order ID>
         WHERE I1.OrderID != <specified order ID>
         GROUP BY I1.ID
       ) AS v3
    ON v3.ID = v1.ID

在该查询中,OrderItem 表中的Quantity 列与我正在执行的计算没有任何关系。如果不使用“select_expr”而不是“SELECT *”,就无法编写该查询。您可能会注意到,最初的“聚合函数”建议是这个较大查询中的子查询之一(它出现了两次——您相信优化器会准确优化)。

【讨论】:

【参考方案3】:

假设您的表有一百万列,您只对其中一个感兴趣,并且您正在通过网络通过 30 波特连接与您的数据库通信。

【讨论】:

表有 百万 列?哇,好大啊。 这只是一个思想实验 :) (错字已更正,谢谢)

以上是关于SELECT 语句中的 select_expr 子句适用于啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

SELECT 语句语法

MySQL SELECT语句

数据库之MySQL的DQL语句(查询语句)

Presto常用语句整理

使用 MySQL 函数或过程提取 SELECT 表达式

MYSQLupdate/delete/select语句中的子查询