基本指針
「複雑なSQL」から逃げないこと
複雑なSQLは避けたがる現場もあるかもしれません。しかし、複雑なSQLを使わないとループからのDB呼び出しの多重ループが発生するため、アプリの性能が遅くなってしまいます。複雑なSQLから逃げないようにしましょう。
読みやすくするには?
ただ、読みづらくなるのは問題です。その場合はサブクエリをWITH句を使うようにしましょう。WITH句を使うことで「クエリ内に新たなテーブル」を作ることができます。(サブクエリに名前をつけることができる機能です。)
また、一度定義すれば何度も使い回すことができます。
MySQLでは?
Web業界などではMySQLを使うことが多いでしょう。ただ、MySQLは8.0以降しかWITH句に対応していないので厳しいです。(RDSのAuroraが5.7にしか対応してないので現状は8.0はあまり使われていない。)
どうしても、5.7以下の場合でもコードの可読性を上げたい場合はVIEWなどを使うのも選択肢の一つです。
WITH句の基本構文
1 2 3 |
WITH ’新たに作成したテーブル名’as (作成したいテーブルを作るクエリ ); |
例
1 2 3 4 5 |
-- WITH句を使ったテーブル定義 WITH aaa as (select * from user where name = "太郎") -- WITH句を使う。 select * from aaa: |
RECURSIVEを用いたWITH句
この形をとります。連番のような結果出力にループ処理が必要なものを作る際に便利です。
1 2 3 4 5 6 7 |
WITH RECURSIVE hoge AS ( FROM句にhogeを含まないSELECT文(非再帰項) UNION ALLまたはUNION FROM句にhogeを含むSELECT文(再帰項) ) WITH句を使用したSELECT文 |
FROM句にhogeを含まないSELECT文
非再帰項と呼びます。
FROM句にhogeを含むSELECT文
再帰項、作業用のテーブルともいえます。
処理の流れ
1 2 3 |
1.「非再帰項」を計算し、結果を作業テーブルと呼ばれる一時的な表に格納する 2.1.の「再帰項」の計算結果を非再帰項のFROM句に代入してSQLの実行結果が空になるまで再度計算します。 3.2.で計算した結果を全てUNIONまたはUNION ALLで足し合わせます。 |
実際にやっていることとしては「再帰」というよりは「反復処理」と言えるかもしれません。
この記事へのコメントはありません。