等号(=)vs.のように
-
23-08-2019 - |
質問
使用時のSQL、他の特典の利用 =
a WHERE
条項の代わりに LIKE
?
わず特別の事業者、 LIKE
や =
同じものですか。
解決
異なる事業者
LIKE
や =
が異なる。最も回答はこちらを中心にワイルドカードをサポートしないという違いがあるだけであれば、事業者!
=
は比較演算子の運営を行って数字や文字列です。を比較する場合は文字列の比較演算子と比較し 文字列全体.
LIKE
文字列オペレーターの比較 文字による文字.
複雑な事項は、両者の使用 照合 ことができる重要な影響の結果と比較しました。
動例
ずるがこれらの事業者を明らかに異なる。初めてご連絡させて頂き見積もりからのMySQLのマニュアル:
り、SQLスタンダードのように、行は文字の上で、結果を生成することができます。異なる=比較演算子:
mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
+-----------------------------------------+
| 'ä' LIKE 'ae' COLLATE latin1_german2_ci |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
+--------------------------------------+
| 'ä' = 'ae' COLLATE latin1_german2_ci |
+--------------------------------------+
| 1 |
+--------------------------------------+
※このページのトのマニュアルと呼ばれ 文字列比較関数, は、 =
はせること =
とは異なるのですが、文字列比較機能です。
どのような =
す。
の SQL標準§8.2 記述方法 =
比較文字列:
世界の文字列は次のように決められます。
a)の場合は長さの文字列Xのではないに等しい長さ 任意の文字列のY、短い方の文字列が有効 交換の目的は、比較のコピー 自体に拡張された長さのもの 文字列連結右のパッド 文字のパット文字の選択に基づくCS.の場合 CSのないパッドの属性は、パッドの文字が 実装に依存文字とはまた一味違っ 文字の文字セットはXとYが統少 より任意の文字列の下でのCS.そうしないと、パッドの文字が .
b)の比較の結果はXとYで指定されます 照合順序CS.
c)によって照合順序は、文字列の場合 比較して同等であっても異なる長さのや を含む異なる配列の文字です。時の操作 最大、最小、異なるだけでなく、グループ分けをカラムに 連合を除き、交差する事業者をご参照の文字 文字列の値を選択するこれらの業務から セットなど等しい値は実装に依存します。
(重点を追加されます。)
これはどういう意味ですか?この場合の比較文字列、 =
オペレーターはただのthinラッパーの現照合。照合するには、図書室は様々なルールを比較するための文字列です。以下に例を示しますの バイナリ照合からMySQL:
static int my_strnncoll_binary(const CHARSET_INFO *cs __attribute__((unused)),
const uchar *s, size_t slen,
const uchar *t, size_t tlen,
my_bool t_is_prefix)
{
size_t len= MY_MIN(slen,tlen);
int cmp= memcmp(s,t,len);
return cmp ? cmp : (int)((t_is_prefix ? len : slen) - tlen);
}
この特定の照合が比較バイトであるようにバイナリ"という特別な意味を文字列).その他のcollationsをより高度ならない。
例えば、ここにある UTF-8照合 を支える大文字と小文字を区別しない。このコードが長すぎます貼り付けが行する身体の my_strnncollsp_utf8mb4()
.この照合処理できる複数のバイトで申し込むことができます様々な変換などの大文字と小文字を区別しません。の =
オペレーターは完全に抽出しから左右の照合。
どのような LIKE
す。
の SQL標準§8.5 記述方法 LIKE
比較文字列:
の <predicate>
M LIKE P
がtrueの場合が存在するパーティショニングのMへの部分文字列 そ:
i)部分文字列が、配列の0以上の連続する <character representation="">s Mならびに各 <character representation=""> Mはちょうど一部分文字列.
ii)の場合はi番目の部分文字列の指示子の任意の 文字の指定子のi番目の部分文字列が単一の <character representation="">.
iii)の場合はi番目の部分文字列の指示子のPは任意の文字列 指定子、そのi番目の部分文字列があらゆるシークエンスの 0以上 <character representation="">s.
iv)の場合はi番目の部分文字列の指示子のPは、 任意の文字の指定子でも任意の文字列指定子 そのi番目の部分文字列が等しい部分文字列 指定子による照合順序 の <like predicate="">はなく、追加の <space> 文字Mは、同じ長さのどの部分文字列 指定子.
v数の部分文字列が全く同じものを使用し 部分文字列の指示子
(重点を追加されます。)
ここには語に絶、そうとしています。項目iiおよびiiiのワイルドカード _
や %
, ます。の場合 P
が含まれていないワイルドカードに設定すると、iv号が適用される。この場合の金利リのOP.
この場合で比較しそれぞれの"部分文字列"(個別の文字) M
各部分文字列 P
の照合。
結論
のボトムラインが比較文字列 =
を比較し、文字列全体が LIKE
比較文字です。両方の比較は、現在のものを利用照合。この違いが異なる結果の場合には、どの最初の例です。
エキゾーストマニフォールド、をお使いになりますか?誰もいないのでお伝えすること—を使用する必要があり、その正しい使用例です。なに早々の最適化による切り替え比較します。
他のヒント
等号(=)演算子「比較演算子は等価のための2つの値を比較」です。式の両辺が等しくない限り、つまり、SQL文で、それはtrueを返しません。たとえばます:
SELECT * FROM Store WHERE Quantity = 200;
LIKEオペレータが一致することを試みる「パターン一致比較実装」、「ワイルドカード文字を含むパターン文字列に対する文字列値」をたとえばます:
SELECT * FROM Employees WHERE Name LIKE 'Chris%';
などは、一般的に高速です(私は信じている)文字列とequalsでのみ使用されます。リテラル文字としてオペレータ扱いワイルドカード文字に等しいです。次のように返された結果の差があります:
SELECT * FROM Employees WHERE Name = 'Chris';
と
SELECT * FROM Employees WHERE Name LIKE 'Chris';
LIKEを使用すると、一般的にそのパターンマッチとして長い時間がかかるでしょうが、は、同じ結果を返します。しかし、
SELECT * FROM Employees WHERE Name = 'Chris%';
と
SELECT * FROM Employees WHERE Name LIKE 'Chris%';
は、「クリス%」との結果のみで使用して「=」結果が返されると、LIKE演算子は「クリス」で始まるものを返します。
異なる結果を返すだろうお役に立てば幸いです。いくつかの良い情報がここを見つけることができます。
LIKE
と=
は異なっています。 LIKE
は、検索クエリに使用するものです。また、_
(単純な文字ワイルドカード)と%
(複数文字のワイルドカード)などのワイルドカードを可能にします。
=
を使用する必要があり、それが速くなります。
これは「のような」質問 SQLのための鉱山の別の答えのコピー/ペーストであります'=' パフォーマンスの対ます:
個人的な例をmysqlの5.5を使用して:私は、内側には2つのテーブル3万行の一つと1万行の1つの間の結合を持っていた。
。 (ワイルドカードなし)以下のようにインデックスになどを使用する場合は、、それは約30秒を要します:
where login like '12345678'
'説明' を使用して私が取得ます:
、それは約0.1秒を要した。
where login ='12345678'
私が得る '説明' を使用します:
、like
は完全にインデックスが求めキャンセルするので、クエリが300倍以上の時間がかかっています。
一つの違い - - 離れなどでワイルドカードを使用する可能性から末尾のスペースである:=演算子はスペースを末尾無視するが、LIKEがない
データベース・システムに依存します。
は、一般的には特別な文字で、はい、=とLIKEは同じです。
一部のデータベースシステムでは、しかし、異なる事業者とは異なる照合順序の設定を扱うことがあります。
特殊文字なしで同じであるようなので、たとえば、文字列に=とMySQLの比較では、デフォルトでは常に大文字と小文字を区別しません。いくつかの他のRDBMSのLIKEでは、大文字と小文字を区別しない間は=ではないです。
私たちはそのvarcharcolが''
が含まれていない付与のためにそれを取ると、この列に対して空のセルを持っていないこの例では、
select * from some_table where varcharCol = ''
select * from some_table where varcharCol like ''
0行出力の最初の結果を第1のリスト全体を示しています。 =つつフィルタのような行為のような厳密に一致する場合です。フィルタは何の基準を持っていない場合は、すべてのデータが有効である。
のように - その目的のおかげで少し遅く動作し、varchar型と同様のデータで使用するためのものです。
。あなたが完全一致を検索する場合は、両方を使用することができ、=とLIKEます。
の使用「=」(完全一致の検索)ほんの少し速く、この場合です - あなたは「=」一度使用して、SQL Server Management Studioで二度同じクエリを持っていることによって、この自分でチェックすることができ、一度「を使用してLIKE 『実際の実行プランを含めるクエリ『/』」、その後、使用して』ます。
2つのクエリを実行し、あなたの二回結果、プラス2つの実際の実行計画が表示されるはずです。私の場合には、それらは50%対50%に分割したが、「=」実行計画は、(あなたが一番左のボックスを「SELECT」にカーソルを合わせると表示される)より小さい「推定サブツリーのコストを」持っている - しかし、再び、それは本当にですない大きな違います。
しかし、あなたはあなたのLIKE式でワイルドカードで検索を開始する場合、検索のパフォーマンスがdimishます。検索「LIKEミル%は」まだかなり速いことができます - がある場合、SQL Serverは、その列に索引を使用することができます。 SQL Serverは、この検索を満たすことができる唯一の方法は、全表スキャンを実行しているので、「%発現%LIKE」検索は、恐ろしく遅いです。だからあなたのようなものだと注意してください!
マルク
使用=文字列内のワイルドカードと特殊文字の衝突を避けることができます。
これは、LIKE句でスリップし、意図した結果を生成しない場合がありますすべての特殊ワイルドカード文字をエスケープする必要がないことで、プログラマの生活が容易になります。結局のところ、= 99%、ユースケースのシナリオである、彼らにするたびにエスケープする必要が苦痛になります。
の90年代の
で目をロール私もそれが少し遅くだ疑いがあるが、私は、パターンにはワイルドカードがない場合、それは重要だ疑います。
パフォーマンスに関する元の質問に対処するために、それはののインデックス利用にダウンしています。シンプルなテーブルスキャンが発生し、 "LIKE" と "=" の同じのです。インデックスが含まれている場合は、をLIKE句がどのように形成されるかについてを依存しています。より具体的には、ワイルドカード(複数可)の位置は何ですか?
<時間>次の点を考慮します:
CREATE TABLE test(
txt_col varchar(10) NOT NULL
)
go
insert test (txt_col)
select CONVERT(varchar(10), row_number() over (order by (select 1))) r
from master..spt_values a, master..spt_values b
go
CREATE INDEX IX_test_data
ON test (txt_col);
go
--Turn on Show Execution Plan
set statistics io on
--A LIKE Clause with a wildcard at the beginning
DBCC DROPCLEANBUFFERS
SELECT txt_Col from test where txt_col like '%10000'
--Results in
--Table 'test'. Scan count 3, logical reads 15404, physical reads 2, read-ahead reads 15416, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--Index SCAN is 85% of Query Cost
--A LIKE Clause with a wildcard in the middle
DBCC DROPCLEANBUFFERS
SELECT txt_Col from test where txt_col like '1%99'
--Results in
--Table 'test'. Scan count 1, logical reads 3023, physical reads 3, read-ahead reads 3018, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--Index Seek is 100% of Query Cost for test data, but it may result in a Table Scan depending on table size/structure
--A LIKE Clause with no wildcards
DBCC DROPCLEANBUFFERS
SELECT txt_Col from test where txt_col like '10000'
--Results in
--Table 'test'. Scan count 1, logical reads 3, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--Index Seek is 100% of Query Cost
GO
--an "=" clause = does Index Seek same as above
DBCC DROPCLEANBUFFERS
SELECT txt_Col from test where txt_col = '10000'
--Results in
--Table 'test'. Scan count 1, logical reads 3, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--Index Seek is 100% of Query Cost
GO
DROP TABLE test
「=」「LIKE」対使用してクエリプランの作成においても無視できない違いがある場合があります。
のほか、ワイルドカードとの差 =
や LIKE
によっても、SQLサーバーのカラムタイプです。
この例:
CREATE TABLE testtable (
varchar_name VARCHAR(10),
char_name CHAR(10),
val INTEGER
);
INSERT INTO testtable(varchar_name, char_name, val)
VALUES ('A', 'A', 10), ('B', 'B', 20);
SELECT 'VarChar Eq Without Space', val FROM testtable WHERE varchar_name='A'
UNION ALL
SELECT 'VarChar Eq With Space', val FROM testtable WHERE varchar_name='A '
UNION ALL
SELECT 'VarChar Like Without Space', val FROM testtable WHERE varchar_name LIKE 'A'
UNION ALL
SELECT 'VarChar Like Space', val FROM testtable WHERE varchar_name LIKE 'A '
UNION ALL
SELECT 'Char Eq Without Space', val FROM testtable WHERE char_name='A'
UNION ALL
SELECT 'Char Eq With Space', val FROM testtable WHERE char_name='A '
UNION ALL
SELECT 'Char Like Without Space', val FROM testtable WHERE char_name LIKE 'A'
UNION ALL
SELECT 'Char Like With Space', val FROM testtable WHERE char_name LIKE 'A '
を使用 MS SQL Server2012, には、行末の空白文字は無視されますの比較を除き、
LIKE
時のカラムタイプVARCHAR
.を使用 MySQL5.5, には、行末の空白文字は無視されますた
=
, ものではないが、LIKE
, これは、CHAR
やVARCHAR
.を使用 PostgreSQL9.1, スペースは重要なも
=
やLIKE
を使用VARCHAR
, が知られていCHAR
参照 文書).の挙動
LIKE
もより異なりますCHAR
.同じデータとして、明示的な
CAST
カラムの名前 も差:SELECT 'CAST none', val FROM testtable WHERE char_name LIKE 'A' UNION ALL SELECT 'CAST both', val FROM testtable WHERE CAST(char_name AS CHAR) LIKE CAST('A' AS CHAR) UNION ALL SELECT 'CAST col', val FROM testtable WHERE CAST(char_name AS CHAR) LIKE 'A' UNION ALL SELECT 'CAST value', val FROM testtable WHERE char_name LIKE CAST('A' AS CHAR)
これだけを返す行のための"キャストの両方"と"キャストコ".
LIKEキーワードは間違いなく付属の「パフォーマンスの価格タグ」が付属しています。あなたが潜在的にあなたのクエリで使用するワイルドカード文字を含めることができ、入力フィールドを持っている場合それは、私はの入力は、ワイルドカードのいずれかが含まれている場合のみの LIKEを使用することをお勧めします、と述べました。それ以外の場合は、比較に等しい標準を使用します。
敬具...
本当にそれはあなたがクエリが何をしたいのかにまで来ています。あなたが完全一致を意味する場合は、=を使用します。あなたがあいまい一致を意味する場合は、LIKEを使用します。あなたは、通常のコードとの良好な政策で何を意味するかと言ってます。
Oracleでは、ワイルドカードなしで「のような」は同じ結果を返します。トム・カイトによる <バインド変数を使用しているとき/ A>、Oracleはリテラルを使用するときに「等しい」としてワイルドカードなしで「のような」を扱うが、しません。
=
や LIKE
なることが重要であること"
=
試合の正確な文字列LIKE
文字列を含めることができるワイルドカード(%)