要件:会社にはいくつの部門がありますか?
select department_id from employees;//このコードは107レコードを検出しますが、部門の重複の問題があります。
select distinct department_id from employees;
思考:次のコードに問題はありますか?
select employee_id,last_name,distinct department_id from employees;
回答:問題が発生し(エラーが報告されます)、エラーの理由は、コードの実行中にemployee_idとlast_nameの2つの列に107個のデータがあるためです。
department_idの重複排除後、データは12個しかないため、数が正しくありません。だからそれは間違っていた!概要:個別に使用する場合は注意が必要です...
コンセプト:シングルデータイン、シングルアウト結果(シングルイン、シングルアウト)
分類学習:
1). キャラクター機能
2). ナンバー機能
3). 日付機能
4). 変換機能
5). 一般的な機能
キャラクター機能:
1). ケース変換機能:3
①.lower(m):文字列内のすべての文字をすべて小文字に変換します
②.upper(m):文字列内のすべての文字をすべて大文字に変換します
③.initcap(m):文字列の最初の文字を大文字に、残りの文字を小文字に変換します
コード:
select lower('ORACLE'),upper('oracle'),initcap('oRACLE')from dual;
要件:ベルという名前の人の情報を照会しますか?
select *from employees where lower(last_name)='bell';
select *from employees where upper(last_name)='BELL';
select *from employees where initcap(last_name)='Bell';
2). 文字制御機能:8
①.concat(m、n):文字列mと文字列nを連結して、より長い新しい文字列を取得します
コード:
select concat('Hello','World')from dual;
select concat(last_name,first_name)from employees;
②.length(m):特定のデータの長さを取得します
コード:
select length('python'),length(123456)from dual;
select length(employee_id),length(first_name),length(hire_date)from employees;
③.substr(x、y、z):xを位置yから長さzまでインターセプトして新しい文字列を取得し、プログラムに返します
パラメータの説明:
x:元の文字列データ
y:開始位置(添え字、索引)
z:傍受の長さ
コード:
select substr('HelloWorld',1,5)from dual;
④.instr(m,n):
パラメータの説明:文字列内の文字の位置を初めて決定します
m:文字列
n:1文字
コード:
select instr('HelloWorld','l')from dual;
⑤.replace(x、y、z):x内のすべての文字yを文字zに置き換えます
パラメータの説明:
x:文字列
y:文字列内の文字
z:置き換えられる文字
コード:
select replace('aaabcdaacdaabefaanba','a','6')from dual;
⑥.trim(x from y):y文字列の最初と最後の文字xを削除します
パラメータの説明:
x:文字
y:文字列
コード:
select trim('m'from'mmmmHellmmmomWmmorldmmmmm')from dual;
animeと⑧.lpadとrpadの機能(理解)
lpad(x,y,z):
rpad(x,y,z):
コード:
select lpad(salary,10,'*'),rpad(salary,10,'*')from employees;
①.round(m、n):丸め
②.trunc(m、n):切り捨て
③.mod(m、n):残りを探す
コード:
select round(439.456,1),round(439.456,0),round(439.456,-1)from dual;
select trunc(439.456,1),trunc(439.456,0),trunc(439.456,-1)from dual;
select mod(1100,300)from dual;
1). 日付
2). 時間
①.months_between(m、n):2つの日付の間の月数を計算するために使用されます(正確)
②.add_months(m、n):元のmか月に基づいてnか月を追加または削除します
③.last_day(m):特定の日付がある月の最終日を取得します
キーワード:sysdateは現在のシステム時間を表します
次のコードをテストします。
select sysdate from dual;
上記のコードは、データの日付部分のみを表示できますが、データベースの内部形式の制限により、時刻は表示できません。
変換関数to_char(x、y)を使用して日付と時刻を表示できます
補足:オラクルの特別な文字には次のものがあります
yyyy:年
mm:月
dd:日
日:週
hh:時間(1-12)
hh24:時間(0-23)
mi:分
ss:秒
上記のコードをリファクタリングして、日付と時刻のデータを表示します。
select to_char(sysdate,'yyyy-mm-dd hh:mi:ss')from dual;
次のコードを参照してください。
select sysdate +1,sysdate,sysdate -2from dual;select(sysdate - hire_date)from employees;
総括する:
日付データは数値で加算および減算でき、結果は前後の日数になります
日付と日付データのみを差し引くことができる場合、結果は2つの日付データ間の日数になります
場合:
1). 会社の従業員が入社してから何日経ちましたか? (切り捨てを使用して整数ビットを維持し、エイリアスworked_day)
select last_name,hire_date,trunc(sysdate - hire_date)"worked_day"from employees;
2). 会社の従業員が入社してから何ヶ月が経ちましたか? (大まかなバージョン:毎月30日と仮定)
select last_name,hire_date,(sysdate - hire_date)/30"month_work",months_between(sysdate,hire_date)"mon_work"from employees;
3). 毎月最後から2日目に入社する社員についてお問い合わせください。
select last_name,hire_date from employees
where last_day(hire_date)-1= hire_date;
select last_day(sysdate)from dual;
select add_months(sysdate,2),add_months(sysdate,-3)from dual;
1). to_date
2). to_char
3). to_number
補足:
変換機能に関係するフォーマット文字:
9- - > 1ビットを表します
99- - > 2桁を表します
例えば:
select to_number('123456','999999')from dual;//初期バージョン、フォーマットを定義する必要があります(桁)
select to_number('123456')from dual;//新しいバージョン、フォーマットは省略できます
【予防】:
データ変換にto_number関数を使用する場合、変換する必要のあるデータの正しい長さを計算する必要があります。
フォーマットに必要な桁数を正確に定義するために、桁数が少なすぎると、エラーが直接報告されます。 !
要求する:
会社員の部署番号を問い合わせると、部署がない場合は「部署なし」と表示されます。
select last_name,department_id,nvl(to_char(department_id,'999'),'部門なし')from employees;
select last_name,department_id,nvl(to_char(department_id),'部門なし')from employees;
1). nvl(expr1,expr2):
2). nvl2(expr1,expr2,expr3):
nvl2関数の実行フロー:
実行プロセスでは、expr1が最初に実行され、expr1の結果がnullでない場合、expr2が実行されます。
expr1の結果がnullの場合は、expr3を実行します。
要求する:
従業員番号、名前、給与、ボーナス率を照会します。
ボーナスレートが空でない場合、ボーナスレート+0.015の後の結果が表示されます。
ボーナスレートが空の場合、0.01が表示されます。
コード:
select employee_id,last_name,salary,commission_pct,
nvl2(commission_pct,commission_pct + 0.015,0.01) "new_comm"
from employees;
sqlの判断構造の紹介と説明:
2種類:
1). ケース式
テンプレート形式:
expr1 thenxの場合のケースフィールド
when expr2 then y
when expr3 then z
...
else n end;
要求する:
会社の従業員の番号、名前、給与、部門番号を照会し、
部門70の従業員の場合、給与の1.1倍が表示されます。
部門80の従業員の場合、給与の1.2倍が表示されます。
部門90の従業員の場合、給与の1.3倍が表示されます。
他の部門は通常の賃金を示しています。
コードは次のように表示されます。
select employee_id,last_name,salary,department_id,case department_id when 70 then salary *1.1
when 80 then salary *1.2else salary *1.3 end
- - when 90 then salary *1.3 end
- - else salary end
from employees
where department_id in(70,80,90);
2). デコード機能
テンプレート形式:
decode(field、expr1、val1、expr2、val2、...):
要求する:
会社の従業員の番号、名前、給与、部門番号を照会し、
部門70の従業員の場合、給与の1.1倍が表示されます。
部門80の従業員の場合、給与の1.2倍が表示されます。
部門90の従業員の場合、給与の1.3倍が表示されます。
他の部門は通常の賃金を示しています。
コードは次のように表示されます。
select employee_id,last_name,salary,department_id,decode(department_id,70,salary *1.1,80,salary *1.2,--90,salary *1.3,
salary *1.3)from employees
where department_id in(70,80,90);
Recommended Posts