Comments
Description
Transcript
4 SQL について
データベース工学 2011 年度資料 4 2011/4-7 情報学科 最首 この資料の目次 4 SQL について 4.1 SQL の概要 4.2 データ定義言語について 4.3 データ操作言語について 4 SQL について ここでは DBMS を操作する SQL について説明する。 4.1 SQL の概要 SQL(Structured Query Language)は IBM 社が開発した関係データベースの処理言語であ る。JIS 規格になっている。情報処理技術者試験では JIS X 3005 の仕様に従う。 SQL はデータ定義言語(DDL data definition language)とデータ操作言語(DML data manipulation language)に分けられる。 データ定義言語(DDL) DDL にはテーブル、ビューの定義(領域確保)、テーブル、ビューの権限の定義などがある。 以下が操作に使うコマンドである。 Create テーブル、ビューを作る Drop テーブル、ビューを削除する Grant テーブル、ビューで権限を与える Revoke テーブル、ビューで権限を取り消す データ操作言語(DML) データ操作言語はデータベースの利用者がデータの選択、挿入、編集、削除などを行うコ マンドからなります。以下がよく使用されるものです。 Select テーブル、ビューの内容を取り出す Delete テーブル、ビューの内容を削除 Insert テーブル、ビューに新たなタプルを挿入 Update テーブル、ビューの内容を変更 SQL ではコマンドはアルファベットの大文字でも小文字でもよい。(insensitive) 4.2 データ定義言語について CREATE CREATE コマンドは実テーブル、ビューなどを定義するときに使用する。 情報処理技術者試験では以下の3つの CREATE コマンドが出題されている。 CREATE TABLE テーブルを定義するとき使用 CREATE TABLE の構文 1 CREATE TABLE テーブル名 ( 列名 1 データ型 1 [列制約定義 1], 列名 2 データ型 2 [列制約定義 2], ………………………………….. [, テーブル制約定義]) 上記で […定義]としてあるところは、定義することがなければ省略できる。 「テーブル制約定義」を加える時は、前の列定義との間を「,」で区切る。 制約が複数あるときも「, 」で区切る。 例 create table 品番( 品番 ID varchar(18) primary key, 入庫数 numeric (9, 0), 出庫数 numeric (9, 0), 列制約定義 受注数 numeric (9, 0), 更新担当者 char (5), 更新日付 char (8), 更新時間 char (6) ) 同じ定義をテーブル制約を使った場合 create table 品番( 品番 ID varchar(18) , 入庫数 numeric (9, 0), 出庫数 numeric (9, 0), 受注数 numeric (9, 0), 更新担当者 char (5), 更新日付 char (8), 更新時間 char (6), primary key(品番 ID) テーブル制約定義 ) 列制約定義「primary key」は品番 ID が主キーであるという制約 この制約は品番 ID の値がユニークでかつ未入力が許されないと言う定義。 テーブル制約定義「primary key(品番 ID)」も品番 ID が主キーであるという制約 【データ型】 varchar(整数値) 可変長文字列(但し、最大の長さは整数値で規制) char(整数値) 固定長文字列(長さは整数値) numeric(整数値 1, 整数値 2) 数値(整数値 1 は全体の桁数, 整数値 2 は少数桁) JIS 規格 X 3005 ではデータ型は限られる。そこで情報処理技術者試験の学習書にある代表 的なテータ型を下記に記す。最大文字数、数値の範囲などは MySQL の場合である。 (1) 文字列 データ型 最大文字数 char 1-255 char(10)は10文字固定長 varchar (n) 1-255 可変長文字列、最大n文字 2 (2) 数値 データ型 smallint integer Numeric numeric(n,m) 数値の範囲 -32768-32767 -2147483648-2147483647 int でもよい n:全桁数、m:小数点以下桁数 (3) その他 データ型 date yyyy-mm-dd 日付を格納 整合性制約の定義 「CREATE TABLE の構文」で列制約定義、テーブル制約定義を挿入するところがある。 これは[ ..] で囲まれているので、オプションで必要のあるときだけ記述すればよい。 テーブルを定義する時点で、ここに整合性制約(以下、制約と呼ぶ)を設定すれば、データを 入力するときに制約に従って検査が行われ、入力ミスが防げる。 代表的な制約は以下である デフォルト値の設定 非ナル制約 一意性制約 主キー制約 検査制約 参照制約 表明 デフォルト値の設定 DEFAULT 列名を定義するとき、DEFAULT キーワードでデフォルト値を設定する。データ入力時に 値を指定しない場合、デフォルト値が設定される。 例 入庫数 numeric(9, 0) DEFAULT 0 非ナル制約 NOT NULL 指定属性の値が NULL にならないようにする制約 例 入庫数 numeric(9, 0) NOT NULL 一意性制約 UNIQUE 指定した属性に重複する値が入ることを防ぐ制約、電話番号に重複値を入れない場合 例 列制約定義の場合 電話番号 CHAR(15) UNIQUE テーブル制約定義の場合 UNIQUE(電話番号) 主キー制約 PRIMARY KEY ある属性を主キーに指定するとき 3 例 列制約定義の場合 品番 ID varchar(18) PRIMARY KEY テーブル制約定義の場合 PRIMARY KEY(品番 ID) 主キーが複合キー(複数の属性からなる)の場合はテーブル制約定義を使う。(下記) テーブル制約定義の別な例 PRIMARY KEY(属性 1、属性 2) 検査制約 CHECK 指定した属性の値が、指定した条件を満たすものに限定する場合 例 属性単価が 100 円以上のものに限定する場合 列制約定義の場合 単価 INT CHECK(単価 >= 100) テーブル制約定義の場合 CHECK(単価 >= 100) 参照制約 2つのテーブルが参照関係にあるときの整合性制約である。 テーブル A の列 属性 1 がテーブル B を参照していると、A の属性 1 は外部キー に指定することができる。参照制約を正義すると以下の制約が発生する。 (1) デフォルトでは、参照元テーブル(A)にデータを追加するとき、外部キーに指定した 属性 1(列)の値は、参照先テーブル(B)に登録されたデータ、または NULL 値である。 (2) デフォルトでは、参照先テーブル(B)のデータ(値)を削除、更新する場合、参照元テ ーブル(A)にそのデータ(値)を持ったデータが存在すると、操作できない。 (3) オプションを指定すると、更新、削除の連動を指定できる。 参照制約の構文 列制約定義の構文 PREFERENCES 参照先テーブル名(参照する属性名) | [ON DELETE] | [NO ACTION] | [ON UPDATE] | [CASCADE] | [SET NULL] テーブル制約定義の構文 FOREIGN KEY (外部キーとなる属性名) PREFERENCES 参照先テーブル名(参照する属性名) | [ON DELETE] | [NO ACTION] | [ON UPDATE] | [CASCADE] | [SET NULL] 列制約定義の構文では、その列定義の列名(属性名)が外部キーとなる。 ON DELETE、ON UPDATE の削除、更新での制約である。 NO ACTION : この設定が行われているテーブルにデータが存在している場合、 参照先テーブルでは削除や更新はできない。指定がない場合は NO ACTION 指定となる。 CASCADE : この設定が行われているテーブルにデータが存在している場合でも、 参照先テーブルで削除や更新ができる。データは連携し、この テーブルでも削除や更新が行われる。 SET NULL : この設定が行われているテーブルにデータが存在している場合でも、 4 参照先テーブルで削除や更新ができる。このテーブルで外部データを 設定している列には NULL を設定。 例 CREATE TABLE order_details ( order_id integer REFERENCES order (id), product_id integer REFERENCES product (id), quantity integer CHECK (quantity > 0), PRIMARY KEY (order_id, product_id) ); 情報処理技術者試験問題より (正解 ア) (正解 エ) CREATE VIEW CREATE VIEW はビュー(仮想テーブル)を定義するときに使用 CREATE TABLE で作るテーブルは実テーブルといわれる。このときは物理的に テーブルを作るので、そのテーブルのためのディスク容量は必要。 テーブルの特定部分、または複数のテーブルから選択した部分をビューとして作り、 5 利用する。ビューの作成理由は以下である。 ビューならディスクの容量が不要 誤操作を行った場合、データを再度作成できる。実テーブルの場合はご操作はデータの 喪失となる。 セキュリティを考え、参照可能、更新不可能などの設定ができる。 CREATE VIEW の構文 CREATE VIEW ビュー名[列名、列名、…] AS SELECT ~ [WITH CHECK OPTION] 列名はビューで使用する列名である。 「SELECT ~」には実テーブルからの SELECT 文を書く。この構文は後で述べる SELECT 文に準拠する。 [WITH CHECK OPTION]は、必要なとき挿入するビューのデータの条件である。 更新可能なビュー ビューに対して 挿入、更新、削除による操作が可能である。しかし以下のビュー は読み取り専用で更新はできない。 集合関数(AVG、MAX、その他)を含む操作で作成されたビュー場合 GROUP BY、HAVING を使って作成されたビューいる場合 複数のテーブルの結合、合併などで作成されたビューの場合 同一表に対する副問い合わせで作成されたビューの場合 DISTINCT 使って作成されたビューいる場合 ビューと権限 ビューの権限は、(1)ビューを作成するときの権限、(2)ビューを使用するときの権限 に分けられる。 (1) ビューを作成するときの権限 ビューを作成する利用者を A とする。ビューを作成する時の元になるテーブルを T1,T2 とする。A は T1,T2 に対する SELECT 権限を持つ必要がある。 GRANT OPTION のない SELECT 権限がある場合 A はビューを作成することは可能であるが、ビューの SELECT 権限を他者に 与えることはできない GRANT OPTION のある SELECT 権限がある場合 A はビューを作成することは可能。ビューの SELECT 権限を他者に与えること もできる。 SELECT 権限での GRANT OPTION とは、下記の GRANT 構文の最後のオプションで ある。 GRANT の構文 GRANT 権限 1、… ON テーブル名(またはビュー名) TO ユーザ ID1、… [WITH GRANT OPTION] (2) ビューを使用するときの権限 ビューの所有者は、ビューの元表の権限に従う。 ビューの所有者以外の者は、ビューに対する権限有無で決定 権限とは SELECT 権限、INSERT 権限、UPDATE 権限、DELETE 権限がある。 6 INSERT 権限、UPDATE 権限、DELETE 権限は更新可能なビューであることが前提 情報処理技術者試験問題には ビューの問題が出ているのでそれを参考に説明する。 例(情報処理技術者試験問題より) (正解 問題1 問題2 ウ) ア、イ、エ は何故更新可能ではないか。 ア、イ、ウ、エは何をする SQL 文か説明しなさい。 (正解 問題1 問題2 ア) イ、ウ、エ は何故更新可能ではないか。 ア、イ、ウ、エは何をする SQL 文か説明しなさい。 7 (正解 イ) 問題1 ア、ウ、エ は何故更新可能ではないか。 問題2 ア、イ、ウ、エは何をする SQL 文か説明しなさい。 8 (正解 イ) 問題 1 ア、ウ、エ は何故間違いか? 問題2 ア、イ、ウ、エは何をする SQL 文か説明しなさい。 (正解 ウ) 9 CREATE ROLE ロールは、データベースに対する権限をまとめたもの CREATE ROLE の構文 CREATE ROLE ロール名 ロールに1つの権限を与える文の例 GRANT 1つの権限 ON テーブル名 1(またはビュー名) TO ロール名 1つの権限: SELECT、INPUT、UPDATE、DELETE という権限の1つ 上例ではテーブル名 1(またはビュー名)に1つの権限を与えるロールをロール名とする。 このロール 1 をユーザ U1,U2 に与える場合は以下となる。 GRANT ロール名 TO U1,U2 DROP CREATE TABLE、CREATE VIEW で作成したテーブル、ビューを、 CREATE ROLE で作ったロールを削除するのは DROP を使用する。 DROP の構文 DROP TABLE テーブル名 DROP VIEW ビュー名 DROP ROLE ロール名 GRANT テーブルやビューの所有者にはそれらを使用するすべての権限が与えられている。 他のユーザには明示的に権限を与えて利用できるようにする。 この権限を与えるのに使用するコマンドが GRANT GRANT の構文 GRANT 権限 1、… ON テーブル名(またはビュー名) TO ユーザ ID1、… [WITH GRANT OPTION] 権限には ALL PRIVILEGES、SELECT、INPUT、UPDATE、DELETE という権限 UPDATE(列名、…) で与える列名を制限できる WITH GRANT OPTION : テーブルを作成したユーザが、与えられた権限を他の ユーザに与えら場合に使用 情報処理技術者試験より 10 (正解 ウ) 問題 ア、イ、エ はどういう権限を与えたり、削除したりしているか。 REVOKE REVOKE の構文 権限を取り消す場合に利用 REVOKE の構文 REVOKE 権限 1、… ON 4.3 テーブル名(or ビュー名) FROM ユーザ ID1、… データ操作言語について 4.3.1 SELECT 文 4.3.1.1 SELECT 文の基本的利用法 データベースからデータを読み出す操作を SELECT 文で行う。 この操作を QUERY(問合せ)という。 リレーション R(A,B,…)をテーブルであらわす。リレーション R では属性 A,B,…で 表現したが、それらはテーブルでは列名となる。 リレーショナルデータモデルと SQL の違いとして以下がある。 SQL では集合関数(aggregate function)として、COUNT、SUM,AVG,MAX,MIN など を使える。 SQL では DISTINCT 指定、GROUP-BY 句、HAVING 句、ORDER-BY 句の指定が可能 SQL で探索条件を指定するとき比較演算子、BETWEEN,LIKE,NULL,EXISTS 述語 などを使える 1つのテーブルに対する SELECT 文の構文 SELECT 列名 1、列名 2、 . . .または * FROM テーブル名 WHERE 条件式 抽出する列名を「列名 1、列名 2、...」としてある。ここには列名の並びの他に以下 のものが指定できる。 * すべての列(属性) ‘文字列定数’ 文字列定数を列の値とするとき 計算式 計算式の結果を列の値とするとき 集合関数 集合関数 SUM( ),AVG( ),MAX( ) などの関数の結果を列の値 とするとき 11 条件式 抽出するタプルの絞り込みに使用 SELECT 文で、 「列名 1、列名 2、...」で列名 x は変数といえる。条件式にこれらの 変数を使った条件を書く。変数としては、この列名になくても、テーブル名のテーブ にあるすべての属性が使える。 ここでは「SELECT 文でデータをデータベースから取り出す」と呼ぶ。 例 1 商品テーブルを以下とすると、「全商品の全属性を取り出す」命令は以下である。 SELECT * FROM 商品 商品 商品番号 M110 M120 M130 M140 M150 商品名 AAAA AABB BBBB BBCC CCCC 原価 売価 定価 4000 4600 5000 2500 2800 3200 3500 3800 4000 1200 1500 1600 700 800 1000 例2 注文テーブルから「顧客 ID を取り出す」命令は以下である。 SELECT 顧客 ID FROM 注文 注文 注文日 2009/1/10 2009/1/10 2009/1/15 2009/1/20 2009/1/20 2009/1/25 顧客 ID C1 C1 C2 C3 C3 C4 商品名 数量 単価 AAAA 5 5,000 BBBB 3 4,000 BBBB 6 4,000 AAAA 3 5,000 CCCC 10 1,000 BBBB 3 4,000 例3 例 3 注文テーブルから「顧客 ID を取り出す、重複は除去する」命令は以下である。 SELECT DISTINCT 顧客 ID FROM 注文 例4 商品テーブルから商品番号、定価、定価の 2 割引きの値を求める SQL 文は以下 SELECT 商品番号、定価、定価*0.8 FROM 商品 商品テーブルから定価が 2000 円以上のタプルの全属性値を求める SQL 文は以下 SELECT * FROM 商品 WHERE 定価>= 2000 WHERE 句の「定価」は商品テーブルの属性の1つなので、変数とみることができる。 例5 例6 商品テーブルから定価が 2000 円以上、4000 円以下のタプルの全属性値を求める SQL 文は以下 SELECT * FROM 商品 WHERE 定価 BETWEEN 2000 AND 4000 例7 商品テーブルから定価が 1500 円以上、4000 円以下で、売価が原価の 1.2 倍以下のタ プルの全属性値を求める SQL 文は以下 12 SELECT * FROM 商品 WHERE 定価 BETWEEN 1500 AND 4000 AND 売価<=原価*1.2 WHERE 句の「売価」、 「原価」は商品テーブルの属性で、変数となる。 例8 注文テーブルから注文した商品の総数を顧客 ID 毎に分ける SQL 文は以下 SELECT 顧客 ID、SUM(数量) FROM 注文 GROUP BY 顧客 ID WHERE 句の「顧客 ID」は注文テーブルの属性で、変数となる。 例 9 注文テーブルか注文総数が 10 以上の顧客について顧客 ID と注文総数を求める SQL 文は以下 SELECT 顧客 ID、SUM(数量) FROM 注文 GROUP BY 顧客 ID HAVING SUM(数量)>=10 例 10 以下のテーブル「成績」で、名前が「isao」である学生をの学籍番号、名前を 求める SQL 文は以下である。 SELECT 学籍番号、名前 FROM 成績 WHERE 名前 LIKE ’%isao’ LIKE を使うと、文字列の一部のみ指定して一致するものを求めることができる。 「%」は文字列の長さが0以上の任意の文字列と一致することを表す。「_」は任意の 1 文字と一致することを表す。 成績 学籍番号 名前 国語点数 数学点数 英語点数 住所コード 05j3001 Inoueisao 30 80 40 3 05j3002 Ootukamegumi 54 25 82 5 05j3003 Suzukitakashi 50 45 65 2 05j3004 Takahashishin 40 77 51 1 05j3005 Tanakayasuko 82 43 10 1 05j3006 Nakamurashun 57 62 49 2 05j3007 hasegawamachiko 31 71 71 1 05j3008 Henmimidori 91 34 66 3 05j3009 Matudaisao 45 67 45 3 05j3010 Matumurajin 28 82 39 2 05j3011 Yamadadaisuke 76 55 61 1 05j3012 yamamotoryoko 55 43 43 1 05j3013 wakabayasitomoko 68 31 51 4 05j3014 Watanabenaoki 83 46 60 1 問題 上記の例 1 から例 10 の SQL 文を実行したとき得られるテーブルを書きなさい。 情報処理技術者試験問題より 13 (正解 ウ) (正解 イ) 14 (正解 ウ) クラブ<>’テニス’ の演算結果は、 「等しくない」場合真であるが、クラブ名が「-」の場 合は「偽」となる。 15 (正解 ウ) 問題 ア、イ、エを得ることができる SQL 文を書け。 (正解 ウ) (正解 ウ) 16 (正解 イ) 問題 ア、ウ、エを実現する SQL 文を書け。 17 (正解 イ) SELECT 部品区分、COUNT(*) AS 部品数、SUM(在庫量) AS 在庫合計 FROM 部品 GROUP BY 部品区分 を実行すると、下記が得られる。 部品区分 部品数 在庫合計 P1 3 240 P2 3 200 P3 4 220 P4 2 180 18 (正解 エ) 上記問題は NOT( 用する。 A AND B) は(NOT A)OR(NOT B)に展開できることを利 4.3.1.2 複数のテーブルを結合する SQL 文の例 複数テーブルに対する SELECT 文の構文 SELECT 列名 1、列名 2、 . . .または * FROM テーブル名 1, テーブル名 2,… WHERE 条件式 抽出する列名を「列名 1、列名 2、 ...」としてある。 2テーブルの場合、 「列名」を「テーブル名 k の列名」として以下で書く。 テーブル k・列名 例 21 商品、注文という 2 テーブルで商品名が同じタプルのすべての属性値を新しい タプルとするデータを求める SELECT 商品.*、注文.* FROM 商品、注文 WHERE 商品.商品名=注文.商品名 19 この例で、商品.*、注文.* は商品テーブル、注文テーブルの全属性を表す。 例 22 商品情報の全てと、それを注文した顧客 ID、注文数量を求める SQL 文 SELECT 商品.*、注文.顧客 ID、注文.数量 FROM 商品、注文 WHERE 商品.商品名=注文.商品名 顧客テーブルを以下とする。 顧客 顧客 ID 顧客名 C1 佐藤 C2 中村 C3 田中 C4 加藤 例 23 注文状況を示す全ての商品名、顧客名、注文数量の組を求める SQL 文 SELECT 商品名、顧客名、注文.数量 as 注文数量 FROM 商品、注文、顧客名 WHERE 商品.商品名=注文.商品名 AND 注文.顧客 ID=顧客.顧客 ID 注文テーブルの数量を、列名を注文数量としてデータを取得。 上記の場合、商品名は「商品.商品名=注文.商品名」で決まるのでテーブル名.商品名 としなくてもよい。顧客名は顧客テーブルにある属性で、他のテーブルにはないので 属性名だけでよい。 例 24 自己結合(self-join)の例: 自己結合の典型的な例は以下である。 社員(社員番号、社員名、給与、上司) テーブル例 社員 社員 ID 従業員名 給与 上司 135 INAGAKI 60 240 240 KIMURA 50 NULL 184 KUSANAGI 60 135 235 KATORI 40 240 上司属性には、社員番号が入る。社員番号は社員テーブルの主キーなので、 上司に社員番号が入るとは、属性上司が外部キーであることを意味する。 この例で、上司より高給を取っている社員番号と、その上司の社員番号を求める SQL 文 SELECT X.社員番号、Y.社員番号 FROM 社員 X、 社員 Y WHERE X.給与>Y.給与 AND X.部長=Y.社員番号 上記で X,Y はタプル変数(tuple variable)と呼ばれ、X,Y は社員テーブルの行(タプル)を値 として取る変数。 問題 例 21~24 での SQL 文を実行したとき得られるテーブルを書きなさい。 情報処理技術者試験問題より 20 (正解 ア) 問題 イ、ウ、エを取り出す SQL 文書け。 問題の考え方 SELECT DISTINCT S1.生年、S2.生年 FROM 社員 AS S1, 社員 AS S2 というタプルの一部は以下である。1943 は2つあるが、省略した。 1943 1943 (1943,1943) 1968 1970 1953 1954 1962 1975 1961 1957 1968 1970 1953 1954 1962 1975 1961 1957 (1968,1953) (1957,1957) 上記のテーブルで、(1943,1943)と書いたのは、(0001,織田信夫,1943,0001, 織田信夫,1943) という直積で得られる1つのタプルの S1 の生年と S2 の生年のみを書いた。 21 直積にはを合計 100 個のタプルがある。(1943,1943),(1943,1943),が要素 S1 生年の値が 「1943」のタプルである。これを S1.生年でグループ化し、S1.生年>=S2.生年 なるタプ ルは 2 個である。これが COUNT(*)の値である。S1.生年の値が「1953」の場合(1953,1943), (1953,1943),(1953,1953)となり、S1.生年>=S2.生年 なるタプルは 3 個である。 DISTINCT が付いているので、 「ア」が正解となる。 (正解 エ) 問題の考え方 SELECT X.会員名 FROM 会員 X,会員 Y は下記の結果となる。 X Y WHERE X.リーダ会員番号=Y.会員番号 会員 リーダ会員 会 員 リーダ会員 番号 会員名 生年月日 番号 番号 会員名 生年月日 番号 001 田中 1960-03 002 002 鈴木 1970 002 002 鈴木 1970 002 002 鈴木 1970 002 003 佐藤 1975 002 002 鈴木 1970 002 004 福田 1960-10 004 004 福田 1960-10 004 005 渡辺 1945 004 004 福田 1960-10 004 内部結合と外部結合 結合は以下に分けられる。 内部結合 INNER JOIN 22 自然結合 NATURAL JOIN 外部結合 OUTER JOIN LEFT OUTER JOIN RIGHT OUTER JOIN 内部結合の表記方法 構文 1 SELECT 列名 1,列名 2,… FROM テーブル 1, テーブル 2, …. WHERE テーブル 1.列名 1=テーブル 2.列名 1 (FROM の後に複数のテーブルを並べ、WHERE 句で選択条件を書く) 構文 2 SELECT 列名 1,列名 2,… FROM テーブル 1 [INNER]JOIN テーブル 2 ON テーブル 1.列名 1=テーブル 2.列名 1 または以下 SELECT 列名,列名,… FROM テーブル 1 [INNER]JOIN テーブル 2 USING (列名,…) (INNER JOIN または JOIN と、ON 句、USING 句で選択条件を書く。 テーブル1とテーブル 2 の列名が同じなら USING を使う) 外部結合の表記方法 左外部結合の構文 SELECT 列名 1,列名 2,… FROM テーブル 1 LEFT [OUTER] JOIN テーブル 2 ON テーブル 1.列名 1=テーブル 2.列名 1 または以下 SELECT 列名,列名,… FROM テーブル 1 LEFT [OUTER] JOIN テーブル 2 USING (列名,…) (INNER JOIN または JOIN と、ON 句、USING 句で選択条件を書く。 テーブル1とテーブル 2 の列名が同じなら USING を使う) 右外部結合の構文 SELECT 列名 1,列名 2,… FROM テーブル 1 RIGHT [OUTER] JOIN テーブル 2 ON テーブル 1.列名 1=テーブル 2.列名 1 全外部結合の構文 SELECT 列名 1,列名 2,… FROM テーブル 1 FULL [OUTER] JOIN テーブル 2 ON テーブル 1.列名 1=テーブル 2.列名 1 「A 外部結合 B」の場合、左外部結合では A の値すべてが結合の対象になる。 右外部結合では B の値すべてが結合の対象になる。 全外部結合では A または B に値があれば、結合の対象になる。 情報処理技術者試験問題より 23 (正解 ア) 問題 上記問題の「LEFT OUTER JOIN」を「RIGHT OUTER JOIN」の場合、どのような結果になるか。 OUTER JOIN」、「FULL 4.3.1.3 入れ子型質問での SQL 文の例 SQL では SELECT 文の WHERE 句の探索条件に、別な SELECT 文が入ることがる。 WHERE 句の探索条件に入る SELECT 文を入れ子型質問(nested query)、あるいは部分 質問という。入れ子は何段になってもよい。 SELECT X1,X2,…FROM テーブル Y WHERE (SELECT 文の入る条件) 上記で 「SELECT X1,X2,…FROM テーブル Y ..」は外側の SELECT 文、 (SELECT 文の入る条件)が入れ子型質問、内側の SELECT 文となる。 入れ子型質問には 2 タイプある。 24 Type1:内側の SELECT 文と外側の SELECT 文で全く関係なく処理できる入れ子型質問 (SELECT 文の入る条件)を最初に実行し、WHERE の条件を決定する。 その条件を使って、外側の SELECT 文を実行する。 例 31 商品名 AAAA の商品を注文している顧客の顧客 ID と顧客名を求める SQL SELECT 顧客 ID,顧客名 FROM 顧客 WHERE 顧客 ID IN (SELECT 顧客 ID FROM 注文 WHERE 商品名=’AAAA’) (SELECT …)の実行結果は以下である。 顧客 ID C1 C3 この結果から上記の SQL 文は以下となる。 SELECT 顧客 ID,顧客名 FROM 顧客 WHERE 顧客 ID IN (C1,C3) この質問は次の結合質問でも書ける。 SELECT 顧客 ID,顧客名 FROM 注文、顧客 WHERE 注文.顧客 ID=顧客.顧客 ID AND 注文.商品名=’AAAA’ Type2:入れ子になっている質問を外側のリレーションから1つづつタプルを取り出しなが ら処理する。 (SELECT 文の入る条件)の中に、外側の SELECT 文の変数値を使っている場合に 起きる。 例 32 例 31 を Type2 で求める SQL 文 SELECT 顧客 ID,顧客名 FROM 顧客 WHERE ‘AAAA’ IN (SELECT 商品名 FROM 注文 WHERE 顧客 ID=顧客.顧客 ID) (SELECT 商品名 FROM 注文 WHERE 顧客 ID=顧客.顧客 ID)は以下でもよい。 (SELECT 商品名 FROM 注文 WHERE 注文.顧客 ID=顧客.顧客 ID) この顧客.顧客 ID が決まると、IN(SELECT …)が決定する。 この文は、SELECT 顧客 ID,顧客名 FROM 顧客 で得られる全タプルについて、 入れ子型質問を検査する。 例 33 平均定価より高い商品の商品名を求める SQL 文 SELECT 商品名 FROM 商品 WHERE 定価>(SELECT AVG(定価) FROM 商品) 問題 例 31~33 での SQL 文を実行したとき得られるテーブルを書きなさい。 情報処理技術者試験問題より 25 (正解 ウ) (正解 ウ) この問題は以下で書ける。 SELECT 製品.製品番号 FROM 製品 26 WHERE NOT EXISTS(SELECT 製品番号 FROM 在庫 WHERE 在庫数>30 AND 製品.製品番号=在庫.製品番号) 最初の SELECT は「主問い合わせ」、2 行目の SELECT を「副問い合わせ」という。 主問い合わせを 1 行処理する毎に副問い合わせ処理を実行する問題である。 (正解 エ) 4.3.1.4 SQL のリレーショナル完備性 リレーショナル DML がリレーショナル代数、あるいはリレーショナル論理の質問記述 能力があるとき、リレーショナル完備という。リレーショナル代数の5つの演算 和、 差、直積、射影、選択 について対応する SELECT 文を示す。 和の SQL 文 R∪S SELECT * FROM R UNION SELECT * FROM S 差の SQL 文 R-S 27 SELECT * FROM R WHERE NOT EXISTS (SELECT * 直積の SQL 文 R×S SELECT R.*、S.* FROM FROM S) R,S 射影の SQL 文 R[A1,A2,…,Ak] SELECT A1,A2,…,Ak FROM R 選択の SQL 文 R[A1θA2] SELECT * FROM R WHERE A1θA2 28 4.3.2 INSERT 文 テーブルに新しいタプルを挿入するときの命令 INSERT 文の構文 INSERT INTO テーブル名[(列名,…)] 挿入内容 挿入する列をきめて挿入するときテーブル名(列名,…) とする。 挿入内容 ①VALUES(データ 1、データ 2、 . . .) 挿入する値(定数)、または NULL をカンマで区切って挿入 ②SELECT 文で挿入 SELECT 文で抽出したタプルを挿入。複数のタプルの挿入が可能 例1 INSERT INTO DEPT(DEPTNO,DNAME,LOC) VALUES(70,'SHOP','OSAKA'); 問題 1 この命令は、何というテーブルの何という列(属性)にどういう値を入れるか。 問題 2 テーブル 履修 0、履修 1 を以下とする。履修 1 の内容を履修 0 にコピーする INSERT 文を書け。 「INSERT INTO ??? SELECT DISTINCT ???」で答えなさい。 履修0 学生名 伊藤俊介 科目名 データベース 履修1 学生名 伊藤俊介 伊藤俊介 佐野秀和 佐野秀和 科目名 データベース 人工知能論 プログラミング1 データベース 4.3.3 UPDATE 文 テーブルのデータを変更するとき使用するコマンド UPDATE 文の構文 UPDATE テーブル名 SET 列名=変更内容、... WHERE 条件式 列名=変更内容 をカンマで区切って複数並べることができる。 変更内容は定数、計算式、NULL が指定できる 条件式は変更データ(タプル)を絞り込むために使う 条件を省略した場合は指定した表の全行が更新対象となる。 問題 下記の UPDATE 文はどのうような更新をするか? UPDATE DEPT SET LOC ='KYOTO' WHERE DEPTNO = 70; 対象とするテーブル名、タプルを絞り込む条件、どの属性(列)をそのように更新するか を答えなさい。 29 4.3.4 DELETE 文 テーブルのデータ(タプル)を削除するとき使用するコマンド DELETE 文の構文 DELETE FROM テーブル名 WHERE 条件式 条件式は削除データ(タプル)を絞り込むために使う 条件を省略した場合は指定した表の全行が削除の対象となる。 問題 下記の DELETE 文はどのうような更新をするか? DELETE FROM DEPT WHERE DEPTNO < 70; 対象とするテーブル名、削除するタプルを絞り込む条件 を答えなさい。 30