MySQL
SQL
SQLServer
PostgreSQL

テーブル変更操作

カラム追加(先頭、後ろ)
SQL
/* テーブル新規作成 */
DROP TABLE IF EXISTS personal; 
CREATE TABLE personal( 
  mail CHARACTER VARYING (250) NOT NULL
  , create_datetime TIMESTAMP WITH TIME ZONE
  , PRIMARY KEY (mail)
); 

/* 先頭のカラムとして追加 */
ALTER TABLE personal ADD pno SMALLINT FIRST; 

/* カラムの後ろに追加 */
ALTER TABLE personal ADD name AFTER pno; 

/* カラムを追加 */
ALTER TABLE personal ADD tel VARCHAR (12); 

データタイプ変更
SQL
/* データタイプを変更 */
ALTER TABLE personal ALTER tel type VARCHAR (13); 

列名変更
SQL
/* 列名を変更 */
ALTER TABLE personal RENAME COLUMN tel TO telephone; 

テーブル名変更
SQL
/* テーブル名を変更 */
ALTER TABLE personal RENAME TO personal_info; 

テーブル操作

キーより最大値を求めて新規レコードを挿入
SQL
/* 方法1 おすすめ */
INSERT INTO personal_info(
  pno
  , name
  , mail 
  , create_datetime
  , telephone
)
SELECT 
  (MAX(pno)+1)
  , :name
  , :mail 
  , :create_datetime
  , :telephone
FROM personal_info

/* 方法2 
「パラメータについて推定された型が不整合です」というSQLエラーが出る場合があります。
原因は調査中。一応、おすすめられません。*/
INSERT INTO personal_info( 
  pno
  , name
  , mail 
  , create_datetime
  , telephone
) 
VALUES ( 
  (SELECT (MAX(pno)+1) FROM personal_info WHERE mail = :mail)
  , :name
  , :mail 
  , :create_datetime
  , :telephone
) 

テーブル検索操作

キーより複数項目を集約
postgreSQL
/* キー(pno)より複数項目を集約 */
/* Table - mails
__________________________________
pno |seq |mail_address
1   |1   |sample1_1@sampleSQL.co.jp
1   |2   |sample1_2@sampleSQL.co.jp
2   |1   |sample2@sampleSQL.co.jp
__________________________________
*/
SELECT
  pno
  , string_agg(mail_address, ',') AS other_mails 
FROM
  mails 
ORDER BY
  pno

/* result
_________________________________________________________
pno|mail_address
1  |sample1_1@sampleSQL.co.jp,sample1_2@sampleSQL.co.jp
2  |sample2@sampleSQL.co.jp
_________________________________________________________
*/

特定時間間隔の計算
postgreSQL
/* 特定時間間隔の計算 (時間間隔パラメータ[:time] 例え:2h)*/
/** Table - mails
____________________________________________________________
pno |seq |mail_address               |create_time
1   |1   |sample1_1@sampleSQL.co.jp  |2018/04/10 9:10:41.565
1   |2   |sample1_2@sampleSQL.co.jp  |2018/04/10 10:10:41.565
2   |1   |sample2@sampleSQL.co.jp    |2018/04/10 11:10:41.565
____________________________________________________________
**/
SELECT
  pno
  , mail_address
  , create_time 
  , now() - (:time)::interval  AS limit_time
FROM
  mails 
WHERE
  create_time <= now() - (:time)::interval 

/**
result
    now() ='2018/04/10 12:30:41.565'
    :time ='120 minutes'
________________________________________________________________________________
pno|mail_address              |create_time             |limit_time
1  |sample1_1@sampleSQL.co.jp |2018/04/10 9:10:41.565  |2018/04/10 10:30:41.565
1  |sample1_2@sampleSQL.co.jp |2018/04/10 10:10:41.565 |2018/04/10 10:30:41.565
________________________________________________________________________________
**/