PHP プログラムの実行(まとめ) SQL 概要 2007/5/16 平成20年度 情報科学III (理系コア科目・2年生) PHP プログラムの実行(まとめ) SQL 概要 担当 岡村耕二 月曜日 2限 http://okaweb.ec.kyushu-u.ac.jp/lectures/jk3/ 本資料の一部は、堀良彰准教授、天野浩文准教授等による 以前の講義資料をもとにしています。 情報科学III(6)
演習問題 クライアントのWindows XP などで英数字でテキストファイルを作成し、そのファイルに含まれる単語を、抽出し、表示するプログラムを作成せよ。 例 This is a pen. Is this a pen,too? Yes, it is. 出力結果 this (2) is (3) a(2) pen(2) too(1) yes (1) it(1) 単語は出現頻度やアルファベット順にソーティングできると、なおよい。
単語の抽出(回答例:http://bossp. is. kyushu-u. ac. jp/~oka/2008-0526/file4 単語の抽出(回答例:http://bossp.is.kyushu-u.ac.jp/~oka/2008-0526/file4.html) $nlines=0; $nwords=0; while(strlen($lines[$nlines])>0){ $words[$nlines]=str_word_count($lines[$nlines],1); print_r($words[$nlines]); printf("<br>"); $j=0; while(strlen($words[$nlines][$j])>0){ for($c=0;$c<$nwords;$c++){ if(strcasecmp($www[$c],$words[$nlines][$j])==0){ $wwwc[$c]++; break; } if($c==$nwords){ $www[$nwords]=strtolower($words[$nlines][$j]); printf("(%d) %s<br>",$nwords,$www[$nwords]); $wwwc[$nwords]=1; $nwords++; } $j++; printf("<BR>"); $nlines++;
前回のおさらい(1) PHPプログラムの処理形態 PHP処理モジュールがインストールされている web サーバ上で,web サーバ経由で実行させる. PHPがコマンドラインで実行できるようにインストールされているサーバ上で,コマンドラインから起動する. PHPプログラムの入出力 コマンドラインから実行される場合は簡単 ディスプレイ,キーボード,ファイル webサーバから実行される場合は,単純ではない.
前回のおさらい(2) webサーバで実行されるPHPプログラムの入出力 HTTPの力を借りる. 入力は,HTTPリクエストから受け取る. 出力は,HTTPレスポンスに埋め込む. HTTP リクエスト 実行中の PHPプログラム webサーバ インター ネット クライアント HTTP レスポンス PHP 処理 モジュール
前回のおさらい(3) クライアントへの間接的な出力 HTML データに print( ) の出力が埋め込まれる. ステータス行やメッセージヘッダが自動的に付加される. PHP プログラム PHPからの出力を含むwebページ print( ) で出力すると,その内容がHTMLデータに埋め込まれてクライアントに返送される.
前回のおさらい(4) クライアントからの間接的な入力 HTMLの <form> ~ </form>タグを用いる. submit タイプのボタンがクリックされると,集めた内容を HTTP で送信する. 利用者の 入力を処理するPHP プログラム 利用者の入力データをフォームに含むwebページ <form> タグのあるページで 入力を集めて,PHPプログラムに送る.
前回のおさらい(5) <form> ~ </form> タグ method:ブラウザに入力されたデータをサーバに送信するときの形式 (GETまたはPOST) GET:データをURLの末尾に追加して送信する. POST:データをURLとは別に送信する. action:集めたデータの送信先のURL 通常は,PHPプログラム(HTML埋め込みも可)またはCGIプログラム <form method="メソッド名" action="URL" ...> ... </form>
前回のおさらい(6) 実際の入力部分は,<input> タグで <form method="メソッド名" action="URL" ...> <input type="タイプ名" name="項目名"> ... </form>
前回のおさらい(7) <input>タグの例 <input type="submit" name="名前"...> :送信ボタン <input type="text" name="名前"...> :1行の入力欄 他に "radio"(ラジオボタン),"password"(パスワード形式の入力欄),"checkbox" (チェックボックス),"file"(ファイルの送信欄),"hidden"(隠しデータ), <textarea name="名前" ...> ~</textarea> (複数行の入力欄) <select name="名前"> <option value="値">選択肢の名前</option> ... </select> (プルダウンメニュー)
前回の補足と訂正 複数選択の可能な "checkbox" タイプの入力欄 <input> タグの name 属性の値は,複数選択された場合にはPHPの配列に格納されるように,"q2[]" のような名前にしておくとよい. <p> 質問1 あなたの好きな果物は?(複数選択可) <br> <input type="checkbox" name="q2[]" value="リンゴ">リンゴ <input type="checkbox" name="q2[]" value="バナナ">バナナ <input type="checkbox" name="q2[]" value="キウイ">キウイ </p>
PHPと入出力(承前)
外部からのデータの受け取り方(1) 入力データをPHPプログラムへ送るのは <form> ~ </form> を使えばよいとして… 受け側のPHPプログラムでは,<form> ~ </form> タグから送られてきたデータをどのようにして受け取ればよいか? 入力されたデータ ? 受け側のPHP プログラム HTML ファイル POST またはGET <form> タグのあるページで 入力を集めて,PHPプログラムに送る.
外部からのデータの受け取り方(2) PHPプログラムの外部から送り込まれるデータ <form> ~ </form> タグで集める利用者入力データ以外のものもある. PHPプログラムを実行しているwebサーバに関する情報 PHPプログラム自身に関する情報(ファイル名など) プログラム自身の情報 POST またはGET 受け側のPHP プログラム 利用者が入力したデータ サーバの 情報 HTML ファイル
外部からのデータの受け取り方(3) webサーバ経由で起動されたPHPプログラムには,外部から来るデータが自動的に格納される,定義済みの連想配列がある. $_SERVER["名前"] $_ENV["名前"] $_POST["名前"] $_GET["名前"] PHPプログラムがwebサーバ経由で起動されると,上記の配列はすでにアクセス可能になっている. 要素には値もセットされている.
$_SERVER['名前']と$_ENV['名前'] そのPHPプログラムを実行しているwebサーバに関する情報 たとえば: $_SERVER["HTTP_HOST"] :サーバのホスト名 $_SERVER["SERVER_ADDR"] :サーバのIPアドレス $_SERVER["HTTP_USER_AGENT"] :そのPHPプログラムにアクセスしてきたクライアントがサーバに対して名乗っているブラウザ名 $_ENV["名前"] そのPHPプログラムが実行されるときの環境に関する情報
これらの連想配列の内容を確認する方法 phpinfo( ) 関数を実行する 第4回のスライドで紹介した. <?php phpinfo(); ?>
$_POST['名前'] そのPHPプログラムに対して,POSTメソッドで送り込まれたデータ $_POST["名前"] 入力されたデータ HTML ファイル POST <form> タグのあるページで 入力を集めて,PHPプログラムに送る.
$_GET['名前'] そのPHPプログラムに対して,GETメソッドで送り込まれたデータ $_GET["名前"] 入力されたデータ HTML ファイル GET <form> タグのあるページで 入力を集めて,PHPプログラムに送る.
連想配列 $_POST[ ] ($_GET[ ] )のキー <input> (<textarea>,<select>)タグの中で指定された name 属性の値が,これらの連想配列のキー(要素を特定するための名前)になる. $_POST["key1"] 入力データ 入力データ 受け側のPHP プログラム HTML ファイル POST <input type="text" name="key1">
さらにデータを入力して,また送信ボタンを 2段以上のPOST/GET <form> タグで集めたデータを受け取った PHP プログラムが,さらに次の PHP プログラムにデータを伝えるための <form> タグを含むことがある. さらにデータを入力して,また送信ボタンを クリック データを入力して,送信ボタンをクリック 受け側のPHP プログラム 受け側のPHP プログラム HTML ファイル POST/GET POST/GET
POST/GETしたデータの到達範囲 そのときの POST(GET) メソッドで送信されたデータが,送信先のPHPプログラムの $_POST[ ] ($_GET[ ])連想配列に入る. $_POST["key1"] ($_GET["key1"]) $_POST["key1"] ($_GET["key1"]) 入力データ2 入力データ1 受け側のPHP プログラム1 受け側のPHP プログラム2 HTML ファイル POST/GET POST/GET ここで送信されるデータは, そのままでは,プログラム2には伝わらない.
入力されたデータを2段以上先まで伝える方法 いくつか方法はあるが,簡単なものは: "hidden" タイプの <input> タグで $_POST["key1"] $_POST["key2"] ($_GET["key1"]) ($_GET["key2"]) $_POST["key1"] ($_GET["key1"]) 入力データ2 入力データ1 受け側のPHP プログラム1 受け側のPHP プログラム2 HTML ファイル POST/GET POST/GET 心情的には,こうしたいが,文法的に× <input type="text" name="key1"> <input type="hidden" name="key1" value="$_POST["key1"]"> <input type="text" name="key2">
今日やること PHPを少し離れて… リレーショナルデータベースの基礎 リレーショナルデータベース言語SQLの基礎 データベース SQL web サーバ PHP プログラム SQL クエリ ブラウザ データベース 管理システム (DBMS) データベース
リレーショナルデータベースの基礎
データベースとは何か? 「複数の応用目的での共有を意図して組織的かつ永続的に格納されたデータ群」 (北川博之著『データベース』,昭晃堂,1996年) 「複数の応用目的での共有」 同じデータが複数の利用者やさまざまなプログラムからアクセスできる. 「組織的」 大量のデータを統一的な枠組みで保存している. 必要とするデータを高速に取り出す方法が整備されている. 「永続的」 プログラムの実行終了後もデータが保存されている 計算機システムの再起動後もデータが保存されている
ファイルではだめなの? 確かに,ファイルは二次記憶に格納されるので,「永続性」を持っている. データベースが登場する前はどうだったか 複数のプログラムが同じファイルを処理対象として共有することも不可能ではない. 実際,データベース登場以前は,そのようにしてデータが共有されていた. ただし,いずれのプログラムも,ファイルの中のデータ形式を強く意識して記述しなければならない. 大量のデータの中から必要なものだけを取り出そうとすると,そのプログラムの責任で探し出す必要があった. 新しい利用目的のためにデータ形式を変更しようとすると,それを使うすべてのプログラムを変更しなければならなかった. 複数のプログラムが同じファイルに同時にアクセスすると,データを破壊してしまう可能性も高かった. 同じデータがバラバラのファイルに重複して記録される可能性も高かった.
データベース登場以前の問題点(1) 各プログラムが独立にデータアクセス機構を持っており,データ構造が変更されるとすべてが影響を受ける. プログラム1 データ アクセス部 プログラム2 データ アクセス部 プログラム n データ アクセス部 例えば: カードを並べる順序が変わる. 1枚のカードに記録される項目が増える. カードの中の項目の記録順序が変わる. ファイル データ すべてプログラム修正が必要
データベース登場以前の問題点(2) 各プログラムがファイルをいったん読み出して,一部を変更してから全部書き戻すと… プログラム1 プログラム2 プログラム n 例えば: タイミングによっては,書き直した内容が古い内容で上書きされて消えてしまう.
そこで… 二次記憶内のデータにアクセスする部分は,データベース管理システムという新たなプログラムとして,応用プログラムから独立させる. すべてのプログラムは,自分の必要とするデータを特定するための『条件』を与えて,データベース管理システムにアクセス(読み書き)を委託する. 条件を満たすデータを探すための処理手順は,データベース管理システムに一任する. データが格納される形式も,データベース管理システムに一任する. 複数のプログラムが同じデータ群に同時にアクセスする可能性があるときには,ある『約束』にしたがってアクセス依頼を送り,それらの間の制御はデータベース管理システムに一任する.
データベース管理システムの利用 基本的に,すべて「お願い」 プログラム1 プログラム2 プログラム n データベース管理システム 例えば: データベース管理システムは,競合するアクセスの間の「交通整理」を行える可能性が出てくる. 例えば: 新たな項目が追加されたくらいなら,プログラムの修正は不要. データの格納される順序が変わっても,プログラムの修正は不要.
データベースとデータベース管理システム データベース管理システム ここからここまでを「データベース」と呼ぶとき(人)と… ここだけを「データベース」と呼ぶとき(人)がある. 特に断らない限り,この講義では,こちら.
歴史の勉強をもうちょっとだけ… 「データベース」という名称の変遷 データ・バンク(data bank) データ・ベース(data base,data-base) データベース(database) これまでにいろいろなデータベースが提案された ネットワークデータベース 階層データベース リレーショナルデータベース オブジェクト指向データベース(オブジェクトベース) 今ココ
データベースの用語と略語 データベース(database) →DB データベース管理システム(database management system) →DBMS リレーショナルデータベース(relational database) →RDB リレーショナルデータベース管理システム →RDBMS
リレーショナルデータベース(1) リレーショナルデータベース(RDB) データベースは,テーブル(表)の集まり データベースとテーブルには,おのおの名前がついている. 住所録 年賀状 氏名 住所 電話番号 安部晋三 東京都千代田区… 03-xxxx-... 麻生太郎 東京都港区... 03-yyyy-... 麻生渡 福岡市中央区... 092-... : 氏名 年 送信 安部晋三 2005 × 2006 2007 ○ 麻生太郎 : テーブル 宛名書き用データベース
リレーショナルデータベース(2) テーブル(table) テーブルは,行に相当するレコード(record)の集まり 列には,おのおの,カラム(column)またはフィールド(field)と呼ばれる名前がついている. カラム 住所録 氏名 郵便番号 住所 電話番号 安部晋三 100-8968 東京都千代田区… 03-xxxx-... 麻生太郎 107-... 東京都港区... 03-yyyy-... 麻生渡 812-... 福岡市中央区... 092-... : レコード
リレーショナルデータベース(3) テーブルの各カラムに格納できるデータの型は統一しなくてはならない. データ型によっては,範囲も制限できる. 例:「年齢はゼロまたは正の整数でなければならない.」 ただし,どのような型のカラム(キーを除く)にも格納可能な,NULL という特殊な値がある. NULL は,以下のいずれかの意味を表す. 値が不明(まだ値がわかっていない) 値が非存在(絶対に存在しないことがわかっている) NULL は空欄(そこに値が入っていない)ともゼロとも同じではない. あるところに格納された NULL は,他のどんな値とも等しくない. それどころか,別のところにある NULL とも等しくない.
リレーショナルデータベース(4) テーブルのキー(key) テーブルに格納されたレコードを一意に識別できるカラム(の集まり) 前ページ,前々ページの例では,キーにあたるカラムに色を付けてある. キーは単一のカラムである場合も,複数のカラムからなる場合もある. キーの値をすべて指定すると,それに合致するレコードはたかだか1つしか存在しない. ただし,値の組み合わせによっては,それに合致するレコードが存在しないこともある. すでに格納されているレコードと同じキー値を持つレコードを新たに追加しようとしたり,キーの一部でも空欄もしくは NULL になっているレコードを追加しようとすると,DBMSはそのような要求を拒絶する.
キーに関する補足 ひとつのテーブルには,複数のキーが存在してもよい. (キーが複数のカラムからなる,という意味ではなく,キーとなりうるカラム集合が複数ある,ということ) その場合,キーのうちのひとつを主キー(primary key)と呼ぶ. 一部のカラムの値を決めただけではレコードが一意に決まらない場合でも,そのテーブルのすべてのカラムをまとめたものは,必ずキーとなる. 実世界では,「氏名」や「会社名」などは,必ずしもキーとはならない. 同姓同名の人,同名の会社などはたくさん存在する. そのような場合,個人番号,会社番号といった,必ず一意になるカラムを別に定めることが多い.
データベースは「設計」が大事(1) 先ほどのDBをうっかり以下のように作ってしまうと… 同じ人の住所や電話番号の情報が何カ所も重複して登録される. うっかり一部だけ更新すると,正しい住所がどれかわからなくなる. 氏名 郵便番号 住所 電話番号 年 送信 安部晋三 100-8968 東京都千代田区… 03-xxxx-... 2005 × 2006 2007 ○ 麻生太郎 107-... 東京都港区... 03-yyyy-... :
データベースは「設計」が大事(2) それでは何でもかんでも分ければいいかと言うと... 以下のように分割してしまったら,宛名を印刷しようとするたびに,ある人の郵便番号と住所を知るために,2つのテーブルをつきあわせなければならなくなる. 氏名 郵便番号 安部晋三 100-8968 麻生太郎 107-... 麻生渡 812-... : 氏名 住所 電話番号 安部晋三 東京都千代田区… 03-xxxx-... 麻生太郎 東京都港区... 03-yyyy-... 麻生渡 福岡市中央区... 092-... :
データベースは「設計」が大事(3) データベースをどこまで分割すればよいかをきちんと議論するためには,リレーショナルデータベース設計論の勉強が必要だが... それは,この講義の範囲を超えそうなので… とりあえずの「指針」 テーブル内に同じ情報が重複して記録されるようなら,そのテーブルをうまく分割できないか考える. 同時に使うことの多いカラムが別々のテーブルに分かれて記録されるようなら,それらのテーブルをうまくまとめることができないか考える.
データベースから必要な情報を取り出す操作(1) 選択(selection) テーブルから,条件を満たすレコードだけを取り出す. 例:「住所録」から「安部晋三」のデータを取り出す. 氏名 郵便番号 住所 電話番号 安部晋三 100-8968 東京都千代田区… 03-xxxx-... 麻生太郎 107-... 東京都港区... 03-yyyy-... 麻生渡 812-... 福岡市中央区... 092-... : 氏名 郵便番号 住所 電話番号 安部晋三 100-8968 東京都千代田区… 03-xxxx-...
データベースから必要な情報を取り出す操作(2) 射影(projection) テーブルから,必要なカラムだけを切り出す. 例:「住所録」から「氏名」「郵便番号」「住所」だけを切り出す. 氏名 郵便番号 住所 電話番号 安部晋三 100-8968 東京都千代田区… 03-xxxx-... 麻生太郎 107-... 東京都港区... 03-yyyy-... 麻生渡 812-... 福岡市中央区... 092-... : 氏名 郵便番号 住所 安部晋三 100-8968 東京都千代田区… 麻生太郎 107-... 東京都港区... 麻生渡 812-... 福岡市中央区... :
データベースから必要な情報を取り出す操作(3) 結合(join) 共通のカラムをてがかりに,複数のテーブルを横につなぎ合わせる. 年賀状 住所録 氏名 年 送信 安部晋三 2005 × 2006 麻生太郎 ○ : 氏名 郵便番号 住所 電話番号 安部晋三 100-8968 東京都千代田区… 03-xxxx-... 麻生太郎 107-... 東京都港区... 03-yyyy-... : 住所録.氏名 郵便番号 住所 電話番号 年賀状.氏名 年 送信 安部晋三 100-8968 東京都千代田区… 03-xxxx-... 2005 × 2006 麻生太郎 107-... 東京都港区... 03-yyyy-... ○ : (2つのテーブルからくる「氏名」を区別するには,元のテーブル名とピリオドを付ける)
結合について補足(1) 結合操作では,左右のテーブルのすべてのレコードに結合する相手のレコードがあるとは限らない. 相手がいない! カラム1 カラム2 カラム3 相手がいない! カラム3 カラム4 カラム5 結合可能なレコード 相手がいない!
結合について補足(2) ほとんどの場合,結合相手のあるレコードだけ残せば用が足りる. このような結合を,特に,内部結合(inner join),等結合(equi-join)と呼ぶ. 重複するカラムの片方を削ったものは,自然結合(natural join)という. しかし,まれに,相手のいないレコードを消さずに残しておきたいこともある. 左(外部)結合:左のテーブルのレコードを消さずに残す. 右(外部)結合:右のテーブルのレコードを消さずに残す. など カラム1 カラム2 カラム3 カラム3 カラム4 カラム5
データベースから必要な情報を取り出す操作(4) 選択・射影・結合を組み合わせるだけでも,かなりいろいろなことができるが… 以下のような操作も,いろいろと役に立つ. 集約演算 平均値,合計,最大値,最小値,カウント グループ化 あるカラムの値が等しいレコードをまとめる 集約演算と組み合わせて,グループごとの平均などを求めることができる. 並べ替え あるカラムの値の大小の(文字列の場合には辞書式の)順に,レコードを並べ替える.
問い合わせ(query) DBから情報を引き出すために,DBMSに送られるリクエストを問い合わせ(query)と呼ぶ. 質問と呼ぶ人もいる.
リレーショナルデータベース言語SQLの基礎 (1)
SQL RDBMSに仕事を頼むための言語 SQLという名称は,もともと,Structured Query Language 「構造化問い合わせ言語」からきている. SQLでできる仕事の例 新しいデータベースを作る・既存のデータベースを削除する. データベースに新たなテーブルを追加する・データベースからテーブルを削除する. テーブルにレコードを追加する・テーブルからレコードを削除する・テーブル内のレコードの値を更新する. データベースに対する問い合わせを行う. … etc.
SQLの「方言」 データベースは世界中で使われるので,国際規格が制定されており,ほとんどのDBMSがこれを採用している. 規格に定められた機能の一部を(しか?)実装していなかったり 規格にない機能を追加で実装していたり 規格に定められている構文と同じ構文で,規格と微妙に異なる機能を提供していたり : というわけで,SQLは必ずしも「万国共通」ではない. その中で,「問い合わせ」の機能は比較的共通点が多いと言えるかも.
大文字・小文字の区別 SQLのキーワード(と予約語) 大文字・小文字の区別がない. この講義の資料では,すべて大文字で記述する. 予約語とは,現在はまだ何の意味もない(使われていない)が,将来の機能拡張によって使われる可能性があるので,使用を禁止されている名前のこと. データベース名・テーブル名・カラム名・エイリアス名など 大文字・小文字を区別するかどうかは,OSに依存する. この講義の資料では,すべて小文字で記述する. このように,キーワードをすべて大文字に,自分が定義する名前をすべて小文字に決めること(あるいはその逆)にしておくと,混乱が少ないだろう.
データベース名・カラム名・文字列定数などの規則 使える文字は,英数字と,アンダースコア( _ ),$ 実習で使用する MySQL では,たまたま数字で始まる名前も使えるが,お勧めしない. 数字だけの名前は禁止されている. $は,今回一緒に使うPHPのほうで特殊な意味を持つので,混乱を避けるために使わないほうが無難. 文字列定数を表すときは シングルクォートでくくる. 例: '麻生渡','1234' ⇔数値の 1234 との違いに注意
SQLの機能の便宜的な分類 問い合わせ機能 SELECT ~ FROM ~ WHERE データ操作機能 INSERT UPDATE DELETE データ定義機能 CREATE DROP ALTER その他 ユーザ管理 セッション管理 ここはひとまとめに扱うことも多い
SELECT [ALL | DISTINCT] SELECT項目リスト FROM テーブル名1[, テーブル名2, ...] SQLの問い合わせの基本形 非常に特徴的な SELECT ~ FROM ~ WHERE ブロックで表される. SELECT [ALL | DISTINCT] SELECT項目リスト FROM テーブル名1[, テーブル名2, ...] [ JOIN 結合条件 ] [ WHERE 検索条件 ] [ ] 内は省略可能 | は それで区切られた要素のいずれかひとつを選ぶことを示す. 上の SELECT 節の例では,ALLまたはDISTICTのどちらか一方を書くことができるが,まるまる省略してもよい,ということを意味している.
SELECT 節 SELECT節は,問い合わせの結果として出力させたい項目を指定する. 書籍によっては,「節」の代わりに「句」を用いているが,意味は同じ. SELECT項目リストは ひとつ以上のカラム名やそれに集約関数を適用したもの(をカンマでつないだリスト) または,「*」 FROM句で指定されるテーブルのすべてのカラムを並べて出力する. ALL は,すべてのカラムの値が同一であるレコードがあっても,重複を除去せずに表示する.DISTINCTは,すべてのカラムの値が同一であるレコードがあったら,重複を除去して表示する.
FROM 節 検索の対象となるテーブルを指定する. 長い名前のテーブルに別名(エイリアス名)をつけることもできる. テーブル名 AS エイリアス名 エイリアス名は,SELECT節,JOIN節,WHERE節の中で用いることができる. 射影操作は,SELECT節とFROM節だけで記述できる.
JOIN節(1) FROM節に書かれたテーブルを左側のテーブルとして,それに右から結合されるテーブルを指定する. JOINだけなら,内部結合(INNER JOIN と書いてもよい). LEFT [OUTER] JOIN,RIGHT [OUTER] JOIN などもある. カラム1 カラム2 カラム3 相手がいない! カラム3 カラム4 カラム5 結合可能なレコード 相手がいない!
JOIN節(2) 結合条件の書き方 ON 結合条件式 結合条件式 は 左テーブル名.カラム名=右テーブル名.カラム名 または,それらを AND でつないだもの USING (カラム名リスト ) 左右のテーブルが同じ名前のカラムを持っていて,それを(全部)使って内部結合する場合は,結合条件を省略してもよい.
WHERE節(1) 選択操作でレコードを絞り込むための条件を記述する. 最も基本的な形は カラム名 比較演算子 値 最も基本的な形は カラム名 比較演算子 値 例: name = '安部晋三' 比較演算子 =,>,<,>=,<=,<> JOIN節を使わずに結合操作を記述するのに使うこともある. テーブル名.カラム名 = テーブル名.カラム名 複数の条件を,AND,OR,NOTなどを用いて,複合的な論理式とすることもできる. AND,ORの有効範囲がわかりにくいときには,括弧 ( ) を用いて区分けする.
WHERE節(2) より高度な検索条件を記述するための述語 LIKE 例: address LIKE '東京都%' 住所が「東京都」で始まっていれば,後ろは何でもよい. BETWEEN 例: id BETWEEN 5 AND 8 id が 5 から 8 までのすべてのレコードに合致 IS NULL 例: phone IS NULL 電話番号に NULL が入っているレコードに合致 IS NOT NULL 上と逆の意味
節の順序 SELECT ~ FROM ~ [JOIN ~] [WHERE ~] の各節は,省略できる節を省略する以外に,順序を入れ替えて使うことはできない. FROMを先に,SELECTを後に書くことは許されない.
サンプルのデータベース address_book name postal_code address phone 安部晋三 100-8968 東京都千代田区… 03-xxxx-... 麻生太郎 107-... 東京都港区... 03-yyyy-... 麻生渡 812-... 福岡市中央区... 092-... : new_year_card name year sent 安部晋三 2005 × 2006 麻生太郎 ○ : テーブル名・カラム名をすべて小文字 英数字に変更した.
射影操作の例 SELECT name, phone FROM address_book name phone 安部晋三 03-xxxx-... 麻生太郎 03-yyyy-... 麻生渡 092-... : 単一のテーブルから必要なカラムだけを切り出す場合には,JOIN節とWHERE節は不要.
選択操作の例 SELECT * FROM address_book WHERE name = '麻生渡' name postal_code phone 麻生渡 812-... 福岡市中央区... 092-...
結合操作の例 SELECT * FROM address_book JOIN ON address_book.name = new_year_card.name (本当は名前の途中で改行しないのが正しいが,スペースの都合でしかたなく…) address_book.name postal_code address phone new_year_card.name year sent 安部晋三 100-8968 東京都千代田区… 03-xxxx-... 2005 × 2006 麻生太郎 107-... 東京都港区... 03-yyyy-... ○ :
射影・選択・結合の組み合わせ SELECT address_book.name, address FROM address_book JOIN ON address_book.name = new_year_card.name WHERE sent = '×' SELECT 節で DISTINCT キーワードを使って重複を取り除くと… address_book.name address 安部晋三 東京都千代田区… address_book.name address 安部晋三 東京都千代田区…
演習問題 各人適当なデータベースを考えよ。 データ 操作