skillup

技術ブログ

Database

サブクエリの使い方

投稿日:

以前も少し学習しましたが、今回からはサブクエリの扱い方です。特に異なった行の比較(年度計算など)に関して行われる自己結合をつかったものが非常に強力です。

例によってここを学習しています。

下記のようなテーブル(sales)があるとします。

year | sale
——+——
1990 | 50
1991 | 51
1992 | 52
1993 | 52
1994 | 50
1995 | 50
1996 | 49
1997 | 55

自己結合覚えると楽ですね

例えば下記のSQLでまず8*8を作ります。

このうち、当然前年のものだけを見たいので、下記のような条件を作ります。(最初の年度は出ません)

こうしますと下記のような表がとれます。

year | sale | prev_year | prev_year | var
——+——+———–+———–+—–
1991 | 51 | 1990 | 50 | ↑
1992 | 52 | 1991 | 51 | ↑
1993 | 52 | 1992 | 52 | =
1994 | 50 | 1993 | 52 | ↓
1995 | 50 | 1994 | 50 | =
1996 | 49 | 1995 | 50 | ↓
1997 | 55 | 1996 | 49 | ↑

自己結合非常にわかりやすいですね・・・。最初見たときは何に使うんだろう・・と思っていましたが、集合の考え方をイメージするのに非常に

またサブクエリで書く場合は下記のようになりますが、自己結合をイメージに持っておくと非常に考えやすいです。

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

CASE式のすすめ その2

本日も「達人に学ぶSQL徹底指南書」を地道に進めていきます。 Contents1 CASE式の利用2 UPDATE文のCASE3 テーブル同士のマッチング CASE式の利用 私自身はCHECK制約を使 …

no image

サブクエリ 分析関数の代替案として

今回は分析関数系のネタです。 以前にも分析関数を少し学習しましたがMySQLにはないので、サブクエリを使い書くことになります。 下記のような入出金講座があるとします。 Accounts prc_dat …

no image

データベース設計のアンチパターン 重すぎるOLTP+Date型不統一+データ量想定が甘い

Contents1 重すぎるOLTP1.1 デメリット1.2 対策2 DATE型の型の不統一2.1 デメリット2.2 対策3 データ量の想定が甘い3.1 デメリット3.2 対策 重すぎるOLTP ※O …

no image

cakePHPでの直SQL

今回はCakePHPにて直のSQLを書く方法を。 cakePHPにて大概の処理はもともと備わっているコマンドでなんとかなりますが、まれに直SQLを書いたほうがらくなこともあります。 書き方その1 [c …

no image

データ構造の基礎知識 後編 木構造

データベースの学習をしていたときの復習です。 データ構造の基礎知識 前編 メモリとポインタ、配列と連結リスト データ構造の基礎知識 中編 ハッシュ 今回はもう少し複雑な「木構造」について考えてみます。 …