◆ SQL




命令


  • INSERT
INSERT INTO テーブル名(カラム名1, カラム名2)
VALUES(値1, 値2)
カラム名1と値1が対応。
レコード(行データ)を追加するので、必須カラムがないとエラーになる。

  • UPDATE
UPDATE テーブル名
SET カラム名 = 値, カラム名 = 値
WHERE ~

  • DELETE
DELETE FROM テーブル名
WHERE (NOT) ~

  • CREATE
CREATE TABLE テーブル名
(
    カラム名 NUMBER(3) ※整数桁、少数桁
    カラム名 VARCHAR2(50) ※2バイト文字、カッコ内はバイト数
)

  • DROP
DROP TABLE テーブル名
テーブル削除

  • DESC
DESC テーブル名
テーブル構造を取得

  • UNION

  • INSERTSECT

  • MINUS

関数


  • ROW_COUNT() と ROWNUM
行インデックスを取得

  • BETWEEN
カラム名 BETWEEN 数字1 AND 数字2
カラムが数字1から数字2の間の場合…WHERE句内で使う

  • CASE
CASE カラム名
 WHEN 比較する値 THEN 値
END

  • LIKE
カラム名 LIKE '%値%'

  • MONTHS_BETWEEN
年月の差(月単位)
12で割れば年

  • SYSDATE
日付取得

  • IN
WHERE カラム名 IN (値, 値)

INNER JOIN

最初のテーブル(左) 【TBL_CHARACTOR】
ID NAME SEX
1 左 翔太郎
2 園咲 来人
3 園崎 若菜
4 須藤 霧彦
5 園咲 冴子

結合するテーブル(右) 【TBL_BAG】
ID NAME COLOR CHARA_ID
1 お買い物バッグ 黄色 3
2 リュック 1
3 ティファニーのバッグ ゴールド 5
4 コーチのバッグ ピンク 3
5 スーツケース シルバ 4

◆行が減る条件
※紐づくIDが結合したテーブルに存在しない
SELECT
   T_CHR.ID AS C_ID
   , T_CHR.NAME AS C_NAME
   , T_BAG.ID AS B_ID
   , T_BAG.NAME AS B_NAME
FROM
   TBL_CHARACTOR T_CHR
   INNER JOIN TBL_BAG T_BAG
     ON T_BAG.CHARA_ID = T_CHR.ID
WHERE
   T_CHR.SEX = '男'

◆結果
C_ID C_NAME B_ID B_NAME
1 左 祥太郎 2 リュック
4 須藤 霧彦 5 スーツケース

◆解説
WHERE句で今度は男だけで絞ってるので、
そのままだと祥太郎と来人と霧彦さんの3人の筈です。
でも、結果は2行しかありません。

右にくっついてるテーブル(TBL_BAG)に
来人のIDの2がありません。
来人はバッグは持ってないようです。
なので、来人の行がなくなってしまっています。

◆行が増える条件
※紐づくIDを複数持つテーブルを結合する
SELECT
   T_CHR.ID AS C_ID
   , T_CHR.NAME AS C_NAME
   , T_BAG.ID AS B_ID
   , T_BAG.NAME AS B_NAME
FROM
   TBL_CHARACTOR T_CHR
   INNER JOIN TBL_BAG T_BAG
     ON T_BAG.CHARA_ID = T_CHR.ID
WHERE
   T_CHR.SEX = '女'
※さっきのSQL文を条件女のみにしただけです。

◆結果
C_ID C_NAME B_ID B_NAME
3 園崎 若菜 1 お買い物バッグ
3 園崎 若菜 4 コーチのバッグ
5 園崎 冴子 3 ティファニーのバッグ

◆解説
WHERE句で女だけに絞ってるので、
そのままだと若菜と冴子の二人だけです。
でも、結果は3行あります。

これは右にくっついてるテーブル(TBL_BAG)の
紐づくID(INNER JOINのONで指定したID)に
同じのが複数あるからです。

若菜は「お買い物バッグ」と「コーチのバッグ」の
二つを持っています。
すると、2行必要なので左のテーブルの値は
コピーされて全て同じデータが入ります。

◆結合して増えて減ってるテーブルサンプル
SELECT
   T_CHR.ID AS C_ID
   , T_CHR.NAME AS C_NAME
   , T_BAG.ID AS B_ID
   , T_BAG.NAME AS B_NAME
FROM
   TBL_CHARACTOR T_CHR
   INNER JOIN TBL_BAG T_BAG
     ON T_BAG.CHARA_ID = T_CHR.ID
※条件を消したので、↑のふたつの結果が一緒になっただけです。

◆結果
C_ID C_NAME B_ID B_NAME
1 左 祥太郎 2 リュック
3 園崎 若菜 1 お買い物バッグ
3 園崎 若菜 4 コーチのバッグ
4 須藤 霧彦 5 スーツケース
5 園崎 冴子 3 ティファニーのバッグ

◆解説
さっきと一緒ですが、
来人はTBL_BAGにIDがないので、データ(行)がありません。
若菜はTBL_BAGに2箇所にIDがあるので、
データ(行)が2件あります。
結果、データが1減って1増えてるので行数は同じでした。
分かりやすい参考ページ

SQLを早くする


|