0

重複の可能性:
select * を使用しない理由は何ですか?

ステートメントのどのselect_exprSELECTが適しているか説明していただけますか? こんな感じでずっと使っ*てますselect_expr

SELECT * FROM table_name WHERE ...

そしてそれで十分でした。

4

3 に答える 3

1

いくつかの理由があります:

  • 計算列を追加できます。select a, b, a+b FROM table
  • 転送データ量を制限できます。
  • 個々の列に新しい名前を付けることができます。
  • より安全に効率よくプログラミングできます。

1 番目と 2 番目のポイントに追加: 特に通常、列の制限が必要です。

4 番目のポイントに追加します。アドホック クエリを実行するときは、ほとんど常に*. ただし、プログラムは常に列を列挙する必要があります。これにより、予期しない列の並べ替えが防止され、実際に使用されているデータが明確になります。

于 2012-11-18T22:23:17.360 に答える
1

すでに提案されている他の例に加えて、次の例があります。

  • 集計関数を使用する必要があります。

    SELECT ID, COUNT(*) AS Num_Total
      FROM OrderItem
     GROUP BY OrderID;
    
  • UNION クエリの 2 つの部分から情報を取得する必要があります。最近、別の質問への回答でこれを使用しました。

    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
    

そのクエリのどの時点でもQuantity、私が行っていた計算に関連する OrderItem テーブルの列はありませんでした。「SELECT *」ではなく「select_expr」を使用せずにそのクエリを作成する方法はありません。最初の「集計関数」の提案は、この大きなクエリのサブクエリの 1 つであることにお気付きかもしれません (2 回表示されます。オプティマイザーが正確に最適化すると信じています)。

于 2012-11-19T00:01:14.497 に答える
0

テーブルに 100 万の列があり、関心があるのは 1 つだけで、30 ボー接続を介してネットワーク経由でデータベースと通信しているとします。

于 2012-11-18T22:16:41.500 に答える