SQLをはじめよう - 初心者でもわかる、構文とデータ取得の基本

リレーショナルデータベース管理システム(RDBMS)において、データの操作や定義を行うためのデータベース言語であるSQL。“データ”の重要性が謳われるようになった昨今において、この言語はより重要性を増しています。本稿では日本MySQLユーザ会の副代表であり、データベースを中心とした業務システムの設計・コンサルティングを手掛ける坂井恵さんが、「SQLを学びはじめたばかりの若手IT技術者」や「社内のデータを利用したい非IT技術者」に向けて、SQLによるデータ操作の基礎を解説します。

SQLをはじめよう - 初心者でもわかる、構文とデータ取得の基本

企業活動において、近年ますます、蓄積されたデータの活用が重要になっています。自社の持つ大量のデータの中から必要なデータを抽出・集計するという操作は、以前はITエンジニアが用意した画面を通して限定的にのみ行うことができるのが一般的でした。

しかし最近は、ITエンジニアではないビジネス担当者も、クエリ(SQLで書いた命令のこと)を自分で書いて、データの取得や集計をするケースも増えてきています。担当者が自らクエリを書くことには2つのメリットがあります。

  • スピード感

    • 今まで他の人(ITエンジニア)に依頼をして実施していたものを、思いついたらすぐに実施できる
  • きめ細かな抽出や集計

    • 業務を知る担当者が自ら抽出・集計操作を行うことで、より目的に合致したデータを取得できる

SQLは、使いこなそうとすると非常に奥深く、習得には時間がかかります。しかし、「とりあえず」シンプルな抽出を行うだけなら、実はものすごくとっつきやすい言語なのです。さぁ、怖がらずにSQLの世界へと足を踏み入れてみましょう。

本稿では、データが保存されている形式(テーブル)と、そこから抽出する言語(SQL)といった、初歩的な理解を得ることを目指します。

データベースとSQL

「データベース」と言っても色々な仕組みのものがあります。本稿ではその中でも広く使われている「リレーショナルデータベース管理システム(以下、RDBMS)」を用いたデータの取り扱いについて解説します。

RDBMSはデータベース内の「テーブル」に入っているデータを「SQL」という言語を使って操作します。SQLを使って、主に以下のようなデータ操作が可能です。

操作名 機能
追加(新規登録) テーブルにデータを1件追加する
更新 テーブル上に既に存在するデータの一部を書き換える
削除 テーブル上に既に存在するデータ行を削除する
検索 テーブル上に存在するデータを、条件を指定して抽出する

一般的に、最初の3つが更新系、最後の1つが参照系と呼ばれています。本記事の対象読者がいきなり更新系のSQL(追加、更新、削除)を使ってテーブルデータの変更を行うケースは、あまりないと思いますので、本稿では検索のSQLをピックアップして説明します。

まずは「テーブル」の概要をサクッと学ぶ

SQLを使って操作するRDBMSでは、「テーブル」と呼ばれる形式でデータを保管しています。本当は細かい部分で全然違うのですが、とりあえずのイメージとしては Excelなどのワークシートの「表(ひょう)」をイメージすればよいでしょう。行と列からなるマトリックスです。

ただし、Excelの場合は、データの入ったファイルをコピーしたり移動したりできますが、RDBMSではデータはサーバ上の一か所に置かれ、SQLを使ってのみデータ操作が可能です。

テーブルの特徴は以下のとおりです。

  • 1行が1件のデータを表す。
  • 列ごとに決められた意味(「郵便番号」や「氏名」「人口」など)を持つ。
  • 列には「型」が決められている。型とは大まかに「数値」「文字列」「日付」のようなもの(本当はもう少し細分化されています)。決められた型以外の値をその列に格納することはできない(数値型の列に「不明」のような文字列を入れることはできない)
  • 各行は、格納されている状態では順序の概念はなく、順序不定である。つまり「4行目のデータ」といった表現で行を特定することはできない。

特徴をまとめると、以下の図1の表のようなイメージになります。

1

SQLの基本構文はたった4つの言葉を知っておけばOK

テーブルからデータを抽出するには、SQLのひとつである SELECT文を使います。SELECT文のもっとも基本的な構文は図2のようになっています。

2

構文を簡単に説明しましょう。SELECTの後ろの枠内には、取得したい列名を羅列します。FROMの枠には取得元のテーブル名。WHEREの後ろには抽出したい行に関する条件を指定し、ORDER BY の後ろに指定した順序に並べてデータを取得します。また、SQLの命令は; (セミコロン)で終わります。
基本的に、上記の4つの枠を穴埋めするだけで、テーブルからのデータ抽出ができてしまうのです。簡単でしょう?

データの地図となる、テーブルレイアウトを読んでみよう

テーブルからデータ抽出を行うには、対象とするテーブルのレイアウトを知っている必要があります。これは通常、データベースを管理するチームから、テーブルレイアウトまたはテーブル定義書といった名前の情報をもらえるはずです。概ね図3のような情報が掲載されているかと思います。特に見るべきところは、テーブル名と列名の部分です。

3

ここでは、このテーブルに図4のようなデータが入っているものとして、説明を続けます。

まずはここから!「SELECT」と「FROM」の使い方を知ろう

さっそく、先ほどの穴埋めをする形でSQLを書いてみましょう。SQLを書くときには、まず「どのテーブルからデータを取るか」を決める必要があります。テーブル定義書を見ると今回は URIAGE_DAILY というテーブル名だとわかります。FROMの後ろに書き入れましょう。

次に、そのテーブルから、どの列の値を取ってきたいのかを、SELECT の後ろに書き入れます。ここでは例として、ID URI_DATE ITEM_CODE TOTAL_AMOUNT の4つの列を取ってくることにしましょう。

列名の指定は、コンマで区切って羅列します。また、コンマの前後には空白を入れても入れなくても構いません。なお、著者のお勧めスタイルは、「コンマの前には空白を入れず、コンマの後ろに空白を入れる」です。また、空白を入れることが可能な場所では、改行を入れても構いません。

SELECT ID, URI_DATE, ITEM_CODE, TOTAL_AMOUNT
  FROM URIAGE_DAILY;

これだけで、URIAGE_DAILYテーブルの指定した列の値を取ってくるクエリになります。「どの行を抽出したいのか」の条件を指定していないので、テーブルにある全件のデータが得られます。抽出後のデータは以下の図5のようなイメージで出力されます。

4

列の指定は、必ずしもテーブル定義の順でなくても構いません。IDの次に真っ先にTOTAL_AMOUNTを得たいのであれば、

SELECT ID, TOTAL_AMOUNT, URI_DATE, ITEM_CODE
  FROM URIAGE_DAILY;

のようにすれば、以下図6のように指定した列の順で結果を得ることができます。

5

演算子と関数を活用して列の値を加工してみよう

取得する列の値は、データベースにある値をそのまま取ってくる以外にも、ちょっとした演算加工を行うこともできます。ここでは、数字の計算の例と文字列の加工の例を紹介します。

まず数値の演算の例です。あまり業務としては現実的な例ではないのですが「もし仮に各日の売り上げ個数が倍あったら?」といったシナリオで、データを抽出してみます

SELECT ID, URI_DATE, ITEM_CODE, NOF*2 AS NOF_TWICE, TOTAL_AMOUNT*2 AS TOTAL_TWICE
  FROM URIAGE_DAILY;

NOF*2TOTAL_AMOUNT*2 の部分が「2倍する」の計算式です。計算した結果の列(これは元の列とは異なります)に名前をつけるために AS NOF_TWICE として、ASを使って列名をつけてあげています(AS を省略し、NOF*2 NOF_TWICE のようにして別名をつけるDBMSもあります)。この場合、以下の図7のような結果が得られるでしょう。

6

*はかけ算の演算子で、+ - * / といった四則演算が使用可能です。また、今回はNOF*2とスペースを空けずに記述しましたが、NOF * 2 NOF* 2 などスペースを空けても同様の結果が得られます。自分や周りの人が見やすい方法で書くと良いでしょう。

続いて文字列演算、つまり文字列の加工例を紹介します。文字列の加工には「関数」と呼ばれる機能を利用します。関数とは、元の値に対してさまざまな加工処理を行うしくみです。文字列に対してその一部を取り出したり、文字列の長さを得たり、数字に対しては、平方根を得たり、三角関数の結果を得たりなど、たくさんの関数がRDBMSには用意されています。

ここではITEM_TYPE_NAMEが長すぎるので、先頭4文字だけを採用する例を以下に示します。

SELECT ID, URI_DATE, SUBSTRING(ITEM_TYPE_NAME, 1, 4) AS ITEM_TYPE_NAME_4, ITEM_CODE, TOTAL_AMOUNT
  FROM URIAGE_DAILY;

SUBSTRING() が、文字列を加工する関数の例です。SUBSTRING()関数を使って、ITEM_TYPE_NAMEの1文字目から4文字目を加工して取得し、その結果に ITEM_TYPE_NAME_4 という新しい列名をつけています。これも結果を見てみましょう。

7

使用できる関数や演算子は、RDMBSごとに異なります。あなたがお使いのSQLのマニュアルの中から「関数」に関する章を開いて、どんな関数が使えるかを確認しておきましょう。今回紹介した SUBSTRING() も、RDBMSによって少しずつ異なる場合があります(SUBSTRだったりMIDだったり)。

WHERE句で行をしぼり、必要なデータだけを手に入れる

エンジニアHubに会員登録すると
続きをお読みいただけます(無料)。
登録のメリット
  • すべての過去記事を読める
  • 過去のウェビナー動画を
    視聴できる
  • 企業やエージェントから
    スカウトが届く