オープンソースデータベース標準教科書

postgresql Published at March 1, 2025, 11:20 a.m. by admin@senrigan.org

なんとなくあるんだろうとは思ってたけど、郵便番号のデータ公開されているなんて知らなかった。PostgreSQLの操作にも疎いので読んでみた。

参考: オープンソースデータベース標準教科書

CREATE TABLEしてテーブル用意したあと、

\copy [テーブル名] from utf_ken_all.csv (format csv)

でデータをロードできるとあるけど、テーブル作るときに地方公共団体コードの前にidカラムを追加しちゃったのでうまく行かない。しょうがないのでスクリプト書いてロードする。

import csv
import psycopg

stmt = """
INSERT INTO postoffice_zipcode (lgcode,old_code,new_code,pref_kana,city_kana,
town_kana,pref,city,town,large_area,koaza,choume,small_area,change_flag,reason)
 VALUES (%s, %s, %s,%s, %s, %s,%s, %s, %s,%s, %s, %s,%s, %s, %s);
"""


def connect_db():
    return psycopg.connect("dbname=db user=admin password=secret host=localhost")

def insert_row(cur, row):
    cur.execute(stmt,
        (row[0], row[1], row[2], row[3], row[4], row[5],
         row[6], row[7], row[8], row[9], row[10], row[11],
         row[12], row[13], row[14])
    )

def main():
    conn = connect_db()
    cur = conn.cursor()
    with open("utf_ken_all.csv", "r") as f:
        reader = csv.reader(f)
        for row in reader:
            insert_row(cur, row)
    conn.commit()
    cur.close()

if __name__ == "__main__":
    main()

その他、覚書。

主な操作 (説明不要)

sudo -u postgres -i psql
create user admin;
create database [データベース名] owner admin;
createdb [データベース名]
psql [データベース名] -h localhost -U admin
psql [データベース名] -h localhost -U admin -f [ファイル名]
SELECT * FROM postoffice_zipcode WHERE CHAR_LENGTH(town_kana) >= 300;

WHERE句の条件式

operator description
= equal to
<> not equal to
> greater than
< less than
>= grater than or equal to
<= less than or equal to
BETWEEN range condition
LIKE pattern match
IN multiple values
IS NULL null check
EXISTS subquery condition
ALL comparison with subquery
ANY comparison with subquery
% matches any number of chars
_ matches a single char

integer型

-2147483648+2147483647までの整数

小数点以下は自動で四捨五入

numeric型

任意の精度の数値データ型

小数部分: 131072桁

整数部分: 131073桁

まで指定可能

numeric(precision, scale)

precision: 総桁数

scale: 小数部の桁数

numeric(6,2)の場合、-9999.99から9999.99までの値を格納可能

postgresではdecimalとnumericは同じ型


varchar型

上限ありの可変長

全角・半角は同じ文字数の扱い

text型

上限なしの可変長


日付と時刻

日付と時刻関連の関数

SHOW DATESTYLE;
SELECT '2024-01-01'::date;
SELECT 'Mar,13 2024'::date;
SELECT CURRENT_DATE;
SELECT CURRENT_TIME;
SELECT CURRENT_TIMESTAMP;
SELECT now();

JOIN

説明不要の結合

LEFT(RIGHT) OUTER JOIN

結合の左側 (右側) のテーブルがすべて検索結果に含まれる。

FULL OUTER JOINも同様の考え。

CROSS JOIN

クロス集計。結合するテーブルのすべての組み合わせ。

自己結合

1つのテーブルを2つのテーブルに見立てて結合する。


主キー

UNIQUEかつNOT NULLの制約でテーブル内のレコードを一意に特定する。

ALTER TABLE [テーブル名] ADD PRIMARY KEY(列);

複数列の主キー

ALTER TABLE [テーブル名] ADD PRIMARY KEY(列1, 列2,...);

外部キー

その列の値が他のテーブルの主キーに存在する列のこと。

ALTER TABLE [参照元のテーブル名] ADD FOREIGN KEY (外部キーを設定する列) REFERENCES [参照先のテーブル名](列);

CREATE TABLE [テーブル名] (列名 データ型 PRIMARY KEY, ...);

NULL

空文字''とは異なる、データがない状態

SELECT count(*)ではNULLを含むレコードは検索結果に含まれる


シーケンス

連番を作る。完全な連番は保証しない。

CREATE SEQUENCE [シーケンス名];
SELECT currval('シーケンス名');
SELECT nextval('シーケンス名');
SELECT setval('シーケンス名', n);