Dondariadmin (トーク | 投稿記録) (ページの作成: *SELECTに欠かせないJOINですが、私の場合、普段よく使うのは、INNER JOINとLEFT JOINぐらいです。が、他にもあるので、勉強してみました...) |
Dondariadmin (トーク | 投稿記録) |
||
(同じ利用者による、間の2版が非表示) | |||
1行目: | 1行目: | ||
+ | ==JOIN句== | ||
*SELECTに欠かせないJOINですが、私の場合、普段よく使うのは、INNER JOINとLEFT JOINぐらいです。が、他にもあるので、勉強してみました。 | *SELECTに欠かせないJOINですが、私の場合、普段よく使うのは、INNER JOINとLEFT JOINぐらいです。が、他にもあるので、勉強してみました。 | ||
*DBMSは手元にあったOracle 10g expressです。 | *DBMSは手元にあったOracle 10g expressです。 | ||
6行目: | 7行目: | ||
##table_aとtable_bの同名列を結合条件としたINNER JOINと等価。 | ##table_aとtable_bの同名列を結合条件としたINNER JOINと等価。 | ||
##table_a INNER JOIN table_b USING (列名) | ##table_a INNER JOIN table_b USING (列名) | ||
− | |||
− | |||
#table_a CROSS JOIN table_b | #table_a CROSS JOIN table_b | ||
##FROM table_a, table_b と記述した場合と等価。いわゆる直積、デカルト積。得られる結果レコード数は2テーブルのレコード数の積。 | ##FROM table_a, table_b と記述した場合と等価。いわゆる直積、デカルト積。得られる結果レコード数は2テーブルのレコード数の積。 | ||
− | |||
− | |||
#table_a FULL JOIN table_b < ON 結合条件式 | USING (列名) > | #table_a FULL JOIN table_b < ON 結合条件式 | USING (列名) > | ||
##table_aとtable_bの両テーブルのレコードすべてが含まれる。一致する場合は結合され、一致しない部分はNULLとなる。 | ##table_aとtable_bの両テーブルのレコードすべてが含まれる。一致する場合は結合され、一致しない部分はNULLとなる。 | ||
32行目: | 29行目: | ||
INSERT INTO shouhin_bunrui VALUES (30,'用紙'); | INSERT INTO shouhin_bunrui VALUES (30,'用紙'); | ||
==== 確認 ==== | ==== 確認 ==== | ||
− | + | [[ファイル:iroirojoin1.png]] | |
=== NATURAL JOIN === | === NATURAL JOIN === | ||
− | + | [[ファイル:naturaljoin.png]] | |
− | + | ||
− | + | ||
*共通の列で結合され、結果の先頭列に昇格してますね。 | *共通の列で結合され、結果の先頭列に昇格してますね。 | ||
*SHOUHIN_BUNRUI_CODEがひとつにまとまってしまうのは、INNER JOIN ~ USINGと同じです。 | *SHOUHIN_BUNRUI_CODEがひとつにまとまってしまうのは、INNER JOIN ~ USINGと同じです。 | ||
*下記SQLもまったく同じ結果が得られます。 | *下記SQLもまったく同じ結果が得られます。 | ||
SELECT * FROM shouhin INNER JOIN shouhin_bunrui USING (shouhin_bunrui_code); | SELECT * FROM shouhin INNER JOIN shouhin_bunrui USING (shouhin_bunrui_code); | ||
− | |||
=== CROSS JOIN編 === | === CROSS JOIN編 === | ||
− | + | [[ファイル:crossjoin.png]] | |
− | + | ||
*直積(デカルト積)ですから、そのまんまですね。shouhinテーブルの3レコード×shouhin_bunruiテーブルの2レコード=6レコード。 | *直積(デカルト積)ですから、そのまんまですね。shouhinテーブルの3レコード×shouhin_bunruiテーブルの2レコード=6レコード。 | ||
*片方のテーブルがゼロレコードの場合は当然結果もゼロレコードです。 | *片方のテーブルがゼロレコードの場合は当然結果もゼロレコードです。 | ||
54行目: | 47行目: | ||
=== FULL JOIN編 === | === FULL JOIN編 === | ||
− | + | [[ファイル:fulljoin.png]] | |
− | + | ||
*1,2行目はshouhin_bunrui_codeで結合されるので、NATURAL JOINの結果と同じです。 | *1,2行目はshouhin_bunrui_codeで結合されるので、NATURAL JOINの結果と同じです。 | ||
*3行目は左側のテーブルのみ存在している結果です。LEFT JOINの結果の中で、条件不一致だったレコードと同じです。 | *3行目は左側のテーブルのみ存在している結果です。LEFT JOINの結果の中で、条件不一致だったレコードと同じです。 | ||
63行目: | 55行目: | ||
UNION | UNION | ||
SELECT * FROM shouhin RIGHT JOIN shouhin_bunrui USING (shouhin_bunrui_code) | SELECT * FROM shouhin RIGHT JOIN shouhin_bunrui USING (shouhin_bunrui_code) | ||
− | [[ | + | |
+ | [[Category:SQL]] |
CREATE TABLE shouhin ( shouhin_code INT , shouhin_name VARCHAR(100) , shouhin_bunrui_code INT ); CREATE TABLE shouhin_bunrui ( shouhin_bunrui_code INT , shouhin_bunrui_name VARCHAR(100) ); INSERT INTO shouhin VALUES (1,'ボールペン黒',10); INSERT INTO shouhin VALUES (2,'ボールペン赤',10); INSERT INTO shouhin VALUES (3,'ノート無地',20); INSERT INTO shouhin_bunrui VALUES (10,'ペン'); INSERT INTO shouhin_bunrui VALUES (30,'用紙');
SELECT * FROM shouhin INNER JOIN shouhin_bunrui USING (shouhin_bunrui_code);
SELECT * FROM shouhin, shouhin_bunrui;
SELECT * FROM shouhin LEFT JOIN shouhin_bunrui USING (shouhin_bunrui_code) UNION SELECT * FROM shouhin RIGHT JOIN shouhin_bunrui USING (shouhin_bunrui_code)Tweet