[SQL] ANSI QUERY
<ANSI QUERY>
오라클 뿐만 아니라 공통적으로 사용 가능한 쿼리.
<INNER JOIN>
SELECT * FROM 테이블1 INNER JOIN 테이블2 ON 조인조건 [INNER JOIN 테이블3 ON 조인조건] WHERE 일반조건 |
<OUTER JOIN>
SELECT * FROM 테이블1 LEFT OUTER JOIN 테이블2 ON 조인조건 WHERE 일반조건 |
<서브 쿼리>
두개의 쿼리를 결합하여 하나의 문장으로 표현하는 것.
-서브쿼리는 메인 쿼리 내에서 리터럴을 대신하는 것이므로
사용자가 직접 쿼리를 두 번 실행하는 것과 같이 대체가 가능하지만
서브쿼리가 성능과 비용이 월등히 우수
-서브쿼리에 의해 검색된 결과 값이 MAIN QUERY 문에 필요한 경우 사용
-주로 WHERE 절이나 HAVING 절에서 사용한다. FROM 절에서 사용하는 경우도 있다.
-FROM절에 쓰이는 서브 쿼리는 인라인 뷰 (INLINE VIEW)라고 부른다.
-메인쿼리(MAIN QUERY) :외부 질의
-서브쿼리(SUB QUERY) :내부 질의
<서브쿼리의 종류>
단일 행 서브 쿼리
: 서브쿼리가 하나의 컬럼에서 하나의 행을 검색한다. //EQUAL 연산자의 의미
SELECT FROM WHERE 컬럼_단일행_연산자(SELECT 문장)//서브쿼리 |
-단일 행 연산자가 사용되므로 반드시 서브 쿼리의 결과 값은 한 개만 검색 된다.
-서브 쿼리는 반드시 괄호로 묶는다
-서브 쿼리는 메인 쿼리 실행 전에 실행 된다.
-서브 쿼리의 검색된 결과 값은 메인 쿼리에 사용된다.
-단일 행 연산자 오른쪽에 기술한다.
>단일행 연산자: <=,<,>,>=,!=,=,IN
-WHERE절에 기술된 열의 숫자와 타입은 SELECT 절과 1:1 대응 관계가 되어야한다. (데이터 타입이 같아야한다.)
<예측하기 힘든 단일 행 서브 쿼리를 수정하는 방법>
-'='연산자는 'IN'연산자로 바꾼다
-부등호는 ANY, ALL 연산자를 추가한다.
-MAX(), MIN() 같은 그룹함수를 사용한다.
(주의) 다중행이 나와도 되는 연산에서 ANY,ALL을 사용하고 업무상 그렇지 않은경우에는 조건을 제대로 넣어줘야한다.
EX) 동명이인이 있다면 이름 대신 사번으로 검색하는 등.
<EXISTS 함수>
서브쿼리의 결과 값이 여러개 일때
SELECT FROM WHERE EXISTS (SELECT * FROM WHERE 조건 )//서브쿼리 |
다중 행 서브 쿼리 : 서브쿼리가 하나의 컬럼에서 여러개의 행을 검색한다. //IN 연산자의 의미
-다중행 서브 쿼리는 서브 쿼리에서 여러 행이 검색되는 것으로 다양한 다중 행 연산자를 이용한다.
-연산자를 제외하면 문법의 구조는 단일 행 서브 쿼리와 동일.
SELECT FROM WHERE 컬럼_다중행_연산자(SELECT 문장)//서브쿼리 |
-서브 쿼리에 여러개의 행이 검색되는 쿼리 문이 다중 행 서브 쿼리다.
-다중행 서브 쿼리는 다중행 연산자를 이용한다.
-다중행 연산자의 종류
>IN : 검색도니 값 중에 하나만 일치하면 참.
>ANY : 검색된 값 중에 조건에 맞는 것이 하나 이상 있으면 참이다.
>ALL :모든 검색된 값과 조건에 맞아야한다. //교집합 효과.
다중 열 서브 쿼리 : 서브쿼리가 여러개의 컬럼을 검색한다.
SELECT FROM WHERE (컬럼1, 컬럼2, ....) IN (SELECT 문) //서브쿼리 |
-여러개의 컬럼을 검색하는 서브 쿼리를 다중 열 서브 쿼리라 한다.
-다중 열 서브 쿼리는 주로 IN 연산자를 사용하지만,
검색 결과가 분명히 한 개의 행이 보장된다면 '='도 사용 가능. (주로 IN 사용)
-서브쿼리의 SELECT 문에 여러개의 컬럼을 검색한다.
-여러개의 컬럼을 검색하는 서브 쿼리 문을 이용할 때는 반드시 비교 대상 컬럼과 1:1 대응 되어야 한다.
-다중 열 서브 쿼리에서 서브 쿼리의 검색 결과가 단지 하나의 행이라면,
'=' 연산자 사용가능하지만 되도록 'IN'산자 사용한다!