개발 강의 정리/SQL

[SQL] ANSI QUERY

심사기 2021. 5. 12. 17:50

<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'산자 사용한다!