こんにちは、ECF Techブログ
担当のMichiharu.Tです。
データベースの入門記事、第2回となります。よろしくお願いいたします。今回からいよいよSQL文について学習する内容となっています。
本記事はSQL文について、実際に動作させながら学習する入門記事の第2回となります。本記事の題材となっているデータベース内の各表、および学習の始め方については、下記の第1回の記事からご覧ください。
SELECT文の基本
それでは早速始めましょう。まず始めはSELECT文です。SELECT文は表の内容を取得してくれるSQL文です。SELECT文と一言に言ってもその書き方は多彩で、様々なデータの取り出し方があります。下はSELECT文の基本形式です。
SELECT文の各パートは「句」と呼ばれています。上には多くの句がありますが、最低限必要なのはSELECT句とFROM句だけです。まずはこの2つを使った文法と実行例を見ていきましょう。実行例については、第1回で構築した環境を元にSQLiteを実行して確認することができます。
本記事での表記について
上で句として登場したSELECTやFROMなどのSQL文の文法として用いるキーワード(または予約語と呼びます)は、大文字小文字のどちらで書いても問題ありません。ですが、慣例的な表記方法としてはキーワードは大文字、表名や列名は小文字で表記するという書き方が多いです。本記事でもこの慣例にならい、
- キーワードは大文字
- 表名や列名は小文字
を利用して記述します。
全ての行、全ての列を取得する
文法
SELECT * FROM 表名;
解説
指定した表の全ての行、全ての列を表示します。*
は「すべて」を表します。また、SQL文の最後には 必ず「 ;
(セミコロン)」 が必要となります。忘れずにつけるようにしましょう。
実行例
商品表(items)の全ての行、全ての列を表示します。
SELECT * FROM items;
実行結果
iid name price cid --- -------------- ------ --- 1 Desktop PC 100000 1 2 Note PC 85000 1 3 Tablet PC 50000 1 4 Mouse 1000 2 5 Keyboard 1200 2 6 USB Memory 800 2 7 LAN Cable 500 2 8 USB Cable 300 2 9 Mother Board 25000 3 10 LAN Card 3000 3 11 Inkjet Printer 9000
行を指定して表示する
文法
SELECT 列名1,列名2.... FROM 表名;
意味
指定した表の特定列のみを表示することができます。列名は必要な数だけ任意に指定できます。
実行例1
商品表(items)から、商品名(name)と価格(price)の列のみを表示します。
SELECT name, price FROM items;
実行結果
name price -------------- ------ Desktop PC 100000 Note PC 85000 Tablet PC 50000 Mouse 1000 Keyboard 1200 USB Memory 800 LAN Cable 500 USB Cable 300 Mother Board 25000 LAN Card 3000 Inkjet Printer 9000
実行例2
利用者表(users)から名前(name)の列のみを表示します。
SELECT name FROM users;
実行結果
name --------- Hiroshi.T Yoko.M Naoto.H Ichiro.K Hitomi.S Akira.O
ここまでのポイントとして、次の2つをおさえておきましょう。
- SELECT句は 表示する列を決める 部分である。
- FROM句は 使用する表を決める 部分である。
WHERE句の利用
それでは次にWHERE句を使った文法を見ていきましょう。WHERE句は表の中の 行を特定すること が主な役割です。それでは文法を見ていきましょう。
文法
SELECT 列名1,列名2.... FROM 表名 WHERE 条件式;
解説
WHERE句では 条件式 を指定することで、条件に合った行だけを取得してくれます。条件式は 演算子 を用いて作成することができます。ここから代表的な演算子を見ていきましょう。
比較演算子
比較演算子とは条件式を作成するのに使用できる記号で、比較演算子を使った条件式の書き方は一般的に次のようになります。
列名 比較演算子 値
下表に比較演算子の種類と使用例を示します。
記号 | 使用例 | 使用例の意味 |
---|---|---|
= | 列A = 100 | 列Aが100である |
!= | 列A != 100 | 列Aが100ではない |
> | 列A > 100 | 列Aが100より大きい |
< | 列A < 100 | 列Aが100より小さい |
>= | 列A = 100 | 列Aが100以上である |
<= | 列A <= 100 | 列Aが100以下である |
いくつかの例を見ていきましょう。
実行例1
商品表(items)の中から商品ID(iid)が1である行を取得します。
SELECT * FROM items WHERE iid = 1;
実行結果
iid name price cid --- ---------- ------ --- 1 Desktop PC 100000 1
実行例2
商品表(items)から、価格(price)が50000以上の行を取得します。
SELECT * FROM items WHERE price >= 50000;
実行結果
iid name price cid --- ---------- ------ --- 1 Desktop PC 100000 1 2 Note PC 85000 1 3 Tablet PC 50000 1
実行例3
商品表(items)から、分類ID(cid)が2でないものを表示します。
SELECT * FROM items WHERE cid != 2;
実行結果
iid name price cid --- ------------ ------ --- 1 Desktop PC 100000 1 2 Note PC 85000 1 3 Tablet PC 50000 1 9 Mother Board 25000 3 10 LAN Card 3000 3
実行例4
商品表(items)から、商品名(name)が「Desktop PC」であるものを取り出します。
SELECT * FROM items WHERE name = 'Desktop PC';
実行結果
iid name price cid --- ---------- ------ --- 1 Desktop PC 100000 1
ポイント
=
や!=
の記号は文字列との比較も可能です。文字列を表す場合は「'
(シングルクォーテーション)」または「"
(ダブルクォーテーション)」で囲みます。
データ型
実行例4では比較する値に 文字列 を指定する例が登場しました。このような比較方法は 対象列のデータ型が文字列型の場合のみ 行なうことができます。 データ型(または型とも呼びます。本連載では以降「型」の表記を用います)とはデータの種類のことで、リレーショナルデータベースでは列ごとの型を指定して表を作成することになります。データベースで用いられる型の代表的なものを下表に示します。
型 | 特徴 |
---|---|
数値型 | 四則計算などを行なうことができる。大小比較ができる |
文字列型 | 計算はできない。文字列パターンなどとの比較ができる |
日付型 | 日付や時間の情報を保持できる。時間の大小比較や加減算ができる |
上記はかなり大ざっぱな分類です。実際にはDBMSの製品ごとに異なります。SQLiteでは次のような型が用意されています。
型 | 特徴 |
---|---|
INTEGER | 整数を扱える型 |
REAL | 浮動小数点を扱える型 |
TEXT | 文字列を扱える型 |
BLOB | 任意のバイナリデータ*1を扱える型 |
(*1)バイナリデータは任意の0と1のビット並びのデータです。データベースでは一般的に画像や音声データは、このバイナリデータの扱いとなります。
今回サンプルとして用意している各表各列は、次の型で定義されています。
またSQL文内に直接 値 を記述する場合も、型を意識する必要があります。文字列との比較を行なう際に、'
(シングルクォーテーション)で文字列を囲んだのはそのためです。'
が無い場合は、数値または列名や表名などと見なされ、意図しない結果を引き起こします。
LIKE演算子
LIKE演算子は文字列型の列と 文字列パターンを比較し、一致する行を取得できる演算子です。LIKE演算子を用いた条件式の凡例は次のとおりです。
列名 LIKE 文字列パターン
文字列パターンを記述する際は、通常の文字と次の2つの特殊表記(ワイルドカードと呼びます)を用いることができます。
表記 | 意味 |
---|---|
_ | 任意の1文字を表します |
% | 任意の文字列を表します |
それではいくつかの実行例を見ていきましょう。
実行例1
商品表(items)の中から、商品名(name)の最後に「PC」という文字列を含むものを表示します。
SELECT * FROM items WHERE name LIKE '%PC';
実行結果
iid name price cid --- ---------- ------ --- 1 Desktop PC 100000 1 2 Note PC 85000 1 3 Tablet PC 50000 1
実行例2
商品表(items)の中から、商品名(name)の最初に「USB」という文字列を含むものを表示します。
SELECT * FROM items WHERE name LIKE 'USB%';
実行結果
iid name price cid --- ---------- ----- --- 6 USB Memory 800 2 8 USB Cable 300 2
実行例3
商品表(items)の中から、商品名(name)のどこかに「M」が含まれているものを表示します。
SELECT * FROM items WHERE name LIKE '%M%';
実行結果
iid name price cid --- ------------ ----- --- 4 Mouse 1000 2 6 USB Memory 800 2 9 Mother Board 25000 3
解説
「%」の使い方がポイントです。「%」は 0文字以上の任意の文字列 を表す記号です。少し言葉の違和感があると思いますが 0文字の文字列 も該当します。したがって、「%M%」の表現は
- 「M」から始まる任意の文字列
- 他の文字の間に「M」を含む任意の文字列
- 「M」で終わる文字列
のいずれにも該当します。
実行例4
利用者表(users)の中から、名前(name)の「.」の前が5文字になっているものを表示します。
SELECT * FROM users WHERE name LIKE '_____.%';
実行結果
uid name age --- ------- --- 3 Naoto.H 26 6 Akira.O 25
解説
「_」は任意の1文字を表すので、5つ並べると「5文字であること」を条件にできます。
練習問題
それではここから練習問題です。
問1
分類表(categories)から、すべての行、すべての列を表示してください。
実行結果
cid name --- -------- 1 PC 2 Supply 3 PC Parts
問2
商品表(items)から、価格(price)が10000以下の行を表示してください。表示列はすべての列です。
実行結果
iid name price cid --- -------------- ----- --- 4 Mouse 1000 2 5 Keyboard 1200 2 6 USB Memory 800 2 7 LAN Cable 500 2 8 USB Cable 300 2 10 LAN Card 3000 3 11 Inkjet Printer 9000
問3
商品表(items)から、商品名(name)の最後が「Cable」となっている行のnameとprice列を表示してください。
実行結果
name price --------- ----- LAN Cable 500 USB Cable 300
問4
商品表(items)から、商品名(name)に空白を含む行のname列を表示してください。
実行結果
name -------------- Desktop PC Note PC Tablet PC USB Memory LAN Cable USB Cable Mother Board LAN Card Inkjet Printer
練習問題(解答例)
それでは、練習問題の解答例です。
問1
SELECT * FROM categories;
問2
SELECT * FROM items WHERE price <= 10000;
問3
SELECT name,price FROM items WHERE name LIKE '%Cable';
問4
SELECT name FROM items WHERE name LIKE '% %';
おわりに
本日は以上とさせていただきます。最後までご覧くださりありがとうございます。今回はwhere句を中心にご紹介しましたが、where句で使える条件式にもまだまだできるものが沢山あります。次回もwhere句のさらなる活用をご紹介する予定です。引き続きよろしくお願いいたします。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。