OSS-DB Silver 暗記 C-1-3
Contents
開発/SQL(32%):::SQL:データ定義【重要度:13】dokoQL可
- dokoQL で実習が可能です(スキーマ除く)
テーブル
テーブルの基本
作成と削除
PostgreSQL 11.5文書:5.1. テーブルの基本
- CREATE TABLE table_name ( syntax );
- syntax:column_name data_type [, …]
- DROP TABLE table_name;
=> CREATE TABLE table1 ( c1 int, c2 timestamp ); => DROP TABLE table1;
デフォルト値
- CREATE TABLE table_name ( syntax );
- syntax:column_name data_type DEFAULT { default_value | default_expr }
=> CREATE TABLE table2 ( c1 int DEFAULT 10, c2 timestamp DEFAULT now() ); => INSERT INTO table2(c1) VALUES (1); ----+---------------------------- c1 | c2 ----+---------------------------- 1 | 2020-10-26 12:38:54.395432 ----+----------------------------
制約
暗記
- 制約の種類
- 主キー制約:PRIMARY KEY
- 一意性制約:UNIQUE
- 非NULL制約:NOT NULL
- 外部キー制約:REFERENCES / FOREIGN KEY
- 検査制約:CHECK
- ドメイン制約:CHECK
主キー
- CREATE TABLE table_name ( syntax );
- syntax:column_name data_type PRIMARY KEY, […]
- syntax:column_name data_type, […,] PRIMARY KEY ( column_name )
- ALTER TABLE table_name syntax;
- syntax:ADD PRIMARY KEY ( column_name )
- syntax:ADD CONSTRAINT primary_key_name PRIMARY KEY ( column_name )
- syntax:DROP CONSTRAINT primary_key_name;
=> create table table3 ( id int primary key, name text); => INSERT INTO table3 VALUES (1, 'aaa'); ----+------ id | name ----+------ 1 | aaa ----+------ => create table table4 ( id int, name text PRIMARY KEY (id) );
一意性制約
- 格納されるデータに重複がない制約
- 例外:NULL は重複可
PostgreSQL 11.5文書:5.3.3. 一意性制約
- CREATE TABLE table_name ( syntax );
- syntax:column_name data_type UNIQUE, […]
- syntax:column_name data_type , […,] UNIQUE KEY ( column_name )
- ALTER TABLE table_name syntax ;
- syntax:ADD UNIQUE ( column_name )
- syntax:ADD CONSTRAINT unique_key_name UNIQUE ( column_name )
- syntax:DROP CONSTRAINT unique_key_name
=> CREATE TABLE products ( product_no integer UNIQUE, name text, price numeric ); => => CREATE TABLE products1 ( product_no integer, name text, price numeric, UNIQUE (product_no) );
非NULL制約
- 列がNULL値を取らない制約
PostgreSQL 11.5文書:5.3.2. 非NULL制約
- CREATE TABLE table_name ( syntax );
- syntax:column_name data_type NOT NULL
- ALTER TABLE table_name ALTER COLUMN column_name syntax;
- syntax:SET NOT NULL
- syntax:DROP NOT NULL
=> CREATE TABLE products ( product_no integer NOT NULL, name text NOT NULL, price numeric );
外部キー制約
- 外部キー制約は参照整合性制約とも呼ばれる
- 参照整合性制約とは
- 例えば、製品テーブルと注文テーブルがあった場合、
- 「製品テーブルにない製品の注文は注文テーブルに格納できない」といった制約
- CREATE TABLE table_name ( column_name data_type syntax );
- syntax:REFERENCES table_name1 ( column_name )
- syntax:REFERENCES table_name1
- syntax:, FOREIGN KEY ( column_name ) REFERENCES table_name1 ( column_name )
- ALTER TABLE table_name syntax;
- syntax:ADD CONSTRAINT foreign_key_name FOREIGN KEY ( column_name ) REFERENCES table_name1 ( column_name );
=> CREATE TABLE products ( -- 製品テーブル product_no int PRIMARY KEY, -- 外部キー制約に必須! name text, price numeric ); => INSERT INTO products VALUES (1,'aaa', 1000); => INSERT INTO products VALUES (2,'bbb', 2000); => INSERT INTO products VALUES (3,'ccc', 3000); ------------+------+------- product_no | name | price ------------+------+------- 1 | aaa | 1000 ------------+------+------- 2 | bbb | 2000 ------------+------+------- 3 | ccc | 3000 ------------+------+-------
=> CREATE TABLE orders ( -- 注文テーブル order_id int PRIMARY KEY, product_no int REFERENCES products (product_no), quantity int ); => INSERT INTO orders VALUES (1, 3, 10); ----------+------------+---------- order_id | product_no | quantity ----------+------------+---------- 1 | 3 | 10 ----------+------------+---------- => INSERT INTO oeders VALUES (2, 9, 10); => SQL実行エラー
検査制約
- 特定の列の値が論理式を満たす(真値)ように指定する制約
- CREATE TABLE table_name ( syntax );
- syntax:column_name data_type CHECK ( expression )
- ALTER TABLE table_name syntax;
- syntax:ADD CONSTRAINT constraint_name CHECK ( expression )
- syntax:DROP CONSTRAINT constraint_name
=> CREATE TABLE products ( product_no int, name text, price numeric CHECK ( price>0 ) );
=> CREATE TABLE products1 ( product_no int, name text, price numeric CONSTRAINT plus_price CHECK ( price>0 ) );
=> ALTER TABLE products1 DROP CONSTRAINT plus_price;
ドメイン制約
PostgreSQL 11.5文書:SQLコマンド:CREATE DOMAIN
- CREATE DOMAIN domain_name [ AS ] data_type [ DEFAULT expression] [ constraint […] ];
- constraint:[ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) }
- DROP DOMAIN domain_name;
=> CREATE DOMAIN postal_code AS TEXT CHECK ( value ~ '^\d{3}-\d{4}$' ); => CREATE TABLE pc_table ( id SERIAL PRIMARY KEY, postal postal_code NOT NULL );
=> INSERT INTO pc_table ( postal ) VALUES ( '030-0801' ); => SELECT * FROM pc_table; ------------------- pc_table ------+------------ id | postal ------+------------ 1 | 170-0014 2 | 160-0021 3 | 530-0001 4 | 812-0011 5 | 030-0801 ------+------------
テーブルの変更
暗記
- ALTER TABLE
- カラム :追加・削除・リネーム
- テーブル:リネーム
- オーナー:変更
PostgreSQL 11.5文書:5.5. テーブルの変更
- ALTER TABLE table_name syntax;
- syntax:ADD COLUMN column_name data_type
- syntax:DROP COLUMN column_name
- syntax:RENAME COLUMN column_name TO new_column_name
- syntax:RENAME TO new_table_name
- syntax:OWNER TO new_owner
=> ALTER TABLE products RENAME TO items;
テーブルのパーティショニング
- テーブルを分割(パーティショニング)する
- 論理的に一つの大きなテーブルを、物理的に小さな部品に分割する
- 利点が多々ある
PostgreSQL 11.5文書:5.10. テーブルのパーティショニング
- CREATE TABLE table_name ( column_name data_type [, …] ) syntax;
- syntax:PATITION BY RANGE ( column_name )
- CREATE TABLE partition_table_name ( column_name data_type [,…] )syntax;
- syntax:PATITION OF table_name FOR VALUES condition;
- ALTER TABLE table_name syntax;
- syntax:ATTATCH PARTITION partition_table_name FOR VALUES condirion
- syntax:DETACH PARTITION partition_table_name
- DROP TABLE partition_table_name;
例:注文テーブル
=> CREATE TABLE orders ( logdate date not null, product_no int not null, quantity int ) PARTITION BY RANGE ( logdate );
例:分割した各注文テーブル
=> CREATE TABLE orders_y2020m10 PARTITION OF orders FOR VALUES FROM ('2020-10-01') TO ('2020-11-01'); => CREATE TABLE orders_y2020m11 PARTITION OF orders FOR VALUES FROM ('2020-11-01') TO ('2020-12-01'); => CREATE TABLE orders_y2020m12 PARTITION OF orders FOR VALUES FROM ('2020-12-01') TO ('2021-01-01');
=> INSERT INTO orders VALUES ('2020-11-10', 3, 20); => SELECT * FROM orders; ------------+------------+---------- logdate | product_no | quantity ------------+------------+---------- 2020-11-10 | 3 | 20 ------------+------------+---------- => SELECT * FROM order_y2020m11; ------------+------------+---------- logdate | product_no | quantity ------------+------------+---------- 2020-11-10 | 3 | 20 ------------+------------+----------
スキーマ
PostgreSQL 11.5文書:5.8. スキーマ dokoQL不可
- スキーマ(Schema)とは、DB内で定義される名前空間のこと
- 名前空間:名前の集合を分割することで衝突の可能性を低減し、参照を容易にする概念
スキーマの作成
PostgreSQL 11.5文書:5.8.1 スキーマの作成
- CREATE SCHEMA schema_name [ AUTHORIZATION database_user_name ];
- CREATE SCHEMA AUTHORIZATION database_user_name;
- DROP SCHEMA schema_name [ CASCADE ];
例:スキーマ作成と表示
postgres=# CREATE SCHEMA test; CREATE SCHEMA postgres=# postgres=# \dn --------------------- List of schemas ----------+---------- Name | Owner ----------+---------- postgres | postgres public | postgres test | postgres ----------+---------- postgres=# ▯
例:スキーマ使用と削除
postgres=# CREATE TABLE test.table1 (c1 int, c2 text); CREATE TABLE postgres=# postgres=# DROP SCHEMA test CASCADE; NOTICE: drop cascades to table test:table1 DROP SCHEMA postgres=# ▯
publicスキーマ
PostgreSQL 11.5文書:5.8.2. publicスキーマ
スキーマ検索パス
PostgreSQL 11.5文書:5.8.3. スキーマ検索パス
- SET search_path TO myschema [ , “$user”, public ];
例:スキーマ検索パス表示
postgres=# show search_path; ----------------- search_path ----------------- “$user”, public ----------------- postgres=# ▯
例:スキーマ検索パス設定
postgres=# set search_path to test, “$user”, public; SET postgres=# postgres=# show search_path; ----------------------- search_path ----------------------- test, “$user”, public ----------------------- postgres=# ▯
参考
- IT資格といえばLPI-Japan | LinuC/OSS-DB/HTML5/ACCEL/OPCEL
- PostgreSQL 11.5文書
- OSS教科書 OSS-DB Silver Ver2.0対応
- 徹底攻略OSS-DB Silver問題集[Ver.2.0]対応
- dokoQL 学習用オンラインSQL実行環境
- スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)