テーブルから1を選択するとはどういう意味ですか?


146

私は次のようなもので多くのクエリを見てきました。

Select 1  
From table

これは1どういう意味ですか、どのように実行され、何が返されますか?

また、どのようなシナリオでこれを使用できますか?


完全なクエリを表示してください
gbn

回答:


107

SELECT 1 FROM TABLE_NAME「テーブルから1を返す」という意味です。それ自体は非常に目立たないので、通常はWHERE頻繁に使用されますEXISTS(@gbnによると、これは必ずしもベストプラクティスとは限りませんが、実際には意味がなくても、注意するのに十分一般的です(とは言っても、他の人が使っているのですぐに使用しますが、すぐに「より明白」になります。もちろん、それは粘性のある鶏と卵の問題かもしれませんが、私は通常は住んでいません))。

 SELECT * FROM TABLE1 T1 WHERE EXISTS (
     SELECT 1 FROM TABLE2 T2 WHERE T1.ID= T2.ID
 );

基本的には、上記のは、これは明らかに、不自然な例ですが、私はそれがアイデアを伝えると考えている(表2から、対応するIDを持つテーブル1からすべてを返します。個人的に、私はおそらくより上だろうSELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);、私はのようにそのビューとしてFARは、状況に応じた説得力のある理由がない限り、読者にとってより明確です)。

編集

実際に今まで忘れていたケースが1つあります。データベース内の値の存在を外部の言語から判断しようとしている場合、SELECT 1 FROM TABLE_NAMEが使用されることがあります。これは、個々の列を選択するよりも大きなメリットはありませんが、実装によってSELECT *は、DBが言語に返す列が多いほどデータが大きくなるため、を実行するよりも大幅に向上することがあります。これは、さらに時間がかかることを意味します。


そして、なぜ「通常」にEXISTSを使用するのですか?理由の証明はあります
gbn 2011

6
そして-1の神話を伝播するための-1...EXISTS (SELECT 1...
gbn '24

2
@GBNなぜ私が他のどこよりもずっと頻繁にそれを見たのか分かりません。私はそれをはるかに頻繁に見ました。
cwallenpoole 2011

2
粘性の鶏?食べたくない!たぶんそれは「悪質な鶏と卵の問題」であるべきでしょうか?
No'am Newman、2011

2
@ベン:INとEXISTは通常、同じプランに最適化されます
gbn '24

106

select 1 from tableテーブルのすべての行に対して定数1を返します。レコードがwhere節やと一致するかどうかを安価に判断したい場合に便利ですjoin


1
この答えは私にとって最も理にかなっています
ジョセフアストラハン

2
実際には非常に重要なポイント:「テーブルのすべての行」。したがって、たとえば、数億行のテーブルのヘルスチェックの一部として「テーブルの可用性」をチェックすると、結果は1億の「1」の結果セットになります。(注:これが発生することは決してありません...本番
環境では

文字通り、これはここで受け入れられる答えになるはずです!
Fahad Javed

40

もしあなたが何かのような意味なら

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 

それはそれがより良いという神話です1

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 

1または*EXISTSでは無視され、あなたがあたりとしてこれを書くことができますANSI SQL 1992標準のページ191

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 

1
postgresがこれを尊重し、exists (select 1/0魅力のように機能することを確認しました
アレックス

22

常に整数1を返します。where句に一致するレコードが存在するかどうかを確認するために使用されます。


22
ええと-質問は「これは何を意味するのか」であり、「これは良い習慣ですか」ではありませんでした。私はそれがパフォーマンスの観点から違いをもたらさないことに同意します-しかし、おそらく1は一般に「true」と解釈されるため、開発者が使用する規則です。
Neville Kuyt、2011

20

select 1 from table 一部のデータベースでは、接続が生きているかどうかを確認するために接続をテストするクエリとして一部のデータベースで使用され、接続プールとの間で接続を取得または返すときによく使用されます。


2
それは私の場合でした、それはJBOSSとTOMCATアプリケーションの間でかなり一般的です。
Valter Silva 2014

13

結果は1、テーブル内のすべてのレコードです。 __


本当に、空のテーブルを作成してクエリを実行しようとすると、結果は6つの1になります。
r0ng

9

広く知られているわけではありませんが、クエリにはHAVING句のない句を含めることができますGROUP BY

このような状況では、HAVING条項はセット全体に適用されます。明らかに、このSELECT句はどの列も参照できません。そうでないと、「列はGROUP BYに含まれていないため、選択では列が無効です」などのエラーが発生します。

したがって、リテラル値を使用する必要あります(SQLではゼロ列の結果セットが許可されないため-なぜですか?!)、リテラル値1(INTEGER)が一般的に使用されます:HAVING句が評価されるTRUE場合、結果セットは1行1行になります値1を示す列。それ以外の場合、空のセットを取得します。

例:列に複数の異なる値があるかどうかを確認するには:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);

「明らかに、SELECT句はどの列も参照できません」-ブール式を選択する方が合理的ではありませんSELECT MIN(colA) < MAX(colA) FROM tableAか?
ポールシュピーゲル

7

もう少し具体的には、これを使用して

SELECT 1 FROM MyUserTable WHERE user_id = 33487

する代わりに

SELECT * FROM MyUserTable WHERE user_id = 33487

結果を見る必要がないからです。数値1を要求することは、データベースにとって非常に簡単です(ルックアップを行う必要がないため)。


上記のコメントのとおり、Select 1はselect *よりもパフォーマンスが良くないようですが、そうですか?
eRaisedToX

5

テーブルにデータが存在するかどうかわからない場合は、次のクエリを使用できます。

SELECT cons_value FROM table_name;

例:

SELECT 1 FROM employee;
  1. 行の総数を含む列を返し、すべての行が同じ定数値1を持ちます(今回はすべての行に対して1を返します)。
  2. テーブルに行がない場合は何も返しません。

したがって、このSQLクエリを使用して、テーブルにデータがあるかどうかを確認します。行数は、このテーブルに存在する行数を示します。


3

これは、何らかの理由で内部クエリの結果に基づいて外部クエリを計算したいため、出力として「1」またはほとんどの時間は内部クエリとして使用する必要があることを意味します。常に1を使用するのではなく、特定の値があります...

これにより、静的に値1として出力されます。


3

WHERE句に基づいてtrueまたはfalseを確認するだけの場合は、条件が最も安い方法であるテーブルから1を選択します。


2

私はそれが常にSQLインジェクションで使用されているのを見る:

www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;

これらの数値を使用して、データベースが存在する場所を推測し、指定したデータベースの列名とテーブルの値を推測できます。


0

簡単なことは、テーブルから最初の列の番号を取得していることを意味します。ここでは、従業員から選択1を使用しています。つまり、Emply_num列を取得しています。ありがとう


私はそのような構文を覚えていますが、それは思い出せないデータベースに固有のものです。Postgresql?
diynevala 2016年

0

その理由は、少なくともMySQLでは別の理由です。これはMySQLマニュアルからのものです

InnoDBは、テーブルにそのような値を格納する代わりに、起動後にそのテーブルに初めてアクセスしたときに、テーブルのインデックスカーディナリティ値を計算します。この手順は、データを多くのテーブルに分割するシステムではかなりの時間がかかる場合があります。このオーバーヘッドは最初のテーブルオープン操作にのみ適用されるため、後で使用するためにテーブルを「ウォームアップ」するには、SELECT 1 FROM tbl_name LIMIT 1などのステートメントを発行して、起動直後にアクセスします。


0

これは、IF EXISTS()の便宜上使用されています。そうでなければあなたは行くことができます

select * from [table_name]

Image「IF EXISTS」の場合、指定された条件を持つ行が存在するかどうか、行の内容が何であるかは問題ではないことを知る必要があります。

select 1 from Users

上記のコード例では、noを返します。行数はnoに等しい。単一列に1を持つユーザーの

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.