こんにちは、今日はSQLについて少し学んでいこうかなと思います。使用するのはOracle Database18c Enterprise Editionです。
ORACLE MASTER Bronze SQL 基礎Ⅰというテキストを参考にしていきます。今日は初日ということで、まず簡単な構文を扱います。
SELECT文
SELECT分は昨日の記事でも扱いました。しっかり学んだことはありませんが、使用したことはあります。SELECT文は”射影”、”選択”、”結合”機能を持ちます。
SELECT 列名 FROM 表名;
これまではSELECT * を使ってテーブルから全てのデータを取り出していましたが、列ごとに取り出すことができます。employeesテーブルを使ってSELECT文を試してみます。employeesテーブルは以下のようになっています。
EMPNO NAME SALARY COMM HIREDATE MANAGER DEPT_ID
------ ---------- ---------- ---------- --------- ---------- ----------
100 King 4500 200 17-11月-87 10
101 John 1800 150 07-4月 -89 100 20
102 David 2400 31-8月 -91 100 30
103 Paul 1800 120 01-6月 -94 101 20
104 Jones 2500 120 21-11月-98 102 30
105 Steven 2500 11-7月 -98 102 30
106 Denver 2600 08-11月-98 101 20
SELECT name FROM employees;
NAME
----------
King
John
David
Paul
Jones
Steven
Denver
employeesテーブルからnameだけ取り出すことができました。
SQL文の算術式
SQL文の算術式を使ってみます。number型であるsalaryに加算します。
SELECT salary, salary + 300 FROM employees;
SALARY SALARY+300
---------- ----------
4500 4800
1800 2100
2400 2700
1800 2100
2500 2800
2500 2800
2600 2900
追加前のsalaryと300を追加した後のsalaryをSELECTしてみました。もう少し触ってみます。
SELECT salary, salary + 300, salary -300 FROM employees;
SALARY SALARY+300 SALARY-300
---------- ---------- ----------
4500 4800 4200
1800 2100 1500
2400 2700 2100
1800 2100 1500
2500 2800 2200
2500 2800 2200
2600 2900 2300
算術演算子の優先順位
1+3×2の答えはなんでしょう。簡単ですね”7″です。3×2を計算した後に+1を計算します。これをSQL文で使ってみます。
SELECT salary, 1+3*salary FROM employees;
SALARY 1+3*SALARY
---------- ----------
4500 13501
1800 5401
2400 7201
1800 5401
2500 7501
2500 7501
2600 7801
まずsalaryが3倍されてから1がプラスされました。
ところで、数学において0で割ることはできませんが、SQLではどうでしょう。気になったのでsalaryを0で割ってみましょう。
SELECT salary, salary/0 FROM employees;
次のコマンドの開始中にエラーが発生しました : 行 1 -
SELECT salary, salary/0 FROM employees
エラー・レポート -
ORA-01476: 除数がゼロです
もちろんエラーが出ますね。しかもエラー内容に”除数がゼロです”と出ています。
列見出しの変更
SELECT文では列の先頭につけられる見出しを変更することができるそうです。早速やってみましょう。
SELECT salary, comm, 12*(salary + comm) income FROM employees;
SALARY COMM INCOME
---------- ---------- ----------
4500 200 56400
1800 150 23400
2400
1800 120 23040
2500 120 31440
2500
2600
incomeという名前に変更することができました。しかし、所々空欄がありますね。commの空欄は歩合給がない人にはNULLを入れています。NULLに算術処理を行っても結果はNULLになってしまうんですね。
また、変更後の見出しを””で囲むと入力したままの文字列で出力されます。先ほどは””で囲んでいなかったのでINCOMEと列見出しとして大文字になりましたが、次の文ではincomeが小文字のまま出力されています。
SELECT salary, comm, 12*(salary + comm) "income" FROM employees;
SALARY COMM income
---------- ---------- ----------
4500 200 56400
1800 150 23400
2400
1800 120 23040
2500 120 31440
2500
2600
連結演算子
||を使うことで文字列を連結することができます。*演算子含めて見出しになるので、salaryに置き換えています。
SELECT '$ ' || salary salary FROM employees;
SALARY
----------
$ 4500
$ 1800
$ 2400
$ 1800
$ 2500
$ 2500
$ 2600
空白も認識されるようですね。数字も連結することができるようです。
SELECT '100' || salary salary FROM employees;
SALARY
---------
1004500
1001800
1002400
1001800
1002500
1002500
1002600
重複行の削除
同列内に同じ値がある場合は、DISTINCTを指定することで除くことができます。
SELECT manager FROM employees;
MANAGER
----------
100
100
101
102
102
101
SELECT DISTINCT manager FROM employees;
MANAGER
----------
101
100
102
SELECT COUNT(DISTINCT manager) FROM employees;
COUNT(DISTINCTMANAGER)
----------------------
3
マネージャーは101、100、102と3人で他は重複となっています。Countを使うことで重複を除いた後の数を取得できます。
おわりに
今日はちょこっとだけSQL文を学習してみました。学習といってもほんのさわり程度ですが…
PHPとの接続で少してこずっているので、明日それを記事にできたらいいなと思います。明日もPHPとOracle Databaseの接続記事が投稿されなかった場合は…察してください。
今日は短い記事になってしまったので、明日はもりもり書いていく予定です!
本日も最後までご覧いただきありがとうございました。
コメント