私は次のようなもので多くのクエリを見てきました。
Select 1
From table
これは1
どういう意味ですか、どのように実行され、何が返されますか?
また、どのようなシナリオでこれを使用できますか?
私は次のようなもので多くのクエリを見てきました。
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);
、私はのようにそのビューとしてFARは、状況に応じた説得力のある理由がない限り、読者にとってより明確です)。
実際に今まで忘れていたケースが1つあります。データベース内の値の存在を外部の言語から判断しようとしている場合、SELECT 1 FROM TABLE_NAME
が使用されることがあります。これは、個々の列を選択するよりも大きなメリットはありませんが、実装によってSELECT *
は、DBが言語に返す列が多いほどデータが大きくなるため、を実行するよりも大幅に向上することがあります。これは、さらに時間がかかることを意味します。
...EXISTS (SELECT 1...
select 1 from table
テーブルのすべての行に対して定数1を返します。レコードがwhere
節やと一致するかどうかを安価に判断したい場合に便利ですjoin
。
もしあなたが何かのような意味なら
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...)
exists (select 1/0
魅力のように機能することを確認しました
常に整数1を返します。where句に一致するレコードが存在するかどうかを確認するために使用されます。
select 1 from table
一部のデータベースでは、接続が生きているかどうかを確認するために接続をテストするクエリとして一部のデータベースで使用され、接続プールとの間で接続を取得または返すときによく使用されます。
広く知られているわけではありませんが、クエリには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 MIN(colA) < MAX(colA) FROM tableA
か?
もう少し具体的には、これを使用して
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クエリを使用して、テーブルにデータがあるかどうかを確認します。行数は、このテーブルに存在する行数を示します。
WHERE句に基づいてtrueまたはfalseを確認するだけの場合は、条件が最も安い方法であるテーブルから1を選択します。
簡単なことは、テーブルから最初の列の番号を取得していることを意味します。ここでは、従業員から選択1を使用しています。つまり、Emply_num列を取得しています。ありがとう
その理由は、少なくともMySQLでは別の理由です。これはMySQLマニュアルからのものです
InnoDBは、テーブルにそのような値を格納する代わりに、起動後にそのテーブルに初めてアクセスしたときに、テーブルのインデックスカーディナリティ値を計算します。この手順は、データを多くのテーブルに分割するシステムではかなりの時間がかかる場合があります。このオーバーヘッドは最初のテーブルオープン操作にのみ適用されるため、後で使用するためにテーブルを「ウォームアップ」するには、SELECT 1 FROM tbl_name LIMIT 1などのステートメントを発行して、起動直後にアクセスします。