개요
해당 페이지에서는 SQL 쿼리 작업을 하면서, 경험으로 확실하게 알게된 SQL 관련 지식을 정리합니다.
SQL 기본 상식 정리
WHERE 절에 사용된 컬럼값 중에 NULL값이 포함된 경우, NULL인 Row 는 결과에서 무조건 제외된다.
Null은 Null 여부로만 비교가 가능하다고 알고 계시면 됩니다.
즉 is null 혹은 is not null 이 두가지죠.
Null값이 들어갈 가능성이 있는 컬럼에 어떤 일치 조건비교를 해야 한다면, 보통 다음처럼 해도 무방합니다.
자동으로 조건 컬럼값이 Null값인 Row 비교 대상 자체에서 필터링되기 때문이다.
colName = 'someValue'
불일치 조건일 경우에는, 보통 다음과 같이 합니다.
(colName IS NULL OR colName != 'someValue')
간혹 NVL() 함수를 써서 NVL(colName,'') != 'someValue' 처럼 하시는 분들이 있는데, 비추입니다.
where절 내에서 함수를 사용해서 컬럼 비교를 하면 대개 인덱스를 제대로 못타서 성능에 악영향을 끼칩니다.
출처 : https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_db&wr_id=208019
조건을 WHERE절과 JOIN ~ ON절에 작성하는 것의 의미와 차이
Left join 에서 Where 절에 조건이 들어가는 경우와 On 절에 조건이 들어가는 경우의 차이 하고자 합니다.
개념적 이해
대상의 범위를 먼저 지정하냐 나중에 지정하냐의 차이
(on -> where)
Inner join 일 경우는 상관 없는 문제.
outer join 일 경우에는 상관이 있음.
Optimizer 는 이렇 게 해석합니다.
WHERE 절: 조인한 후에 필터링(= null 포함 된 대상에 대해 null이 아닌 대상으로 필터링)
ON 절 : 조인하기 전에 필터링(= 필터링 후 outer join결과 null 출력 가능)
출처 : https://arranging.tistory.com/133
LEFT JOIN을 여러개할 때 주의할 점
SQL에서 2개가 아닌 3개 이상의 테이블을 조인하는 것은 헷갈리고 꽤나 까다로운 작업입니다.
그래서 3개 이상의 테이블을 LEFT JOIN을 할 경우 아래의 2가지를 기억해주세요.
첫째, INNER JOIN과는 달리 LEFT JOIN은 조인하는 테이블의 순서가 상당히 중요합니다. 여러분이 어떤 순서로 테이블을 조인하는지에 따라 결과 테이블에 조회되는 행의 개수며 구성 등이 달라질 수 있습니다. 따라서 JOIN 문을 작성하실 때, 만약 여러분이 LEFT JOIN을 하실 거라면 가장 첫 번째의 테이블로 SELECT문에 가장 많은 열을 가져와야 할 테이블을 우선으로 적어주세요.
(LEFT JOIN이 왼쪽 집합은 무조건 모든 Row를 살리는 것이 핵심 속성이기 때문에, 오른쪽 집합은 JOIN 조건에 부합하지 않으면 JOIN되지 않고 결과 집합에는 반영되지 않고 유실되기 때문에, 보통은 조회하고자 하는 메인 테이블을 제일 앞에 둔다.)
둘째, 조인을 여러 번 해야하는데 시작을 LEFT JOIN으로 했다면 보통의 경우는 나머지 조인도 LEFT JOIN을 합니다. 즉, LEFT JOIN을 쓰다가 갑자기 INNER JOIN 이나 다른 조인을 사용하지 않는다는 이야기입니다. 우리가 LEFT JOIN을 사용하는 이유가 무엇입니까? 어떤 값이 비록 조인하는 여러 개 테이블 내에는 공통적으로 존재하진 않더라도, 여전히 그 값을 결과 테이블에서 보고 싶기 때문입니다. 애초에 우리가 다양한 JOIN 종류 중에서 LEFT JOIN을 사용한 이유를 잊지 않으면서, 추가적인 LEFT JOIN을 구성해 나가야 합니다. 부디 갑자기 INNER JOIN을 사용함으로써 원하는 값이 조회되지 않는 불상사를 겪지 않으시길 바랍니다.
LEFT JOIN을 여러개 중첩할수록, 왼쪽집합의 개수는 절대 안줄어들고 조금씩 늘어나는 방향으로 연산될 것이다.
데이터 ROW간 관계가 1:1 또는 1:0이면 결과 집합 수가 늘어나지 않겠지만, 1:N인 경우 관련 ROW는 기존보다 N-1개만큼 늘어난다.
- Task Table : Task_id가 Key로 구성된 집합니다.
- Task JOIN Task_Schedule Table : (INNER, LEFT, RIGHT)조인 조건에 부합한 Row들을 대상으로 Task_id, Schedule_id가 Composite Key로 구성된 결과집합니다.
Join의 정의와 종류
Join이란? 두 개 이상의 테이블을 서로 연결하여 데이터를 검색할 때 사용하는 방법
두 개의 테이블을 마치 하나의 테이블인 것처럼 보여준다.
1. Inner Join : 교집합, 조건에 부합하지 않는 양쪽 테이블의 Row들은 소멸된다.
2. Natural Join : ?
3. Outer Join
- Left Join : 교집합 하되, 교집합 조건에 부합하지 않는 왼쪽 테이블의 Row는 소멸시키지 않고 남긴다.
- Right Join : 교집합 하되, 교집합 조건에 부합하지 않는 오른쪽 테이블의 Row는 소멸시키지 않고 남긴다.
4. Full Join : 합집합
5. Cross Join :
자기 테이블의 Row를 N X N 으로 카테시안 곱(Cartesian Product)한 Table를 반환한다.
ex. 3 Row의 Table이면 3*3 Row의 Table을 반환한다.
출처 : https://doh-an.tistory.com/30
'[DBA] Database > SQL' 카테고리의 다른 글
[SQL 패턴] Row 간 Timestamp 주기가 1초이고, 5분 이상 떨어진 Row 군집 별로 묶어서, StartTime과 EndTime을 계산해야 하는 경우 (LEAD 함수 활용) (0) | 2023.01.17 |
---|---|
[SQL 약어] DBO[DataBase Owner], SP[Stored Procedure]란? (0) | 2021.01.18 |
SQL 쿼리 속도에 대하여 (0) | 2020.07.23 |
최근댓글