こんにちは、ECF Techブログ
担当のMichiharu.Tです。
本記事はSQL文について、実際に動作させながら学習する入門記事の第4回となります。本記事の題材となっているデータベース内の各表、および学習の始め方については、下記の第1回の記事からご覧ください。
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つ、「結合」の方法について、ご紹介します。引き続きよろしくお願いいたします。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。