【问题标题】: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 的数据.. 而您实际上不需要此列怎么办?

标签: mysql sql


【解决方案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 波特连接与您的数据库通信。

      【讨论】:

      • 表有 百万 列?哇,好大啊。
      • 这只是一个思想实验 :) (错字已更正,谢谢)
      猜你喜欢
      • 2023-03-15
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 2021-04-03
      • 2013-01-24
      • 2020-05-23
      • 1970-01-01
      相关资源
      最近更新 更多