Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

今日のお題 SELECT だらけの SELECT

Slide 5

Slide 5 text

こんな 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=#

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

どんだけ 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=#

Slide 8

Slide 8 text

こんな環境で実行した ● “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)

Slide 9

Slide 9 text

こんな環境で実行した ● “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=#

Slide 10

Slide 10 text

こんな環境で実行した ● “ 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 補完はサジェストしてくれる

Slide 11

Slide 11 text

どういうことかというと ● 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=#

Slide 12

Slide 12 text

どういうことかというと ● “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” を定義

Slide 13

Slide 13 text

どういうことかというと ● 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=#

Slide 14

Slide 14 text

どういうことかというと ● ”.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=#

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

おわり