この章では、導出表に関して確認していきましょう。導出表は、事実バーチャルな表で、実際にはデータベースには存在しません。導出表は、 エイリアスを使用することによって、一時的に保存されます。

db_blog_short

図3.1 : データベーススキーマ

1. 導出表

それぞれの投稿の「いいね」の数とコメントの数が欲しいと仮定しましょう。

SELECT P.ID, P.post_title, derivLikes.nbLikes, derivComm.nbComments
FROM Posts AS P
LEFT JOIN
   ( SELECT post_ID, COUNT(*) AS nbLikes
     FROM Likes
     GROUP BY post_ID ) AS derivLikes ON P.ID = derivLikes.post_ID
LEFT JOIN 
   ( SELECT post_ID, COUNT(*) AS nbComments
     FROM Comments
     GROUP BY post_ID ) AS derivComm ON P.ID = derivComm.post_ID

下記の表が取得できます。

{{h}}
{{r}}

導出表の構造に関してもう少しお話ししましょう。上記の例で、2つの導出表が構成されました。最初のは、それぞれの投稿の「いいね」の数、2つ目のは、それぞれの投稿のコメントの数を含みます。両方に、エイリアスを使用してラベルが割り当てられます。すなわち、derivLikesderivCommです。最後に、全ての投稿において、集約データに外部結合がなされます。

2. データのサニタイズ

外部結合で、一致が起きない場合に、0を表示させましょう。そのために、IFNULL節を使用します。

SELECT P.ID, P.post_title, IFNULL(derivLikes.nbLikes,0) AS Likes, IFNULL(derivComm.nbComments,0) AS Comments
FROM Posts AS P
LEFT JOIN
   ( SELECT post_ID, COUNT(*) AS nbLikes
     FROM Likes
     GROUP BY post_ID ) AS derivLikes ON P.ID = derivLikes.post_ID
LEFT JOIN 
   ( SELECT post_ID, COUNT(*) AS nbComments
     FROM Comments
     GROUP BY post_ID ) AS derivComm ON P.ID = derivComm.post_ID

下記の表が取得できます。

{{h}}
{{r}}

まとめ

導出表は、SQLクエリの結果でエイリアスの使用によって一時的に保存されます。導出表は、サブクエリのように、中間結果がメインタスクを達成するため必要な時に使用されます。上記で示されたIFNULL機能は、MySQLとMariaDBのみに使用される方法です。他のRDBMS‘s は、少し違った方法となります。