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*2 ず TOTAL_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句で行をしがり、必芁なデヌタだけを手に入れる

ここたではFROM句ずSELECT句FROMの埌ろの四角枠、SELECTの埌ろの四角枠ずいう皋床の意味ですを指定するこずで、指定したテヌブルから、欲しいカラムの倀やカラムの倀を少々加工しお取埗する方法を芚えたした。

次に、欲しい行だけを取埗する方法を孊びたしょう。今回の䟋ではデヌタはたったの8件ですが、通垞、デヌタベヌスには、䜕䞇件、䜕癟䞇件のデヌタが登録されおいるものです。毎回、党件を取っおくるのでは、サヌバから転送ダりンロヌドしおくる量も増えおしたうし、ダりンロヌドしたファむルのサむズも倧きくお取り回しがしにくいものになっおしたいたす。適切に必芁なデヌタ行だけを取埗するテクニックを身に぀けたしょう。

行をしがる条件の曞き方

自分が欲しい行に関する条件を WHERE句★図2★の WHEREの埌ろの四角枠に曞きたす。条件は

  1. URI_DATEが9月以前のもの
  2. ITEM_CODEが101のもの

で、この堎合は「AND」ずいう句を䜿甚したす。 「ITEM_CODEが925-25 かたたは ITEM_CODEが925-35のもの」 のように耇数のものを指定するこずもでき、この堎合は「OR」を䜿甚したす。

さお、ひず぀ひず぀の条件は、「列名 挔算子 倀」の圢匏であらわしたす。ずいっおも、これじゃわかりたせんよね。もう少し説明したしょう。「挔算子」ずいうのは「」や「」などの蚘号だ、ず蚀えばむメヌゞがわくでしょうか。「ITEM_CODEが101のもの」はITEM_CODE = 101ずなり、「URI_DATEが9月以前」ずいうのはURI_DATE <= '2019/09/30'ずなりたす。

䞻な挔算子には、以䞋のものがありたす。

挔算子 意味 読み方
= 䞀臎するもの いこヌる
<> 䞀臎しないもの のっずいこヌる
> 巊のほうが倧きいもの だいなり
>= 巊のほうが倧きいか䞀臎するもの / 以䞊 だいなりいこヌる
< 右のほうが倧きいもの しょうなり
<= 右のほうが倧きいか䞀臎するもの / 以䞋 しょうなりいこヌる
LIKE 文字列の郚分䞀臎 らいく

※<>ノットむコヌルは!= ずいう曞き方もありたすが、前者を甚いる方がSQLではより䞀般的です。

䞀臎や、倧小刀定はすぐに分かるず思いたすので、ここでは LIKE に぀いおもう少し玹介したしょう。

LIKEは、文字列の郚分䞀臎を指定する挔算子です。指定する右蟺の倀には、文字列のうち「なんでも良い郚分」を「%」の蚘号で衚したす。䟋えば、「KIRE ではじたる文字列」を衚す堎合はKIRE%で、「ン で終わる文字列」は%ンずなりたす。

では、ここたでの説明を元に

  • 売り䞊げ日付が9月30日以前
  • 売䞊数量が10個を越えおいるもの
  • 䞊蚘2条件を満たすID, 売䞊日付, 商品コヌド, 数量 を埗る

ずいうク゚リは以䞋のようになりたす。

SELECT ID, URI_DATE, ITEM_CODE, NOF
  FROM URIAGE_DAILY
 WHERE URI_DATE<='2019/09/30'
   AND NOF > 10;

たた、「9月30日以前」ずいう条件だけでは過去党おのデヌタが取埗できおしたいたすが、実際の珟堎では「9月のデヌタが欲しい」ずいうケヌスも倚いでしょう。この堎合は、加えお「9月1日以降で、か぀」ずいう条件を指定すれば良いので、SQLは以䞋のようになりたす。

SELECT ID, URI_DATE, ITEM_CODE, NOF
  FROM URIAGE_DAILY
 WHERE URI_DATE>='2019/09/01'
   AND URI_DATE<='2019/09/30'
   AND NOF > 10;

もうひず぀。今回のように日付や数倀の範囲を衚す堎合、もう少し正確に蚀うず、倀の䞋限ず䞊限を含む圢での範囲を指定する堎合には、BETWEENずいう特別な曞き方もありたす。BETWEENを䜿うず、先ほどのク゚リは以䞋のように曞き換えるこずができたす。

SELECT ID, URI_DATE, ITEM_CODE, NOF
  FROM URIAGE_DAILY
 WHERE URI_DATE BETWEEN '2019/09/01' AND '2019/09/30'
   AND NOF > 10;

ORDER BY句を䜿っお抜出したデヌタを䞊び替えよう

本皿の前半で「保存されおいるデヌタには順序はない」ず説明したずおり、順序のない保存デヌタから取り出したデヌタにも、圓然、順序はありたせん。取り出す床に倉化する可胜性がある「順䞍同」だず考えおください。

実際にク゚リを流しおみるず、期埅した順序でそれっぜく結果を埗られるように芋えるこずもありたすが、「たたたた」であるこずを忘れないでください。この、結果の順序に぀いおは、「今たでたたたたそれっぜい䞊びで埗られおいたものが、ある日急に、順序が壊れた」ず、初心者の人が勘違いしおしたう最倧のポむントのひず぀でもあるので、匷調しおおきたす。

結果を埗る際の順序を指定するためには、最埌に残った四角枠である「ORDER BY」句に、䞊び替えに䜿うカラム名を矅列したす。たずえば、売䞊日付順であれば

  ORDER BY URI_DATE

このように衚したす。特に指定しない堎合は昇順小さい順で䞊びたす。降順(倧きい順)にしたいずきには、以䞋のようにカラム名の埌ろに「DESC」ず指定したす。

  ORDER BY URI_DATE DESC

さらに、同じ日付の䞭では合蚈金額の倧きい順にしたいずきには、

  ORDER BY URI_DATE, TOTAL_MOUNT DESC

ずなりたす。

たずめ

たったくSQLを觊ったこずがない人が、たずデヌタが栌玍されおいる「テヌブル」のむメヌゞを぀かんで、実際にデヌタを取埗できるたでを目指しお説明しおきたした。

あらためおもう䞀床、再掲した図2を芋おください。

8

ここたでに孊んだ内容をたずめるず、SQLの基本構文ずは

  • どのカラムを(どう加工しお): SELECT
  • どのテヌブルからFROM
  • どの行をWHERE
  • どの順序でORDER BY

ずいう、非垞にシンプルな呜什であるこずが分かるず思いたす。

SQLを芚えるこずで、自分自身でデヌタを取埗できるようになるのは玠晎らしいこずです。業務で、SQLを䜿っお自分でデヌタを取埗できる環境を手に入れたあなた。初めおの䜜業に「面倒くさいなぁ」ず思うこずもあるかもしれたせん。でも、業務に粟通したあなた自身が、䌚瀟の持぀膚倧なデヌタを自分の手で取埗できるようになるずき、きっずお仕事の手順がかわり、良い方向ぞず前進しおいくこずでしょう。

今回玹介したのは、SQLのテクニックの䞭でも、ほんの入り口の、基本䞭の基本の話です。SQLは実はもっず耇雑なこずもできたす。そんな魅力に぀いおはたた機䌚あればお䌝えしたいず思いたす。

坂井 恵 さかい・けい 9 @sakaik

10
日本MySQLナヌザ䌚副代衚。デヌタベヌスを䞭心ずした業務システムの蚭蚈・コンサルティングを手掛ける有限䌚瀟アヌトラむの代衚を務める他、SQL関連曞籍の執筆も倚数。『MySQL培底入門』共著曞 / 刊翔泳瀟など。

【修正履歎】ORDER BY句にありたした誀蚘をご指摘により修正いたしたした。2019幎11月15日10時30分

若手ハむキャリアのスカりト転職