📑

ITスクール DAY29 Oracle Sequence/SELECT/INSERT/関数

2023/08/21に公開

初めに

先週は、DDLを中心に勉強をしましたが、今日は個別個別のエンティティを扱うDMLとOracle内の関数(build-in function)について勉強しました。

Sequence

factory patternといいまして、自動化のために使うやつです。
1億行目のデーターに一一数字を挿入するのは、相当なテーマがかかりますので、その場合はSequneceを活用した方が効率が高いです。

CREATE SEQUENCE sequencename;
CREATE SEQUENCE table_name_sequence

慣習的に、適用するテーブル名_sequenceに名づけます。

CREATE SEQUENCE table_name_sequence;
    INCREMENT by 1 -- 1ずつ上がります
    START WITH 1   -- 初期化する値 
    MINVALUE       
    MAXVALUE 
    CYCLE/NOCYCLE -- 最大値になった場合、最低値に戻るかないか
    CACHE/NOCACHE -- メモリ上にsequenceを作っといて持ってくるかないか
  
DROP SEQUENCE sequencename;  --  sequence削除

table_name_sequence.nextval; --Autoincrementによる値増加(++)

Insert(INSERT INTO)

CRUDのCに該当します。
テーブル(カラム)にデーター(値)を入れるDMLです。

INSERT INTO table_name (col1,col2,...) VALUES(v1,v2...);
INSERT INTO table_name VALUES(v1,v2,...);

属性を指定して入れる方法とターブルに一基に入れる方法があります。
テーブルに一基に入れる場合は、属性の順序に沿って値を入れることが必修になります。
インスタンス化する際にパラメーターを入れることと同じだと考えば、わかりやすいです。

自習

create table snack(
s_no number(4) primary key,
s_name varchar2 (10 char) not null, 
s_maker varchar2 (10 char) not null, 
s_price number(4) not null,
s_exp date not null
);

CREATE SEQUENCE snack_seq;

 INSERT INTO snack VALUES
 (snack_seq.NEXTVAL,'새콤달콤','롯데',500,TO_DATE('2023-08-22 12','YYYY-MM-DD HH24'));
  INSERT INTO snack VALUES
 (snack_seq.NEXTVAL,'오예스','해태',3000,TO_DATE('2023-08-25 15','YYYY-MM-DD HH24'));
 INSERT INTO snack VALUES
 (snack_seq.NEXTVAL,'허니버터칩','해태',3000,TO_DATE('2023-08-20 07','YYYY-MM-DD HH24'));
   .
   .
   .
   
 INSERT INTO snack VALUES
 (snack_seq.NEXTVAL,'초코파이','오리온',3000,TO_DATE('2023-08-22 10','YYYY-MM-DD HH24'));
  INSERT INTO snack VALUES
 (snack_seq.NEXTVAL,'포카칩 오리지날','오리온',1200,TO_DATE('2023-08-24 16','YYYY-MM-DD HH24'));
 INSERT INTO snack VALUES
 (snack_seq.NEXTVAL,'포카칩 어니언맛','오리온',1200,TO_DATE('2023-08-23 08','YYYY-MM-DD HH24'));

s_no   s_name    s_maker   ....
1      새콤달콤   롯데      .....
2      오예스     해태      .....
3      허니버터칩  해태      .....
.
.
17     초코파이   오리온      ....
18     포카칩 오리지날 오리온  ....
19     포카칩 어니언맛 오리온  ....

snack_seq.NEXTVALというSequenceで、s_noが自動的に増加したことが分かります。

Read(SELECT)

SELECT [distinct] [c_name],[c_name as othername], [Operator],[aggregate function(集計関数],
from [table_name]
where [conditional statement]
group by [grouping target]
having [function-inclusive condition(関数包含条件)]
order by [ASC/DESC (昇順 / 降順)] --defaultはASC(Ascend) 
*/

今日は、distinct, as, 演算子(Opeator),集計関数(aggregate function) を勉強しました! 今後、Group by, having, order byも載せます。

* : テーブル内の全てのカラムの値=すべてのエンティティを読みます。

SELECT * FROM snack;

distinct : 属性(カラム)の値の中で重腹は除去して読みます。

SELECT DISTINCT s_maker FROM snack;
s_maker
-------
롯데
오리온
해태

snack tableの中で全てのお菓子会社が分かりたい。ただし、重腹は除去する
とと

as :属性の名前に別の名前を付けることができます。必ずasが必修ではありません。ただし、空白文字(space)と記号などが入る場合は、別称に" "を付けることをオススメします。

SELECT s_price/100 as s_price, s_price / 100 s_price2 from snack;
SELECT s_price/100 as "s_price/100" , s_price/100 "s_price2/100"

s_price/100 は s_priceに、s_price/100はs_price2に

|| : 文字を結合する際に使う演算子です。javaと異なり、Oracleは1+'3'が4になる整数演算が行われます。1||3に演算すれば、Javaのように、13が出ます。

関数(Build-in-function)

数字・数学

ABS(数字) : Math.abs(数字)、絶対値計算
ROUND(数字,M) : 四捨五入
POWER(数字,N) : 数字のN条 (Math.pow(数字、N))
TRUNC(数字,M) : 数字をM桁まで残して値を捨てます。
MOD(M,N) : M%N、MをNに分けた後のあまり
SQRT(数字) : 数字の√を計算(陽数のみ)

SELECT ABS(-4.5) FROM DUAL;  --4.5
SELECT ROUND(5.36,1) FROM DUAL;  --5.4
SELECT POWER(2,3) FROM DUAL;  --8
SELECT TRUNC(123.456,1) FROM DUAL;  --123.4
SELECT TRUNC(123.456,-1) FROM DUAL;  --120
SELECT MOD(12,10) FROM DUAL;   --2
SELECT SQRT(9.0) FROM DUAL;   --3

文字

CONCAT(S1,S2) : 二つの文字列を繋ぐ
SUBSTR(S1,N,K) : S1のN桁の文字からKの長さほど切り取ります。
INSTR(S1,S2,N,K) : S1のN番目から始まり、探したい文字列S2がK番目に出現する文字列の位置を返します。
LPAD(S,N,C) : 文字列Sを左から指定した桁数Nまで指定した文字Cで埋めます。
RPAD(S,N,C) : 文字列Sを右から指定した桁数Nまで指定した文字Cで埋めます。
LTRIM(S1,S2) : 文字列S1を基準にして左側にある指定した文字S2を削除します。
RTRIM(S1,S2) : 文字列S1を基準にして右側にある指定した文字S2を削除します。
REPLACE(S1,S2,S3) : S1の指定した文字S2を希望する文字S3に置き換えます。
LENGTH : 文字数を数えてくれる関数
LENGTHB : 文字のバイト数を数えてくれる関数

SELECT CONCAT('A','B') FROM DUAL -- 'AB'
SELECT SUBSTR('ABCDEFG',3,4) FROM DUAL -- 'CDEF'
SELECT INSTR('HELLO','L',1,2) FROM DUAL -- 4
SELECT LPAD('ABC',5,'*') FROM DUAL -- '**ABC'
SELECT RPAD('ABC',5,'*') FROM DUAL -- 'ABC**'
SELECT LTRIM('**ABC','*') FROM DUAL -- 'ABC'
SELECT RTRIM('ABC**','*') FROM DUAL -- 'ABC'
SELECT REPLACE('JACK and JUE','J', 'BL') FROM DUAL -- 'BLACK and BLUE'
SELECT LENGTH('ㅋㅋㅋ') 글자수, LENGTHB('ㅋㅋㅋ') 바이트수 FROM DUAL -- 글자수: 3, 바이트수: 9

日付、時間

YYYY: 4桁の年 / YYY, YY, Y: それぞれ4桁の年の末尾3、2、1桁
MM: 月 / DD: 1ヶ月の中の日付 / DAY: 曜日(月曜日〜日曜日)/ DY: 曜日(月〜日)
HH, HH12: 12時間単位 / HH24: 24時間単位 / MI: 分 / SS: 秒 / AM/PM: 午前/午後

SYSDATE: 現在の日付/時刻を返します
TO_DATE(S1, DATETIME形式): 文字列データを日付形式に変換します。

SELECT TO_DATE ('2023-08-21 오후 03:10','YYYY-MM-DD AM HH:MI') FROM DUAL;

-TO_CHAR(DATE,DATETIME형식): 日付形式を文字列デーに変換します。

SELECT TO_CHAR (SYSDATE,'YYYY-MM-DD') FROM DUAL;
SELECT TO_CHAR (TO_DATE ('2023-08-21 오후 03:10','YYYY-MM-DD AM HH:MI'),'YYYY-MM-DD AM HH:MI') FROM DUAL;

特定の日付値を取得したい場合は、SYSDATEの代わりにTO_DATE関数を使用して指定できます!

ADD_MONTHS(日付, 数値) : 日付から指定した月数を加算します(1: 次の月、-1: 前の月)

SELECT ADD_MONTHS(SYSDATE,-3) FROM DUAL;

LAST_DAY(DATE) : 該当月の最後の日をリターンします。

SELECT LAST_DAY(SYSDATE) FROM DUAL;
SELECT TO_CHAR(SYSDATE,'YYYY')||'년' 연도 FROM DUAL;
SELECT TO_CHAR(SYSDATE,'MM')||'월'FROM DUAL;
SELECT TO_CHAR(SYSDATE,'DD')||'일'FROM DUAL;
SELECT TO_CHAR(SYSDATE,'HH')||'시', TO_CHAR(SYSDATE,'mm') ||'분'FROM DUAL
SELECT TO_CHAR(SYSDATE,'ss')||'초'FROM DUAL;
SELECT TO_CHAR(SYSDATE,'DAY')||'요일' 요일 FROM DUAL;
SELECT TO_CHAR(SYSDATE,'AM') "오전/오후" FROM DUAL;

文字列 '2023-08-23 午前 06:00' ➡ 文字列 2023.08.23
SELECT TO_CHAR 
(TO_DATE ('2023-08-23 오전 06:00','YYYY-MM-DD AM HH:MI'),'YYYY-MM-DD') FROM DUAL;

3か月前の月と最後の日をリターン  ➡ 05-31
SELECT TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE,-3)),'MM-DD') FROM DUAL;

集計/分析関数

AVG(フィールド名) : 平均
COUNT(フィールド名) : 検索されたデータ数
MAX(フィールド名) : 最大値
MIN(フィールド名) : 最小値
SUM(フィールド名) : 合計
RANK: 重複する順位だけ次の順位値を増加させる(1,2,2,4)
DENSE_RANK: 重複する順位が存在しても、連続的に次の順位値として表示する(1,2,2,3)

NVL

NVL関数: NULLの場合に指定した値で置換する関数
NVL(値, NULLのときの代替値)

SELECT NVL(NULL,'B'), NVL('C','B') FROM DUAL;

NVL2関数: NULLの有無に応じて指定した値で置換する関数
NVL2(値, 値があるときの代替値, NULLのときの代替値)

SELECT NVL2(NULL,'A','B'), NVL2('C','A','B') FROM DUAL;

WHERE句(条件式)

全データのうち、指定した条件に一致するデータを検索する文
条件式で使用される演算子 => 比較演算子

--全てのお菓子の名前、価格を取得
SELECT s_name 名前 FROM snack;
SELECT s_price || '円' 価格 FROM snack;

--全てのお菓子の名前(価格)を取得
SELECT s_name||'(' || s_price|| '円)' "名前(価格)" FROM snack;

--2000円以下のお菓子の中で最低価格
SELECT MIN(s_price) FROM snack WHERE s_price <= 2000;

--全てのお菓子の平均価格
SELECT ROUND(AVG(s_price),1) || '円' 平均価格 FROM snack;

--30%割引されたお菓子の名前と価格
SELECT s_name "お菓子名", ROUND(s_price*0.7,1) || '円' "30%割引額" FROM Snack;

--3500円以下のお菓子の数
SELECT COUNT(*) FROM snack WHERE s_price <= 3500;

--4000円以下のお菓子の名前、会社名
SELECT s_name "お菓子名" , s_maker "会社名" FROM Snack WHERE s_price <= 4000;

Discussion