SQL, DBMS(MySQL)ナレッジ
なるほど。BOOLEANの1はtrueなのね。
CREATE TABLE `m_user` (
`is_valid` BOOLEAN NOT NULL DEFAULT 1,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
mysql> select * from m_user where is_valid = true;
+----+-----------+------------+---------------+----------+-----------+---------------------+---------------------+----------+
| id | client_id | login_name | email | password | acl_group | created_at | updated_at | is_valid |
+----+-----------+------------+---------------+----------+-----------+---------------------+---------------------+----------+
| 1 | 1011 | jujuwar | jjj@gmail.com | admin | user | 2021-06-04 10:21:51 | 2021-06-04 10:21:51 | 1 |
+----+-----------+------------+---------------+----------+-----------+---------------------+---------------------+----------+
1 row in set (0.00 sec)
mysql> select * from m_user where is_valid = false;
Empty set (0.00 sec)
テーブル1からテーブル2にデータ移した時に参考にしたページ
ex.) m_clinet から m_zen_client を作成したい時とか
INSERT INTO tbl_name (col_name1, col_name2, ...)
SELECT col1, col2, ... FROM other_table
カラムのdefault値の設定
ALTER TABLE テーブル名 ALTER フィールド名 SET DEFAULT デフォルト値;
〈テーブルのプレフィックス規則〉
m_(マスタ):管理側が登録するテーブル。
t_(transaction):ユーザが投入するデータ。Tweetとかはここに入るかな
システムでログなどで大量に登録されるテーブルはh_**かl_**とかでいいかと思います。
r_**の登録、更新頻度が落札の9割程度でi_**の登録、更新頻度がそのr_**の1割~2割ぐらいと分けるときれいにわけられるかと思います。
マスタテーブル:m_~
トランザクションテーブル:t_~
ワークテーブル:w_~
ビュー:v_~
インデックス:i_~
プライマリキー:k_~
マテリアライズドビュー:mv_~
なるほど。作業用の一時的なテーブルのこととかを指すんやな。
ほな分析に使うようのデータとかをテーブルにいれるなら、w_ が適切やな。
ワークテーブルは一時テーブルのことです。
どうやらローカル用語だったようで! もう少し説明すると、この処理をするために
専用のテーブルを作成するということです。データベースの一時テーブルの機能を
つかってもいいし 通常のテーブルを一時テーブルに見立てて使用するのもよしです。
ただ 具体的にどうするかは、要件しだいです。
GROUPBYしてグルーピングして、HAVINGでそのグループ内の抽出条件を指定できると。便利。
以下のようにできると
select * from category, AVG(price) from products GROUP BY category HAVING AVG(price) > 100
ストアプロシージャ:複数のsql文をあらかじめ保存しておくこと
<メリット>
ストアプロシージャすると、本来であれば流す複数のsql文を1回の命令で実行することができるので、
- ネットワークの負荷が軽減できる。
- 処理速度が速い(ストアプロシージャしたsql文は解析も済まされてる即実行可能な形式なので)
条件付きunique制約のかけ方
例えばこんな感じ
CREATE UNIQUE INDEX uidx_email ON account(email) WHERE del_flg = 0;
m_**_client の同期scriptに役立った記事
INSERT ** ON DUPLICATE KEY UPDATE
を実行するのに参考になったやーつ
mysql の CREATE DATABASE or TABLE で -(ハイフン)を使用したければ、``バッククォーテーションで文字列を囲む必要がある。
特定カラムの後にカラムを追加する。
ALTER TABLE employee ADD birth AFTER last_name;
indexの断片化は以下のコマンドでわかる。
※SQL Server (Microsoft製) のやつやからMySQLとは違うかも。
declare @DB_ID int
,@OBJECT_ID int
set @DB_ID = DB_ID('DB名')
set @OBJECT_ID = OBJECT_ID('テーブル名')
select *
from sys.dm_db_index_physical_stats(@DB_ID, @Object_ID, null, null, 'DETAILED') as A
join sys.objects as B on A.object_id = B.object_id
なるほど。Indexの再構成、再構築をすべきかは以下のindexの断片化%閾値が目安と。
なるほど。
- whereはselect句の結果からfilterかけてデータ取得する
- HavingはGroupBy句でグルーピングした結果からhavingで指定した抽出条件でデータ取得する
Where句はselect句の結果からwhere句で指定した抽出条件を実行する
Having句はGroupBy句でグルーピングした結果からHaving句で指定した抽出条件を実行する
今はCHARSET=utf8mb4
が良い。
NOT IN
と NOT EXISTS
は現在は実行速度そんな変わらんらしい。
PreparedStatementとは
PreparedStatementとはコンパイルされたSQL文。普通のSQL文より高速に実行できる。
「PreparedStatement」は「Statement」と同じくデータベースに対するSQL文を実行するために使われますが、「PreparedStatement」で使うSQLは事前にコンパイルが行われています。その為高速に実行することが出来るようになっています。