私は、次のような多くのクエリを見ました。
Select 1
From table
この1
は何を意味し、どのように実行され、何を返しますか?
また、どのようなシナリオでこれを使用できますか?
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が言語に返す列が多いほど、データ構造。これは、さらに時間がかかることを意味します。
select 1 from table
は、テーブルのすべての行に対して定数1を返します。レコードがwhere
句やjoin
と一致するかどうかを簡単に判断する場合に役立ちます。
もしあなたが何かを意味するなら
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...)
それはそれが言うことをします-それは常に整数1を返します。それはあなたのwhere句に一致するレコードが存在するかどうかをチェックするために使用されます。
select 1 from table
は、一部のデータベースで接続が接続されているかどうかをテストするクエリとして使用されます。接続プールとの間で接続を取得または返すときによく使用されます。
広く知られていませんが、クエリには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);
もう少し具体的に言うと、これを使って
SELECT 1 FROM MyUserTable WHERE user_id = 33487
する代わりに
SELECT * FROM MyUserTable WHERE user_id = 33487
あなたは結果を見ることを気にしないので。番号1を要求することは、データベースにとって非常に簡単です(検索を行う必要がないため)。
テーブルのデータが存在するかどうかわからない場合は、次のクエリを使用できます。
SELECT cons_value FROM table_name;
例:
SELECT 1 FROM employee;
そのため、このSQLクエリを使用して、テーブルにデータがあるかどうかを確認し、行数はこのテーブルに存在する行数を示します。
これは、何らかの理由で内部クエリの結果に基づいて外部クエリを計算したいため、出力として値「1」またはほとんどの場合内部クエリとして使用されることを意味します。 1を使用するが、特定の値がある場合...
これにより、値1として静的に出力されます。
WHERE句に基づいてtrueまたはfalseのみをチェックする場合は、条件が最も安価な方法であるテーブルから1を選択します。
次のようなSQLインジェクションで常に使用されていることがわかります。
www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;
これらの数値を使用して、データベースが存在する場所を推測し、指定したデータベースの列名と、テーブルの値を推測できます。
これは、IF EXISTS()との便宜のために使用されています。そうでなければあなたは行くことができます
select * from [table_name]
Image 「IF EXISTS」の場合、指定された条件を持つ行が存在するかどうか、行の内容が何であるかは関係ありません。
select 1 from Users
上記のコード例では、noを返します。行の数はnoに等しい。単一の列に1を持つユーザーの
それは、テーブルから最初の列の番号を取得していることを簡単に意味します。ここでは、従業員から選択1を使用しています。つまり、Emply_num列を取得しています。ありがとう
その理由は、少なくともMySQLにとっては別の理由です。これは MySQLマニュアル
InnoDBは、テーブルにそのような値を格納するのではなく、起動後にテーブルに最初にアクセスしたときに、テーブルのインデックスカーディナリティ値を計算します。データを多数のテーブルに分割するシステムでは、この手順にかなりの時間がかかる場合があります。このオーバーヘッドは最初のテーブルオープン操作にのみ適用されるため、後で使用するためにテーブルを「ウォームアップ」するには、SELECT 1 FROM tbl_name LIMIT 1などのステートメントを発行して、起動後すぐにアクセスします。