リンク

正規形

データベースの正規化の基礎

  • 第1正規形
    • 各テーブルで繰り返し現れるグループを除去します。
    • 関連するデータごとに 1 つのテーブルを作成します。
    • 関連するデータ セットを主キーで識別します。
  • 第2正規形
    • 複数のレコードに該当する値のセットごとに 1 つのテーブルを作成します。
    • これらのテーブルを外部キーと関連付けます。
  • 第3正規形
    • キーに従属しないフィールドを除去します。

SQLの実行順序

FROM → WHERE → GROUP BY → HAVING → SELECT (→ ORDER BY)

HAVING 句、GROUP BY 句で書ける要素

  • 定数
  • 集約関数
  • GROUP BY 句で指定した列名(集約キー)

自動時間更新の設定

create table sample (
  id         int primary key auto_increment,
  val       varchar(16),
  created_at timestamp not null default current_timestamp,
  updated_at timestamp not null default current_timestamp on update current_timestamp
);

11.3.5 TIMESTAMP および DATETIME の自動初期化および更新機能

SQL の文とその種類

  • DDL(Data Definition Language) データ定義言語
    • CREATE
    • DROP
    • ALTER
  • DML(Data Manipulation Language) データ操作言語
    • SELECT
    • INSERT
    • UPDATE
    • DELETE
  • DCL(Data Control Language) データ制御言語
    • COMMIT
    • ROLLBACK
    • GRANT
    • REVOKE

重複を排除する(DISTINCT)

SELECT DISTINCT job
FROM   emp;

GROUP BY

SELECT   グループ化する列名, 関数(列名), …
FROM     表名
GROUP BY グループ化する列名
…
SELECT deptno, COUNT(empno) AS "社員数", TRUNC(AVG(sal)) AS "平均給与"
FROM   emp
GROUP BY deptno
ORDER BY deptno;

GROUP BY句に複数の列を指定すると、複数の列を使ってさらに細かくグループ化することもできます。次の例では、GROUP BY句にdeptno列と、job列を指定しています。このように指定すると、最初に指定したdeptno(部門番号)でグループ化し、部門が同じ人をさらにjob(職種)でグループ化することができます。

SELECT deptno, job, COUNT(empno)  AS "社員数", TRUNC(AVG(sal)) AS "平均給与"
FROM   emp
GROUP BY deptno, job
ORDER BY deptno, job;

HAVING句

グループ化した結果に対して条件を付けて、特定のグループだけを検索する場合には、WHERE句ではなく、HAVING句を使用します。

SELECT   グループ化する列名, 関数(列名), …
FROM     表名
GROUP BY グループ化する列名
HAVING   グループ化した結果に対する条件
…

例えば、社員が2人以上いるグループだけを表示したい場合には、以下のように指定します。

SELECT deptno, COUNT(empno) AS "社員数", TRUNC(AVG(sal)) AS "平均給与"
FROM   emp
GROUP BY deptno, job
HAVING COUNT(empno)>=2
ORDER BY deptno, job;

グループ関数

グループ関数説明
MAX対象列のデータのうち、最大値を戻す
MIN対象列のデータのうち、最小値を戻す
AVG対象列のデータの、平均値を戻す(数値データ型に対してのみ使用可能)
SUM対象列のデータの、合計値を戻す(数値データ型に対してのみ使用可能)
COUNT問合せによって戻された行の数を戻す
SELECT    関数(列名), 関数(列名), …
FROM     表名
…

内部結合と外部結合

内部結合
一致するデータのみを検索する結合構文(指定のテーブル内のレコードのみを使う)
外部結合
一致しないデータを含めて検索する結合構文(行数固定)

外部結合では、FROM句に「RIGHT」または「LEFT」キーワードを指定します。「RIGHT」または「LEFT」で、FROM句に記載した表の、左右どちらの表のデータをすべて表示するかを指定します。一般的に「LEFT」を使う場合が多い。

SELECT e.ename, d.deptno, d.dname
FROM   emp e RIGHT OUTER JOIN dept d
ON     e.deptno=d.deptno;

また、互いに一致するデータがない場合でも、両方の表すべてのデータを表示したい場合には、「FULL OUTER JOIN」を指定します。

JOIN

NATURAL JOIN 句

SELECT    表1.列名, 表2.列名, 共通列…
FROM      表1 NATURAL JOIN  表2
……
SELECT emp.ename, deptno, dept.dname
FROM   emp NATURAL JOIN dept;

USING 句

SELECT    表1.列名, 表2.列名, 共通列…
FROM      表1  JOIN  表2
USING     (共通列)
……
SELECT emp.ename, deptno, dept.dname
FROM   emp JOIN dept
USING (deptno);

ON 句

SELECT    表1.列名, 表2.列名, 表1.共通列…
FROM      表1  JOIN  表2
ON        表1.共通列  =  表2.共通列
……
SELECT emp.ename, dept.deptno, dept.dname
FROM   emp JOIN dept
ON     emp.deptno=dept.deptno;

表別名

SELECT    表別名1.列名, 表別名2.列名, 表別名1.共通列…
FROM      表1  表別名1 JOIN  表2 表別名2
ON        表別名1.共通列 = 表別名2.共通列
……
SELECT e.ename, d.deptno, d.dname
FROM   emp e JOIN dept d
ON     e.deptno=d.deptno;

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-29 (火) 11:54:57 (808d)