こんにちは、今日は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の接続記事が投稿されなかった場合は…察してください。
今日は短い記事になってしまったので、明日はもりもり書いていく予定です!
本日も最後までご覧いただきありがとうございました。
コメント