はじめに
HAVING句でデータの歯抜けを探す方法を見ながら、集合思考言語と手続き型言語の違いを考えてみます。(2/2)
Schema (MySQL v8.0)
CREATE TABLE members (
id INT NOT NULL PRIMARY KEY auto_increment,
name TEXT
);
INSERT INTO members VALUES
(1, 'brown'),
(2, 'rally'),
(3, 'boggie'),
(5, 'tashiro'),
(6, 'yamada'),
(8, 'takeda');
Result
id | name |
---|---|
1 | brown |
2 | rally |
3 | boggie |
5 | tashiro |
6 | yamada |
8 | takeda |
歯抜けの最小値
前回は、このデータの歯抜けを探しました。今日は、歯抜けの最小値を求めていきましょう。
最小ときたら MIN
ということで。
query
SELECT MIN(id + 1) AS gap
FROM members
WHERE (id + 1) NOT IN (SELECT id FROM members)
結果は4が返ってきます。
NOT IN
を使ったサブクエリで、あるidの+1
のidがあるかを調べています。
見つからないid は[3, 6, 8]が真になります。
歯抜けがない場合は、9が得られます。(ほんとか?と思う方は是非試してください。)
テーブルはファイルではないので行に順序はありません。それゆえ、こういう行同士の比較を行う際にソートをしません。
連番にNULLが入ってた場合
少しスキーマを変えます。
Schema (MySQL v8.0)
CREATE TABLE members (
id INT,
name TEXT
);
INSERT INTO members VALUES
(1, 'brown'),
(2, 'rally'),
(NULL, 'telly'),
(3, 'boggie'),
(5, 'tashiro'),
(6, 'yamada'),
(8, 'takeda');
id | name |
---|---|
1 | brown |
2 | rally |
telly | |
3 | boggie |
5 | tashiro |
6 | yamada |
8 | takeda |
query
SELECT MIN(id + 1) AS gap
FROM members
WHERE (id + 1) NOT IN (SELECT id FROM members)
results
gap |
---|
これまでの記事を見ていただい方なら、この挙動がしっくりくるかと思います。
本日は、以上です。
参照
108 - 109p
アウトプット100本ノック実施中