web-dev-qa-db-ja.com

テーブルから1を選択するとどうなりますか?

私は、次のような多くのクエリを見ました。

Select 1  
From table

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

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

123

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);として上記を行います。 as FAR状況に応じて説得力のある理由がない限り、読者に対してより明示的に。

編集

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

92
cwallenpoole

select 1 from tableは、テーブルのすべての行に対して定数1を返します。レコードがwhere句やjoinと一致するかどうかを簡単に判断する場合に役立ちます。

76
Sahil Muthoo

もしあなたが何かを意味するなら

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

1の方が優れているというのはmythです

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

EXISTSの1または*は無視され、 ANSI SQL 1992標準の191ページ に従って記述できます。

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

それはそれが言うことをします-それは常に整数1を返します。それはあなたのwhere句に一致するレコードが存在するかどうかをチェックするために使用されます。

19
Neville Kuyt

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

17
Tom

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

12
TiyebM

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

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

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

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

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

もう少し具体的に言うと、これを使って

SELECT 1 FROM MyUserTable WHERE user_id = 33487

する代わりに

SELECT * FROM MyUserTable WHERE user_id = 33487

あなたは結果を見ることを気にしないので。番号1を要求することは、データベースにとって非常に簡単です(検索を行う必要がないため)。

6
Robert Martin

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

SELECT cons_value FROM table_name;

例:

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

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

5
mahbub_siddique

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

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

3
DShah

WHERE句に基づいてtrueまたはfalseのみをチェックする場合は、条件が最も安価な方法であるテーブルから1を選択します。

3
user1286465

次のようなSQLインジェクションで常に使用されていることがわかります。

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

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

2
EmilyAvon

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

select * from [table_name]

Image 「IF EXISTS」の場合、指定された条件を持つ行が存在するかどうか、行の内容が何であるかは関係ありません。

select 1 from Users

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

0
arvind singh

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

0
zeeshan rajput

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

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

0
Ramona Morea