Day24

37958 ワード

Day24


1.スクリプトをインストールし、スクリプトによって生成されたテーブルをバインドします/(SQLPLSSQSL Sample w 2.0.sql)
2.クエリーは、結合タイプとoracleタイプ、Ansiタイプを使用して実装できます.
3.署名の概念を理解し、体現することができる.
授業の進度.
DML、DDL、TCL順(CRUD)->インストール->アーキテクチャ(勘定科目、権限、テーブル)->SELECT構文->集約関数->関数(数値、文字列、日付)
->結合(テーブル間のカラムマッチング)->サブクエリ(ネストされたクエリ)->CRUD[VIEW]->制約
->トランザクション->トリガ->インデックス->ユーザー関数、プロシージャ(PLS/SQL)
講師はここで何人かやらなくてもいいと言っているようです

質問する


Q1.'「2010年1月1日」を基準に、入社10年以上の従業員の勤務年数を照会します.
ただしMonths BETWEEN(「10/01/01」、目標欄)を利用して、社員の名前、入社日、別名で勤務年数を求めます.
SELECT EMP_NAME,HIRE_DATE,MONTHS_BETWEEN('10/01/01',HIRE_DATE)/12 AS 근무년수
FROM EMPLOYEE
WHERE MONTHS_BETWEEN('10/01/01',HIRE_DATE) > 120;
Q2.私たちは400人の従業員の名前と給料を印刷します.
SELECT EMP_NAME,SALARY
FROM EMPLOYEE
WHERE EMP_ID = 100; 

WHERE EMP_ID = TO_CHAR(100); ->명시 형 변환

WHERE EMP_ID = '100';
Q3.名前と入社日を別名で印刷しますが、入社日は0000-00-00で印刷します.
ただしJOB IDはJ 7のみ抽出される.
EX) N<-> C <-> D
SELECT EMP_NAME AS 이름 ,TO_CHAR(HIRE_DATE,'YYYY-MM-DD') AS 입사일
FROM EMPLOYEE
WHERE JOB_ID = 'J7';
 SELECT EMP_NAME AS 이름 ,TO_CHAR(HIRE_DATE,'YYYY"년"-MM"월"-DD"일"') AS 입사일
Q4. JOB IDがJ 1、J 2の従業員の氏名、基本入社日、詳細入社日を別名として出力します.
詳細入社日を0000/00:00:00に出力します.
SELECT EMP_NAME AS 이름,HIRE_DATE AS 기본입사일,TO_CHAR(HIRE_DATE,'YYYY/MM/DD HH24:MI:SS') AS 상세입사일
 FROM EMPLOYEE
 WHERE JOB_ID IN('J1','J2');
===========================
WHERE JOB_ID ='J1' OR JOB_ID ='J2';
Q5. 寒暑期90/04/012090/04/0113:30:30
90年04月01日入社社員の名前と入社日を印刷します.
SELECT EMP_NAME,HIRE_DATE
FROM EMPLOYEE
WHERE TO_CHAR(HIRE_DATE,'YYMMDD')='900401';
===========================
WHERE HIRE_DATE = TO_DATE('900401 133030','YYMMDD HH24MISS');

RR日付フォーマット


Q6. Oracleに表示される世紀RR日付フォーマット
  • YY日付フォーマットと同じです.
  • の「指定した年」と「現在の年」によって、返される「世紀」の値が異なります.
  • SELECT EMP_NAME,HIRE_DATE,TO_CHAR(HIRE_DATE,'YYYY/MM/DD')
    FROM EMPLOYEE
    WHERE EMP_NAME='한선기';
    ===========================
    SELECT EMP_NAME,HIRE_DATE,TO_CHAR(HIRE_DATE,'RRRR/MM/DD')
    FROM EMPLOYEE
    WHERE EMP_NAME='한선기';

    講師は簡単だと言っていますが、正直これは何なのか分かりません.
    第2の例から見ると、現在は1995年である.
    最後に2番目の数字95を持って代入します.
    1.95は、底部50~99に相当します.
    2.指定した年は17で、左側にあります.
    3.再来世紀の回車交差点->RR回車再来世紀2017
    YYは、現在の年に基づいて指定された日付を入力します.
    Q7.RRとYYを比較して印刷します.
    SELECT '2009/10/14' AS 현재,   '95/10/27' AS 입력,
     TO_CHAR(TO_DATE('95/10/27','YY/MM/DD'),'YYYY/MM/DD') AS YY
    SELECT '2009/10/14' AS 현재,   '95/10/27' AS 입력,
         TO_CHAR(TO_DATE('95/10/27','YY/MM/DD'),'YYYY/MM/DD') AS YY형식1,
         TO_CHAR(TO_DATE('95/10/27','YY/MM/DD'),'RRRR/MM/DD') AS YY형식2,
         TO_CHAR(TO_DATE('95/10/27','RR/MM/DD'),'YYYY/MM/DD') AS RR형식1,
         TO_CHAR(TO_DATE('95/10/27','RR/MM/DD'),'RRRR/MM/DD') AS RR형식2
         FROM DUAL;
    SELECT EMP_NAME,HIRE_DATE,TO_CHAR(TO_DATE('90/04/01','RR/MM/DD'),'YYYY/MM/DD')
    FROM EMPLOYEE
    WHERE EMP_NAME ='한선기';

    DECODE


    Q8. その他の単行関数-DECODE
    SELECT構文有限を使用してIF-ELSEロジックを実装するOracle関数
    DECODE(expr,search1,result1[, searchN, resultN,...][, default])
    expr:ターゲット列または文字列
    search 1:exprと比較する値
    結果1:IF expr=search 1が返す値
    default:exprとsearch 1が一致しない場合のデフォルトの戻り値
    defaultが指定されておらず、exprとsearch 1が一致しない場合はNULL値を返します.
    従業員テーブルに従業員の名前と性別を印刷します.
    SELECT EMP_NAME, DECODE(SUBSTR(EMP_NO,8,1), '1','남','2','여','3','남','4','여')AS 성별
    FROM EMPLOYEE;
    ------------------1、3=「男」残りの「女」
    SELECT EMP_NAME, DECODE(SUBSTR(EMP_NO,8,1), '1','남','3','남','여')AS 성별
    FROM EMPLOYEE;
    Q9. 「≪従業員|Employee|Planning≫」表で、従業員番号、従業員名およびマネージャを別名として出力します.
    管理者がいない場合は、「なし」として出力されます.DECODE
    SELECT EMP_ID AS "사원의 번호" , EMP_NAME AS "사원의 이름",
    DECODE(MGR_ID, NULL,'없음', MGR_ID) AS 관리자
    FROM EMPLOYEE;
    
    ==============================
    SELECT EMP_ID AS "사원의 번호" , EMP_NAME AS "사원의 이름",
    NVL(MGR_ID, '없음') AS 관리자
    FROM EMPLOYEE;
    Q10. 社員の名前、職業、給料、昇給を別称で印刷する
    昇給はDECODEを利用して、もし雑なIDがJ 7ならば、給料の1.1、J 6、給料の1.15、
    J 5面給与の1.2、残りは1.05アップ
    SELECT EMP_NAME AS 이름, JOB_ID AS 직업,
    TO_CHAR(SALARY, 'L999,999,999') AS 봉급,
    DECODE(JOB_ID, 'J7', SALARY*1.1, 'J6', SALARY*1.15, 'J5', SALARY*1.2, SALARY*1.05) AS 인상급여
    FROM EMPLOYEE;
    
    Q11.ANSI標準構文、DECODE関数に類似
  • CASE expr WHEN search1 THEN result1 [WHEN...THEN...][ELSE default ] END
  • CASE WHEN condition1 THEN result1 [WHEN...THEN...][ELSE default ] END
  • SELECT EMP_NAME AS "사원의 이름", JOB_ID AS "직업",
    TO_CHAR(SALARY, 'L999,999,999') AS 봉급,
    CASE JOB_ID
    WHEN  'J7' THEN SALARY*1.1
    WHEN 'J6' THEN SALARY*1.15
    WHEN 'J5' THEN SALARY*1.2
    ELSE SALARY*1.05 END AS 인상급여
    FROM EMPLOYEE;
    Q12. 従業員の番号、名前、区分を印刷しますが、CASE文を区別して使用します.
    分割給与が300以下であれば、初級、400以下であれば、中級剰余分は上級に出力されます.
    SELECT EMP_ID AS "사원의 번호", EMP_NAME AS 이름,
    TO_CHAR(SALARY, 'L999,999,999') AS 봉급,
    CASE WHEN SALARY <= 3000000 THEN '초급'
    WHEN  SALARY <= 4000000 THEN '중급'
    ELSE '고급' END AS 구분
    FROM EMPLOYEE;
    Q13.社員の名前と電子メールのIDを印刷します.ただしIDは電子メールのIDのみを出力します.
    EX ) sg_ahn@vccあ、comならsg ahnのみIDとして出力し、SUBSTR INSTR
    SELECT EMP_NAME, EMAIL,EMP_ID, SUBSTR(EMAIL,1,INSTR(EMAIL, '@')-1)AS ID
    FROM EMPLOYEE;
    
    Q14. 基本平均、重複除外平均、NULL平均を含むBOUNUS PCTの平均を計算します.
    SELECT AVG(BONUS_PCT) "기본 평균" ,
    	AVG(DISTINCT BONUS_PCT) "중복 제거",
    	AVG(NVL(BONUS_PCT,0)) "NULL 포함 평균"
    FROM EMPLOYEE;
    =================================

    joinの必要性を考えてみましょう。

  • に関連付けられた他のテーブルの列を一度に表示するためのテクニック

    つまり、別のテーブルに存在する列を参照して、交差状態でクエリーを行うことができます.
  • SELECT EMP_NAME,DEPT_NAME , E.DEPT_ID
    FROM EMPLOYEE E, DEPARTMENT D
    WHERE E.DEPT_ID = D.DEPT_ID;
    両方のテーブルに同じ名前のカラムがある場合.
    WHEREセクション:表区切りが必要
    SELECT部:2つの表の列の値は同じですが、文法的にどの表がその列の値を表示するかを区別する必要があります.
    JOIN->ANSI標準構文
    SELECT
    FROM TALBE1 (
    [INNER] JOING TALBLE2 ON (condition1 [AND condition2]) |
    [INNER] JOING TALBLE2 USING (column1 [,....]) |
    NATURAL [INNER] JOIN TABLE2 |
    LEFT | RIGHT | FULL [OUTER] JOIN TABLE2 ON (condition1 [AND condition2]) |
    LEFT | RIGHT | FULL [OUTER] JOIN TABLE2  USING (column1 [,...])   |
    CROSS JOIN TABLE2)
    WHERE

    INNER JOIN


    Q15. INNER JOIN:結合条件として使用するカラム名が同じであれば、NULLとFALSE値は出力されません.
    従業員の表と部門表に、従業員の名前、部門番号、部門名を印刷します.
    ANSI  ---
    SELECT ENAME,DEPTNO,DNAME
    FROM EMP 
    INNER JOIN DEPT USING(DEPTNO);
    
    SELECT ENAME,DEPTNO,DNAME
    FROM EMP 
      JOIN DEPT USING(DEPTNO);             =  INNER 를 생략가능
    
    ORACLE --
     SELECT ENAME,E.DEPTNO,DNAME
     FROM EMP E, DEPT D
    WHERE E.DEPTNO = D.DEPTNO;
    Q16. 2色はUSINGでINNERJOINできます
    SELECT EMP_NAME, LOC_ID
    FROM EMPLOYEE2
    JOIN DEPARTMENT USING(DEPT_ID,LOC_ID);
    Q17. 結合条件に使用するカラム名は、同時に使用できません.ON
    ANSI ----
    
    SELECT DEPT_NAME,LOC_DESCRIBE
    FROM DEPARTMENT
    JOIN LOCATION ON (LOC_ID  =  LOCATION_ID);
    
    
    ORACLE----
    
    SELECT DEPT_NAME,LOC_DESCRIBE
    FROM DEPARTMENT, LOCATION
    WHERE LOC_ID = LOCATION_ID;
    

    OUTER JOIN


    Q18. OUTER JOIN:メインテーブルの内容はすべて出力し、テーブルの内容からTUREのみ出力します.
    CREATE TABLE X(
    X1 NUMBER,
    X2 NUMBER);
    CREATE TABLE Z(
    Z1 NUMBER,
    Z2 NUMBER);
    X Z
    X1 X2 | Z1 Z2
    1 111 | 111 2
    2 333 | 222 3
    3 444 | 444 4
    4 555 | NULL NULL
    INSERT INTO X VALUES(1,111);
    INSERT INTO X VALUES(2,333);
    INSERT INTO X VALUES(3,444);
    INSERT INTO X VALUES(4,555);
    INSERT INTO X VALUES(NULL,NULL);
    
    INSERT INTO Z VALUES(111,2);
    INSERT INTO Z VALUES(222,3);
    INSERT INTO Z VALUES(444,4);
    INSERT INTO Z VALUES(NULL,NULL);
    SELECT * FROM X JOIN Z ON (X2 = Z1); // INNER JOIN
    SELECT * FROM X JOIN Z ON (X1 = Z2);                      (NULL,FALSE값은 출력 되지 않는다)
    Q19. プライマリスレーブ関係テーブルフォーマットでは、プライマリテーブルのすべてのコンテンツのみが出力され、スレーブテーブルの値はTRUEの値である.
    ANSI ------
    
    SELECT *
    FROM X LEFT OUTER JOIN Z ON (X2 = Z1);
     
    SELECT *
    FROM X RIGHT OUTER JOIN Z ON (X2 = Z1);
    
    
    ORACLE ----  (+) 주종관계 에서 종 테이블의 컬럼에(+) 키워드를 지정한다.
    
     SELECT *
     FROM X,Z
     WHERE X.X2 = Z.Z1(+);
    
    
     SELECT *
     FROM X,Z
     WHERE X.X2(+) = Z.Z1;
    
    Q.20 FULL OUTER JOIN
    SELECT *
    FROM X FULL JOIN Z ON (X2 =Z1);
    Q21. CROSS JOIN:全組合せの結果を返す
    ANSI----
    SELECT *
    FROM X CROSS JOIN Z;
    
    SELECT EMPNO,ENAME,DNAME
    FROM EMP CROSS JOIN DEPT;
    
    
    ORACLE----
    
    SELECT *
    FROM X ,Z;
    
    SELECT EMPNO,ENAME,DNAME
    FROM EMP ,DEPT;
    Q22. JOIN-NON-Equjoin:カラム値が同じ範囲に属するかどうかを決定する結合です.
    社員の名前、給料、等級を印刷します.
    ANSI----
    SELECT ENAME,SAL,GRADE
    FROM EMP JOIN
     SALGRADE ON (SAL BETWEEN LOSAL AND HISAL);
    
    
    ORACLE---
    
    SELECT ENAME,SAL,GRADE
    FROM EMP,SALGRADE
    WHERE SAL BETWEEN LOSAL AND HISAL;

    SELF JOIN


    Q23. SELF JOIN:1つのテーブルを2回チェックインするタイプ
    ≪メソッド|Method|emdw≫:1つのテーブルを2つの別名として宣言します.
    「≪従業員|Employee|Planning≫」表の従業員番号と管理者番号を使用して、従業員、管理者別名として出力します.
    SELECT E.ENAME AS 직원,
    M.ENAME AS 관리자
    FROM EMP E
    LEFT JOIN EMP M ON(E.MGR = M.EMPNO);