見出し画像

プログラム初心者が”DEV.LAB"を受講してどこまで成長できるかの記録 その9【第8章SQL 〜実用編〜】【ユーザー体験】

DEV.LAB受講生のayakaです:)
今回は第8章 SQL 実用編についてです。

前回の章ではSQLの基本と、SQLの4大命令(SELECT, UPDATE, DELETE, INSERT)について学びました。
今回はSQLと実用編ということで、前回でも出てきた"WHERE句"による絞り込みについて学習します。

授業ポイントノート

WHERE句の絞り込み - 比較演算子 - 

SQLも言語の一種になるため、比較をする際には、比較演算子というものを使います。
比較演算子は、Javaでも登場しましたが、SQLでも使用するため、混同しないように注意が必要です。
ただし、= , < , > , <= , >= , <> などについてはJavaで使用した意味と全く同じになります。
SQLで使われるその他の比較演算子は以下のものになります。

  • IS NULL / IS NOT NULL

  • LIKE

  • BETWEEN

  • IN / NOT IN

  • ANY / ALL

まずは、IS NULL / IS NOT NULL について説明します。
IS NULL は項目が NULL のもの、
IS NOT NULLは項目が NULL でないものを示しています。

IS NULL演算子

IS NULLの場合、上記の画像のように nameカラムが NULL (カラ)の場合に取得できる = nameがないレコードを取得できるということになります。
反対に、IS NOT NULL は nameカラムがNULL (カラ)でないものを取得することができます。(下画像参照)

IS NOT NULL演算子

次に比較演算子 LIKE演算子 についてです。
LIKEは、文字列があるパターンに一致しているかをチェックするときに使います。パターン文字を使用して絞り込みたい文字を作成することができます。

パターン文字の % を使用する場合、下記の左のように表すことができます。
'コ’というパターンを絞り込むため、右のdogテーブル2番目(コメ)のレコードが取得対象になります。
また、% は任意の0文字以上の文字列が対象になるため、'コ’ の前に文字名なくても取得対象になります。
そのため、4番目(ロコン)、5番目(チョコ)もパターン文字の絞り込み対象になります。

LIKE演算子

次にBETWEEN演算子についてです。
BETWEEN演算子は、ある範囲内に値が収まっているか判定する際に使用します。
下記を例として、
height カラムのうち30から60の間のデータが対象になるように絞り込みたい時は、下記の画像左のように表します。
そうすると、dogテーブルの2番目(コメ)、4番目(ロコン)、5番目(チョコ)のheightがそれぞれ、43, 53, 31 となっているため、この3つが取得対象になります。

BETWEEN演算子

次に、IN / NOT IN 演算子についての説明です。
INは値が( )内に列挙した複数の値のいずれかに一致するかどうか、
NOT INは( )内に列挙した値のどれとも一致しないという絞り込みをしたいときに使用します。

IN演算子

上記はINの絞り込みを表してます。
43と53という値を持っているデータを対象にしているので、
dogテーブルの2番目(コメ)と4番目(ロコン)のレコードが取得対象となります。

反対に、NOT INでは
43, 53以外のデータが対象になるため、
1番目(リク)と3番目(マメ)が絞り込みデータの対象となります。

NOT IN 演算子

比較演算子WHERE句の絞り込みの最後はANY / ALL演算子です。
ANYは値リストのそれぞれと比較してどれかが真なら真、
ALLは値リストのそれぞれと比較して、全て真なら真となります。

ANY演算子

上記のANY演算子の例の場合、44または55以上の値が絞り込み対象となるため、3番目(マメ)と4番目(ロコン)の67, 53がデータ取得対象となります。

下記のALL演算子の例の場合は、44かつ55以上の値が絞り込み対象となるため、3番目(マメ)のデータのみが条件に当てはまっています。

ALL演算子

WHERE句の絞り込み - 論理演算子 -


次はWHERE句の絞り込み論理演算子について説明します。
SQLで使用される論理演算子は以下の3つになります。

  • AND

  • OR 

  • NOT

まずは AND演算子について説明します。
AND演算子とは2つの条件式の両方が真の場合、
真(AかつB)とさせたい時に使用します。
下を例として、age が2より大きい かつ height が55よりも大きいという絞り込みの命令をすると、dogテーブルの2番目(コメ)がデータ取得の対象になります。

AND 演算子

続いて、OR演算子
2つの条件式のどちらかが真の場合、対象になるのは全てになります(AまたはB)
下の例のように、age もしくは height が真であれば、dogテーブルのデータ全てが取得対象になります。

最後にNOT演算子とは
条件式の結果を真は偽に、偽は真に逆転することができます。

下記の例のように、NOT age  = 2ということは ageカラムが2以外のデータが取得対象になるので、1番目(リク)以外が選択されます。

NOT演算子

また、WHERE句の絞り込みの際に、カッコをつけて優先度を変えることも可能です。
WHERE句から一番近いカッコから優先順位が高く、
下記の例では、ANDが一番最後に処理されるようになっています。

検索結果の加工

続いては、検索結果の加工についての説明です。
検索結果の加工とは、先ほどまで説明していた絞り込みは検
索結果を絞り込んで取得するので、取得する合計数が変わりますが、
今回は加工なので、WHEREで絞り込みが完了して取得してから処理する方法になります。
加工する際に使用できる6つのキーワードを紹介します。

まずはDISTINCT についてです。
DISTINCTは結果表の中で重複している行があれば、その重複を除外する方法になります。
dogテーブルが下記のように存在している場合、WHERE > 2なので、
2,3,4番目が取得対象になります。ここまでが絞り込みの処理となっており、ここからDISTINCT の検索結果から 重複行を除外するという加工を行い、
3 と 3 というレコードデータが重複しているので、取り除くと最終的には3,4番のみが残ります。このような検索結果の加工がDISTINCTではできます

DISTINCT サンプルコード

次に、2つ目のキーワード ORDER BY についてです。
ORDER BYは指定した列の値を基準として、結果を並び替えて取得できる方法になります。
下記のサンプルコードを使って説明すると、
まずWHEREの絞り込みで2以上なので、2,3,4行目 のデータだけ取得しています。取得してくると4-3-5という並びの順番で取得して行きますが
取得してきてから ORDER BY の処理が走り、
3-4-5と並び替えて 取得し直すという 検索結果の加工ができます 。

ORDER BYサンプルコード

次は、OFFSET-FETCH についてです。
OFFSET-FETCHは、先頭から数件だけを取得する際に使用することができます。
データベースによっては使用できない場合もあり、
MySQLやMariaDBで使用する場合は、リミットオフセットというキーワードに変わります。
ただし、OFFSET-FETCHを使用すると、データベースの検索速度が遅くなるので、極力使わず他の方法を模索した方がいいです。


OFFSET-FETCH

OFFSET-FETCHのサンプルコードの中に、
OFFSET 2 ROWS とありますが、これはスキップする数を表しており、
そのため3行目が取得対象となります。
また、FETCH は取得するデータの数になるので、
NEXT 1 ROWS と記載されているので、3行目のみが取得対象となります。

WHERE句と同じ使い方のように見えますが、
処理としては加工のタイミングのため、イメージとしては一度取得してから加工の処理をするので、WHERE句とは別物になります。
そのため、検索速度が遅くなるというところにつながってきます。

次に集合関数についてです。
集合関数とは構造がよく似た複数のテーブルの検索結果を組み合わせる加工の方法で、主に3つ(UNIONEXCEPTINTERSECT) が存在します。

集合関数

まず、UNIONについてです。
UNIONでは、2つのSELECT文を繋ぎ、それぞれの検索結果を合わせた結果を表示することが可能です。

UNIONサンプルコード

次に、EXCEPTについてです。
EXCEPTは、あるSELECT文の検索結果に存在する行から、
別のSELECT文の検索結果に存在する行を差し引いた結果になります。
下記のサンプルコードとテーブルを参照にすると、
"リク"という項目はdogテーブルにもcatテーブルにも存在していて、
EXCEPTを使用することで、同じように持っている項目だけをdogテーブルから差し引いて"ロコン"のレコードデータだけが表示されるようになってます。

EXCEPTサンプルコード

EXCEPTの集合関数は関しては少し注意が必要で、
オラクルデータベースの場合、EXCEPTはMINUTEという名前に変わり、MySQLでは対応していません。
また、MariaDBの場合、バージョンが10.3以上じゃないと対応してないので
使用する際には注意が必要です。


最後に、INTERSECTについての説明です。
INTERSECTとは、2つのSELECT文に共通する文を集めた結果になります。
下記のサンプルコードとテーブルを参照すると、
dogテーブルとcatテーブル、どちらにも"リク"というデータが存在しているので、"リク"というデータが取得対象になります。

INTERSECTサンプルコード

集合関数を使用する際の3つの注意点として…

  • 選択列リストと列数とデータ型が一致していないと使えない(列の数と、カラムのデータ型が完全に一致してないとエラーで怒られる。)

  • ORDER BY を使うときは最後のSELECT文に記述

  • 列名やASによる別名の場合、1つ目のSELECT文のものを指定 (SELECT文が2つ並んだ際の注意点になる)

私が通っているDEV.LAB(ディラボ)とは…
”一生使えるスキルを学ぶ”ことができる 未経験から現場での活躍を目指す
超実践OJT開発型をおこなっているプログラミングスクールです。
Java × Springを現役エンジニアから学ぶことができ充実したサポートもあります。

この記事が気に入ったらサポートをしてみませんか?