SQL の基礎 その5 [exam]
SQL のメモ。ORACLE MASTER Bronze SQL 基礎Ⅰ向け。SQL の基礎 その4 の続き。
RR日付書式
表示する年00~49 | 現在の年号50~99 | |
---|---|---|
現在の年XX00~XX49 | 現在の世紀 | 前の世紀 |
現在の年XX50~XX99 | 次の世紀 | 現在の世紀 |
※現在2010年 '09' -> 2009年、現在1998年 '09' -> 2009年
ANY と ALL
- > ANY
いずれかより大きい = 最小より大きい - > ALL
全てより大きい =最大より大きい
NEXTVAL と CURRVAL
- 使用可能
- SELECT文のSELECT句の内、副問い合わせ以外の SELECT句
- UPDATE文のSET句
- INSERT文のVALUES句
- INSERT文で使用する副問い合わせ内のSELECT句
- 使用不可能
- SELECT分や、DELETE文、UPDATE文の副問い合わせ内のSELECT句
- GROUP BY句やHAVING句、ORDER BY句を使用するSELECT文
- DISTINCTを使用するSELECT句
- CREATE TABLE文やALTER TABLE文内のDEFAULT式
- ビューのSELECT句
デカルト積
- 明示する場合は CROSS JOIN
SQL の基礎 その4 [exam]
SQL のメモ。ORACLE MASTER Bronze SQL 基礎Ⅰ向け。SQL の基礎 その3 の続き。
日付関数
- ADD_MONTHS(日付,n)
日付に nヶ月を加算する。 - MONTHS_BETWEEN(日付1,日付2)
日付1から日付2を減算した月数を戻す。日数部分は小数点。日付1が日付2よりも古いときは負になる。 - LAST_DAY(日付)
月末の日付を返す。 - NEXT_DAY(日付,'文字列')
指定した日付より後の指定曜日の日時を返す。
例: NEXT_DAY(DATE '2010-01-01', '月曜日') '月曜日' の部分は環境依存。'月曜' も可。
日付書式要素
要素 | 説明 | 結果 | 補足 |
---|---|---|---|
YYYY | 年 | 2005 | |
MM | 2桁数値による月 | 04 | |
MONTH | 月の名前 | APRIL | 日本語環境の場合「4月」 |
MON | 月の名称 | APR | 日本語環境の場合「4月」 |
DDD | 年における日数 | 091 | 年のはじめから数えた日数 |
DD | 月における日数 | 01 | 月のはじめから数えた日数(=日付) |
D | 週における日数 | 6 | 週のはじめから数えた日数(日曜が1で土曜が7) |
DAY | 曜日の名前 | FRIDAY | 日本語環境の場合「金曜日」 |
DY | 3文字の曜日の略称 | FRI | 日本語環境の場合「金」 |
※結果欄は「2005-04-01 金曜日」をそれぞれの書式で表示した結果
※出典 ORACLE MASTER Bronze SQL基礎Ⅰ模擬問題集,株式会社CSK 教育サービス事業部,株式会社アスキー,2005
日付書式要素:時刻書式
要素 | 説明 | 結果 | 補足 |
---|---|---|---|
AM または PM | 正午標識 | PM | 日本語環境の場合「午後」 |
HH または HH12 | 時間、12時間書式 | 07 | |
HH24 | 時間、24時間書式 | 19 | |
MI | 分 | 30 | |
SS | 秒 | 20 |
※結果欄は「午後7時30分20秒」をそれぞれの書式で表示した結果
※出典 ORACLE MASTER Bronze SQL基礎Ⅰ模擬問題集,株式会社CSK 教育サービス事業部,株式会社アスキー,2005
- 「分」が「MI」であることに注意。
数値書式要素
- 0 は先頭の数値が0のとき0を戻す。 TO_CHAR(1234,'0999') -> 01234
- 9 は空白を戻す。 TO_CHAR(0.5,'99.99' -> _ _ .50
SQL の基礎 その3 [exam]
SQL のメモ。ORACLE MASTER Bronze SQL 基礎Ⅰ向け。 SQL の基礎 その2 の続き。
順序
- 順序を作成した後、開始番号(START WITH) は変更できない。変更する場合は順序を削除し再作成する。
ビュー
- ビューの元になる表を削除してもビューは削除されないが、使用できない。
- ビューを通して実表を操作するには制限がある。
行の削除 (DELETE) |
行の変更 (UPDATE) |
行の挿入 (INSERT) |
|
---|---|---|---|
グループ関数 | ○ | ○ | ○ |
GROUP BY句 | ○ | ○ | ○ |
DISTINCTキーワード | ○ | ○ | ○ |
疑似列ROWNUMキーワード | ○ | ○ | ○ |
式によって定義された列 | ○ | ○ | |
ビューで選択されていない実表のNOT NULL列 | ○ |
※出典 ORACLE MASTER Bronze SQL基礎Ⅰ日本オラクル公式テキスト 改訂版,日本オラクル株式会社オラクルユニバーシティ,株式会社アスキー,2005
CASE
- CASE 列 WHEN 条件1 THEN 戻り値1
WHEN 条件2 THEN 戻り値2
...
ELSE デフォルト値
END
DECODE
- DECODE (列,
条件1,戻り値1,
条件2,戻り値2,
...,
デフォルト値)
NULL
- NULL + 100 -> NULL
- NULL は昇順ソート(ASC)では最後、降順ソート(DESC)では最初になる。
SQL の基礎 その2 [exam]
SQL の基礎 その1 の続き。
日付・時刻データ型
-
DATE
- TIMESTAMP
小数秒を格納可能 - TIMESTAMP WITH TIME ZONE
UTC との時差 - TIMESTAMP WITH LOCAL TIME ZONE
データベースのタイムゾーンに変換して日時を格納。格納されたデータを表示するときはユーザセッションのタイムゾーンに従って変換されて表示 - INTERVAL YEAR TO MONTH
年月の期間。INTERVAL '123-5' YEAR(3) TO MONTH のように記述する。この場合、123年と5ヶ月間。YEAR(n) は年の桁数。既定は 2。 - INTERVAL DAY TO SECOND
日時分秒の期間。INTERVAL '3 1:2:3' DAY TO SECOND のように記述する。この場合、3日と1時間2分3秒間。DAY と SECOND の部分は DAY,HOUR,MINUTE,SECOND のいずれかを指定。TO の左側に指定したい期間の中で一番大きいものを、TO の右側に小さいものを記述。INTERVAL '3 1:2' DAY TO MINUTE なら 3日と1時間2分間となる。
制約
- NOT NULL は列制約構文でしか定義できない。
関数
- 日付関数はあるが時刻関数とは呼ばない。
- TRUNC は TRUNC(列名,[n]) として使う。n: 小数第何位まで表示するか。省略した場合は整数まで表示。
25.374 -> 2:-1、5:0、3:1、7:2、4:3 。 TRUNC(25.374,-1) = 30
計算
- 日付に時間を加算するときは 日付+数値/24
集合演算子
- UNION
- NULL は重複チェック時に無視される。
- 既定ではSELECTの第一列で昇順にソートされる。
- UNION ALL
- 重複行は削除されない。
- ソートされない。
- DISTINCT は利用できない。
SQL の基礎 その1 [exam]
SQL のメモ。ORACLE MASTER Bronze SQL 基礎Ⅰ向け。
私が SQL を書くときは、USING 句や自然結合は使わないし(A.COLUMN1 = B.COLUMN1 とちゃんと書く)、NULL はあらかじめ除外して集計するし、HAVING 句や GROUP BY 句の順序を余り気にしてなかったので...問題を解いてみると案外間違えるわけです。
自然結合
- NATURAL JOIN 句を使用する。
- 同名の列を全て使用した等価結合であり、結合に使用される列の型は同じでなければならない。
using句
- 結合する列名が表間で同じ場合は USING 句を利用して結合する列名を定義できる。
- USING 句と NATURAL JOIN 句は同時に使用できない。
- USING 句に指定した列は表名による修飾が出来ない。
集計関数とNULL
- COUNT(*) -> NULL もカウントする。
- COUNT(*) 以外は NULL を無視する。
グループ関数と単一列の選択
- グループ関数(MAX とか COUNT とか)と単一列を SELECT するときは、単一列を全て GROUP BY 句に指定しなければならない。
- GROUP BY に列別名を指定できない。
HAVING句とGROUP BY句の順序
- HAVING 句と GROUP BY 句はどちらを先に記述しても良い。
私が SQL を書くときは、USING 句や自然結合は使わないし(A.COLUMN1 = B.COLUMN1 とちゃんと書く)、NULL はあらかじめ除外して集計するし、HAVING 句や GROUP BY 句の順序を余り気にしてなかったので...問題を解いてみると案外間違えるわけです。