SQL
メインページ > 工学 > 情報技術 > プログラミング > SQL
ようこそ[編集]
ようこそ、SQLの世界へ。 2007年現在。RDBMS[1](リレーショナルデータベース管理システム)……いわゆるデータベースは、世界中に広く使用されています。 え? 見た事もない? いえいえ。貴方の預金口座、プリペイドICカードの残高も、先日注文したショッピングサイトの注文履歴も、すべてデータベースで管理されています。 『データの蓄積』という行為がある限り、RDBMSは、貴方の生活とは切っても切り離せないものなのです。
それどころか、貴方がもし『表計算アプリケーション』(例えば、Microsoft社のExcelや、OpenOfficeのCalc)を使用しているのであれば もう貴方は、データベースの世界に足を踏み入れている可能性が高いのです。
なので、おそれる事はありません、SQLなんて。『箱を作る、捨てる』『データを入れる』『データを書き換える』『データを引っ張り出す』『データを捨てる』ぐらいで大半の事は済ませられます。 大掛かりで面倒で大変そうだと感じるのは……SQLではなく、データベースのセットアップだとかです。データベースそのものについてのメンテナンスが大変なだけなのです。
そんなのは、DBA[2]の連中に任せて。 私達は、手早く簡単に、IT社会における膨大な情報を、お片づけしましょう。 ようこそ。膨大な情報を素早く操る術を身につける事を志す者よ。
SQLとは[編集]
SQLは、RDBMSへの要求(Query、クエリー)を行う為に定義された言語である。SQLの正式名称はSQLそのままであり略称ではない。 しかしながら1970年代に、IBM社のSanJose研究所において初のRDBMSプロトタイプSystem Rが発表された際に定義されたSEQUEL (Structured English QUEry Language) が他社商標との衝突を回避する為に、SQLと改名されました。Englishの部分を除いたSQL (Structured Query Language) として広く知れ渡る事になった背景があります。
次に歴史背景です。1970年代は、IBM社を筆頭に、ORACLE社など様々なRDBMSが生み出され、また各RDBMSに沿ったSQLが生み出されました。 そして、1980年代後半~1990年代初頭にかけて、ISO(国際標準規格)およびJIS(日本工業規格)による標準化の試みが行われる事となり、1999年には、SQL99と呼ばれる規格が制定され運びとなりました。
主なRDBMS(概要)[編集]
MySQL[編集]
L.A.M.P. (Linux,Apache,MySQL,PHP) という用語が定着している通り、MySQLは一定の評価を得ているオープンソースのデータベース(2007年現在)である。機能よりも検索速度重視で開発が進められてきたがMySQL5を境に、機能面の充実が図られている。
PostgreSQL[編集]
MySQLがトランザクション機能(処理排他機能)をサポートしていなかった頃、機能を必要とするベンダにおいて選択の1つとして候補に挙がっていたRDBMSである。また2007年現在では、富士通社によるPowerGRESシリーズによる日本国内サポート環境、NTT-Data社によるLudiaなど、日本国内での人気度が伺える。
SQLite[編集]
SQLite は、Cで書かれたデータベースエンジンである。 スタンドアローンのアプリケーションプログラムではなく、ソフトウェア開発者がアプリケーションプログラムに埋込むライブラリーである。 このため、組込み型データベースに分類される。 Google Chrome や Mozilla Firefoxなどのウェブブラウザ^、OS、携帯電話、その他の組込みシステムで使用されているため、最も広く導入されているデータベースエンジンの1つである。
Oracle[編集]
正しくは、Oracle Databaseシリーズ。マニュアル類のヴァージョン表記に、Oracle9i等のように記述されるため Oracle という呼び名が使われている。 RDBMSとしては世界初の商用採用として、耐障害性に特化した機能や、幅広い言語APIの提供等に一目置かれている。
DB2[編集]
IBM社のDB2は、長い間、自社プラットフォーム上でしか動作せず、表舞台に立っていたとは言えないが、SQLの歴史的背景の実績だけに留まらず、DB2シリーズ (UDB) に於いては、競合するOracle社から良きライバルとして評価されている。またIBM側もOracleのトランザクション処理における高い技術力を評価しあう関係にある。
スキーマ[編集]
スキーマとは、データを格納する枠組み(データベース)を定義するものである。 表定義の他、アクセス権限、インデックス付与、ビュー定義等もスキーマに含まれる。
表定義[編集]
表定義とは、実際にデータの出納を行う物理的な定義を意味する。 本稿では以下のテーブルを用いて以後の説明を行う。
フィールド名 | データ型 | 制約 |
---|---|---|
ID | char(32) | not null |
氏 | char(32) | not null |
名 | char(32) | not null |
年齢 | integer(3) | unsigned, not null |
職業 | char(128) | not null |
住所 | char(128) | null |
- 記述例
CREATE TABLE personal (
ID番号 integer(20) not null,
ユーザID char(32) not null,
氏 char(32) not null,
名 char(32) not null,
年齢 integer(3) unsigned not null,
職業 char(128) not null,
住所 char(128),
PRIMARY KEY(ID番号),
UNIQUE(ユーザID)
);
整合性制約[編集]
データベースに格納されるデータの整合性を保つ為に、スキーマで指定する制約事項。
- PRIMARY KEY(主キー、PKとも)
- 該当行そのものを示す。PKであればUNIQUEやNOT NULLが自動的に付与されるが、逆は成り立たない。
- FOREIGN KEY(外部キー、FKとも)
- データ間リンク(結合先)を明示する。例えば、会員情報テーブルから会員を削除した際、購入履歴テーブルにある情報も削除する。これにより『ゴミデータ(孤立データ)』を防ぐ事が出来る。
- NOT NULL
- キーをNULLにすることができなくなる。
- UNIQUE
- 該当フィールドには、同一テーブル内で重複した値を持つ事が出来ない。
- CHECK
- 指定した条件に当てはまる値のみを受け入れる。
ビュー定義[編集]
ビュー定義とは、表定義のうち指定条件を満たす行で構成される仮想的な表である。
データ操作[編集]
INSERT[編集]
データを追加する。
レコード行 | ID | 氏 | 名 | 年齢 | 職業 | 住所 |
---|---|---|---|---|---|---|
1 | egohgeoh | 安威 | 植雄 | 47 | 会社員 | 北海道 |
2 | reboof | 夏樹 | 久華子 | 24 | 会社員 | (NULL) |
3 | moin | 佐史 | 守瀬聰 | 36 | 住職 | シーランド公国 |
4 | e104da4ef | 太刀 | 津照人 | 20 | ウィキペディアン | 志賀県 |
- 文法
- INSERT INTO テーブル名 ( フィールド名1, フィールド名2, ... ) VALUES ( 値1, 値2, ... );
- 記述例
- INSERT INTO personal (ID, 氏,名,年齢,職業,住所) VALUES ('e104da4ef', '太刀','津照人','20','ウィキペディアン','志賀県');
- ※太字のレコードが新規に追加される。
SELECT[編集]
データを抽出する。
文法
- SELECT 表示するフィールド FROM テーブル名 [WHERE 抽出条件] [ORDER BY 並べ替えの基準となるフィールド];
記述例1
- SELECT * FROM personal;
この記述は、全てのデータを出力する。
レコード行 | ID | 氏 | 名 | 年齢 | 職業 | 住所 |
---|---|---|---|---|---|---|
1 | egohgeoh | 安威 | 植雄 | 47 | 会社員 | 北海道 |
2 | reboof | 夏樹 | 久華子 | 24 | 会社員 | (NULL) |
3 | moin | 佐史 | 守瀬聰 | 36 | 住職 | シーランド公国 |
4 | e104da4ef | 太刀 | 津照人 | 20 | ウィキペディアン | 志賀県 |
5 | oyipoyip | 奈荷 | 縫根乃 | 42 | 主婦 | 東京 |
6 | uotiket | 羽火 | 夫経穂 | 33 | 公務員 | にゃごや |
101 | abcdef | エビ | シディイエフ | 27 | 大学院生 | ロシア |
102 | ghijk | ジエイチ | アイジェケ | 63 | 無職 | (NULL) |
記述例2
- SELECT 氏, 名, 職業 FROM personal;
氏名・職業のみ表示する。
氏 | 名 | 職業 |
---|---|---|
安威 | 植雄 | 会社員 |
夏樹 | 久華子 | 会社員 |
佐史 | 守瀬聰 | 住職 |
太刀 | 津照人 | ウィキペディアン |
奈荷 | 縫根乃 | 主婦 |
羽火 | 夫経穂 | 公務員 |
エビ | シディイエフ | 大学院生 |
ジエイチ | アイジェケ | 無職 |
記述例3
- SELECT 氏, 名, 年齢, 職業 FROM personal WHERE 年齢 >= 25 AND 年齢 <= 50;
年齢が25以上50以下の人を抽出する。
氏 | 名 | 年齢 | 職業 |
---|---|---|---|
安威 | 植雄 | 47 | 会社員 |
佐史 | 守瀬聰 | 36 | 住職 |
奈荷 | 縫根乃 | 42 | 主婦 |
羽火 | 夫経穂 | 33 | 公務員 |
エビ | シディイエフ | 27 | 大学院生 |
記述例4
- SELECT 氏, 名, 職業 FROM personal WHERE 職業 LIKE '%員';
職業が「○○員(文字数は任意)」の人を抽出する。
氏 | 名 | 職業 |
---|---|---|
安威 | 植雄 | 会社員 |
夏樹 | 久華子 | 会社員 |
羽火 | 夫経穂 | 公務員 |
このデータには「会社員」「公務員」しか存在しないが、「議員」「工作員」「自宅警備員」など最後が「員」の職業の人は抽出される。
記述例5
- SELECT 氏, 名, 年齢, 住所 FROM personal ORDER BY 年齢
年齢順に出力される。
氏 | 名 | 年齢 | 住所 |
---|---|---|---|
太刀 | 津照人 | 20 | 志賀県 |
夏樹 | 久華子 | 24 | (NULL) |
エビ | シディイエフ | 27 | ロシア |
羽火 | 夫経穂 | 33 | にゃごや |
佐史 | 守瀬聰 | 36 | シーランド公国 |
奈荷 | 縫根乃 | 42 | 東京 |
安威 | 植雄 | 47 | 北海道 |
ジエイチ | アイジェケ | 63 | (NULL) |
UPDATE[編集]
データを更新する。
文法
- UPDATE テーブル名 SET フィールド名=値 [, フィールド名2=値 (以下更新するフィールドの数だけ繰り返す)][WHERE 条件];
記述例1
- UPDATE personal SET 年齢 = 年齢 + 1;
personal の全てのレコードの「年齢」を1増やす。
記述例2
- UPDATE personal SET 住所 = '不明' WHERE 住所 IS NULL;
「住所」が(NULL)の場合 '不明' という文字列に置換する。
DELETE[編集]
データを削除する。
文法
- DELETE FROM テーブル名 [WHERE 条件];
トランザクション[編集]
- SET TRANSACTION
- COMMIT
- ROLLBACK
デッドロック[編集]
RDBMSにおける正規化[編集]
第1正規形[編集]
第2正規形[編集]
第3正規形[編集]
第4正規形[編集]
SQLインジェクションの危険性[編集]
脚注[編集]
- ^ (略語)RelationalDataBaseManagementSystem - データベースの独立性、分散データとの連携、アクセスの単純化を追求したデータベースをいう。
- ^ (略語)DataBaseAdministrator - データベース管理者。データベースのパフォーマンスや記憶媒体領域の確保、SQLの妥当性検証等、神経を使っている方々。
参考資料[編集]
- 標準SQLプログラミング (ISBN 4-906391-41-9)