본문 바로가기

데이터베이스/ORACLE

(54)
[ORACLE] SQL 명령어 분류표 및 의미 명령어 분류표 질문 QUERY에 SELECT만 따로 빼놓은 이유는? - 학자에 따라 5개의 카테고리, 4개의 카테고리로 분류하기도 한다. - QUERY는 조작이 아니라 단순히 조회만 하기 때문에, DML보다 QUERY라는 별도의 카테고리에 넣는 것이 맞다는 의견도 있다. 명령어의 대상 - QUERY: (데이터를 조회) QUERY - DML: (데이터를) INSERT(입력), UPDATE(수정), DELETE(삭제) - DDL: (OBJECT를) CREATE(생성), ALTER(변경), DROP(삭제) - TCL: (TRANSACTION을) COMMIT(저장), ROLLBACK(취소), SAVEPOINT(임시 저장점) - DCL: (권한을) GRANT(부여), REVOKE(취소)
[ORACLE] Data Dictionary(System catalog) RDMBS에 저장되는 데이터의 종류 1. System data: USER_TABLES, USER_CONSTRAINTS 등 2. User data: EMP, DEPT 등 Data Dictionary 정의 읽기전용으로 제공되는 테이블 및 뷰들의 집합으로, DB전반에 대한 정보를 제공함. 데이터 사전에 저장되는 내용 - 오라클의 사용자 정보 - 오라클 권한과 롤 정보 - 데이터베이스 스키마 객체(Table, View, Index, Sequence 등) 정보 - 무결성 제약조건에 관한 정보 - DB 구조 정보 - 오라클 DB 함수와 프로시저 및 트리거에 대한 정보 - 기타 일반적인 DB 정보 종류 포함 관계: DBA_ > ALL_ > USER_ USER_XXXX: 특정 사용자가 조회 가능한 데이터 사전 Owne..
[ORACLE] SELECT ~ FOR UPDATE 기능 및 용도 SELECT ~ FOR UPDATE 정의 선택된 행들에 대해 배타적인 LOCK을 설정하는 기능이다. SELECT FOR UPDATE 문을 통해 커서 결과 집합의 레코드를 잠글 수 있다. 이 문을 사용하기 위해 레코드를 변경할 필요는 없다. (일반적인 SELECT 문장은 SHARED LOCK이다. 즉, 다른 사람도 동시에 접근할 수 있다.) SELECT ~ FOR UPDATE 특징 - update, delete만 row level lock이 걸린다. (select, insert는 상관 없음?) - 오라클에서 lock은 table 단위 lock이 아니라, 처리할 데이터 row 레벨 lock. SELECT ~ FOR UPDATE 용도 - 은행의 예금 및 통장의 잔액 변경의 일관성을 유지하려고 할 때 - 영화 ..
[ORACLE] 'GROUP BY 구 없이 그룹 함수가 내포되었습니다' 에러 에러나는 상황 SELECT SUM(DECODE(DEPTNO, 10, COUNT(JOB), 0)) AS "10번부서", SUM(DECODE(DEPTNO, 20, COUNT(JOB), 0)) AS "20번부서", SUM(DECODE(DEPTNO, 30, COUNT(JOB), 0)) AS "30번부서" FROM EMP; 원인 - COUNT 함수는 그룹행 함수다. 여러 행이 한번에 들어가야하는데, DEPTNO가 10인 행의 데이터가 각각 인자로 들어가는 상황이다. - 여기서 GROUP BY가 필요한 이유는, DEPTNO가 10, 20, 30인 데이터를 각각 하나로 모우는 임시 테이블을 만들기 위해서다(뇌피셜) - 만들어진 임시 테이블에서는 전체 행이 각각 10, 20, 30일테니까 COUNT 함수를 사용할 수 ..
[ORACLE] 부서별 컬럼을 만들고, 직원 수를 나타내기(GROUP BY or 조건문 활용) 문제 다음과 같은 결과를 생성하는 SQL 작성 10번부서 20번부서 30번부서 3 5 6 정답1 SELECT SUM(DECODE(DEPTNO, 10, COUNT(DEPTNO), 0)) AS "10번부서", SUM(DECODE(DEPTNO, 20, COUNT(DEPTNO), 0)) AS "20번부서", SUM(DECODE(DEPTNO, 30, COUNT(DEPTNO), 0)) AS "30번부서" FROM EMP GROUP BY DEPTNO; 정답2 SELECT COUNT(CASE WHEN DEPTNO = 10 THEN 1 END) AS "10번부서", COUNT(CASE WHEN DEPTNO = 20 THEN 1 END) AS "20번부서", COUNT(CASE WHEN DEPTNO = 30 THEN 1 ..
[ORACLE] 82년도에 입사한 직원 찾기(LIKE 활용) SELECT HIREDATE FROM EMP WHERE TO_CHAR(HIREDATE,'YY-MM-DD') LIKE '82%';
[ORACLE] DISTINCT 함수의 알고리즘 차이(9i VS 10g) ORACLE 9i - SORT 알고리즘 사용 ORACLE 10g - HASH 알고리즘 사용 - 대용량 데이터 처리가 이슈가 됐다. 대용량 데이터를 SORT 할 때 굉장히 속도가 느려진다. CPU, MEMORY 등을 많이 쓰기 때문에 비효율적임. - HASH 알고리즘을 써서 병렬처리를 함.
[ORACLE] 해당 월의 마지막 법정 영업일자를 구하기(SYSDATE, 조건문 활용) 문제 아래 SQL을 참고하여 해당월의 마지막 법정 영업일자를 구하는 SQL을 작성(법정 영업일은 월~금요일) SELECT TO_CHAR(SYSDATE,'DDD'), TO_CHAR(SYSDATE,'DD'), TO_CHAR(SYSDATE,'D') FROM DUAL; SELECT LAST_DAY(SYSDATE) FROM DUAL; 정답1 (CASE 활용) SELECT CASE WHEN TO_CHAR(LAST_DAY(SYSDATE), 'DAY') = '일요일' THEN TO_CHAR(LAST_DAY(SYSDATE)-2) WHEN TO_CHAR(LAST_DAY(SYSDATE), 'DAY') = '토요일' THEN TO_CHAR(LAST_DAY(SYSDATE)-1) ELSE TO_CHAR(LAST_DAY(SYSDA..