인덱스 컬럼 절을 변형한 경우
SELECT column_name FROM table_name WHERE TO_CHAR(column_name, 'YYYYMMDD') = '20130909';
SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD');
SELECT column_name FROM table_name WHERE column_name * 100 > 10000;
SELECT column_name FROM table_name WHERE column_name = 10000 / 100;
내부적으로 데이터 형 변환이 일어난 경우
SELECT column_name FROM table_name WHERE column_name = '20130909'; // DATE 타입의 column
SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD');
SELECT column_name FROM table_name WHERE column_name = 100; // 문자 타입의 column
SELECT column_name FROM table_name WHERE column_name = '100';
조건절에 NULL 또는 NOT NULL을 사용하는 경우
SELECT column_name FROM table_name WHERE column_name IS NULL;
SELECT column_name FROM table_name WHERE column_name IS NOT NULL;
SELECT column_name FROM table_name WHERE column_name > '';
SELECT column_name FROM table_name WHERE column_name >= 0;
부정형으로 조건을 사용한 경우
부정문은 인덱스를 활용하지 못한다.
```
SELECT column_name FROM table_name WHERE column_name != 30;
SELECT column_name FROM table_name WHERE column_name < 30 AND column_name > 30;
테이블을 한 번 더 읽어 NOT EXISTS를 사용
> SELECT column_name FROM table_name WHERE NOT EXISTS
(SELECT column_name FROM table_name WHERE column_name = 30);
LIKE 연산자를 사용하였을 경우
SELECT column_name FROM table_name WHERE column_name LIKE '%S%';
SELECT column_name FROM table_name WHERE column_name LIKE 'S%';
SELECT column_name FROM table_name WHERE INSTR(column_name , 'cmp_value') > 0;
OR 조건 사용
SELECT column_name FROM table_name1 t1, table_name2 t2
WHERE
(t1.column_name1 = t2.column_name1 OR t1.column_name2 = t2.column_name2)
AND t1.column_name3 = 'cmp_value';
SELECT column_name FROM table_name1 t1, table_name2 t2
WHERE t1.column_name1 = t2.column_name1 AND t1.column_name3 = 'cmp_value';
UNION ALL
SELECT column_name FROM table_name1 t1, table_name2 t2
WHERE t1.column_name2 = t2.column_name2 AND t1.column_name3 = 'cmp_value';
뭐가 참 많다. 사실 다 JOIN 쓰면 해결될 문제다. 근데 왜 자꾸 Subquery를 쓰고 싶을까?
DDD가 적용된 소프트웨어에서 JOIN을 사용하게 되면, 결국 두 가지 이상의 도메인이 결합된 쿼리가 필요로 하게 된다.
두 가지 이상의 도메인이 결합하여 그 자체로 하나의 도메인이 되는 것이 DDD라고 할 수 있을 것 같다. 다만, 기존에 잘못 분리되었거나 너무 크게 분리된 도메인의 경우 이러한 관점에서 보는 것이 굉장히 애매했다.
만약 서브쿼리를 잘 사용할 수 있다면, 각각의 도메인에서 서브쿼리를 받아 사용하면 어떨까? 하고 생각했다.
Join되는 형태를 보면, 자주 조인되는 테이블과 칼럼이 항상 비슷하였는데, 충분히 재사용할 수 도 있을 것이라 생각한다.
다만, 아직까지 사내에서 사용하는 5.6으로는 서브쿼리를 사용하기에는 너무 까다롭다고 느껴진다.