Upgrade to Pro — share decks privately, control downloads, hide ads and more …

many-many-select-PostgreSQL-conference-2021-japan

nuko_yokohama
November 12, 2021

 many-many-select-PostgreSQL-conference-2021-japan

Lightning talk material presented at "PostgreSQL Conference 2021 Japan".

nuko_yokohama

November 12, 2021
Tweet

More Decks by nuko_yokohama

Other Decks in Technology

Transcript

  1. メニー・メニー・セレクト
    PostgresSQL Conference 2021 (2021-11-12) Lightning Talk

    View Slide

  2. 自己紹介
    ● ぬこ@横浜 (@nuko_yokohama)
    ● にゃーん
    ● 趣味でポスグレをやってる者だ
    ● SELECT なんもわからん

    View Slide

  3. この発表から得られるもの
    ● このレーダーチャートから察してください。
    即応性
    汎用性
    持続性 ぬこ性
    実用性
    0
    5
    安定の
    ぬこクオリティ

    View Slide

  4. 今日のお題
    SELECT だらけの SELECT

    View Slide

  5. こんな SELECT 文をみかけた
    ● ある日、 PostgreSQL 14 上で動作する
    こんな SELECT 文をみかけた
    select=# select "select"."select"::"select" select,
    "select.select"."select"::"select" select
    FROM "select"."select" "select" JOIN "
    select.select
    " "select.select"
    ON ("select"."select"::"select" = "select.select".select::"select")
    ;
    select | select
    --------+--------
    select | select
    (1 row)
    select=#

    View Slide

  6. このクエリを作ったのは誰だぁ!
    わたしです

    View Slide

  7. どんだけ select あるねん
    ● こんな短い SELECT 文の中に 25 個の” select” が含まれている。
    ● おまけ:データベース名も select です。
    select=# select "select"."select"."select"::"select" select,
    "select.select"."select"::"select" select
    FROM "select"."select" "select" JOIN "
    select.select
    " "select.select"
    ON ("select"."select"::"select" = "select.select".select::"select")
    ;
    select | select
    --------+--------
    select | select
    (1 row)
    select=#

    View Slide

  8. こんな環境で実行した
    ● “select” ENUM data type
    select=# \dT+ select
    List of data types
    Schema | Name | Internal name | Size | Elements | Owner | Access privileges | Description
    --------+----------+---------------+------+----------+----------+-------------------+-------------
    public | "select" | select | 4 | select +| postgres | |
    | | | | "select"+| | |
    | | | | 'select' | | |
    (1 row)

    View Slide

  9. こんな環境で実行した
    ● “select” table on “select” schema
    ● “select” column in “select” table
    select=# \dn
    List of schemas
    Name | Owner
    --------+----------
    public | postgres
    select | postgres
    (2 rows)
    select=# \d "select"."select"
    Table "select.select"
    Column | Type | Collation | Nullable | Default
    --------+----------+-----------+----------+---------
    select | "select" | | |
    select=#

    View Slide

  10. こんな環境で実行した
    ● “
    select.select
    ” table on public schema
    ● “select” column in “select” table
    select=# \d public."
    select.select
    "
    Table "public.
    select.select
    "
    Column | Type | Collation | Nullable | Default
    --------+----------+-----------+----------+---------
    select | "select" | | |
    select=#
    自力では入力できないけど、
    psql の TAB 補完はサジェストしてくれる

    View Slide

  11. どういうことかというと
    ● SELECT statement command tag
    select=# select "select"."select"."select"::"select" select,
    "select.select"."select"::"select" select
    FROM "select"."select" "select" JOIN "
    select.select
    " "select.select"
    ON ("select"."select"::"select" = "select.select".select::"select")
    ;
    select | select
    --------+--------
    select | select
    (1 row)
    select=#

    View Slide

  12. どういうことかというと
    ● “select” スキーマの” select” 表をエイリアス” select” にする。
    ● ”select” 列を” select” 型でキャスト
    ● ラベル select を付与( PostgreSQL 14 ~ )
    select=# select "select"."select"."select"::"select" select,
    "select.select"."select"::"select" select
    FROM "select"."select" "select" JOIN "
    select.select
    " "select.select"
    ON ("select"."select"::"select" = "select.select".select::"select")
    ;
    select | select
    --------+--------
    select | select
    (1 row)
    select=#
    エイリアス “ select” を定義

    View Slide

  13. どういうことかというと
    ● public スキーマの” < 改行 >select.select< 改行 >” 表の
    エイリアス” select.select”.”select” 列を” select” 型でキャスト
    ● ラベル select を付与( PostgreSQL 14 ~ )

    select=# select "select"."select"."select"::"select" select,
    "select.select"."select"::"select" select
    FROM "select"."select" "select" JOIN "
    select.select
    " "select.select"
    ON ("select"."select"::"select" = "select.select".select::"select")
    ;
    select | select
    --------+--------
    select | select
    (1 row)
    select=#

    View Slide

  14. どういうことかというと
    ● ”.select” エイリアスの” select” 列を” select” 型でキャスト
    ● ”select.select” エイリアスの” select” 列を” select” 型でキャスト
    ● それを = 比較
    select=# select "select"."select"."select"::"select" select,
    "select.select"."select"::"select" select
    FROM "select"."select" "select" JOIN "
    select.select
    " "select.select"
    ON ("select"."select"::"select" = "select.select".select::"select")
    ;
    select | select
    --------+--------
    select | select
    (1 row)
    select=#

    View Slide

  15. まとめ
    ● わかりにくいクエリのコツ
    – ユーザ定義型に” select” とか使ってみよう
    – オブジェクト名(スキーマ名、テーブル名、列名)に” select” とか使ってみよう
    – オブジェクト名に改行を含めると混乱しやすくて楽しいぞ
    – PostgreSQL 14 から列ラベルに (AS なし ) で select が使えるようになったの
    で使ってみよう
    なるほど?

    View Slide

  16. おわり

    View Slide