비교 연산자 ANY(만족하는 값 하나만 있으면 됨)
조건 | 결과 | 설명 |
1000 > ANY (500, 1000, 2000) | TRUE | ANY 값에 1000 보다 작은 500이 있으므로 TRUE |
1000 = ANY (500, 1000, 2000) | TRUE | ANY 값에 같은 값 1000이 있으므로 TRUE |
2000 < ANY (500, 1000, 2000) | FALSE | ANY 값에 2000 보다 큰 값이 없으므로 FALSE |
= ANY | 하나라도 만족하는 값이 있으면 결과를 리턴 (IN과 동일) |
> ANY | 값들 중 최소값 보다 크면 결과를 리턴 |
>= ANY | 값들 중 최소값 보다 크거나 같으면 결과를 리턴 |
< ANY | 값들 중 최대값 보다 작으면 결과를 리턴 |
<= ANY | 값들 중 최대값 보다 작거나 같으면 결과를 리턴 |
<> ANY | 모든 값들 중 다른 값만 리턴 (값이 하나일 때만 가능, 사용X) |
SOME은 ANY와 이름만 다를 뿐 동일한 기능이다.
ALL
ALL(30, 50)은 30보다 작고 50보다 작아야 한다. 두 개의 값을 모두 만족해야 함
IN, NOT IN, EXISTS, NOT EXISTS
IN에서 Null은 포함되지 않는다. IS Null로 비교해야 한다.
NOT IN의 경우 조회를 할 때 값이 없으면 ROW가 나와야 할 것 같지만 Null 값이 하나라도 포함되어 있으면 Null을 비교하면서 NOT IN 조건 전체가 false가 되어버려 아무 ROW가 나오지 않는다.
EXISTS는 존재하느냐 존재하지 않느냐의 여부만 체크하기 때문에 서브쿼리의 SELECT 리스트에는 등장하는 값과는 상관없이 서브쿼리의 결과로 반환되는 로우가 있느냐 없느냐만 중요한 것이다. 따라서 IN과 EXISTS는 동일한 결괏값을 출력한다. 반면 NOT IN과 NOT EXISTS는 결괏값이 다를 수 있다.
데이터 모델링
- 논리 모델링의 외래키는 물리 모델에서 반드시 구현되지 않는다.
- 실제 데이터 베이스 구축 시 참고되는 모델은 물리적 데이터 모델링이다.
- 개념 모델링에서 물리 모델링으로 가면서 더 구체적이며 개념 모델링이 가장 추상적이다.
- 물리 → 논리 → 개념 갈수록 추상적
- 데이터 모델링의 3가지 요소는 Thing, Attirbutes, Relationship이다.
개념적 데이터 모델링
추상화 수준이 높고 업무중심적이고 포괄적인 수준의 모델링 진행 전사적 데이터 모델링, EA 수립 시 많이 이용됨
엔터티, 인스턴스, 속성, 속성 값
- 하나의 속성은 하나의 속성값을 가지며 하나 이상의 속성값을 가지는 경우 정규화가 필요함
- 한 개의 엔터티는 두 개 이상의 인스턴스의 집합이어야 한다.
- 한 개의 엔터티는 두 개 이상의 속성을 갖는다.
- 하나의 엔터티의 인스턴스는 다른 엔터티의 인스턴스 간의 관계인 Paring을 가진다.
function(3.46) 함수 결과 값 다른 경우
- FLOOR : 숫자보다 작거나 같은 최대 정수를 리턴 → 3
- CEIL/CEILING : 숫자보다 크거나 같은 최소 정수를 리턴 → 4
- TRUNC : 숫자를 소수 m 자리에서 잘라서 리턴 (m default : 0) → 3
- ROUND : 숫자를 소수 m 자리에서 반올림하여 리턴 (m default : 0) → 3
정규화
1차 정규형
- 모든 속성은 반드시 하나의 값을 가져야 한다. 즉, 반복 형태가 있어서는 안 된다.
- 각 속성의 모든 값은 동일한 형식이어야 한다.
- 각 속성들은 유일한 이름을 가져야 한다.
- 레코드들은 서로 간에 식별 가능해야 한다.
2차 정규형
- 식별자가 아닌 모든 속성들은 식별자 전체 속성에 완전 종속되어야 한다.
- 이것을 물리 데이터 모델의 테이블로 말하면 기본키가 아닌 모든 칼럼들이 기본키에 종속적이어야 2차 정규형을 만족할 수 있다는 것이다
3차 정규형
- 2차 정규형을 만족하고 식별자를 제외한 나머지 속성들 간의 종속이 존재하면 안 된다.
- 이것이 3차 정규형을 만족하는 것이다.
ROLLUP
ROLLUP구문은 GROUP BY 절과 같이 사용되며, GROUP BY절에 의해서 그룹 지어진 집합 결과에 대해서 좀 더 상세한 정보를 반환하는 기능을 수행한다.
SELECT절에 ROLLUP을 사용함으로써 보통의 SELECT 된 데이터와 그 데이터의 총계를 구할 수 있다.
CUBE
SQL> SELECT b.dname, a.job, SUM(a.sal) sal, COUNT(a.empno) emp_count
FROM emp a, dept b
WHERE a.deptno = b.deptno
GROUP BY CUBE(b.dname, a.job)
DNAME JOB SAL EMP_COUNT
---------- ---------- ---------- ----------
ACCOUNTING CLERK 1300 1
ACCOUNTING MANAGER 2450 1
ACCOUNTING PRESIDENT 5000 1
ACCOUNTING 8750 3 --> ACCOUNTING 부서의 직업별 급여의 총계와 사원 수.
RESEARCH ANALYST 6000 2
RESEARCH CLERK 1900 2
RESEARCH MANAGER 2975 1
RESEARCH 10875 5 --> RESEARCH 부서의 직업별 급여의 총계와 사원 수.
SALES MANAGER 28500 1
SALES SALESMAN 4000 3
SALES 32500 4 --> SALES 부서의 직업별 급여 총계와 사원수.
ANALYST 6000 2
CLERK 3200 3
MANAGER 33925 3
PRESIDENT 5000 1
SALESMAN 4000 3
52125 12 --> 직업별로 급여의 총계와 사원 수.
- CUBE는 Cross-Tab에 대한 Summary를 추출하는 데 사용된다
- 즉 ROLLUP에 의해 나타 내어지는 Item Total값과 Column Total값을 나타 낼 수 있다.
Grouping 함수
: pseudo column (의사컬럼 : 실제로는 존재하지 않으나 특수목적으로 사용)
GROUPING 함수는 ROLLUP, CUBE에 모두 사용할 수 있다.
GROUPING 함수는 해당 Row가 GROUP BY에 의해서 산출된 Row인 경우에는 0을 반환하고, ROLLUP이나 CUBE에 의해서 산출된 Row인 경우에는 1을 반환하게 된다.
따라서 해당 Row가 결과집합에 의해 산출된 Data 인지, ROLLUP이나 CUBE에 의해서 산출된 Data 인지를 알 수 있도록 지원하는 함수이다.
GROUP BY ROLLUP(DNAME,JOB)
= GROUP BY DNAME,JOB
UNION ALL
GROUP BY DNAME
UNION ALL
모든 집합 그룹 결과
GROUP BY GROUPING SET(DNAME,JOB)
= GROUP BY DNAME
UNION ALL
GROUP BY JOB
GROUP BY CUBE(DNAME,JOB)
= GROUP BY DNAME,JOB
UNION ALL
GROUP BY DNAME
UNION ALL
GROUP BY JOB
UNION ALL
모든 집합 그룹 결과
ANSI SQL JOIN
ANSI SQL에서 조인 조건절(ON 절)에 사용된 조건절은 조인 전 조건으로 작용한다. ON 절 이후 WHERE 절에서 쓰인 조건절은 조인 후 조건절로 사용된다.
조인 조건과 조회 조건이 분리되어야 하므로 조회 조건은 WHERE 절로 분리되어야 함
SQL Server vs Oracle
SQL SERVER의 IDENTITY로 지정된 칼럼에는 값을 넣으면 에러가 남 ORACLE의 CHECK 조건을 만족하지 못할 경우 에러가 나나 NULL 은 무시됨(Null Row Insert 가능)
Hash Join
- Hash Join 은 Non Equal Join 은 불가능함. Equal Join 만 가능함
- 사전 Sorting 작업이 필요한 Join 알고리즘은 Sort Merge Join 임
- 각 테이블에 인덱스가 반드시 필요한 것은 아니다.
- 일반적으로 작은 테이블을 Memory에 올리는 선행 테이블로 사용한다.
SQL 수행 순서
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
문자 비교
SAPCE를 추가하여 길이를 맞춰 비교하는 방법은 CHAR 타입인 경우임
SQL 결합 함수
Oracle의 결합 함수 : CONCAT, /, ||
SQL Server : +
SQL Server TOP vs Oracle Rownum
TOP (Expression) [PERCENT] [WITH TIES]
- WITH TIES : ORDER BY 조건 기준으로 TOP N의 마지막 행으로 표시되는 추가 행의 데이터가 같을 경우 N + 동일 정렬 순서 데이터를 추가 반환하도록 지정하는 옵션 (마지막 기준 공통일 경우 모두 출력)
ROWNUM < 4의 의미는 3건까지 출력이므로 TOP(3) 임 WITH TIES를 사용할 경우 동일 데이터가 있을 때 추가 건수가 출력되는 현상이 가능함
ANSI Join SQL
NATURAL JOIN에서 사용된 열은 식별자를 가질 수 없음. 즉 EMP.DEPTNO 와 같이 OWNER 명을 사용하면 에러가 난다.
엔터티 기준
- 엔터티는 사람, 장소, 물건, 사건, 개념 등의 명사에 해당한다.
- 엔터티는 업무상 관리가 필요한 관심사에 해당한다.
- 엔터티는 저장이 되기 위한 어떤 것(Thing)이다.
계층형 SQL
- CONNECT_BY_ISLEAF : 전개 과정에서 해당 데이터가 리프 데이터면 1, 아니면 0
- CONNECT_BY_ISCYCLE : 전개 과정에서 자식을 갖는데, 해당 데이터가 조상으로 존재하면 1, 그렇지 않으면 0 여기서 조상이란 자신으로부터 루트까지의 경록에 존재하는 데이터를 말함
- SYS_CONNECT_BY_PATH : 하위 레벨의 칼럼까지 모두 표시해 줌 (구분자 지정 가능)
- CONNECT_BY_ROOT : Root 노드의 정보를 표시
RANGE BETWEEN start_point AND end_point
- start_point는 end_point와 같거나 작은 값이 들어감
- Default값은 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
- UNBOUNDED PRECEDING : start_point만 들어갈 수 있으며, 파티션의 first row
- UNBOUNDED FOLLOWING : end_point만 들어갈 수 있으며, 파티션의 last row
- CURRENT ROW : start, end_point 둘 다 가능. 윈도우는 CUREENT ROW에서 start 하거나 end 함
권한
DBA 권한은 SYSTEM, SYS 등의 상위 유저와 그에 해당하는 권한을 가진 경우 부여 가능
테이블의 소유자는 해당 테이블의 DML 권한을 다른 유저에게 부여할 수 있다.
MAX(LEVEL)
계층형 쿼리에서 최대 계층의 수를 구하기 위한 문제. MAX (LEVEL)을 사용하여 최대 계층 수를 구함
NOT EXISTS → OUTER JOIN
NOT EXISTS의 OUTER JOIN으로의 변형을 묻는 문제로 NOT EXISTS는 OUTER JOIN으로 변경 시 NOT NULL COLUMN에 대한 IS NULL 체크로 NOT EXISTS를 구현가능하다
참조
https://icty.tistory.com/entry/Oracle-EXISTS-연산자의-활용
https://androphil.tistory.com/166
SQLD_예상문제해답