次のような SQL ステートメントがあります。
SELECT COUNT(*) AS foo, SUM(foo) AS foo_sum FROM bar
しかし、foo は別名であるため、MySQL はこれを許可しません。これを SQL で実現する方法を知っている人はいますか?
次のような SQL ステートメントがあります。
SELECT COUNT(*) AS foo, SUM(foo) AS foo_sum FROM bar
しかし、foo は別名であるため、MySQL はこれを許可しません。これを SQL で実現する方法を知っている人はいますか?
いいえ、select-list または WHERE 句でエイリアスを使用することはできません。エイリアスは、GROUP BY、HAVING、または ORDER BY でのみ使用できます。
サブクエリで定義されたエイリアスを使用することもできます。
SELECT foo, SUM(foo) AS foo_sum
FROM (
SELECT COUNT(*) AS foo
FROM bar
);
SELECT SUM(foo) as foo_sum
FROM
(
SELECT COUNT(*) AS foo
FROM bar
GROUP BY baz
)
私はそれは良い考えではないと思います。大きなクエリを作成する場合は、サブクエリなしで実行することをお勧めします。COUNT(*)
必要に応じて、エイリアスなしでより大きな関数を使用してください。
エイリアスとサブクエリを使用してクエリを作成しました。約1時間かかりました!次に、エイリアスなしでクエリを再現しました。約45分に短縮されました。この状況では、サブクエリを忘れてください。難しくなくきれいですが、クエリが遅くなります。
あなたが何をしようとしているのかわかりませんが、上記のソリューションでは、効率的ではないエイリアス テーブルでサブクエリを実行しています。
SELECT foo
FROM (SELECT COUNT(*) AS foo FROM employees) AS T;
基本的に T はエイリアステーブルであり、単一レコードである count を持つ foo 列を返します。単一レコードであるため、SUM(foo) 関数を使用する意味はありません。
とにかく簡単な答え:
SELECT Count(1) AS foo from employees;
COUNT 関数は、どの NOT NULL フィールドを COUNT 関数のパラメーターとして (つまり、括弧内に) 含めても同じ結果を返すため、COUNT(1) を使用してパフォーマンスを向上させることができます。これで、データベース エンジンはデータ フィールドをフェッチする必要がなくなり、代わりに整数値 1 を取得するだけになります。