SQLiteでデータベース(SQL)の基本を学ぶ(4)

データベース

こんにちは、ECF Techブログ
担当のMichiharu.Tです。

本記事はSQL文について、実際に動作させながら学習する入門記事の第4回となります。本記事の題材となっているデータベース内の各表、および学習の始め方については、下記の第1回の記事からご覧ください。

データベース
データベースのカテゴリです。トレーニングとして使えるSQLの入門記事などを連載しています。

SELECT句の活用

今回は主にSELECT句の活用についてご紹介します。SELECT句は主に取得する列を決定する役割がありますが、他にも次のような様々なことが可能です。

  • 列の値に基づいて計算をする
  • 列の値を加工する
  • 複数の行をまとめた上で処理を行ない、その結果を表示する

本連載では以降、上記の列に関する処理、および列名の記述を総称して 列指定 と呼ぶことにします。

それでは、1つ1つ見ていきましょう。

列の値に基づいて計算をする

SELECT句で列を指定する際に、算術演算(+、ー、×、÷)をすることができます。使用できる記号は次のようになります。

記号 意味
+ 加算
- 減算
* 乗算
/ 除算

実行例を見ていきましょう。

実行例1

ユーザー表(users)から、ユーザーID(uid)に1000加算した値、名前(name)の2列を表示します。

SELECT uid + 1000, name
FROM users;

実行結果

uid + 1000  name
----------  ---------
1001        Hiroshi.T
1002        Yoko.M
1003        Naoto.H
1004        Ichiro.K
1005        Hitomi.S
1006        Akira.O

実行例2

商品表(items)から、商品名(name)、価格(price)に10%上乗せした金額の2列を表示します。

SELECT name, price * 1.1
FROM items;

実行結果

name            price * 1.1
--------------  -----------
Desktop PC      110000.0
Note PC         93500.0
Tablet PC       55000.0
Mouse           1100.0
Keyboard        1320.0
USB Memory      880.0
LAN Cable       550.0
USB Cable       330.0
Mother Board    27500.0
LAN Card        3300.0
Inkjet Printer  9900.0

列に別名をつける

前節でご紹介した算術演算は便利な機能ですが、表示結果の列名に計算式が表示されている点が難点です。これを解決する方法として、 列に別名をつける 方法が便利です。列指定部分に記述する場合の凡例は次のようになります。

列指定 AS 列別名

実行例を見てみましょう。

実行例1

商品表(items)から、商品名(name)、価格(price)に10%上乗せした金額の2列を表示します。2列目には「InTax」という別名を付与します。

SELECT name, price * 1.1 AS InTax
FROM items;

実行結果

name            InTax
--------------  --------
Desktop PC      110000.0
Note PC         93500.0
Tablet PC       55000.0
Mouse           1100.0
Keyboard        1320.0
USB Memory      880.0
LAN Cable       550.0
USB Cable       330.0
Mother Board    27500.0
LAN Card        3300.0
Inkjet Printer  9900.0

連結演算子

次は 連結演算子 です。連結演算子は列同士や列名と文字列などを結合し、1つの文字列とします。列指定の際の凡例は次のとおりです。

値1 || 値2

※値1、値2は列名や文字列などが入ります。

実行例を見てみましょう。

実行例1

商品表(items)から、商品名(name)、価格(price)を表示します。価格は末尾に「Yen」をつけて表示します。

SELECT name, price || 'Yen'
FROM items;

実行結果

name            price || 'Yen'
--------------  --------------
Desktop PC      100000Yen
Note PC         85000Yen
Tablet PC       50000Yen
Mouse           1000Yen
Keyboard        1200Yen
USB Memory      800Yen
LAN Cable       500Yen
USB Cable       300Yen
Mother Board    25000Yen
LAN Card        3000Yen
Inkjet Printer  9000Yen

実行例2
ユーザー表(users)から、ユーザーID(uid)と氏名(name)を用いて、下の形式で表示します。

uidが1の行の例

No.1 Hiroshi.T

SQL文

select 'No.' || uid || ' ' || name
FROM users;

実行結果

'No.' || uid || ' ' || name
---------------------------
No.1 Hiroshi.T
No.2 Yoko.M
No.3 Naoto.H
No.4 Ichiro.K
No.5 Hitomi.S
No.6 Akira.O

解説

連結演算子を複数利用することで、文字列や列を次々に繋いでいくことができます。

重複を排除する

次に表示対象列の重複を排除する例について見ていきましょう。重複を排除するには 「DISTINCT」というキーワードを使います。まずは実行例と実行結果をご覧ください。

実行例1

注文表(orders)から、注文日(odate)を重複を排除して表示する。

SELECT DISTINCT odate
FROM orders;

実行結果

odate
----------
2021-04-10
2021-04-15
2021-05-01
2021-05-10
2021-05-15
2021-04-30
2021-05-20

上の実行結果は、元の注文表と比較すると同じ値は2度表示されていないことがわかります(下図)。

DISTINCTキーワードの使い方は下のとおりとなります。SELECT句部分を表示します。

SELECT DISTINCT 列名1, 列名2....

DISTINCTキーワードが使えるのは、 SELECTの記述直後に1度だけ です。次のように、それぞれの列に付加することはできません。

SELECT DISTINCT 列名1, DISTINCT 列名2....

また、DISTINCTキーワードの後ろに複数の列を指定した場合、 指定したすべての列の値が一致してはじめて重複と見なされます。 下に実行例を示します。

実行例2
注文明細表(order_details)から、明細番号(mno)と数量(amount)を表示する。但し、両列とも同じ値のものは重複と見なし、2度表示しない。

SELECT DISTINCT mno, amount
FROM order_details;

実行結果

mno  amount
---  ------
1    1
2    1
3    1
1    2
1    10
1    5
2    10

注文明細表は全部で17行ありますので、ずいぶんと重複が排除されています。たとえば明細番号(mno)と数量(amount)が共に「1」となっている行は下のとおりで、これらは1行として表示されます。

練習問題

それではここから練習問題です。

問1

商品表(items)から、商品名(name)、価格(price)、価格の2割引価格の3列を表示してください。2割引価格の列は「discount」という列別名をつけてください。

実行結果

name            price   discount
--------------  ------  --------
Desktop PC      100000  80000.0
Note PC         85000   68000.0
Tablet PC       50000   40000.0
Mouse           1000    800.0
Keyboard        1200    960.0
USB Memory      800     640.0
LAN Cable       500     400.0
USB Cable       300     240.0
Mother Board    25000   20000.0
LAN Card        3000    2400.0
Inkjet Printer  9000    7200.0

問2

ユーザー表(users)の氏名(name)と年齢(age)の列を使用し、「氏名(年齢)」の形式で表示してください。表示列は「profile」という列別名をつけてください。

実行結果

profile
-------------
Hiroshi.T(35)
Yoko.M(28)
Naoto.H(26)
Ichiro.K(44)
Hitomi.S(33)
Akira.O(25)

問3

ユーザー表(users)のうち、氏名(name)が「Yoko.M」および「Hitomi.S」以外のものについて、その氏名を「Mr. 氏名」の形式で表示してください。表示する場合の列別名は「name」としてください。

実行結果

name
-------------
Mr. Hiroshi.T
Mr. Naoto.H
Mr. Ichiro.K
Mr. Akira.O

問4

注文表(orders)から、ユーザーID(uid)を重複なしで表示してください。

実行結果

uid
---
1
2
3
4
6

練習問題(解答例)

それでは、練習問題の解答例です。

問1

SELECT name, price, price * 0.8 AS discount
FROM items;

問2

SELECT name || '(' || age || ')' AS profile
FROM users;

問3

SELECT 'Mr. ' || name AS name
FROM users
WHERE name NOT IN('Yoko.M', 'Hitomi.S');

問4

SELECT distinct uid
FROM orders;

おわりに

本日は以上とさせていただきます。最後までご覧くださりありがとうございます。今回はSELECT句での様々な表示・表現方法をご紹介しました。次回はリレーショナルデータベースの最重要項目の1つ、「結合」の方法について、ご紹介します。引き続きよろしくお願いいたします。


合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。

ECFエデュケーション
タイトルとURLをコピーしました