SQL

出典: フリー教科書『ウィキブックス(Wikibooks)』
移動: 案内検索

メインページ > 工学 > 情報技術 > プログラミング > SQL

ようこそ[編集]

ようこそ、SQLの世界へ。 2007年現在。RDBMS[1]……所謂データベースは、世界中に広く使用されています。 え? 見た事もない? いえいえ。貴方の預金口座も、プリペイドICカードの残高も、先日注文したショッピングサイトも。 『データの蓄積』という行為がある限り、RDBMSは、貴方の生活とは切っても切り離せないものなのです。

それどころか、貴方がもし『表計算アプリケーション』(例えば、Microsoft社のExcelや、OpenOfficeのCalc)を使用しているのであれば もう貴方は、データベースの世界に足を踏み入れている可能性が高いのです。

なーに。おそれる事はありません。SQLなんて。『箱を作る、捨てる』『データを入れる』『データを書き換える』『データを引っ張り出す』『データを捨てる』ぐらいで大半の事は済ませられます。 大掛かりで面倒で大変そうだと感じるのは……SQLではなく、データベースのセットアップだとか。データベースのパフォーマンスだとか。RDBMSそのものについてのメンテナンスが大変なだけなのです。

そんなのは、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) という言葉が普及している通り、一定の評価を得ているオープンソースのデータベース(2007年現在)。機能よりも検索速度重視で開発が進められてきたがMySQL5を境に、機能面の充実が図られている。

PostgreSQL[編集]

MySQLがトランザクション機能(処理排他機能)をサポートしていなかった頃、機能を必要とするベンダにおいて選択の1つとして候補に挙がっていたRDBMS。また2007年現在では、富士通社によるPowerGRESシリーズによる日本国内サポート環境、NTT-Data社によるLudiaなど、日本国内での人気度が伺える。

Oracle[編集]

正しくは、Oracle Databaseシリーズ。マニュアル類のヴァージョン表記に、Oracle9i等のように記述されるため Oracle という呼び名が使われている。 RDBMSとしては世界初の商用採用として、耐障害性に特化した機能や、幅広い言語APIの提供等に一目置かれている。

DB2[編集]

IBM社のDB2は、長い間、自社プラットフォーム上でしか動作せず、表舞台に立っていたとは言えないが、SQLの歴史的背景の実績だけに留まらず、DB2シリーズ (UDB) に置いては、競合するOracle社から良きライバルとして評価されている。またIBM側もOracleのトランザクション処理における高い技術力を評価しあう関係にある。

スキーマ[編集]

スキーマとは、データを格納する枠組み(データベース)を定義するものである。 表定義の他、アクセス権限、インデックス付与、ビュー定義等もスキーマに含まれる。

表定義[編集]

表定義とは、実際にデータの出納を行う物理的な定義を意味する。

個人情報テーブル(テーブル名:personal)
フィールド名 データ型 オプション
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とも)
該当行そのものを示す。 UNIQUEとの混同に注意。
  • FOREIGN KEY(外部キー、FKとも)
データ間リンク(結合先)を明示する。例えば、会員情報テーブルから会員を削除した際、購入履歴テーブルにある情報も削除する。これにより『ゴミデータ(孤立データ)』を防ぐ事が出来る。
  • NOT NULL
該当フィールドには、値の無指定 (NULL) が不可である。ただし空文字列の指定は可能。
  • UNIQUE
該当フィールドには、同一テーブル内で重複した値を持つ事が出来ない。PRIMARY KEYと混同しそうだが。例えば PRIMARY KEYが会員ID。 UNIUQEにログインIDが指定されている、と考えると分かりやすいかもしれない。
  • CHECK

ビュー定義[編集]

ビュー定義とは、表定義のうち指定条件を満たす行で構成される仮想的な表である。

データ操作[編集]

INSERT[編集]

データを追加する。

個人情報テーブル(テーブル名:personal)
レコード行 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;

この記述は、全てのデータを出力する。

個人情報テーブル(テーブル名: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;

氏名・職業のみ表示する。

個人情報テーブル(テーブル名:personal)
職業
安威 植雄 会社員
夏樹 久華子 会社員
佐史 守瀬聰 住職
太刀 津照人 ウィキペディアン
奈荷 縫根乃 主婦
羽火 夫経穂 公務員
エビ シディイエフ 大学院生
ジエイチ アイジェケ 無職

記述例3

SELECT 氏, 名, 年齢, 職業 FROM personal WHERE 年齢 >= 25 AND 年齢 <= 50;

年齢が25以上50以下の人を抽出する。

個人情報テーブル(テーブル名:personal)
年齢 職業
安威 植雄 47 会社員
佐史 守瀬聰 36 住職
奈荷 縫根乃 42 主婦
羽火 夫経穂 33 公務員
エビ シディイエフ 27 大学院生

記述例4

SELECT 氏, 名, 職業 FROM personal WHERE 職業 LIKE '%員';

職業が「○○員(文字数は任意)」の人を抽出する。

個人情報テーブル(テーブル名:personal)
職業
安威 植雄 会社員
夏樹 久華子 会社員
羽火 夫経穂 公務員

このデータには「会社員」「公務員」しか存在しないが、「議員」「工作員」「自宅警備員」など最後が「員」の職業の人は抽出される。

記述例5

SELECT 氏, 名, 年齢, 住所 FROM personal ORDER BY 年齢

年齢順に出力される。

個人情報テーブル(テーブル名:personal)
年齢 住所
太刀 津照人 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インジェクションの危険性[編集]

脚注[編集]

  1. ^ (略語)RelationalDataBaseManagementSystem - データベースの独立性、分散データとの連携、アクセスの単純化を追求したデータベースをいう。
  2. ^ (略語)DataBaseAdministrator - データベース管理者。データベースのパフォーマンスや記憶媒体領域の確保、SQLの妥当性検証等、神経を使うっている方々。

参考資料[編集]

このページ「SQL」は、書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にノートへどうぞ。