0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SQLのHAVING句で全称量化(Vol.2)

Last updated at Posted at 2022-01-02

はじめに

前回の記事をご覧ください。

今回の例題にて用いるデータ

実行結果はこちらで確認できます。

用いるデータ

前回の記事をご覧ください。

今回の例題

membersテーブルには何かしらの行動が開始できるかどうかのステータスがデータ化されています。

この時「クラスの全メンバーが行動可能な状態(ready)であることがわかるクエリ」を書いてください。

本日はCASE3を見ていきます。

CASE3

クエリ

  • 以下のクエリは
    • ある要素 (今回ならグループ化された各行(集合))の最大値と最小値が同じであることがTRUEである
      • ということは、その集合は1つの値(status)今回ならreadyのみしかない
    • ことを利用しています
    • 極値関数は、引数の列のインデックスを利用できるのでパフォーマンスもいいです
SELECT class
FROM members
GROUP BY class
HAVING MAX(status) = 'ready' AND MIN(status) = 'ready'

結果

class
C
D
CASE4

別の視点ですが、集合に対する条件をSELECT句に移して、欲しい条件の集合かそうじゃないかのラベリングをつけるものいいでしょう

  • OK,全員がready
  • NO

クエリ

-- (MySQL v5.6)
SELECT
	class,
	CASE
		WHEN MAX(status) = 'ready' AND MIN(status) = 'ready'
		THEN 'TRUE' ELSE 'FALSE' END AS IS_READY
FROM members
GROUP BY class

結果

class IS_READY
A FALSE
B FALSE
C TRUE
D TRUE
E FALSE

ただし、このクエリはMySQL(v5.6)までしか使えないでしょう(デフォルトの設定しかしていなければ)。

なぜならば、MySQL(v5.7)からはデフォでONLY_FULL_GROUP_BYオプションが有効になっているからです。

有効の場合、GROUP BYするカラムだけしか参照できなくなります(無効だと、GROUP BYしたカラムじゃなくても参照できます)。

本日は以上です。

参照

123p

アウトプット100本ノック実施中

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?