SQL基礎の基礎
  @satomicchy
自己紹介


つじたさとみ

@satomicchy
経理ときどきエンジニア

Minami.rb, Coffee女子会, Ruby関西

プログラム歴3年目
発表の前に


自分で勉強したことをまとめました。

Railsを使う上で知っておいた方がいいかなと思うことだけ
抜き出してあります。本気でDBしたい人は本を買ってくだ
さい。

ツッコミ、間違いのご指摘お願いします。

最後に質問があるで教えてください。
SQL?

SQL : Structured Query Language(構造化問合せ言語)




リレーショナルデータベース: RDBとデータをやりとりする
ための言語
RDB?

RDB: Relational Data Base(リレーショナルデータベース)

行と列の表形式でデータを保存

RDBMS: Relational Data Base Management System
(リレーショナルデータベースマネージメントシステム)

例)SQLite3, MySQL, PostgreSQL, MongoDB ...

               SQL              ?
  クライアント
  (Rails,ターミ          RDBMS              RDB
    ナルetc.)
                データ             データ
データの型

SMALLINT, INT, FLOAT, REAL, DEC, NUMERIC ...数値

CHAR, NATIONAL CHAR, VARCHAR ...文字列

DATE, TIME, TIMESTAMP ...日時データ

BINARY LARGE OBJECT ...バイナリ型

BIT, BIT VARYING ...ビット列

BOOLEAN ...ブール型

システムによって異なるので注意
SQLを書く前に

RDBMSによって記述が異なるので注意

構文は慣習的に大文字(実は小文字でもいい)

文の最後はセミコロン;

改行、スペースは文中で自由に使ってよい

文字列と日付はシングルクォート ’ で囲む

テーブル名とカラム名は日本語でできるものもある
SQLを書く前に(例)
社員テーブル employees
  ☆社員id     名前     入社日
                                    出勤
 INTEGER   CHAR    DATE
                                    テーブル
出勤日テーブル attendance_days         多          多
 ☆出勤日id    出勤日              1                  1
 INTEGER   DATE            社員              出勤日

出勤テーブル attendance_book     テーブル            テーブル

  ☆出勤id    出勤日id   社員id
 INTEGER INTEGER INTEGER
SQL: データベース作成
文法

CREATE DATABASE データベース名;


例

CREATE DATABASE attendances;
SQL: テーブル作成
文法

CREATE TABLE テーブル名 (列名 データ型 制約, ...,
    PRIMARY KEY (列名));         列毎の制約をまとめて書く
                               方法もある(テーブル制約)
例
                              一つのデータを特定するための
CREATE TABLE employees (      もの = 空欄・重複厳禁
    id INTEGER,
    name CHAR(15) NOT NULL,
    PRIMARY KEY (id));
SQL: 列の追加
文法

ALTER TABLE テーブル名 ADD (列名 データ型 制約, ...);


例

ALTER TABLE employees ADD (
    beginning_on DATE);
SQL: データ入力
文法

INSERT INTO テーブル名 (列名1, 列名2, ...)

    VALUES (列名1の値, 列名2の値, ...);

例

INSERT INTO employees (name, beginning_on)
    VALUES (‘つじたさとみ’, ‘2010/4/1’);


型によってシングルクオート              日付区切りはハイフンでも可
忘れずに
SQL: データ参照
文法(全部参照)

SELECT 列名1, 列名2 FROM テーブル名;


例

SELECT name, beginning_on FROM employees;
SQL: データ参照
文法(条件付き参照)

SELECT 列名1, 列名2 FROM テーブル名

    WHERE 条件;

例

SELECT name, beginning_on FROM employees
    WHERE name = ‘つじた’;
SQL: データ参照
条件例

a < b, a <= b
a > b, a >= b
a <> b
a NOT b, a AND b, a OR b
a IN (b, c)
a BETWEEN b AND c
a LIKE ‘b’          ワイルドカードとして、%(とある文字列)、
a IS NULL           _(とある一文字)が使える
SQL: データ変更
文法

UPDATE テーブル名 SET 列名1 = 値1, 列名2 = 値2

    WHERE 条件;


例

UPDATE employees SET beginning_on = ‘2009/4/1’
    WHERE id = ‘1’;
SQL: データ削除
文法

DELETE FROM テーブル名

    WHERE 条件;


例

DELETE FROM employees
    WHERE id = ‘1’;
SQL: データ集計
文法(集約関数)

SELECT 関数 FROM テーブル名;


例

SELECT COUNT(name) FROM employees;
SQL: データ集計
関数例

SUM()
AVG()
MAX()
MIN()
COUNT()
SQL: データ集計
文法

SELECT 列名1, 列名2, 関数 FROM テーブル名

    GROUP BY 列名1, 列名2;

                      文の最後にHAVINGを用いて集約条件を
例                     つけることができる

SELECT attend_on COUNT(employee_id)
    FROM attendance_book
    GROUP BY attend_on;
SQL: データ並べ替え
文法

SELECT * FROM テーブル名

    ORDER BY 列名1 DESC;

                       何も書かなければ昇順のASC。
例

SELECT * FROM employees
    ORDER BY beginning_on DESC;
SQL: 内部結合と外部結合
出勤テーブル attendance_book
☆出勤id   出勤日id    社員id
                         社員テーブル employees
                ☆社員id    名前   入社日
                ↑結合キー
内部結合:対象テーブルのすべてのデータの組み合わせが取
れる(データが多重表示される)

外部結合:基準テーブルのデータに対して対象となるデータ
が取れる
SQL: テーブル内部結合
文法

SELECT テーブル1.列1, テーブル2.列1, ...   結果としてほしい列

   FROM テーブル1 INNER JOIN テーブル2
                                 結合するテーブル
   WHERE テーブル1.列1 = テーブル2.列1

      AND 参照条件;        結合キー
                       WHEREの代わりにONでもいい


         参照するデータの条件
         ONで結合キーを指定したときはWHEREで条件追加
SQL: テーブル内部結合
例

SELECT attendance_book.attend_on, employees.name
    FROM attendance_book INNER JOIN employees
    WHERE attendance_book.employee_id = employees.id
       AND attendance_book.attend_on > ‘2010/4/1’;
SQL: テーブル外部結合
文法

SELECT テーブル1.列1, テーブル2.列1, ...   結果としてほしい列

   FROM テーブル1 LEFT OUTER JOIN テーブル2

   WHERE テーブル1.列1 = テーブル2.列1
                        結合するテーブル
      AND 参照条件;        LEFT OUTER : 基準テーブルは左
                       RIGHT OUTER : 基準テーブルは右
           結合キー
           WHEREの代わりにONでもいい
  参照するデータの条件
  ONで結合キーを指定したときはWHEREで条件追加
トランザクション?
ひとまとまりで実行されるべき処理の集まり


例:出勤日を間違えて登録した

  →出勤日を変更する+社員の出勤登録を変更する

   まとめて変更しなければ孤立したおかしなデータが残る




           ルールがある
ルール=ACID?
Atomicity: 原子性・・・トランザクション(作業の最小単
位)は、すべて有効に処理されるか、全く処理されないか
のどちらかということ

Consistency: 一貫性・・・トランザクションが実行された
前後でデータの整合性が保証されるということ

Isolation: 独立性・・・トランザクション中は、他の操作を
一切受け付けないということ

Durability: 永続性・・・トランザクションが終了した時点
でのデータが保証(保存)されるということ
ルール=ACID?
ACIDはRDBMSがよきに計らってくれるものではなく、実装
して自分で守るもの。




Railsでも自分で実装しなければならない!

というところだけ覚えていてください。
おまけ



Railsで見られるSQL → rails sしたターミナルを見てみる

資料や書籍は1つを鵜呑みにせず3つは当たる
疑問



SQL statementて何ですか?

SQLのGROUP BYとRubyの.group_byは同じものですか?

SQLのORDER BYとRubyの.orderは同じものですか?
参考サイト・書籍
TECHSCORE
http://www.techscore.com/tech/sql
SQLite
http://www.sqlite.org/
MySQL
http://www.mysql.com/
http://www.mysql.gr.jp/
ゼロからはじめるデータベース操作 SQL
翔泳社 ミック著

Sql基礎の基礎