見出し画像

SQLって何?MySQLで学ぶ、初めてのSQL入門(SELECT文/データ抽出・分析)

はじめまして、ひぐまです。

本日はSQLの概要と、一番利用頻度の高いSELECT文というデータを抽出する技術についてご説明します。なお、YouTubeで解説動画も公開していますので、併せてご視聴いただけるとなお理解が促進されると思います。

SQLとは

SQLとはデータベースを操作するための言語で、データベースの構築や、データベース内のデータの目の抽出・更新・削除をするための技術です。

データベースとは、データを蓄積するためのソフトウェアです。データベースにはオブジェクトと呼ばれる操作対象が複数存在します。データを格納する「テーブル」、データの見せ方を定義した「ビュー」などです。

SQLはこのオブジェクトに対して操作します。オブジェクトを定義する「DDL(データ定義言語:Data Definition Language)」、データを操作する(抽出や更新など)「DML(データ操作言語:Data Manipulation Language)」、データベース内の権限やトランザクションなどを制御する「DCL(データ制御言語:Data Control Language)」が存在します。

今回ご説明する「SELECT文」はDMLに分類され、データベースからデータを抽出する技術です。抽出対象の絞り込みや合計・平均などの集計など、様々な加工をしたうえで抽出することができます。詳細は下記動画をご視聴ください。

以降はSELECT文の使い方についてご説明していきます。手元で試しながら学習すると理解が進みやすいのでお勧めです。動画の中で環境構築の手順もご紹介していますので、ぜひお試しください。それではSELECT文の使い方を学んでいきましょう!

SELECT文(データ抽出)の基本

では、さっそくSELECT文の基本的な使い方を見ていきましょう。一般的なデータベースでは行と列からなるデータ(Excelのような表データ)が格納されており、下記のようなクエリと呼ばれる文章を使って抽出します。

select  YM
      , item_cd
      , customer_cd
      , quant
  from test.t_actual_detail
 where YM = '201703';

SELECT文は上記のように記載します。このSELECT文はどの列を取得するか記載するSELECT句、どのテーブルからデータを取得するか記載するFROM句、そしてどのような条件でデータを取得するか記載するWHERE句から成り立ちます。SELECT句で「*」(アスタリスク)を指定すると、対象のテーブルの全べての列を取得します。

上記を読むだけではイメージが湧きにくいと思いますので、実践を交えていきたいと思います。動画で解説していますので、ぜひご視聴ください!


様々な抽出条件

基本的なデータ抽出は前述の内容で学びましたが、今度は様々な条件句(WHERE句)を利用して自分の欲しいデータを抽出していきたいと思います。主要な検索条件は下記になります。

◆数値や日付(文字列でも利用可能)
 ・列名 = A (等しい)
 ・列名 != A (等しくない。列名 <> Aでも可)
 ・列名 > A (大小比較。境界値を含める場合「>=」と記載)

◆文字列
 ・列名 like ‘B%’ (前方一致)
 ・列名 like ‘%B%’ (部分一致)
 ・列名 like ‘%B’ (後方一致)

◆複数条件
 ・列名1 = B and 列名2 = C (2つの条件を満たす)
 ・列名1 = B or 列名2 = C (2つのいずれかの条件を満たす)
 ・列名 in(A,B,C,D) (A~Dのいずれかに該当)

例えば下記のようなSQLを書くと、「m_dept」というテーブルから、「dept_name」列に「事業」という文字を含んでいるデータを抽出します。

select * from test.m_dept where dept_name like '%事業%'

上記を読むだけではイメージが湧きにくいと思いますので、実践を交えていきたいと思います。動画で解説していますので、ぜひご視聴ください!


並び替え(ソート)

続いては並び替えについてです。並び替えには「order by」という句を利用します。

例えば下記のようなデータがあった時に、YMやquantで並び替える手段をご紹介します。

01_元テーブル


まず、YMで昇順(小さい順。徐々に大きくなる)に並び替える方法です。下記のように記載すると、YMで昇順に抽出されます。

select *
  from test.t_actual_detail 
 order by YM

02_YM昇順

次にquantで降順(大きい順。徐々に小さくなる)に並び替える方法です。下記のように記載すると、quantで降順に抽出されます。降順を指定するには「DESC」を記載します。

select *
  from test.t_actual_detail 
 order by quant DESC

画像3

集計

続いては集計です。集計とは指定した列で合計や平均を求める技術です。「集計関数」と呼ばれる関数を利用して集計します。主な集計関数は下記のものとなります。

 ・合計:SUM(列名)
 ・平均:AVG(列名)
 ・件数:COUNT(列名)
 ・重複を排除した件数:COUNT(DISTINCT 列名)
 ・最大値:MAX(列名)
 ・最小値:MIN(列名)

例えば下記のようなデータがあったとします。

11_元テーブル

YMごとのquant合計を求めるには、下記のようなSQLを記載します。

select YM,sum(quant) as quant
  from test.t_actual_detail 
 group by YM

画像5

YM・item_cdごとのquant合計を求めるには、下記のようなSQLを記載します

select YM,item_cd,SUM(quant) as quant
  from test.t_actual_detail 
 group by YM,item_cd

13_複数で集計


詳細や演習問題は動画にまとめていますので、ぜひご視聴ください。


演算・関数

SELECT句の中では四則演算や関数を利用した加工を行うことができます。よく使う演算子は下記のものがあります。(ただし関数はDBの種類で少し異なる場合があります)

◆4つの微積分
 ・足し算:列名A + 列名B
 ・引き算:列名A - 列名B
 ・かけ算:列名A * 列名B
 ・わり算:列名A / 列名B

◆文字列操作
 ・文字列結合:CONCAT(列名A, 列名B)
 ・文字の切り出し:SUBSTR(列名A, 開始位置,終了位置)
 ・文字列の長さ:LENGTH(列名)
 ・置換:REPLACE(列名A,変更前の文字,変更後の文字)

◆その他
 ・値の分岐:CASE WHEN 条件式1 THEN 値1 WHEN 条件式2 THEN 値2
 END
 ・NULLの時のみ置換:IFNULL(値1,値2)(値1がNULLの時値2を返却)
NULLとは値が存在しないということを表す特殊文字です。NULLは「=」で比較することはできず、「列名 is NULL「、」列名はNOT NULLです」のように比較します。

例えば下記のようにすると、quantに100を足したquant2を取得できます。

select quant, quant + 100 as quant2 from test.t_actual_detail

詳細や演習問題は動画にまとめていますので、ぜひご視聴ください。


表の結合

ここまでは1つのテーブル(表)からのデータ抽出をご紹介してきましたが、ここでは複数のテーブルからデータを抽出する方法についてご紹介します。この技術は「結合」と呼ばれます。イメージとしてはExcelのVLOOKUP関数に似ています。

例えば下記の2つのテーブルが存在するとします。

21_結合のもとデータ

この2つのテーブルを利用して下記のようなデータを抽出することを想定します。

22_結合結果

上記は「t_actual_detail」に「m_item」を結合して、「item_name」や「unit_price」を取得しています。Excelで例えるなら、「item_cd」を検索キーとしてVLOOKUP関数を利用しているようなものです。これをSQLで実現するには、下記のようなクエリを発行します。

select t.YM
      ,t.item_cd
      ,t.customer_cd
      ,t.quant
      ,t.dept_cd
      ,m.item_name
      ,m.unit_price
 from test.t_actual_detail t
 left outer join test.m_item on t.item_cd = m.item_cd 

新しく「LEFT OUTER JOIN」という句が出てきました。この句を利用して表を結合させます。「ON」で指定した条件を満たす場合のみ結合します。(上記の例では「item_cd」が一致するデータ同士を結合させます。

結合には両方のテーブルに存在するデータのみ(キーが一致するデータのみ)抽出する「内部結合」と、左側(先に記載したテーブル。上記の例ではFROM句で記載した「t_actual_detail 」)に存在するデータはすべて抽出する「左側外部結合」が存在します。左側外部結合の場合、結合しようとしているテーブルに値が存在しない場合、NULLとなります。上記の例では「item_name」や「unit_price」がNULLになります)

23_内部結合の例

24_外部結合の例

なお、余談になりますが、外部結合には左側外部結合以外にも右側外部結合、完全外部結合が存在しますが、使う機会は非常に稀です。(これはあくまでも推測ですが、日本は左から書いていく文化なので、左側外部結合がよく使われているのだと思います)

こちらも動画にまとめていますので、ぜひご視聴ください。


サブクエリ(副問い合わせ)

さて、少し特殊なデータ抽出方法をご紹介します。それがサブクエリ(副問い合わせ)と呼ばれる技術です。

サブクエリとは、SELECTの結果を、SELECT句の中で再利用する機能です。SELECT文のことをクエリや問い合わせと呼ぶので、サブクエリ(副問い合わせ)と呼びます。

例えば、下記のデータが存在するとします。

31_サブクエリ_元データ

これを「YM」で集計した結果を結合し、構成比(シェア)を表示させます。

下記のようなクエリを発行することで、実現できます。

select t.YM
     , t.item_cd
     , t.customer_cd
     , t.quant
     , s.quant_sum
     , t.quant/s.quant_sum as share
 from test.t_actual_detail t 
inner join (select YM
                  ,sum(quant) as quant_sum 
              from test.t_actual_detail 
             group by YM
           )s on t.YM = s.YM

32_サブクエリ

33_結果

上記の例のように、サブクエリはJOIN句で利用できますが、他にもSELECT句、FROM句など様々なところで利用できます。

詳細や演習問題は動画にまとめていますので、こちらもぜひご視聴ください。


総合演習

さて、これまで学んだ内容の総復習ということで、総合演習を用意しております。こちらもぜひ挑戦してみてください!


最後に

今回はSQLの中でも利用頻度の高い「SELECT文」というデータ抽出の技術をご紹介しました。最近では扱うデータも多岐にわたり、事前に準備された形式以外のデータが必要になってきています。SELECT文を扱えれば、自分で好きなようにデータを抽出することが可能です。ぜひこの機会にマスターしてみてください。

また、SQL以外にもシステム開発に関するノウハウやセミナー動画を公開しています。ご興味がある方はぜひご視聴ください!

YouTube:ひぐま流IT道場



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