その3)SQLテクニック 副問い合わせ(inとexist) – ざったなぶろぐ
密避け!順番待ちアプリ
Twitter フォロワー推移サイト

お金配りおじさんやワニの人、AKBやイラストレーター、アイドル、youtuberまで人気者たちの推移をチェック!!

TwitterRanking

その3)SQLテクニック 副問い合わせ(inとexist)

この記事を読むのに必要な時間は約 8 分です。

前回まではSelect文の基本的な使い方なり検索の仕方などを説明してきました。今回からは一気に内容を濃ゆくしていろいろな技術的な方法を小出しで出していきたいと思います。関数なども利用していきますのでその都度その都度覚えてください。

副問い合わせ

あんまり使わないかな?副問い合わせ

SQL文を書いていくとそのうち効率的な書き方に自然と目覚めていきます。勉強していく途中でこのフェーズは通過すると思いますので、説明はしておきます。が、個人的にはあまりお勧めしていません。

では、この状態からスタートします。

お題をは 住所の数が丁度100個ある市区町村の存在する都道府県にある市区町村全てを求めます。市区町村の数が100個の場所を求めるわけではないですよ。

まずは、市区町村が100個の住所を求めます。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT TOP (1000) [漢字都道府県名]
      ,[漢字市区町村名]
      ,[num]
  FROM [test001].[dbo].[shicyouson] where num='100'

ここまでは簡単ですね。

対象は

  1. 益田市
  2. 糸島市
  3. 新潟市秋葉区
  4. 真岡市
  5. 笛吹市
  6. 苫小牧市

とわかったので、実際に求めたい市区町村が存在している都道府県は以下になります。

  1. 島根県
  2. 福岡県
  3. 新潟県
  4. 栃木県
  5. 山梨県
  6. 北海道

 

今まで実施してきたことを忠実に再現すると以下のような書き方になります。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT TOP (1000) [漢字都道府県名]
      ,[漢字市区町村名]
      ,[num]
  FROM [test001].[dbo].[shicyouson]
   where 
     [漢字都道府県名]='島根県' or 
     [漢字都道府県名]='福岡県' or 
     [漢字都道府県名]='新潟県' or 
     [漢字都道府県名]='栃木県' or 
     [漢字都道府県名]='山梨県' or 
     [漢字都道府県名]='北海道'

答えは出せましたがスマートではないですよね。

 

ここで、同じ結果を求める方法が副問い合わせです。

 

in

まず、副問い合わせの中で一番人気且つ、もっとも使ってはいけない物が此方になります。

SQL文を書いてみると以下のようになります。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT TOP (1000) [漢字都道府県名]
      ,[漢字市区町村名]
      ,[num]
  FROM [test001].[dbo].[shicyouson]
   where 
     [漢字都道府県名] in (
                         SELECT 
						   [漢字都道府県名]
						  FROM [test001].[dbo].[shicyouson] 
						  where num='100'
						)

この様な形になります。

この 【 in 】 が非常に曲者で、コードを書いたときに非常にわかりやすくてスッキリします。だから、みんながこぞって使いたがるのですが、パフォーマンスが悪くなることが多いです。※理由はまた別の機会で

駄目だとは言いましたが、やはり、その使い安さ!半端ないですね。触っていてちょこっと〇〇▲▲■■が該当するんだけどなーってわかっているときなんかは、迷わず使いましょう。効率的なSQL文を追い求めて、1分程度で終わる作業を無駄にし、数十分時間を費やすのは愚の骨頂です

exist

inよりも優秀になることがあるかもしれないのが existです。

こっちはちょっとだけ取っつきにくいですが、慣れればなんてことは無いです。

それではSQL文を書いてみましょう。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT TOP (1000) [漢字都道府県名]
      ,[漢字市区町村名]
      ,[num]
  FROM [test001].[dbo].[shicyouson] A
   where exists
   (
        SELECT 1
				FROM [test001].[dbo].[shicyouson] B
		 where A.[漢字都道府県名]=B.[漢字都道府県名] and B.num='100'
)

途中で A とか B とか出てきましたね。 これはテーブルの略称になります。見栄えが良いだけではなく、なんと性能もあがります。折角なのでなるべくこのテーブル略称は使っていきましょう。

 

はい。

これも同じ結果になりました。

existsを使った場合の副問い合わせで注目したいのが、内側のSelect文で指定している列が

【 1 】であることです。 これは列名ではなくただの数字の1です。1でなくとも’AA’とか文字でも構いません。これは副問い合わせでは求めたいデータの存在チェックのみを実施しており、何か結果を求めているわけではないからです。

existを使う場合は、頭の中で、以下のイメージを持ってください。

メインのテーブルを想像する。

 

そのテーブルをコピーして2個にする。

コピーした先のテーブルで条件を指定する。

値を条件で絞ったあとに、キーが等しい列を結びつける

残りが答え ※図の場合は 1 と 3

 

この様な形をあたまの中で想像できる人は EXISTSを使えると思います。ただし、管理人はこの方法を全く使いません。

次の記事で書きますが、副問い合わせを使わなくてももっと簡単な方法で値を求める事ができるからです。

その4)SQLテクニック 副問い合わせと同じ結果を取得
前回まではSelect文の基本的な使い方なり検索の仕方などを説明してきました。今回からは一気に内容を濃ゆくしていろいろな技術的な方法を小出しで出していきたいと思います。関数なども利用していきますのでそ...

 

[speech_bubble type=”drop” subtype=”L1″ icon=”02ukiyoe/yukiji_R.png” name=”ゆきじさん”]な、なんかよくわからんばい[/speech_bubble]

タイトルとURLをコピーしました