ISQL を使用して SELECT クエリを実行する
SQL をインストールする場合
サーバー、ISQL/w というアプリケーションもインストールしました。 ISQL/w を使用すると、対話型 SQL クエリを実行できます。 ASP Web ページにクエリを含める前に、ISQL/w でクエリをテストすると非常に役立ちます。
注:
この本の最初の部分では、Microsoft のインストールと構成方法を学習しました。
SQLサーバー。 SQL Sever がインストールされていない場合、または SQL Sever を実行できない場合は、第 3 章「SQL のインストールと使用」を参照してください。
SQL でタスクを選択
サーバー プログラム グループの ISQL_w を使用してプログラムを開始します。プログラムが起動すると、最初にダイアログ ボックスが表示され、サーバー情報とログイン情報の入力を求められます (図 10.1 を参照)。 [サーバー] ボックスに SQL サーバーの名前を入力します。サーバーがローカル コンピューターで実行されている場合、サーバー名はコンピューターの名前になります。
ログイン情報ボックスにログインアカウントとパスワードを入力するか、「信頼された接続」を使用することを選択し、「接続」ボタンをクリックします。
図10.1
注:
SQLを使用する場合
サーバーが完全なセキュリティまたは混合セキュリティを使用するように構成されている場合は、信頼された接続を使用できます。標準セキュリティを使用する場合は、ユーザー名と
パスワードを入力する必要があります。詳細については、第 3 章を参照してください。
すべてがうまくいけば、図 10.2 に示すように、接続ボタンをクリックした後にクエリ ウィンドウが表示されます。 (異常がある場合は3章を参照してください)
図10.2
クエリを実行する前に、データベースを選択する必要があります。 SQL Server をインストールするときは、自分用のデータベース、SQL を作成します。
サーバーには、master、model、msdb、tempdb などの多くのシステム データベースもあります。
便利な SQL
サーバーには、pubs と呼ばれる特別なサンプル データベースが付属しています。図書館
pubs には、仮想パブリッシャが使用するテーブルが含まれています。ドキュメント内のすべてのサンプル プログラムは、このライブラリ用に設計されています。本書の例の多くでもこのデータベースが使用されています。
クエリ ウィンドウの上部にある DB ドロップダウン ボックスでデータベース パブを選択し、データベースを選択します。すべてのクエリは、このライブラリ内のさまざまなテーブルに対して実行されます。これで、最初のクエリを実行できるようになりました。これはとてもエキサイティングです!
最初のクエリは、autrors というテーブルに対して行われます。このテーブルには、仮想出版社で働くすべての著者に関するデータが含まれています。クエリ ウィンドウをクリックし、次のステートメントを入力します:
SELECT
著者からの電話 どこから
au_name="Ringer"
入力が完了したら、[クエリの実行] ボタン (VCR の再生ボタンのような緑色の三角形) をクリックします。このボタンをクリックすると、クエリ ウィンドウに表示されるすべてのステートメントが実行されます。クエリ ウィンドウは自動的に結果表示ウィンドウに変わり、クエリの結果を確認できます (図 10.3 を参照)。
表示されるクエリ結果は、図 10.3 に示されているものとは異なる場合があります。 SQLで
サーバーのバージョンが異なると、ライブラリ パブ内のデータも異なります。 SQLサーバー
6.5 の場合、
は 2 つのレコードを検索します。結果表示ウィンドウには次の内容が表示されます:
phone
……………….
801
826_0752
801 826_0752
(2行)
影響を受けます)
図 10.3
実行した SELECT ステートメントは、著者テーブルから Ringer という名前のすべての著者の電話番号を取得します。 WHERE 句で特別な選択条件を使用することで、クエリの結果を制限します。選択基準を無視して、テーブルからすべての著者の電話番号を取得することもできます。これを行うには、[クエリ] タブをクリックし、クエリ ウィンドウに戻り、次の SELECT ステートメントを入力します:
SELECT
からの電話
authors
このクエリが実行されると、authors テーブル内のすべての電話番号が (順不同で) 取得されます。 authors テーブルに 100 の電話番号が含まれている場合、100 のレコードがフェッチされます。テーブルに 10 億の電話番号がある場合、10 億のレコードすべてがフェッチされます (これには時間がかかる場合があります)。
テーブル作成者のフィールドには、姓、名、電話番号、住所、都市、州、郵便番号が含まれます。 SELECT ステートメントの最初の部分にフィールドを指定することで、テーブルから任意のフィールドを取得できます。
SELECT のような SELECT ステートメントで複数のフィールドを一度に取得できます。
au_fname、au_lname、電話番号 FROM
authors
この SELECT ステートメントが実行されると、これら 3 つの列の値がすべて取得されます。このクエリの結果の例を次に示します (紙の節約のため、クエリ結果の一部のみが表示され、残りのレコードは省略記号で置き換えられています):
au_fname
au_lname 電話
……………………………………………………………………………….
Johnson White 408
496_7223
マージョリー・グリーン 415 986_7020
シェリル・カーソン 415
548_7723
マイケル・オリアリー 408 286_2428
…
(23 row(s)
影響を受けます)
SELECT ステートメントでは、リストする必要があるだけフィールドをリストできます。フィールド名をカンマで区切ることを忘れないでください。アスタリスク (*) を使用して、テーブルからすべてのフィールドを抽出することもできます。アスタリスクを使用した例を次に示します:
SELECT
* から
著者
SELECT ステートメントが実行されると、テーブル内のすべてのフィールドの値が取り出されます。 SQL クエリではアスタリスクが頻繁に使用されることがわかります。
ヒント:
アスタリスクを使用すると、テーブル内のすべての列の名前を確認できます。これを行うには、SELECT ステートメントの実行後にクエリ結果の列ヘッダーを確認するだけです。
複数のテーブルを操作する
これまでは、SQL クエリを使用して 1 つのテーブルからデータを取得することのみを試みてきました。
SELECT ステートメントの FROM 句にデータをフェッチするテーブルの名前をリストするだけで、SELECT ステートメントを使用して複数のテーブルから同時にデータをフェッチすることもできます。
au_lname ,title FROM 著者, タイトル
このSELECT文を実行すると、authorsテーブルとtitlesテーブルから同時にデータが取得されます。 authors テーブルからすべての著者名を取得し、titles テーブルからすべての
本のタイトルを取得します。 ISQL/w プログラムでこのクエリを実行し、クエリ結果を確認します。いくつかの奇妙で予期せぬ状況に遭遇するでしょう。著者の名前はその著者が書いた本と一致しませんが、著者の名前と本のタイトルの考えられるすべての組み合わせが表示されます。これは、あなたが期待していたものではないかもしれません。を参照してください。
何が問題だったのでしょうか?問題は、2 つのテーブル間の関係を指定していないことです。テーブルを相互に関連付ける方法を SQL に指示することはありません。 2 つのテーブルを関連付ける方法がわからない場合、サーバーは両方のテーブルから取得したレコードの可能なすべての組み合わせを単純に返すことができます。
2 つのテーブルから意味のあるレコードの組み合わせを選択するには、2 つのテーブルのフィールド間の関係を確立して、2 つのテーブルを関連付ける必要があります。これを行う 1 つの方法は、他の 2 つのテーブルのフィールド間の関係を記述するために特に使用される 3 番目の
テーブルを作成することです。
著者テーブルには au_id という名前のフィールドがあり、各著者の一意の ID が含まれています。テーブルタイトルには、title_id と呼ばれるフィールドがあり、各書籍タイトルの一意の識別子が含まれています。フィールドau_idとフィールドtitle_idに含めることができる場合
それらの間に関係を確立することにより、2 つのテーブルを関連付けることができます。データベース pubs には、titleauthor という名前の
テーブルがあり、この作業を完了するために使用されます。テーブル内の各レコードには、titles テーブルと authors テーブルを関連付けるために使用される 2 つのフィールドが含まれています。次の SELECT ステートメントは、
これら 3 つのテーブルを使用して正しい結果を取得します:
SELECT
au_name,title FROM authors,titles,titleauthor
WHERE
authors.au_id=titleauthor.au_id
AND title.title_id=titleauthor.title_id
この SELECT ステートメントが実行されると、各著者が正しい書籍タイトルと照合されます。テーブル titleauthor は、各テーブルから 1 つのフィールドを含めることによって、authors テーブルと title テーブルの間の関係を指定します。 3 番目のテーブルの唯一の目的は、他の 2 つのテーブルのフィールド間の関係を確立することです。それ自体には追加のデータは含まれません。
この例ではフィールド名がどのように記述されているかに注目してください。 authors テーブルと Titles テーブルで同じフィールド名 au_id を区別するために、各フィールド名の前にテーブル名のプレフィックス
とピリオドが付けられます。名前付き author.au_id
という名前のフィールドはテーブル authors に属し、titleauthor.au_id という名前のフィールドはテーブル titleauthor に属します。この 2 つは混同されません。
3 番目のテーブルを使用すると、2 つのテーブルのフィールド間にさまざまな種類の関係を確立できます。たとえば、1 人の著者が多数の異なる本を執筆する場合や、1 つの本が多数の異なる著者によって執筆される場合があります。 2 つのテーブルのフィールド間にこの「多対多」の関係がある場合、3 番目のテーブルを使用してこの関係を示す必要があります。
ただし、多くの場合、2 つのテーブル間の関係は複雑ではありません。たとえば、テーブルのタイトルとテーブルの発行者の間の関係を指定する必要があります。書籍のタイトルが複数の出版社と一致することは不可能なので、2 つのテーブル間の関係を示す 3 番目のテーブルは必要ありません。 Titles テーブルと Publishers テーブルの間の関係を指定するには、2 つのテーブル間に共通のフィールドが必要なだけです。データベース pubs では、テーブルのタイトルとパブリッシャーに pub_id という名前のフィールドがあります。本のタイトル
とその出版社のリストを取得したい場合は、次のステートメントを使用できます:
SELECT
title,pub_name FROM タイトル,出版社
WHERE
title.pub_id=publishers.pub_id
もちろん、書籍が 2 つの出版社によって共同出版されている場合は、この関係を表す 3 番目のテーブルが必要です。
通常、2 つのテーブルのフィールド間に「多対多」の関係があることが事前にわかっている場合、3 番目のテーブルを使用して 2 つのテーブルを関連付けます。一方、2 つのテーブルのフィールド間に「1 対 1」または「1 対多」の関係しかない場合は、共通フィールドを使用してそれらを関連付けることができます。
上記は SQL データ操作の基礎 (初級) 2 の内容です。その他の関連記事については、PHP 中国語 Web サイト (m.sbmmt.com) に注目してください。