【SQL】基本

読取(SELECT)

--全項目
SELECT * FROM 社員マスタ WHERE 氏名 = '田中';

--よく使うもの
SELECT
  社員.社員コード AS コード  --ASまたはスペースで別名
  , 氏名
  , COUNT(資格.社員コード) 
FROM
  社員マスタ 社員   --ASまたはスペースで別名
  LEFT JOIN 資格情報 資格   --テーブル結合
    ON 社員.社員コード = 資格.社員コード   --結合条件
WHERE
  社員.社員コード LIKE '00%'   --曖昧検索(%と_が使える)
  AND 社員.社員コード IN ('0001','0002')    --複数条件
GROUP BY
  社員.社員コード, 社員.氏名  --グループ化(COUNTやSUMの時に必要)
ORDER BY
  社員.氏名 DESC  --並び替え(ASCで昇順、DESCで降順 ※省略でASC)

追加(INSERT)

--全項目
INSERT INTO 社員マスタ VALUES (1,'田中',25);

--一部項目
INSERT INTO 社員マスタ (社員コード, 氏名) VALUES (7,'浜田');

--別テーブルから(まるごと)
INSERT INTO 社員マスタ SELECT * FROM BK_社員マスタ;

--別テーブルから(条件付き)
INSERT INTO 社員マスタ SELECT 社員コード,氏名 FROM BK_社員マスタ WHERE 社員コード=0001;

更新(UPDATE)

--対象行
UPDATE 社員マスタ SET 氏名 = '高田', 部署コード= '005' WHERE 社員コード = 1;

--全行
UPDATE 社員マスタ SET 氏名 = '高田', 部署コード = '005';

--別の列の値に置き換え
UPDATE 社員マスタ SET 生年月日 = 入社年月日;

削除(DELETE)

※TRUNCATEは早いがロールバック不可

--対象行
DELETE FROM 社員マスタ WHERE 社員コード = '1';

--全行
DELETE FROM 社員マスタ;
TRUNCATE TABLE 社員マスタ;

テーブル作成(CREATE TABLE)

型はDBの種類によって異なる(例はPostgreSQL)

CREATE TABLE 社員マスタ (
   社員コード SERIAL
  , 氏名 VARCHAR(20) NOT NULL
  , 生年月日 DATE
  , 年齢 INTEGER
  , 住所 TEXT
  , PRIMARY KEY (社員コード)
);

テーブル削除(DROP TABLE)

DROP TABLE 社員マスタ;

--存在する場合のみ削除
DROP TABLE IF EXISTS 社員マスタ;

テーブル複製(CREATE SELECT)

キー情報などはコピーされないため注意
ORACLEPostgreSQLMySQLのみ

--データあり
CREATE TABLE BK_社員マスタ AS SELECT * FROM 社員マスタ;

--データあり(条件指定)
CREATE TABLE BK_社員マスタ AS SELECT 社員コード,氏名 FROM 社員マスタ WHERE 部署コード='001';

--データなし
CREATE TABLE BK_社員マスタ AS SELECT * FROM 社員マスタ WHERE 1<>1;

件数をカウント(COUNT)

--全件
SELECT COUNT(*) FROM 資格情報;

--NULLをカウントしない
SELECT COUNT(取得日) FROM 資格情報;

--重複をカウントしない
SELECT COUNT(DISTINCT 社員コード) FROM 資格情報;

--グループごとの集計
SELECT 社員コード, COUNT(社員コード) FROM 資格情報 GROUP BY 社員コード;

結合して抽出(UNION)

f:id:vist764:20200519223621p:plain:w300

--重複行は出力しない
SELECT * FROM 社員A
UNION
SELECT * FROM 社員B

--すべて出力
SELECT * FROM 社員A
UNION ALL
SELECT * FROM 社員B

存在判定(EXISTS)

--サンプル2に存在するIDを出力
SELECT * FROM サンプル1 A WHERE EXISTS
 (SELECT * FROM サンプル2 B WHERE A.ID=B.ID)

--サンプル2に存在すれば出力
SELECT * FROM サンプル1 A WHERE EXISTS
 (SELECT * FROM サンプル2 B WHERE A.ID=2)

差分を抽出(MINUS)

2つのテーブルの行の差分を抽出
f:id:vist764:20200519222549p:plain:w300

SELECT * FROM 社員A
EXCEPT
--ORACLEの場合はMINUS
SELECT * FROM 社員B

一致行を抽出(INTERSECT)

2つのテーブルの一致した行を抽出
f:id:vist764:20200519222321p:plain:w300

SELECT * FROM 社員A
INTERSECT
SELECT * FROM 社員B