Skip to content

Instantly share code, notes, and snippets.

@tamata78
Last active March 5, 2021 08:07
Show Gist options
  • Save tamata78/8c2282b9f5e25aded950be812b09e74a to your computer and use it in GitHub Desktop.
Save tamata78/8c2282b9f5e25aded950be812b09e74a to your computer and use it in GitHub Desktop.
Oracle_tips

1. DML

1.1 日付

日付変換

  • (文字列⇒日付)
TO_DATE('20171201','YYYY/MM/DD') 

日時の計算

SELECT SYSDATE + 1 FROM DUAL;      --1日足す
SELECT SYSDATE - 1 FROM DUAL;      --1日引く
SELECT SYSDATE + 1/24 FROM DUAL;   --1時間足す
SELECT SYSDATE + 2/1440 FROM DUAL; --2分足す
SELECT SYSDATE + 3/86400 FROM DUAL; --3秒足す

日、時、分、秒の切り捨て

TRUNC(日時) 使用例 fmtは、設定した時間要素以下を切り捨てるという設定

SQL> select dt, fmt, TRUNC(dt, fmt) from trunc_date_sample;
 
DT                  FMT      TRUNC(DT,FMT)
------------------- -------- -------------------
2007-07-07 23:30:40 MI       2007-07-07 23:30:00
2007-07-07 23:30:40 HH       2007-07-07 23:00:00
2007-07-07 23:30:40 DD       2007-07-07 00:00:00
2007-07-07 23:30:40 DAY      2007-07-01 00:00:00  -- 2007-07/01(日曜日)
2007-07-07 23:30:40 MM       2007-07-01 00:00:00
2007-07-07 23:30:40 YYYY     2007-01-01 00:00:00
2000-01-01 00:00:00 CC       1901-01-01 00:00:00

時間の範囲指定

SELECT ...
WHERE TO_CHAR(date型列, 'HH24:MI:SS') BETWEEN '10:00:00'
AND '14:00:00';

曜日取得

曜日を表す数字(1~7)を取得する

SELECT TO_CHAR(SYSDATE,'D') FROM DUAL
---------------------------
  1

戻り値 曜日 1 日曜日 2 月曜日 3 火曜日 4 水曜日 5 木曜日 6 金曜日 7 土曜日

日本語で曜日を取得する方法

SELECT TO_CHAR(SYSDATE,'Day') FROM DUAL
---------------------------
  月曜日

1.2 WITH句

サブクエリを別名を付けて括りだす機能。

例) SELECT文の内容をINSERTする

INSERT INTO
    new_table (
        col
    )
SELECT
   col
FROM
   old_table

これをWITH句を使うと以下のように書ける。サブクエリが長い場合に別名付けて、可読性をあげられる

INSERT INTO
    new_table (
        col
    )
WITH
    tmp_table AS (
        SELECT
            col
        FROM
            old_table
    )
SELECT
   col
FROM
   tmp_table

1.3 SELECT FOR UPDATE(行ロック)

表ロックを行う場合、ロックテーブルを作成するなどする。 SELECT時点で行ロック、COMMIT or ROLLBACK された時点で解除

SELECT
  ORDER_ID
FROM
  ORDER_INFO
WHERE
  ORDER_ID = /*orderId*/9999
FOR UPDATE
OF ORDER_INFO.ORDER_ID

2. DDL

## 2.1 Create
### create as select 
create table ADMIN_NEW
as
select 
    USER_ID                
   ,USER_NM
   ,USER_STS
   ,UPDATE_TM
 from ADMIN where UPDATE_TM >= to_timestamp('20200220','YYYYMMDD');

# 2.2 comment
COMMENT ON COLUMN ADMIN.USER_ID IS 'ユーザーID';

# 2.3 index
CREATE INDEX IX_ADMIN_02 ON ADMIN (USER_ID); 

# 2.4 ALTER TABLE
## 列追加
ALTER TABLE "SCM_NAME"."SHOP" ADD "SHOP_KIND_FLG" NVARCHAR2(2);
-- 新規追加項目にnot nullを付ける場合、既存レコードの新規追加項目を更新してからnot nullを付与する必要がある
ALTER TABLE "SCM_NAME"."SHOP" MODIFY ("SHOP_KIND_FLG" NOT NULL ENABLE); -- not null制約追加

## 列変更 
ALTER TABLE ADMIN MODIFY (USER_STS default '10');

## 列削除
ALTER TABLE table1 DROP (pno) CASCADE CONSTRAINTS; -- 1列を削除(CASCADE CONSTRAINTSは制約ごと削除するオプション)
ALTER TABLE table1 DROP (pno,memo); -- 複数列を削除

## テーブル変更
ALTER TABLE SHOP_ITME RENAME TO SHOP_ITME_BK; -- バックアップテーブルとしてリネーム

# 2.5 シノニム
## 設定
CREATE SYNONYM SCHEME_A.USER FOR USER;

# 2.6 ビュー
## View作成

CREATE VIEW v_emp AS
SELECT
    a.name
    ,a.age
from
    emp a
    inner join dept b on a.dept_cd = b.dept_cd
;

## View更新
ALTER VIEW v_emp AS
SELECT
    ~
;

ビューの再定義をするときは、CREATE文で[OR REPLACE]を指定し、再定義する方法もあり

CREATE OR REPLACE VIEW v_emp AS
SELECT
    ~
;

## View削除
DROP VIEW v_emp;

3. DB オブジェクト

3.1 Sequence

select * from user_sequences; -- display seq list
select * from user_sequences where sequence_name = 'MY_SEQ';

4. システムテーブル

-- カラム名の確認
SELECT COLUMN_NAME
      ,COMMENTS
FROM   USER_COL_COMMENTS
WHERE  TABLE_NAME = 'USER';

-- テーブルINDEXの確認
SELECT * FROM USER_IND_COLUMNS WHERE TABLE_NAME = UPPER('USER') ORDER BY INDEX_NAME, COLUMN_POSITION ASC;

-- PKEYの確認
SELECT C.TABLE_NAME, CC.COLUMN_NAME
  FROM USER_CONSTRAINTS C, USER_CONS_COLUMNS CC
 WHERE C.TABLE_NAME      = CC.TABLE_NAME
   AND C.CONSTRAINT_NAME = CC.CONSTRAINT_NAME
   AND C.CONSTRAINT_TYPE = 'P' -- この情報がほしいから USER_CONSTRAINTS テーブルと結合
   AND C.TABLE_NAME = 'USER'
 ORDER BY CC.TABLE_NAME, CC.COLUMN_NAME;

-- シノニムの確認
SELECT * FROM ALL_SYNONYMS WHERE table_name = 'USER';

5. DBMS機能

5.1 フラッシュバッククエリ(Flashback Query)

UNDOデータを参照して間違って削除してしまったデータを 復活させることができます。

-- 1時間前のデータを参照
select * from hoge
as of timestamp (systimestamp - interval '1' hour );

-- 1日前のデータを参照
select * from hoge
as of timestamp (systimestamp - interval '1' day );

-- 指定した日付、時間のデータを参照
select * from hoge
as of timestamp to_timestamp('2013-09-07 09:30:00', 'yyyy-mm-dd hh:mi:ss');

6. 数学的な統計情報

SELECT
  avg(i.con) AS avg -- 平均
  ,median(i.con) AS median -- 中央値
  ,stddev(i.con) AS stddev -- 標準偏差
FROM (
SELECT
  count(1) as con
FROM
  ITEM
) i
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment