So-net無料ブログ作成
検索選択


プログラム言語におけるSQL(3章の内容) [SQL]

思ったのだが、プログラム言語英語の前置詞とか
持ち込まなくてもいいじゃないか、と。


3.5 INSERT・UPDATE・DELETE
 例
  INSERT INTO TOKUISAKI (TKSCD, TKSNAME, TKSJUSYO, TKSTELNO, TKSTANCD)
    VALUES('000008','Kスーパー', '大阪市北区・・','06-XXXX-XXXX', '101')

  UPDATE TOKUISAKI
    SET TKSTELNO = '06-XXXX-XXXX'
    WHERE TKSCD = '000006'

  DELETE FROM TOKUISAKI
    WHERE TKSCD = '000008'


3.6 プログラム言語におけるSQL

■カーソルの使用方法
 例
 [定義部分]
  EXEC SQL DECLARE MEISAISYORI CURSOR FOR
    SELECT JMJHCD, JMNO, SYONAME, JMSURYO,
      SYOTANKA, JMSURYO * SYOTANKA AS KINGAKU
    FROM JUTYUM X, SYOHIN Y
    WHERE X.JMSYOCD = Y.SYOCD
  END-EXEC

 [手続き部分]
  EXEC SQL OPEN MEISAISYORI
    END-EXEC

    LOOP EXEC SQL FETCH MEISAISYORI INTO :A, :B, :C, :D, :E, :F
      END-EXEC
      IF SQLSTATE = '02000' THEN GO TO END;
        GO TO LOOP;

    EXEC SQL CLOSE MEISAISYORI
  END-EXEC

 [EXEC SQLとEND-EXEC]
  プログラムの中にSQL文を指定するとき最初と最後につける。
 [SQLSTATE]
  SQL文の実行結果を格納する変数。 0:正常、2000:データなし
 [DECLARE カーソル名 CURSOR FOR]
  処理にカーソル名をつけて定義する。それを手続き部で使用する。
 [読取り処理]
  OPEN, FETCH, CLOSE, INTO
 [更新処理]
  EXEC SQL
  UPDATE文~
    WHERE CURRENT OF カーソル名
  END-EXEC

  ※WHERE文節の代わりに「WHERE CURRENT OF カーソル名」を使う。

 [処理の完了]
  EXEC SQL COMMIT WORK END-EXEC
  EXEC SQL ROLLBACK WORK END-EXEC


勉強時間】
3.5~3.6節の勉強 1時間


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:資格・学び

SQL-SELECT(3章の内容) [SQL]

SQLの中で一番使われる頻度が高いと思われるSELECT。
しっかり覚えてたら役に立つんだろうな。


3.3 権限
 GRANT
  ALL PRIVILEGES,SELECT,INSERT,DELETE,UPDATE,PUBLIC,WITH GRANT OPTION
  例
   GRANT ALL PRIVILEGES ON TOKUISAKI TO YAMASHITA, MATSUDA
   SELECT * FROM MIYOSHI.TOKUISAKI ※所有者の識別子を付けて使用する。

   GRANT SELECT, UPDATE (TKSTELNO) ON TOKUISAKI TO PUBLIC
   GRANT 人事部課長ロール TO B課長, C課長

 REVOKE
  例
   REVOKE ALL PRIVILEGES ON TOKUISAKI FROM YAMASHITA, MATSUDA
   REVOKE SELECT, UPDATE (TKSTELNO) ON TOKUISAKI FROM PUBLIC


3.4 SELECT

■基本的な使い方
 例
  SELECT * FROM TOKUISAKI
  SELECT COUNT(*) FROM TOKUISAKI
  SELECT TKSCD, TKSNAME FROM TOKUISAKI
  SELECT * FROM TOKUISAKI WHERE TKSCD = '000003'

 [列で計算式を指定]
  SELECT SYONAME, SYOTANKA * 0.8 AS NEBIKI FROM SYOHIN
    WHERE SYOCD = '000002'

 [列を連結]
  SELECT '商品名='|| SYONAME AS NAMAE FROM SYOHIN

 [別名を指定]
  上の例のようにASを使用する。ただしASは省略可能。
  SELECT X.JHCD, X.JHDATE, Y.TKSNAME FROM JUTYUH X, TOKUISAKI Y
    WHERE X.JHTKSCD = Y.TKSCD

 [重複を取り除く]
  SELECT DISTINCT TKSTANCD FROM TOKUISAKI

 [NULLを処理]
  SELECT 年代, 性別, COALESCE (SUM (B1), 0) A1 FROM 会員
    GROUP BY 年代, 性別

 [条件式の利用]
  SELECT 会員番号,
    SUM (CASE WHEN 入館時刻 < '1200'
      THEN 1 ELSE 0 END) AS B1
    FROM...

 [集合演算子]
  {UNION, EXCEPT, INTERSECT}
  SELECT JHTKSCD FROM JUTYUH UNION SELECT TKSCD FROM TOKUISAKI
  SELECT JHTKSCD FROM JUTYUH UNION ALL SELECT TKSCD FROM TOKUISAKI


■条件設定(WHERE句)
 [範囲を表す BETWEEN]
  WHERE JHDATE BETWEEN '20030704' AND '20030706'

 [実値の列挙 IN]
  WHERE JHDATE IN ('20030704', '20030706')

 [文字列の部分一致 LIKE]
  WHERE TANNAME LIKE '_好%'

 [NULLを指定 IS NULL]
  WHERE TKSTELNO IS NULL

 [存在検査 EXISTS]
  WHERE EXISTS (副問合せ)

 [否定 NOT]
  NOT BETWEEN, NOT IN, NOT LIKE, NOT NULL, NOT EXISTS


■GROUP BY句と集合関数
 例
  SELECT JMJHCD, SUM(JMSURYO) AS SURYOKEI
    FROM JUTYUM GROUP BY JMJHCD
 集合関数
  AVG(列名), MAX(列名), SUM(列名), COUNT(*), COUNT(DISTINCT 列名)

 列名に指定できるのはグループ化に使った列と集合関数と定数のみ

 HAVING句
  SELECT JMJHCD, SUM(JMSURYO) AS SURYOKEI
    FROM JUTYUM GROUP BY JMJHCD
    HAVING COUNT(*) >= 3


ORDER BY句
 例
  SELECT JMJHCD, SUM(JMSURYO) AS SURYOKEI
    FROM JUTYUM GROUP BY JMJHCD
    ORDER BY JMJHCD DESC
  ※DESCは降順、ASCまたは省略で昇順。

  ORDER BY 2 DESC  ※2はSELECTの後の列名の2番目を指す。


■結合
 内部結合=自然結合
  SELECT JUTYUH.JHCD, JUTYUH.JHDATE, TOKUISAKI.TKSNAME
    FROM JUTYUH, TOKUISAKI
    WHERE JUTYUH.JHTKSCD = TOKUISAKI.TLSCD
  SELECT X.JHCD, X.JHDATE, Y.TKSNAME,
    Z.JMNO, Z.JMSYOCD, Z.JMSURYO
    FROM JUTYUH X, TOKUISAKI Y, JUTYUM Z
    WHERE X.JHTKSCD = Y.TKSCD AND X.JHCD = Z.JMJHCD

 自己結合
  SELECT X.会員名, Y.会員名 AS 上司の名前
    FROM 会員 X, 会員 Y
    WHERE X.上司会員番号 = Y.会員番号

 外部結合
  SELECT X.JHCD, X.JHDATE, Y.TKSNAME
    FROM (JUTYUH X LEFT JOIN TOKUISAKI Y
      ON X.JHTKSCD = Y.TKSCD)
  SELECT X.JHCD, X.JHDATE, Y.TKSNAME
    FROM (JUTYUH X RIGHT JOIN TOKUISAKI Y
      ON X.JHTKSCD = Y.TKSCD)
  SELECT X.JHCD, X.JHDATE, Y.TKSNAME
    FROM (JUTYUH X FULL JOIN TOKUISAKI Y
      ON X.JHTKSCD = Y.TKSCD)

  SELECT 列名, ...
    FROM テーブルA LEFT OUTER JOIN テーブルB
      ON 結合条件
      LEFT OUTER JOIN テーブルC ON 結合条件
      LEFT OUTER JOIN テーブルD ON 結合条件


■副問合せ
 SQL文の中にさらにSELECT文を含んでいること
  SELECT JHCD, JHDATE FROM JUTYUH
    WHERE JHTKSCD IN(SELECT TKSCD
              FROM TOKUISAKI
              WHERE TKSTANCD = '101')

 [相関副問合せ]
  通常の副問合せは「副問合せを実行してから主問合せを実行」
  相関副問合せは「主問合せの1行を処理するごとに副問合せの処理実行」

  SELECT JHCD, JHDATE
    FROM JUTYUH X
    WHERE EXISTS (SELECT * FROM TOKUISAKI Y
          WHERE TKSCD = X.JHTKSCD
            AND TKSTANCD = '101')

 [EXISTSを使った副問合せ]
  EXISTSはTRUE/FALSEとなるので単なる副問合せでは全部かなしかの結果になる。
  IN句を使った副問合せとEXISTSを使った相関副問合せでは
   IN句の副問合せの方が処理速度が遅いとされる。


勉強時間】
3.3~3.4節の勉強 2.5時間


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:資格・学び

SQL-CREATE(3章の内容) [SQL]

順番を変えてSQLからにしてみた。
これ結構大変というか労力がいるのが分かった。
パターンを理解するのと後は暗記が必要みたいだが、暗記だってさ。


3.1 SQL概要
 データ定義言語(CREATE,DROP,GRANT,REVOKE,etc)
 データ操作言語(SELECT,INSERT,UPDATE,DELETE,etc)

3.2 CREATE

■CREATE TABLE
 例
  CREATE TABLE TOKUISAKI
   (TKSCD CHAR(6) NOT NULL,
   TKSNAME NCHAR(10),
   TKSJUSHO NCHAR(20) DEFAULT "不明"
   PRIMARY KEY (TKSCD))

  CREATE TABLE JUTYUH
   (JHCD CHAR(5) NOT NULL,
   JHDATE CHAR(8) NOT NULL,
   JHTKSCD CHAR(6),
   PRIMARY KEY (JHCD),
   FOREIGN KEY (JHTKSCD) REFERENCES TOKUISAKI ON DELETE SET NULL)

 [整合性制約]
  TEL-NO CHAR(15) DEFAULT '090-XXXX-XXXX',
  TEL-NO CHAR(15) NOT NULL,
 [一意性制約]
  TEL-NO CHAR(5) UNIQUE,
  CREATE TABLE SYOHIN
   (SYOCD CHAR(5) PRIMARY KEY,
   SYONAME NCHAR(20),
   UNIQUE(SYONAME))
 [主キー制約]
  JHCD CHAR(5) PRIMARY KEY,
  CREATE ATABLE JUTYUH
   (JMJHCD CHAR(5),
   JMNO CHAR(2),
   PRIMARY KEY(JMJHCD, JMNO))
 [検査制約]
  SYOTANKA INT CHECK(SYOTANKA>=100),
  CREATE TABLE SYOHIN
   (SYOCD CHAR((5) PRIMARY KEY,
   SYOTANKA INT,
   CHECK(SYOTANKA>=100))
 [参照制約]
   ※外部キー指定の列の値は参照先にあるものしか取れない。
   ※これに反する参照先の削除は通常できない。ただしオプションで連動可能。
     ON DELETE,ON UPDATE ⇒ NO ACTION,CASCADE,SET NULL
  CREATE TABLE JUTYUH
   (JHCD CHAR(5) PRIMARY KEY,
   JHDATE CHAR(8) NOT NULL,
   JHTKSCD CHAR(6),
   FOREIGN KEY(JHTKSCD)
   REFERENCES TOKUISAKI(TKSCD)
   ON DELETE SET NULL)


■CREATE ASSERTION
 表明。制約を定義できる。
  CREATE ASSERTION 表明名 CHECK(条件文)

■CREATE DOMAIN
  CREATE DOMAIN AGE
  AS SMALLINT CHECK(STUDENT>=7)
   AND (STUDENT<=18)
  CREATE TABKE 学生
   (NENREI AGE,)

■CREATE VIEW
 例
  CREATE VIEW TOKUISAKIV
   AS SELECT TKSCD,TKSNAME FROM TOKUISAKI
  CREATE VIEEW TOKUISAKIKITAKU
   AS SELECT *
   FROM TOKUISAKI
   WHERE TKSJUSYO LIKE '大阪市北区%'
  CREATE VIEW JHTYUV (VJHCD,VJHDATE,VTKSNAME)
   AS SELECT X.JHCD, X.JHDATE, Y.TKSNAME
   FROM JUTYOH X, TOKUISAKI Y
   WHERE X.JHTKSCD = Y.TKSCD

 [更新可能なビュー]
  原則可能。対象が特定できないビューの作り方だとできない。
  WITH CHECK OPTION ??
 [ビュー作成時の権限]
  SELECT権限があれば可能。ただし他にも付与するにはGRANT OPTIONも必要。
 [ビュー使用時の権限]
  元表に関係なくビューに対する権限の有無だけで判断。


■CREATE ROLE
 例
  CREATE ROLE 人事部課長ロール
  GRANT SELECT ON 従業員給料ビュー TO 人事部課長ロール
  GRANT 人事部課長ロール TO B課長,C課長

■DROP
 CREATEで作成したものを削除する。
  DROP TABLE テーブル
  DROP VIEW ビュー名
  DROP ROLE ロール名


勉強時間】
3.1~3.2節の勉強 2時間


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:資格・学び




この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。