重複の可能性:
select * を使用しない理由は何ですか?
ステートメントのどのselect_expr
句SELECT
が適しているか説明していただけますか? こんな感じでずっと使っ*
てますselect_expr
SELECT * FROM table_name WHERE ...
そしてそれで十分でした。
重複の可能性:
select * を使用しない理由は何ですか?
ステートメントのどのselect_expr
句SELECT
が適しているか説明していただけますか? こんな感じでずっと使っ*
てますselect_expr
SELECT * FROM table_name WHERE ...
そしてそれで十分でした。
いくつかの理由があります:
select a, b, a+b FROM table
1 番目と 2 番目のポイントに追加: 特に通常、列の制限が必要です。
4 番目のポイントに追加します。アドホック クエリを実行するときは、ほとんど常に*
. ただし、プログラムは常に列を列挙する必要があります。これにより、予期しない列の並べ替えが防止され、実際に使用されているデータが明確になります。
すでに提案されている他の例に加えて、次の例があります。
集計関数を使用する必要があります。
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 回表示されます。オプティマイザーが正確に最適化すると信じています)。
テーブルに 100 万の列があり、関心があるのは 1 つだけで、30 ボー接続を介してネットワーク経由でデータベースと通信しているとします。