欢迎来到天天文库
浏览记录
ID:37203786
大小:233.50 KB
页数:31页
时间:2019-05-19
《ーー管理(DBMS)SQL基础》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
データベース管理システム(DBMS)とSQLの基礎DBMSの基礎知識SQL言語の概要SQL言語の実例リレーショナルデータベースの正規化1.DBMSの基礎知識データベースとは何でしょう?どのようなデータベースがあるのでしょう?ここでは、データベースとは何かについて説明します。データファイルとデータベースコンピュータで情報を扱う場合は、『データ-ベース(DataBase)』の利用が最も一般的です。データベースは、情報の集まりです。データベースを広義に解釈すれば、テキストファイルに数十行のメモを、日付と内容などで分けただけのものをデータベースと呼ぶことができますが、ここでは、整理された情報と、それを扱うためのシステムを総称してデータベースと呼んでいます。紛らわしさをなくすために、データを記録しておくためのファイルはデータファイルと呼ぶことにします。用語解釈:データベース(Database):データ形式をあらかじめ定義して、統合的に管理できるファイル構造のこと。リレーショナル形のデータベースや、ツリー型のデータベースなどのモデルがある。データファイル(DataFile):データを記録するためのファイル。DBMS(DataBaseManagementSystem):データベースを管理するためのシステム。DBMSの利用により、データの共有化やデータ保護、データ検索、更新などの処理を簡単に実現することができる。データベースの構造ファイル構造のデータベースは、データ構造の違いによって様々なデータモデルが考案されています。リレーショナル型データベース階層型データベースネットワーク(網)型データベース分散型データベースオブジェクト型データベース現在、もっともよく利用されているのがリレーショナル型のデータベースです。データベース管理システムとは?31 データベースを効率的に利用するためには、データベースを統合的に管理するシステムが必要です。このシステムは、扱う情報の規模や環境にかかわらず非常に重要なものです。それでは、その役割と機能について詳しくみていきましょう。DBMSの概要 先のセクションで紹介したデータファイルは情報の集まりに過ぎませんから、それ自身ではデータの作成や更新などが行えません。データを統一的に管理するといった概念がまだなかったことは、プログラムから直接、ファイルに対してデータの保存や読み込みを行うのが一般的でした。これでは、一貫した管理方法がないため、安全性や利便性に欠けていました。その後、データを共有してアクセスするために、統一的な管理が要求されるようになり、データベース管理システム、『DBMS(DataBaseManagementSystem)』に注目が集まります。データベースはファイル構造の事ですが、DBMSはそのファイル構造の設計から管理・運用を含めたデータベース管理システムの事です。 DBMSの役割と機能は次のようになります。データに一貫性を持たせて管理し、整合性をもたせるデータの重複を排除するデータ利用の標準化を行い、各種プログラムへのインターフェイスを提供するデータへのアクセス制限を管理する 上記のようにDBMSの機能は多岐にわたりますが、もっともベースになる機能は要求に応じたデータの受け渡しです。たとえば、エンド・ユーザ、つまり利用者が必要な情報を取り出す際、DBMSはエンド・ユーザの要求にしたがって膨大なデータから必要な情報を取り出し、それを整形してエンド・ユーザに渡します。このとき、エンド・ユーザはデータファイルの構造を気にする必要がなく、複雑なことはすべてDBMSが処理します。 このようなことから、DBMSは、エンド・ユーザの要求とデータファイルの橋渡し的な存在といえます。これは同時に、複数のユーザがデータファイルを共有することを可能にしたり、データファイルの内容を保護する役目もあります。インターネットに対応したDBMSの大半は、PerlやPHPといったプログラムから要求を受け取り、解釈した後に必要なデータを取り出したり、渡されたデータを格納したりします。アマゾン・コムやデルのような、商品を販売する大手ショッピングサイトでは、必ずといっていいほどDBMSが利用されています。また、SOHOや個人サイトといった小さなサイトでも気軽にDBMSが利用されるようになり、今後さらに重要な技術となるのは間違いないでしょう。31 DBMSの機能 DBMSの役回りを理解したところで、DBMSとデータファイルとの関係をもう少し深く掘り下げてみましょう。 DBMSが扱うデータファイルは通常バイナリファイルになっていて、その構造はDBMSによってまったく違うものになっています。そして、DBMSの様々な機能を実現するために、データファイルは非常に複雑な構造となっています。もちろん、エンド・ユーザがデータファイルの構造を理解する必要はありません。エンド・ユーザはどうやって必要なデータを取り出すかを気にする必要はなく、どのデータが必要かをDBMSに伝えればよいわけです。 時代が進むにつれ、DBMSはデータファイルを効率よく利用するための基本的な機能から、データファイルの保全や共有、より簡単なアクセス手段を提供できるように進化してきました。データファイルもそれに伴い、単純な文字列や数値を格納するだけではなく、画像や映像といったメディアファイルに対応し、データ量の限界も年々拡大されてきています。DBMSの主な機能 機能内容データベース設計機能テーブルの設計や、テーブルとテーブル間のリレーションなどを定義をする機能データベース構築機能データの作成・削除機能データベース操作機能データを並べ替えたり、抽出、検索する機能データ共有化機能複数のユーザ間でデータを共有するための機能データベースへのアクセス管理機能ユーザのアクセス権を設定したり、ユーザ認証する機能DBMSモデルDBMSはデータベースを管理するための機構として古くから利用されているので、様々なタイプのモデルが考案されています。現在ではほとんど見られなくなったものから、主流を占めているものまで様々なモデルがありますから、ここでざっと紹介しておきましょう。DBMSの種類リレーショナル型データベース現在最も利用されているデータベース。リレーションと呼ばれるテーブルとテーブルのリレーションを基本にしてデータを管理します。ツリー型データベース31 データをディレクトリ構造のように構築したデータベース。一つの親データに複数の子データがツリー構造的に結合されたデータベースです。ネットワーク型データベース各レコード間の関係付けが網目状になっている構造のデータベース。親データと子データが多対多に結びつく複雑なデータ構造に適したデータベースです。分散型データベースデータベースを複数のコンピュータで管理し、全体としてひとつのデータベースの構造を持つ形のデータベース。オブジェクト指向型データベースオブジェクト指向のデータ構造を持つデータベース。複雑なデータ構造に向いている為、写真や画像や音声などの異なるデータを統合して扱えます。 リレーショナルデータベースのイメージ階層型データベースのイメージネットワーク型データベースのイメージ ネットワーク型、ツリー型のDBMSは、データベース構造の設計が難しく、汎用性もないといったデメリットがあるため、現在ではあまり使われていません。それらの問題を解決したのが、現在最も利用されているリレーショナル型のデータベースです。次からはこのリレーショナル型のデータベースについて、詳しく見ていきます。リレーショナル・データベースとは?今、最も多く利用されているDBMSが、リレーショナル・データベースです。他のデータベースモデルと比べてデータ構造を理解しやすいことなどから、最も良く利用されています。31 リレーショナル・データベースの概要 DBMSの主流を占めるリレーショナル型のデータベースは、一般的に「リレーショナル・データベース(RelationalDataBase)」と呼び、リレーショナル・データベースを扱うDBMSのことを、特に「RDBMS(RelationalDataBaseManagementSystem)」と呼びます。リレーショナル・データベースの最大の特徴は、データを表形式で表し、複数の表に関係付けを結ぶことができるところです。 もう一つの特長は、共通のデータベース言語が標準化されている事で、その言語を利用すればどのリレーショナルデータベースでも同じように利用することが出来ます。 データベース言語は、SQLと呼ばれ国際標準化機構(ISO)や日本工業規格(JIS)で制定されています。テーブル形式 上図の表全体をテーブルと呼びます。代表的なRDBMS製品 有名なRDBMS製品には、マイクロソフト社のオフィス製品に含まれるAccessや、SQLServer、UNIX系のOSで最大のシェアを獲得しているオラクル社のOracleなどがあります。フリーソフトウエアで有名なのはMySQLやPostgreSQLで、LinuxやFreeBSDといったPCUNIXをはじめ、ウインドウズなどの幅広いプラットフォームで動作します。これらのRDBMS製品はインターネットでも対応しているのはもちろんのこと、インターネットでの利用を前提としたツールなどが豊富に用意されています。データベース開発元企業・団体DB2/InformixIBMOracleOracleSQLServerMicrosoftPostgreSQL-MySQLソフトエージェンシー31 用語解釈:リレーショナル・データベース(RDB:RelationalDataBase): リレーショナル型のデータベース。データを行と列からなる表形式で表し、複数の表に関係付けを結ぶことができる。他のデータベースモデルと比べてデータ構造を理解しやすいことなどから、最も良く利用されている。 データベース問い合わせ言語は、ISOで規格化されたSQLが標準。RDBMS(RelationalDataBaseManagementSystem):リレーショナル・データベースを管理するソフトウエア。テーブル(Table):リレーショナル・データベースの基礎概念。データを格納するための2次元配列。テーブルはレコード(行)とフィールド(列)から構成される。フィールド(Field):表形式のデータにおいて、縦方向に区切られたデータの組。レコードを構成するそれぞれの要素。レコード(Record):表形式のデータにおいて、横方向に区切られたデータの組。フィールド名(Field Name):フィールドに設定する名称。プライマリキー(PrimaryKey):プライマリキーとはレコードを1行ずつ識別するためのフィールドで、プライマリキーは必ずユニークな値となる。プライマリキーの指定により、膨大なデータから必要なレコードだけを確実に取り出すことが可能。外部キー(ForeignKey):テーブルのプライマリキーと同じ値を持った別のテーブルのフィールド値。テーブルの構造 リレーショナルデータベースの情報の集まりは、『(テーブル(Table表))という概念にまとめられます。テーブルは『フィールド(Field列)』と『レコード(Record行)』から構成されます。顧客テーブルのフィールドとレコード リレーショナル・データベースでは、縦に個々の情報を区切るのがフィールドです。たとえば、顧客テーブルでしたら、名前のフィールド、電話番号のフィールドといったように、情報の種類ごとに区分けされています。横に情報を区切るのがレコードで、1件のデータごとにレコード数が増えていきます。顧客テーブルの場合は、名前や電話番号といったフィールドは不変ですが、レコードは顧客数が増加するのに比例して増えていきます。31 フィールドには、テーブルを作成する際に『フィールド名』を必ず設定します。もしフィールド名がなければ、「フィールドの左から1番目と、2番目のフィールドの値を取り出す」というように、作成した本人でさえわからなくなるような指定をDBMSに送ることになりますが、フィールド名があれば、「名前フィールドと、電話番号フィールドを取り出す」と、わかりやすい指定が可能になります。 フィールド名はあらかじめ用意しておくことができますが、レコード名はどうでしょうか。レコードに関しては、順次増えていくので、最初からレコード名を用意することは不可能です。ですが、レコードを登録する際に、各レコードを整理するためのフィールドを用意しておくことができます。それが『プライマリキー(PrimaryKey)』と呼ばれる特殊なフィールドです。プライマリキーとはレコードを1行ずつ識別するためのフィールドで、プライマリキーは重複して同じ値を持つことができません。このような性質から、プライマリキーを指定すれば、膨大なデータから必要なレコードだけを確実に取り出すことができます。 たとえば、レコードが100件あるテーブルを考えてみましょう。レコードは追加される可能性もありますし、削除される可能性もあります。最初は5行目にあったレコードも、前のレコードが削除されれば4行目になり、3行目になったりします。プライマリキーがない場合は、行数が変更されるたびに「5行目のレコードを取り出す」というDBMSへの指定が、「4行目のレコードを取り出す」といったように毎回変わる可能性があります。逆に、プライマリキーがユニークに保たれていれば、「A001というフィールド名のレコードを取り出す」といった指定はそのレコードが存在するまで有効です。 また、プライマリキーは複数のフィールドをセットにしてプライマリキーとすることもできます。たとえば、IDと名前をセットにしてプライマリキーと設定することができます。 フィールドは、フィールド名の設定のほかに、文字列や数値をあらわすデータ形式や、プライマリキーのようにユニークを保障したり、ヌルを許さないといった制約の属性を設定できます。リレーションの作成リレーショナル・データベースでは、テーブルにプライマリキーを設定することが原則です。このプライマリキーを使って、複数のテーブルを関連付けることができます。このテーブル間の関係は『リレーション』と呼びます。リレーションは、テーブルのプライマリキーを、それと同じ値を持った別のテーブルのフィールド値、これを『外部キー(ForeignKey)』と呼びますが、この2つのフィールドの関係付けによって実現されます。31 たとえば、顧客情報に会社名や会社の住所を含める場合、顧客一人一人に会社名や代表電話番号などを登録していくのは効率的ではありません。そこで、顧客情報と会社情報を別のテーブルに分け、会社テーブルのプライマリキーに、顧客テーブルの外部キーを関連付ければ、データ量を節約でき、効率化が進みます。顧客テーブルと会社テーブルのリレーションシップ サンプル図では、会社テーブルのプライマリキーになるIDに、顧客テーブルの会社ID(外部キー)を関連付けています。これで、顧客一人一人に会社名や代表電話番号を登録しなくてもよいですよね。これが、リレーショナル・データベースで一番重要な特徴です。 リレーションがあることで、1つのテーブルから他のテーブルのデータを参照することが簡単になります。たとえば、顧客テーブルと製品テーブル、それに購入履歴テーブルを用意し、顧客テーブルに顧客と購入した製品を記録した場合を考えてみましょう。顧客テーブルから製品名を取得 購入履歴テーブルに、顧客テーブルのプライマリキー「顧客ID」フィールドと、製品テーブルのプライマリキー「製品コード」フィールドを記録します。これにより、購入履歴テーブルから顧客の名前を参照したり、製品の価格を参照したりすることができます。また、顧客テーブルから購入履歴テーブルを参照し、顧客が購入した製品情報を取得することもできます。2.SQL言語の概要SQLとはStructuredQueryLanguageの略で「構造化問合せ言語」という意味です(query=クエリ、問い合わせ)。SQL言語は、データベース・マネジメントシステム(DBMS)に命令を送るのがお仕事。DBMSの種類は数多くあるけど、そのほとんどは標準のSQL31 をサポートしているから、一度おぼえてしまえば、どのDBMSもそれほど怖くはない。SQL言語の概要SQL言語『(StructuredQueryLanguage)』を一言で言えば、データベースを操作するための言語、データベース言語です。SQLは、あくまでデータベース操作についての処理だけに特化していますから、この点において、CやVB、Perlのようなプログラミング言語とは異なります。 SQLはデータベース言語として考案されましたが、通常のプログラミング言語と同じように定められた文法があります。SQL言語の文法は、データベースを操作しやすいように1つの文で完結した意味を持つようになっていています。そのような理由から、条件分岐や繰り返し処理といったフロー制御文は含まれていませんでしたが、それも最新のSQLでは部分的に対応がなされるようになってきました。SQLはDBMSに問い合わせを行うのが主な機能になりますから、その命令文を『クエリ(query)』と呼びます。クエリが発行され、結果が返ってくるまでの流れは次のようになります。クエリの結果が返ってくるまでの流れユーザやプログラムからクエリが発行されるDBMSがクエリを解釈し、その内容に応じてデータファイルを読み書きする処理の結果がユーザやプログラムに返される SQL文を使用して、RDBMSからデータを取り出したり、削除/更新を行ったりすることができます。SQLで重要となる操作、機能は下記の通りです。データの問合せや、挿入、更新、削除などの基本命令文基本命令文の条件・オプション指定クエリに使われる文字列や数値に関する関数と演算子テーブルの作成と削除データを整列して取り出すデータをグループごとに取り出すデータベースへのアクセス制御データベースの整合性の保証SQL命令文解説CREATETABLEテーブル作成DROPTABLEテーブル削除ALTERTABLEテーブル定義一部変更CREATEVIEWビュー作成DROPVIEWビュー削除SELECTデータ照会INSERTデータ追加UPDATEデータ修正DELETEデータ削除31 COMMITトランザクションコミットROLLBACKトランザクションキャンセルSQLはデータベース言語として、ANSI、ISO、JISなどの機関で世界的に統一された規格です。DBMS製品によっては独自の拡張や構文の省略などがありますが、基本的にはSQLの規格に従っているので、一度覚えた知識が無駄になることはありません。そのため、一度SQLをマスターすれば、どのDBMS製品を扱うことになってもその知識を活かすことができ、他のデータベースへの移行もスムーズに行えます。SQLの歴史 RDBMSの基礎理論は、1970年6月、「CommunicationsoftheACM」誌により、「大型共用データ・バンク用のデータのリレーショナル・モデル」というタイトルで発表されました。この論文は、カリフォルニア州IBMサンノゼ研究所のE.F.Codd博士が集合理論に基づいたデータ管理手法として発表したものです。当時、Codd博士のモデルは理論だけでソフトウエアとして動くものもなく、あまり注目を集めていませんでしたが、現在ではRDBMSの完成したモデルとして認められています。 その後、IBM社によってCodd博士の論文に基づいたSEQUEL(StructuredEnglishQueryLanguage)が開発され、それが後にSQLと発展します。1989年に『ANSI』標準化団体によってSQLが標準の規格として認定され、広く認知されるようになりました。1992年のANSI標準は、SQL92としてそれまでの商用製品の独自拡張機能なども取り込み、さらに実用性が高まりました。 第3世代に当たるSQL99はSQL92を基盤としながらも、オブジェクト指向を取り入れ、インターネットやJavaに対応したクライアント/サーバ機能を強化しています。『ISO』もSQL99を認めています。SQL言語には様々な命令文がありますが、それらのほとんどはデータを処理するためのものです。理解をより深くするために、命令文をグループに分け、大きな視点からSQL言語を眺めてみましょう。ANSI(AmericanNationalStandardsInstitute)米国標準化団体ISO:(InternationalStandardsOrganization)国際標準化機構の略と、規格番号として使われている。SQL処理の分類テーブルの構築やデータの挿入・削除はすべてSQLを使います。SQLには数多くの構文が用意されていますが、本当に必要なものはわずか10種類程度です。その処理内容を大きく区分すると、テーブルの作成・変更・削除などデータを定義する処理を『データ定義文(DDL)』、データの追加・更新・削除などデータを操作する処理を『データ操作文(DML)』、アクセス権限などを管理する『データ制御文(DCL)』の3つに分類することができます。クラス説明命令文データ定義文(DDL)DDL=DataDefinitionLanguageテーブルの作成・変更・削除などを行います。CREATE、ALTER、DROP、GRANTデータ制御文(DCL)GRANT、REVOKE31 アクセス権限関連の管理を行います。データ操作文(DML)DML=DataManipulateLanguage:データの修正、追加、削除、検索などを行行います。データ操作言語には、プログラミング言語中にデータベースの処理を記述する方式の親言語型DMLと、既存の言語を使用せず、DBMSにより提供されている言語を使用する方式の独立言語型DMLとがあります。SELECT、INSERT、UPDATE、DELETE 次にデータ定義文とデータ操作文の代表的な例を見てみましょう。データ定義文のSQL例:テーブルの作成CREATETABLEreview( idMEDIUMINT(8)UNSIGNEDDEFAULT'0'NOTNULLAUTO_INCREMENT, titleVARCHAR(250), detailTEXT, add_timeDATETIME, PRIMARYKEY(id)); 上記SQL文は次のようなテーブルを作成します。フィールド名説明データ型idプライマリキーmediumint(8)titleタイトルvarchar(250)detail内容textadd_time登録日datetimeデータ操作文のSQL例:データの選択SELECTid,title,add_timeFROMreview;31 上記SQL文は次のような表を表示します。idtitleadd_time1アリーとフレンズが終了2002-04-1810:30:112オーストラリアのデザイン2002-04-1810:48:103欧州でiモード2002-04-1912:30:28データベース言語の基本的な操作方法 データベースの主な操作に選択、射影、結合の3つがあります。射影は特定のデータ列の取り出し、選択は特性のデータ行の取り出し、選択は2つ以上のテーブルデータを結び付けます。射影: データベースの行列のうち、列を取り出す操作です。射影SQLの例SELECT商品名,単価FROM顧客 上記のSQLは、顧客テーブルから商品名と単価の列を取り出しています。選択: データベースの行列のうち、行を取り出す操作です。選択SQLの例SELECT*FROM顧客WHERE姓='桜庭'OR姓='ケアー' 上記のSQLは、顧客テーブルから1行目と3行目を選択しています。31 結合:元となるデータベースの行列の属性と共通するものに関して、取り出すことで新規のデータベースの行列を作成することです。 結合SQLの例SELECT姓,名,商品名,単価,FROM購入履歴,顧客,商品WHERE購入履歴.顧客ID=顧客.顧客IDAND購入履歴.商品ID=商品.商品ID 上記のSQLは、購入履歴テーブルの顧客IDと、顧客テーブルの顧客ID、購入履歴テーブルの商品IDと商品テーブルの商品IDを関連付け、結合しています。31 3.SQL言語のクイックリファレンスと実行例このステップでは、mysql命令文プロンプトの使用方と、データベースの作成から操作までを例題としてとり上げます。サーバへの接続と切断MySQLの設定が済み無事に起動したら、次はMySQLへの接続です。ついでに簡単なSQL文も使って、MySQLと対話してみましょう。 UNIX系のOSでしたらTELNET、ウインドウズシリーズでしたら命令文プロンプトからMySQLに接続することができます。MySQLのbinディレクトリにパスが通っていれば、次の命令文でMySQLに接続できます。 いくつかのMySQLインストレーションでは、ローカルホストで実行されているサーバに、匿名ユーザの接続を許しています。 匿名ユーザでMySQLを接続します。>mysql ホスト名や、ユーザ名、パスワードを指定してから接続する方法は次のとおりです。>mysql-hホスト名-uユーザ名-pEnterpassword:******** mysqlがEnterpassword:プロンプトを出したときに、********とかかれている箇所にパスワードを入れます。31 接続に成功すると、いくつかの情報とmysqlプロンプトが表示されます。>mysql-hhost-uuser-pEnterpassword:********WelcometotheMySQLmonitor.Commandsendwith;org.YourMySQLconnectionidis1toserverversion:3.23.49-ntType'help;'or'h'forhelp.Type'c'toclearthebuffer.mysql> このプロンプトはmysqlが命令文入力を待っている状態を示します。 接続が成功した後、mysqlプロンプトで、quit、もしくはexitとタイプすればいつでも接続を切ることができます。>quitBye UNIX系OSでしたら[Ctrl]キー+[D]キー、ウインドウズシリーズでしたら[Ctrl]キー+[C]キーでも切断できます。MySQL命令文プロンプト MySQL命令文プロンプトの入力規則はそれほど多くはありません。いくつかの規則に注意すれば、すぐにSQL文を入力できるようになります。 MySQL命令文プロンプトでは、セミコロン(;)で1行の終わりを宣言します。mysql>SELECTVERSION();+------------+|version()|+------------+|3.23.49-nt|+-------31 -----+1rowinset(0.01sec)mysql> 命令文の発行後に結果が表示され、プロンプトの状態に戻ります。また、命令文の結果の最後の行に、何レコード返ってきたか、実行に費やされた時間も示します。 命令文で使われるキーワードは、大文字小文字を区別しません。以下に示すクエリは同じです。mysql>SELECTVERSION();mysql>selectversion();mysql>SelectVersion(); 命令文は複数行にわたって書くこともできます。命令文の途中で改行を挿入しても、セミコロン(;)を宣言するまでは命令文文が続いているとみなされます。 複数行にまたがった文の例です。mysql>SELECT->USER(), ->CURRENT_DATE;+----------------+--------------+|user()|current_date|+----------------+--------------+|ODBC@localhost|2002-04-21|+----------------+--------------+ 入力中に命令文実行のキャンセルを行う場合、c+[Enter]と入力します。この後、入力待ちの命令文プロンプトに戻ります。mysql>SELECTUSER()->cmysql> 命令文プロンプトは、待ち状態によって表記が変わります。これによって、命令文の続きを待っているのか、新しい命令文を受け入れる状態になっているかなどがわかります。MySQL命令文プロンプトの待ち状態表示31 プロンプト意味mysql>新しい命令文の待状態->複数行にまたがる命令文の、次の行の入力を待っている状態。'>シングルクォート(')で始められた文字の、次の行の入力を待っている状態。">ダブルクォート(")で始められた文字の、次の行の入力を待っている状態。SQL言語の実例紹介個人的にも使える、データベース対応のメモ帳を作成してみましょう。データベースはmydbを作成し、テーブルはメモ情報用のreviewテーブルと、その種類を示すm_review_genreを作成します。次にデータベースの作成、確認、選択、アクセス権の設定;テープルの作成、確認;データの挿入、表示、検索、更新、削除;テープル構造の変更;リレーションシップの利用などの実例を取り上げます。データベースの作成 一番最初に行うのは、データベースの作成です。データベースの作成にはCREATEDATABASE構文を使用します。CREATEDATABASEの基本的な構文は次のようになります。CREATEDATABASEデータベース名; データベース名をmydbとすると、次のようになります。CREATEDATABASEmydb;データベースの確認 先に作成したデータベースを確認するには、SHOWDATABASES構文を使用します。SHOWDATABASES構文にはオプションがないので、そのまま入力します。SHOWDATABASES; mysql、testデータベースは、MySQLのインストール時に自動的に作成されます。そこに、mydbが追加されているのがわかりますね。データベースの選択31 このままではmydbが利用できないので、USE構文を使ってmydbを使うように指令を出します。USEmydb; これで、mydbを操作できるようになりました。データベースの選択は、MySQL命令文プロンプトのセッション毎にリセットされるので、毎回行う必要があります。ただし、次のオプションを使うことによって、MS-DOS命令文プロンプトからMySQLに接続する際に、データベースを一緒に選択することもできます。C:>mysql-Amydbアクセス権の設定 ユーザのアクセス権を設定するには、GRANT構文が便利です。ここでは、簡単な利用法を紹介します。 先ほど作成したmydbに対し、現在のユーザ名にすべてのアクセス権を与えましょう。GRANT構文は次のとおりです。ユーザ名に任意の名前を指定してください。GRANTALLONmydb.*TOユーザ名;テーブルの作成 メモ情報用のreviewテーブルを作成しましょう。テーブルを作成するCREATETABLE構文を使って、最低限必要と思われるフィールドだけを設定しています。CREATETABLEreview( idMEDIUMINT(8)UNSIGNEDDEFAULT'0'NOTNULLAUTO_INCREMENT, titleVARCHAR(250), detailTEXT, add_timeDATETIME, PRIMARYKEY(id)); プライマリキーとなるidフィールドは値を自動的に設定してくれるAUTO_INCREMENT31 を指定しています。表にすると次のようになります。フィールド名説明データ型idプライマリキーmediumint(8)titleタイトルvarchar(250)detail内容textadd_time登録日datetime ここで使用しているデータ型は、数値型のmediumintと、文字列型のvarchar、text、日付型のdatatimeです。データ型の説明は『フィールドタイプとリテラル』の章で詳しく述べます。テーブルの確認 宣言したテーブルが構築されているか、SHOWTABLES構文で確認してみましょう。SHOWTABLES; テーブルの構造を確認するには、SHOWFIELDS構文を使います。SHOWFIELDS構文SHOWFIELDSFROMテーブル名; SHOWFIELDS構文にテーブル名reviewを指定して、テーブル構文を表示させましょう。SHOWFIELDSFROMreview; idからadd_timeまでのフィールドの内容が表示されました。 SHOWFIELDS構文と同じ機能を持ったDESCRIBE構文も用意されています。こちらの方が簡単です。DESCRIBE構文DESCRIBEテーブル名;データの挿入 テーブルの用意も整いましたので、さっそくデータを挿入してみましょう。 データの挿入にはINSERT構文を使います。31 INSERTVALUES構文INSERT[INTO]テーブル名VALUES(値1,値2,...); 挿入するデータの内容は次のとおりです。titledetailadd_timeアリーとフレンズが終了アメリカドラマの「アリーmyラブ」と「フレンズ」が終了。「フレンズ」は続けてほしかった!2002-4-1810:30:11オーストラリアのデザイン最近の注目はオーストラリアのウェブデザイン。要チェック。2002-4-1810:48:10欧州でiモードようやく欧州でもiモードが本格的に始動。アメリカではAT&Tがmモードをはじめるらしい。2002-4-1912:30:28 最初の1件を例にして、INSERTを使ってみます。INSERTINTOreviewVALUES(1,'アリーとフレンズが終了','アメリカドラマの「アリーmyラブ」と「フレンズ」が終了。「フレンズ」は続けてほしかった!','2002-4-1810:30:11'); INSERTには他の構文も用意されています。INSERTSET構文INSERT[INTO]テーブル名SETフィールド名1=値1,フィールド名2=値2,... SETを使ったINSERTは、フィールド名を指定できるので、すべてのフィールド値を指定する必要がありません。ここでは、idを省略しています(idはAUTO_INCREMENTにしているので、わざわざ番号を指定しなくても大丈夫です)。INSERTINTOreviewSET31 title='オーストラリアのデザイン',detail='最近の注目はオーストラリアのウェブデザイン。要チェック。',add_time='2002-4-1810:48:10';データの表示 登録したデータを全て表示するには、SELECT構文を使います。SELECT構文SELECTフィールド名1,フィールド名2FROMテーブル名 reviewテーブルのtitleフィールドだけを表示させたい場合は、次のようにします。SELECTtitleFROMreview; フィールド名はいくつ指定してもかまいません。また、アスタリスク(*)を使うことで、すべてのフィールドを指定することができます。それでは、reviewの全レコードを表示してみましょう。SELECT*FROMreview; このSQL文の意味は「表(table_name)から全て(*)の行を取得せよ」という意味になります。データの検索 SQLで最も多く利用されているのがSELECT構文のWHEREです。SELECT構文にWHEREを追加することで、検索条件を指定し、行を絞り込んで出力させることができます。SELECTtitleFROMreviewWHEREid=2; このSQL文の意味は「テーブルからidの値が2のレコードを出力せよ」という意味になります。データの更新 データの内容を変更したい場合は、UPDATE構文を使います。WHEREを使って、更新するレコードも指定しましょう。UPDATE構文31 UPDATEテーブル名SETフィールド名=値,フィールド名=値,...[WHERE条件式] 次のUPDATE構文は、idフィールドの値が2のレコードのtitleフィールドのみを更新しています。UPDATE構文からWHEREを省略すると、すべてのレコードに対して更新が行われます。たった1行のSQL文ですべてのレコードが駄目になる可能性があるので、WHEREを省略する際は十分に注意してください。UPDATEreviewSETtitle='オーストラリアの優れたデザイン'WHEREid=2;データの削除 データが必要なくなった場合は、DELETE構文を使います。UPDATE構文と同じように、WHEREを指定しない場合は全てのレコードに対して処理が行われるので、テーブルのレコードを全て削除したい場合を除けば、かならずWHEREをつけるようにしましょう。DELETE構文DELETEFROMテーブル名[WHERE条件式] それでは、idフィールドが1の値のレコードだけ削除してみましょう。DELETEFROMreviewWHEREid=1; DELETE構文の後にQueryOK,1rowaffectedというメッセージが表示されているので、1件のレコードが削除されたことがわかります。テーブル構造の変更 これで、reviewテーブルにいつでもレビューを登録したり、更新したりすることができるようになりました。ですが、せっかくレビューを登録するのでしたら、本、映画、インターネットというように、レビューの内容で整理できるといいですね。 よくあることですが、あとからテーブル構造を拡張したくなることがあります。たとえば、review31 テーブルにはどのジャンルに対するレビューかを示す情報がありませんが、もしレビューに関するジャンル情報があれば、「本だけのレビューを表示」といった指定も可能になります。 テーブル構造を後から変更するには、ALTERTABLE構文を使います。ALTERTABLE構文ALTERTABLEテーブル名 ADDフィールド名と属性 CHANGE古いフィールド名と属性新しいフィールド名と属性 MODIFYフィールド名と属性 DROPフィールド名 ALTERTABLE構文には、フィールドの追加・更新・削除などの機能があります。ここでは、genreという新しいフィールドを追加します。ALTERTABLEreviewADDgenreTINYINT(3)UNSIGNEDDEFAULT0AFTERid; TINYINT(3)UNSIGNEDというのは、genreフィールドがTINYINTの整数型を意味し、DEFAULT0というのは、genreの値が指定されていない場合はデフォルトで0の値をとるという意味です。ということで、現在登録されているレコードのgenre値は、すべて0になります。最後のAFTERidは、idフィールドの後にgenreフィールドを追加するように指示しています。 reviewのテーブル構造は次のように変更されました。フィールド名説明データ型idプライマリキーmediumint(8)genreジャンルtinyint(3)titleタイトルvarchar(250)detail内容textadd_time登録日datetime genreフィールドは、数値を格納できますが、これではレビューの内容が本なのか映画なのか判別することができません。genreフィールドに直接ジャンル名を登録するのではなく、他のテーブルでジャンルの種類を登録しておき、それを参照できるようにしているのです。 細かい説明よりも、実際に試した方がわかりやすいでしょう。まずは、ジャンルの全種類を登録するためのテーブルを作成します。31 CREATETABLEm_review_genre( idTINYINT(3)UNSIGNEDDEFAULT'0' NOTNULLAUTO_INCREMENT, valueVARCHAR(100), PRIMARYKEY(id)); m_review_genreテーブルは、ジャンルの番号と、ジャンル名のみを登録できるようになっています。テーブルの詳細は次のようになります。フィールド名説明データ型idプライマリキーtinyint(3)valueジャンルvarchar(100) 次は、ジャンルの種類をm_review_genreに登録します。 INSERTINTOm_review_genreVALUES(1,'ブック');INSERTINTOm_review_genreVALUES(2,'スポーツ');INSERTINTOm_review_genreVALUES(3,'グルメ');INSERTINTOm_review_genreVALUES(4,'ミュージック');INSERTINTOm_review_genreVALUES(5,'ウェブサイト'); それでは、m_review_genreの全レコードを表示してみましょう。SELECT*FROMm_review_genre;リレーションシップの利用 UPDATEを使って、今までに登録したデータにリレーションを設けてみましょう。といっても、reviewのgenreフィールドに、m_review_genreに登録されたレコードのidを設定するだけです。たとえば、reviewテーブルのidフィールドの値が2のレコードのジャンルを「ウェブサイト」に設定する場合は、次のようにします。UPDATEreviewSETgenre=5WHEREid=2;31 次に、reviewテーブルとm_review_genreテーブルを結合して、レビューのタイトルとジャンルを表示します。SELECTtitle,valueFROMreview,m_review_genreWHEREreview.genre=m_review_genre.id; 以上が簡単なSQLの使用法です。いよいよデータベースの構築です。データベースの設計を後から変更するのは難しいことですから、最初にきちんとした計画を建てましょう。4.リレーショナルデータベースの正規化 前回のステップでSQL言語の基本的な使い方について述べました。このステップでは、テーブルを設計する上で非常に重要な概念となる『正規化』について紹介していきます。 適切な正規化が行われたテーブル構造は、使用時のパフォーマンスを向上させます。また、データ量を最小限に抑え、データの重複を防ぐ効果もありますので、正規化はぜひマスターしておいた方が良い規則です。正規化の概要 正規化とは、全テーブルのデータを分析し、効率化されたリレーションを作成するための規則です。用語解釈:導出フィールド:他のフィールドを基にした計算により、自動的にデータが導かれるフィールドのことを導出フィールドと呼びます。従属:あるデータ項目の値が決定すると、他の列の値も一意的に決定する関係のことです。部分従属:部分従属とは、プライマリキー以外のフィールドが、プライマリキーを構成する一部のフィールドに従属していることです。完全従属:完全従属とは、プライマリキー以外のフィールドが、プライマリキー全体に従属していることです。 たとえば、下記の図の購入商品履歴テーブルでは、商品名フィールドに複数の商品が登録されています。 また、このテーブル構造ですと、何度か買い物した顧客は重複して名前が登録されることになります。もし、結婚するなどして名前が変わった場合などは、すべてのレコードを調査し、変更が必要なレコードを調査することからはじめなければなりません。このように整合性がとれていないデータベースは、データ領域を無駄に消費し、パフォーマンスにも悪影響を与えます。31 購入商品履歴テーブル そのような事態を避けるには、購入商品履歴テーブルから商品名フィールドを切り離し、商品名フィールドを登録する用のテーブルを新たに作成して、購入商品履歴テーブルとリレーションを張ります。また、顧客用のテーブルも用意し、名前や姓、名などのフィールドも切り離すべきです。 この一連のテーブルの分解とリレーションの作成を、「リレーショナルデータベースの正規化」と呼びます。 正規化のイメージを簡単に表すと、次のような図になります。正規化のプロセス 正規化には、第1から第5までの手順があります。このうち、リレーショナル・データベースにおいては、第3正規化までの処理が必要とされています。正規化前のデータベース31 次のテーブルは、正規化のされていないテーブルです。購入商品履歴テーブル テキストファイルのような原始的なデータベースではこのように保存するのも仕方ありませんが、RDBMS製品を利用できる環境でこのようなテーブルを使うのはもったいないですね。第1正規化 第1正規化の規則は、「すべての属性が異なった値をもっている」です。具体的には、正規化を行っていないテーブルに対し、次のような処理を行います。フィールドの重複を避けるまず、1件のレコードに、フィールドの繰り返しや、フィールド中に複数のデータがある場合、そのフィールドを別レコードとして分離します。導出フィールドがある場合、それを排除導出フィールド』とは、他のフィールドから値を算出することができるデータのことです。たとえば、名前フィールドの値は、姓と名フィールドを結合すれば得られます。この名前フィールドのような列を、導出フィールドと呼びます。正規化を行う際は、このような余分なフィールドを削除する必要があります。 次の図にあるように、購入商品履歴テーブルの名前フィールドは姓、名フィールドを結合することで表現できるので、余分なフィールドです。このフィールドは削除します。↓名前フィールドの削除 また、1件の中に商品名が複数登録されているので、これを別テーブルに分割します。31 ↓商品フィールドの切り出し 分割後の2つのテーブルには、1レコード中に重複がありません。ここで注目したいのは、購入履歴テーブルの購入IDです。この購入IDは、一意にレコードを指定することを保障するためのもので、決して他のレコードと同じ値を持つことはありません。このようなフィールドをプライマリキーと呼ぶことは、先のステップで紹介していますね。また、購入商品テーブルの購入IDですが、これは購入履歴テーブルの購入IDを参照しています。このようなフィールドを外部キーといい、これもまた先のステップで紹介済みです。 プライマリキーは次の規則に従ったフィールドです。同じフィールドの中で必ずユニークな値NULL値であってはいけない。生成から削除まで決して値は変更されないということで、プライマリキーは名前やそのほかのフィールドを割り当てるのではなく、プライマリキー専用のフィールドを用意するべきです。プライマリキーと外部キーを設定したら、リレーションを張ることが可能になります。正規化には、プライマリキーと外部キーは必須になりますから、とくに注意してください。ここでは、他のフィールドと区別するために、図の中でプライマリキーと外部キーの値を青の文字色で表しています。 さて、以上のような操作により、どの属性も同じ値を持たなくなりました。次は第2正規化です。第2正規化 第2正規化の規則は、「プライマリキーに『従属』するフィールドと、『部分従属』するフィールドを分離する」です。第1正規化では、1つのレコード中に同じフィールドが存在しないように正規化しました。第2正規化では、プライマリキーが決まれば、その他のフィールドも決定できるように正規化します。たとえば、後で第1正規化で作成したテーブルを分割して商品テーブルを作成しますが、商品テーブルは、商品IDによって商品名や単価を決定することができます。 第1正規化の状態の購入商品テーブルは、商品名が重複して登録される可能性があります。31 第1正規化後の購入履歴テーブルと購入商品テーブル これでは、入力の間違いなどが発生したときや、商品名が変更になった際は大変な処理が待っています。そこで、商品テーブルを新たに作成することにします。 商品名を別テーブルに切り離す際に、単価というフィールドを新しく付け加えました。また、購入商品にあった価格フィールドを、個数フィールドに変更しています。こうすることにより、商品をいくつ購入したか、商品の単価はいくらかとうことがすぐにわかるようになりました。購入時の価格を知りたい場合は、商品テーブルの単価と、購入商品テーブルの個数をかければよいわけです。SQLにすると、次のような分になります。SELECT単価*個数AS価格FROM商品,購入商品WHERE商品.商品ID=購入商品.商品ID こうして新たに作成した商品テーブルは、1商品ごとに新しいレコードを追加していくことになります。このように、値の重複を避け、他のテーブルから参照されるために用意されるテーブルをマスターテーブルと呼びます。31 第3正規化 第3正規化は最後の正規化です。この規則は、「プライマリキー以外の全てのフィールドは、プライマリキーに直接に従属する」です。これは、テーブル内でプライマリキーとは直接関係のないフィールドを別テーブルに切り分ける作業を指しています。 第2正規化の状態にあるテーブルは、よくみるとテーブル名とは関係のないフィールドがあります。たとえば、購入履歴テーブルに顧客情報の性と名フィールドがありますが、これは別に顧客テーブルを用意して、そこに登録したほうがよいでしょう。 顧客情報を購入履歴テーブルから切り離し、新たに顧客テーブルを用意しました。これにより、購入履歴テーブルから商品テーブル、顧客テーブル、購入商品テーブル全ての値を効率よく参照し、完全に重複を排除しています。 実は、第3正規化は常に実用性があるとは限りません。たとえば、顧客テーブルに都市、電話番号、性別、利用頻度などを登録するような場合、それら全てを別個のテーブルに作成する必要があります。もし本当に別テーブルに切り分けるとしたら、小さいテーブルを数多く作成することになり、パフォーマンスや作業効率の低下を招きます。 第3正規形は、テーブルの利用形態などをじっくりと考えてから、データの変更頻度や重要度によってケース・バイ・ケースに適用するのが現実的です。31 その他の正規形 BCNF(BoyceCoddNormalForm)と呼ばれる第4正規形や、第5正規形が存在しますが、実用的な設計とはみなされていません。機能的にも影響が限られていますので、ほとんどの設計では適用されていません。31
此文档下载收益归作者所有
举报原因
联系方式
详细说明
内容无法转码请点击此处