TOPサーバ構築・運用> 文字データ型について
徹底比較!! PostgreSQL vs MySQLパート2
徹底比較!! PostgreSQL vs MySQLパート2

第2回:拡張部分によって違いがでてくるSQL文
著者:NTTデータ   藤塚 勤也   2007/4/18
前のページ  1  2  3  次のページ
JOIN

   JOINにはINNER JOINとOUTER JOINがあります。さらに、OUTER JOINにはLEFT OUTER JOINとRIGHT OUTER JOINの2種類があります。例えばtableAとtableBを表1、2とすると、LEFT OUTER JOINとRIGHT OUTER JOINのSQL文および結果は以下のようになります。
tableA
col01 col02
1 A1
2 A2

表1:tableAの中身

tableB
col01 col02
2 B2
3 B3

表2:tableBの中身

LEFT OUTER JOINの例
select a.col01,a.col02,b.col03 from tableA a LEFT OUTER JOIN tableB b on a.col01 =b.col01;

 1     | A1    | null
 2     | A2    | B2

RIGHT OUTER JOINの例
select a.col01,a.col02,b.col03 from tableA a RIGHT OUTER JOIN tableB b on a.col01 = b.col01;

2     | A2    | B2
null  | null  | B3

   このLEFT OUTER JOINとRIGHT OUTER JOINの動作はPostgreSQL、MySQLともに同じです。

   PostgreSQLの場合は、LEFT OUTER JOINとRIGHT OUTER JOINの両方の処理を同時に行うようなFULL OUTER JOINがサポートされています。同様に、tableAとtableBでFULL OUTER JOINを行うと以下のような実行結果になります。これは、MySQLでは実行できません。

FULL OUTER JOINの例
select a.col01,a.col02,b.col03 from tableA a FULL OUTER JOIN tableB b on a.col01 = b.col01;
 1     | A1    | null
 2     | A2    | B2
 null  | null  | B3

   MySQLにてPostgreSQLのFULL OUTER JOINと同じ結果を得るためには、LEFT OUTER JOINとRIGHT OUTER JOINのSELECT文をUNIONにて結合するなどの工夫が必要になります。以下は、UNIONを用いてFULL OUTER JOINと同じ結果をだす例です。

(select a.col01,col02,col03 from tableA a LEFT OUTER JOIN tableB b on a.col01 = b.col01) union distinct (select a.col01,col02,col03 from tableA a RIGHT OUTER JOIN tableB b on a.col01 = b.col01);
 1     | A1    | null
 2     | A2    | B2
 null  | null  | B3

   もちろん、PostgreSQLでもこのUNIONを用いたJOINは動作します。

GROUP BY句

   MySQLのGROUP BY句にはちょっと変った拡張機能があります。それは、GROUP BY句の後ろに並び替えのためのASC句、DESC句を指定できることです。例えば、表3のtableCを使ってカラム「col01」別にカラム「col02」の値を集計するSELCT文は、以下のようになります。

tableC
col01 col02
A 15
B 10
A 5

表3:tableCの中身

select col01,sum(col02) from tableC group by col01
B  |  10                 A  |  20
A  |  20  どちらの結果になるかは不定  B  |  10

   もし、この集計結果をカラム「col01」の降順に並べ変えたい場合は、通常ORDER BY句とDESC句を使用して、以下のようになります。

select col01,sum(col02) from tableC group by col01 order by col01 desc
B  |  10
A  |  20

   もちろん、このSELECT文はPostgreSQL、MySQLともに正常動作します。ところが、MySQLはこのORDER BY句を使用せずとも以下のようにGROUP BY句の後ろにDESC句を付けるだけで、ORDER BY句を使用したときと同じ、降順の並べ替えを行うことができます。

select col01,sum(col02) from tableC group by col01 desc
B  |  10
A  |  20

前のページ  1  2  3  次のページ


NTTデータ  藤塚 勤也
著者プロフィール
株式会社NTTデータ   藤塚 勤也
基盤システム事業本部 オープンソース開発センタ シニアスペシャリスト。
日本タンデムコンピューターズ(現日本HP)を経て、2003年よりNTTデータにてOSS分野に参画。日頃はオリジナルOSSの開発や、OSSを用いたシステム構築への技術支援に従事。「RDBMS解剖学」(翔泳社)を共著。

INDEX
第2回:拡張部分によって違いがでてくるSQL文
  SQL文の違い
JOIN
  INSERT文