回答:
次のいずれかを使用することをお勧めします。
-- Method 1.
SELECT 1
FROM table_name
WHERE unique_key = value;
-- Method 2.
SELECT COUNT(1)
FROM table_name
WHERE unique_key = value;
最初の代替案では結果がないか1つの結果が得られ、2番目のカウントは0または1になります。
使用しているドキュメントは何歳ですか?良いアドバイスを読みましたが、最近のRDBMSのほとんどのクエリオプティマイザーはSELECT COUNT(*)
とにかく最適化するため、理論(および古いデータベース)には違いがありますが、実際には違いに気付かないはずです。
私はカウント関数をまったく使用しないことを望みます:
IF [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... )
<do smth>
たとえば、データベースに挿入する前にユーザーが存在するかどうかを確認する場合、クエリは次のようになります。
IF NOT EXISTS ( SELECT 1 FROM Users WHERE FirstName = 'John' AND LastName = 'Smith' )
BEGIN
INSERT INTO Users (FirstName, LastName) VALUES ('John', 'Smith')
END
以下を使用できます。
SELECT 1 FROM MyTable WHERE <MyCondition>
条件に一致するレコードがない場合、結果のレコードセットは空です。
他の答えはかなり良いですが、不要な行のチェックを防ぐために追加するLIMIT 1
(または同等の)ことも役立ちます。
SELECT COUNT(1) FROM MyTable WHERE ...
すべてのレコードをループします。これが、レコードの存在に使用するのが悪い理由です。
私は使うだろう
SELECT TOP 1 * FROM MyTable WHERE ...
1つのレコードを見つけた後、ループを終了します。
SELECT TOP 1
それは実際には1つを発見した後に終了するか、それはすべてがTOPどちらであると言うことができるように見つけるために続けていますか?
IF EXISTS (SELECT TOP 1 1 FROM ... WHERE ..)
以下を使用できます。
SELECT COUNT(1) FROM MyTable WHERE ...
または
WHERE [NOT] EXISTS
( SELECT 1 FROM MyTable WHERE ... )
これSELECT *
は、すべてのフィールドではなく、各行の値1を選択するだけなので、より効率的です。
COUNT(*)とCOUNT(列名)の間にも微妙な違いがあります:
COUNT(*)
nullを含むすべての行をカウントしますCOUNT(column name)
列名のnull以外の出現のみをカウントしますcount(1)
とは、count(*)
唯一の最も脳死DBMSでは異なるであろう。
count(*)
とはcount(1)
。それが他の DBMSに当てはまるかどうか、私には言えません。
以下を使用できます。
SELECT 1 FROM MyTable WHERE... LIMIT 1
使用する select 1
不要なフィールドのチェックを防ぐためにします。
LIMIT 1
不要な行のチェックを防ぐために使用します。