Upload
satomi-tsujita
View
6
Download
1
Embed Size (px)
DESCRIPTION
Citation preview
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 ...
クライアント(Rails,ターミナルetc.)
RDBMS
SQL
データ
?
データRDB
データの型
SMALLINT, INT, FLOAT, REAL, DEC, NUMERIC ...数値
CHAR, NATIONAL CHAR, VARCHAR ...文字列
DATE, TIME, TIMESTAMP ...日時データ
BINARY LARGE OBJECT ...バイナリ型
BIT, BIT VARYING ...ビット列
BOOLEAN ...ブール型
システムによって異なるので注意
SQLを書く前に
RDBMSによって記述が異なるので注意
構文は慣習的に大文字(実は小文字でもいい)
文の最後はセミコロン;
改行、スペースは文中で自由に使ってよい
文字列と日付はシングルクォート ’ で囲む
テーブル名とカラム名は日本語でできるものもある
SQLを書く前に(例)
☆社員id 名前 入社日INTEGER CHAR DATE
社員テーブル employees
☆出勤日id 出勤日INTEGER DATE
出勤日テーブル attendance_days
☆出勤id 出勤日id 社員idINTEGER INTEGER INTEGER
出勤テーブル attendance_book
出勤テーブル
社員テーブル
出勤日テーブル
1 1
多 多
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 <= ba > b, a >= ba <> ba NOT b, a AND b, a OR ba IN (b, c)a BETWEEN b AND ca 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;
例
SELECT attend_on COUNT(employee_id) FROM attendance_book GROUP BY attend_on;
文の最後にHAVINGを用いて集約条件をつけることができる
SQL: データ並べ替え
文法
SELECT * FROM テーブル名
ORDER BY 列名1 DESC;
例
SELECT * FROM employees ORDER BY beginning_on DESC;
何も書かなければ昇順のASC。
SQL: 内部結合と外部結合
内部結合:対象テーブルのすべてのデータの組み合わせが取れる(データが多重表示される)
外部結合:基準テーブルのデータに対して対象となるデータが取れる
☆社員id 名前 入社日
☆出勤id 出勤日id 社員id社員テーブル employees
出勤テーブル attendance_book
↑結合キー
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は同じものですか?
参考サイト・書籍
TECHSCOREhttp://www.techscore.com/tech/sql
SQLitehttp://www.sqlite.org/
MySQLhttp://www.mysql.com/
http://www.mysql.gr.jp/
ゼロからはじめるデータベース操作 SQL翔泳社 ミック著