홍카나의 공부방

[ORACLE] 오라클 SQL 세부 정리 노트 - 1 본문

Data Engineering/Database

[ORACLE] 오라클 SQL 세부 정리 노트 - 1

홍문관카페나무 2024. 1. 20. 16:51

 

Oracle SQL 공부 도중 몰랐던 부분들을 정리하는 글.

 

 


 

 

1. WHERE 절에서 OR와 AND 연산자의 우선순위는 AND가 우위

 

> 이를 고려하지 않으면 원하지 않는 결과가 나올 수 있으므로, 괄호를 적극적으로 활용할 것

 

예를 들어서 사는 지역이 서울 또는 경기고, 성별이 남성인 사용자를 조건으로 했을때

WHERE 지역 = '서울' or 지역 = '경기' AND 성별 = '남자'

 

이렇게하면 의도치 않게 지역이 서울이거나, 경기면서 남자인 사용자를 고르게 된다.

 

 

2. 대표적인 와일드카드의 종류는 %, _, [], ^ 등이 있음.

 

%는 임의의 수의 문자를 의미

_는 단 한 개의 문자를 의미

[ ]는 문자들을 하나의 집합으로 지정해 사용

예를들어, [JK]면 J또는K로 시작하는 레코드를 찾는 것

^는 캐럿 기호라고 부르고, 반대의 효과를 가져오는 와일드카드

 

꼭 필요한 경우가 아니라면, 검색 패턴 시작에 와일드카드는 사용하지 말 것.

와일드카드로 시작하는 검색 패턴은 처리가 가장 느림.

 

 

3. Oracle에서 여러 값을 연결하려면 || 기호를 사용한다.

 

> RTRIM, LTRIM, TRIM()과 같은 공백제거 함수를 같이 사용해서 원하는 결과를 SELECT하자.

 

 

4. Oracle의 DATE 타입에서 '년도'만 추출하는 방법

 

(1) SELECT절에서 EXTRACT() 함수를 사용한다.

SELECT EXTRACT(YEAR FROM START_DATE)
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
 WHERE START_DATE > TO_DATE('2022-10-01', 'YYYY-MM-DD');

 

(2) TO_CHAR 함수와 DATE 포맷을 이용한다.

-- 코드를 입력하세요
SELECT TO_CHAR(start_date, 'YYYY')
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY;

 

MySQL처럼 YEAR() 함수는 지원하지 않는다.

 

 

5. 레코드마다 특정 컬럼에 값이 존재하는 레코드만을 세려면 COUNT({column_name})을 쓴다.

 

 

6. Where 절은 데이터가 그룹핑되기 전에 필터링하고, HAVING 절은 데이터가 그룹핑된 후에 필터링한다.

 

> 그룹핑한 결과를 기반으로 필터링을 해야할 때는 HAVING 절을 적극 활용하자.

 

 

7. 서브쿼리보다는 셀프 조인이 연산 속도가 더 빠르다.

 

> 서브쿼리는 뷰(view)처럼 일종의 가상 테이블을 만드는 것이다.

이처럼 가상 테이블을 만들 때 추가적인 I/O 비용이 발생할 수도 있고,

서브쿼리는 처리 속도를 높이기 위한 인덱스 정보를 가지고 있지 않을 가능성이 높기 때문에 속도차이가 날 가능성이 높다.

 

그래서 똑같은 테이블을 두 번 이상 참조할 때는 서브쿼리가 아닌 셀프 조인 활용을 권장한다.

SELECT C1.CUST_ID
	 , C1.CUST_NAME
     , C1.CUST_CONTACT
  FROM CUSTOMERS C1,
  INNER JOIN CUSTOMERS C2
    ON C1.CUST_NAME = C2.CUST_NAME
    AND C2.CUST_CONTACT = 'SHAWN KIM';

 

 

 


출처 : <손에 잡히는 10분 SQL> 책

반응형