Oracle 基本編 2 (疑似列/疑似テーブル、単関数、NULL 値処理、行-列変換、分析関数、集合演算)

Oracle 基本編 2 (疑似列/疑似テーブル、単関数、NULL 値処理、行-列変換、分析関数、集合演算)

1 疑似カラム、疑似テーブル

1.1 疑似列

rowid : rowid は、テーブル内の行を一意にマークするために使用される疑似列です。これは、物理テーブル内の行データの内部アドレスです。2 つのアドレスが含まれます。1 つは、データ テーブル内の行を含むブロックに格納されているデータ ファイルのアドレスで、もう 1 つは、データ テーブルの行データを直接見つけることができる行です。データブロック内のデータ行自体のアドレス。
各レコードの ROWID は一意ですが、同じクラスタ内では一意ではない可能性があります。ROWIDが一意であることがわかります

rownum : rownum は、Oracle システムがクエリーから返された行に順番に割り当てる番号です。返される最初の行には 1 が割り当てられ、2 番目に返される行には 2 が割り当てられます。このフィールドは、返される行の合計数を制限するために使用できます。また、rownum にテーブル名をプレフィックスとして付けることはできません。

1.2 疑似テーブル

Dual : Dual は確かにテーブル、つまり 1 つのフィールドと 1 行のレコードのみを持つテーブルです。そのフィールドとレコードは無意味です。通常、これを「疑似テーブル」と呼びます。デュアルは、システムに付属しており、システム テーブルであることを意味し、そのテーブル構造は削除または変更できません。
ここに画像の説明を挿入します

2 単機能

2.1 よく使用される文字列関数

2.1.1 length() 指定した文字の長さを問い合わせる

構文: length(string)
説明: string が占める文字の長さを計算します。

select length('ABCD') from dual

結果は4です

2.1.2 substr() は文字列をインターセプトするために使用されます

構文: substr(string string, int a[, int b]);
説明: string をインターセプトする必要があり、a は文字列の開始位置をインターセプトします (注: a が 0 または 1 に等しい場合、インターセプトは最初の位置から開始されます) ) , b インターセプトする文字列の長さ (最後までインターセプトする場合は省略)

select substr('ABCD',2,2) from dual

結果はBCです

2.1.3 文字列連結のための concat()

構文: Concat (式 1, 式 2)
説明: 式 1 の値と式 2 の値を結合表示に使用します。

select concat('A','B') from dual 

結果はABです

他の接合方法もあります

select concat(concat('A','B'),'C') from dual  -- concat只能拼接两个字符串,需要拼接多个需要嵌套

select 'A' || 'B' || 'C' from dual  -- 可以使用 || 进行字符串的拼接

2.2 一般的に使用される数値関数

2.2.1round()丸め

構文: ROUND (数値[,小数点])
説明: 数値はインターセプトされる値で、小数点は保持する必要がある小数点以下の桁数を指定します。オプションで、すべての小数部分を切り捨てて四捨五入する場合は省略します。負の数値の場合は、小数点の左側の桁数を表します。対応する整数は 0 で埋められ、小数点が削除されます。trunc 関数とは異なり、切り取られた数値は四捨五入する必要があることに注意してください。

select round(100.456,2) from dual  -- 100.46

2.2.2 trunc(数値用) デジタル傍受

構文: TRUNC (数値[,小数点])
説明: 数値は、インターセプトされる値です。小数点は、保持される小数点以下の桁数を指定します。これはオプションです。これが無視されると、すべての小数部分が切り捨てられます。
: データはインターセプト時に丸められません。

select trunc(100.456,2) from dual  -- 100.45

2.2.2 mod() 係数

構文: mod(m,n)
説明: (1) MOD は、m を n で割った余りを返します。n が 0 の場合、m を返します。(2) この関数は、任意の数値データ型または任意の非数値データ型をデータ型として受け取ります。パラメータ。暗黙的に数値データ型に変換できます。

select mod(10,3) from dual  -- 1

2.3 一般的な日付関数

2.3.1 sysdate 現在の日時

構文: sysdate
説明: 現在の日付と時刻を返します。

select sysdate from dual  -- 2023-04-11 22:02:30

2.3.2 add_months() 月の追加関数

構文: add_months(times,months)
説明: timetimesに月を追加した後の時間値を計算するために使用されます月の値が負の数の場合、それはこの時点の間の時間値です(this time-months months)。

select add_months(sysdate,2) from dual  -- 2023-06-11 22:06:04

2.3.3 LAST_DAY() 月の最終日

構文: last_day(time)
分析: 指定された日付が位置する月の最後の日を返します。

select last_day(sysdate) from dual -- 2023-04-30 22:08:30

2.3.4 TRUNC (日付用) 日付インターセプト

構文: TRUNC(date[,fmt])
説明: date は日付値です。fmt 日付形式です。日付は指定された日付形式に従って取得されます。日付は無視し、最新の日付から取得します。

select trunc(sysdate,'mi') from dual -- 按分钟截取(把秒截掉,显示当前日期的分钟)
select trunc(sysdate,'hh') from dual -- 按小时截取(把分钟截掉,显示当前日期的小时)
select trunc(sysdate) from dual -- 按日截取(把时间截掉)
select trunc(sysdate,'mm') from dual -- 按月截取(把日截掉,显示当月第一天)
select trunc(sysdate,'yyyy') from dual -- 按年截取(把月截掉,显示当年第一天)

2.4 その他の機能

2.4.1 nvl() null 値関数

構文: NVL (式 1、式 2)
説明: 式 1 が null の場合、NVL は式 2 の値を返し、それ以外の場合は式 1 の値を返します。この関数の目的は、NULL 値を実際の値に変換することです。その式の値は、数値、文字、または日付にすることができます。ただし、式 1 と式 2 のデータ型は同じ型である必要があります。

SELECT NVL(NULL, 0) FROM DUAL;  -- 0

2.4.2 decode()の条件値

構文 1: decode (式、値、結果 1、結果 2)
説明: 式=値の場合は結果 1 を出力、それ以外の場合は結果 2 を出力
構文 1: デコード (式、値 1、結果 1、値 2、結果 2、値 3、結果 3...、デフォルト)
説明 : 式 = 値 1、出力結果 1、式 = 値 2、出力結果 2、式 = 値 3、出力結果 3 の場合、式がリストされたすべての値と等しくない場合、出力はデフォルトになります。

select decode(100,1,2,400,200,500) from dual -- 500

3行-列変換

3.1 PIVOTの使用

構文 1: PIVOT (任意の集計関数 FOR 列名 IN (型))
説明: [集計関数] は列値に変換する必要があるフィールドを集計します; [列名] は列識別子に変換する必要があるフィールドです、[ type] ] は必須の結果表示です。[Type] にはエイリアスを指定でき、IN にはサブクエリを指定することもできます。

SELECT * FROM (
  SELECT 
       A16.INTEREST_RATE_CD
       ,A16.DATA_DT
       ,A16.TERM
       ,A16.INTEREST_RATE
  FROM FACT_FTP260_BSC_A16 A16
)
PIVOT(
        SUM(INTEREST_RATE)
        FOR TERM
        IN ('1D' AS D1   ,'7D' AS D7   ,'14D' AS D14
           ,'1M' AS M1   ,'2M' AS M2   ,'6M' AS M6
           ,'9M' AS M9   ,'1Y' AS Y1    ,'2Y' AS Y2
           ,'3Y' AS Y3   ,'5Y' AS Y5   ,'7Y' AS Y7
           ,'10Y' AS Y10 ,'15Y' AS Y15 )
    )

3.2 sum 関数と DECODE 関数の使用

select (select name from t_area where id = areaid) 区域,
       sum(case when month='01' then money else 0 end)一月,
       sum(case when month='02' then money else 0 end)二月,
       sum(case when month='03' then money else 0 end)三月,
       sum(case when month='04' then money else 0 end)四月,
       sum(case when month='05' then money else 0 end)五月,
       sum(case when month='06' then money else 0 end)六月,
       sum(case when month='07' then money else 0 end)七月,
       sum(case when month='08' then money else 0 end)八月,
       sum(case when month='09' then money else 0 end)九月,
       sum(case when month='10' then money else 0 end)十月,
       sum(case when month='11' then money else 0 end)十一月,
       sum(case when month='12' then money else 0 end)十二月

from t_account
where year = '2012'
group by areaid

3.2 CASE WHEN と GROUP BY を使用する

:この方法が最も一般的であり、価格比較が分かりやすいです。

SELECT
    A16.INTEREST_RATE_CD
    ,SUM(CASE TERM WHEN '1D' THEN A16.INTEREST_RATE ELSE 0 END) AS D1
    ,SUM(CASE TERM WHEN '7D' THEN A16.INTEREST_RATE ELSE 0 END) AS D7
    ,SUM(CASE TERM WHEN '14D' THEN A16.INTEREST_RATE ELSE 0 END) AS D14
    ,SUM(CASE TERM WHEN '1M' THEN A16.INTEREST_RATE ELSE 0 END) AS M1
    ,SUM(CASE TERM WHEN '2M' THEN A16.INTEREST_RATE ELSE 0 END) AS M2
    ,SUM(CASE TERM WHEN '3M' THEN A16.INTEREST_RATE ELSE 0 END) AS M3
    ,SUM(CASE TERM WHEN '6M' THEN A16.INTEREST_RATE ELSE 0 END) AS M6
    ,SUM(CASE TERM WHEN '9M' THEN A16.INTEREST_RATE ELSE 0 END) AS M9
    ,SUM(CASE TERM WHEN '1Y' THEN A16.INTEREST_RATE ELSE 0 END) AS Y1
    ,SUM(CASE TERM WHEN '2Y' THEN A16.INTEREST_RATE ELSE 0 END) AS Y2
    ,SUM(CASE TERM WHEN '3Y' THEN A16.INTEREST_RATE ELSE 0 END) AS Y3
    ,SUM(CASE TERM WHEN '5Y' THEN A16.INTEREST_RATE ELSE 0 END) AS Y5
    ,SUM(CASE TERM WHEN '7Y' THEN A16.INTEREST_RATE ELSE 0 END) AS Y7
    ,SUM(CASE TERM WHEN '10Y' THEN A16.INTEREST_RATE ELSE 0 END) AS Y10
    ,SUM(CASE TERM WHEN '15Y' THEN A16.INTEREST_RATE ELSE 0 END) AS Y15
FROM FACT_FTP260_BSC_A16 A16
GROUP BY 
     A16.INTEREST_RATE_CD

4 分析機能

ランキングに使用可能(1.同じ値でジャンプ、同じ連番でランキング、2.同じ値で連続、同じ連番で同じランキング、3.値の有無に関わらず連続連番)同じだ)

4.1 Rank() は、値が同じ、ランクが同じ、シーケンス番号が同じ場合にジャンプします。

select rank() over(order by usenum desc) 序号,t.* from t_account t

ここに画像の説明を挿入します

4.2 Density_rank() 値が同じ、順位も同じ、通し番号が連続する。

select dense_rank() over(order by usenum desc) 序号,t.* from t_account t

ここに画像の説明を挿入します

4.3 row_number() over() シリアル番号は、値が同じかどうかに関係なく連続します

select row_number() over(order by usenum desc) 序号,t.* from t_account t

ここに画像の説明を挿入します

5. セット操作

5.1 ユニオン全ユニオン(重複レコードを含む)

select * from t_owners where id>5
union all
select * from t_owners where id<8

ここに画像の説明を挿入します

5.2 結合(重複レコードを除く)

select * from t_owners where id>5
union
select * from t_owners where id<8

ここに画像の説明を挿入します

5.3 交差する (2 つのセットの繰り返し部分)

select * from t_owners where id>5
intersect
select * from t_owners where id<8

ここに画像の説明を挿入します

5.4 マイナス差分セット

5.4.1 例 1

select * from t_owners where id>5
minus
select * from t_owners where id<8

ここに画像の説明を挿入します

5.4.2 減算演算のページング

select rownum, t.* from t_account t where rownum <=20
minus
select rownum, t.* from t_account t where rownum <=10

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/slb190623/article/details/130092148