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 3 years have passed since last update.

HAVING句でデータの歯抜けを探す方法を見ながら、集合思考言語と手続き型言語の違いを考える(2/2)

Last updated at Posted at 2021-10-03

はじめに

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本ノック実施中

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?