2. SCHEDULE
1. SQL GUIDE
① SQL작성시 유의사항 – SQL 활용가이드 참고
② JOIN
③ SUBQUERY
④ Optmizer의 이해
⑤ EXPLAIN
2. Query Tuning
① Clustring Index, Covering Index
② UNION, UNION ALL
③ ANY, EXISTS
3. Data Modeling
① 엔터티, 속성, 식별자, 관계
4. Logical Modeling
① 작도방법, 보는 방법
5. Physical Modeling
① 규칙 및 유의사항
3. STRUCTURED QUERY LANGUAGE, 구조화 질의어
Standard?
SQL-86 First published by ANSI. Ratified by ISO in 1987
SQL-89 Minor revision
SQL-92 or SQL2 - Major revision (ISO 9075) - MySQL start
SQL:1999 or SQL3
SQL:2003
SQL:2006
SQL:2008
SQL:2011 ISO/IEC 9075-1:2011 CHE 172
http://en.wikipedia.org/wiki/SQL
4. BEFORE WRITE QUERY…
어떻게 처리할 것인지를 먼저 생각하지 말고 무엇을 할 것인지를 먼저 파악하라.
그러한 결과 값을 얻기 위해 어떤 집합 이 필요한지를 찾아라.
필요한 집합이 논리적 으로 가능한지를 확인한다. 그러나 그 집합을 구체적으로 어떻게 생성할 것인지는 아직 생각하지
마라. 구체적인 생성 방법은 나중에 해도 충분하다.
원하는 집합이 생성 가능하다면 그 전체 집합을 마치 하나의 테이블로 간주 하라. 다시 말하면 원하는 집합을 테이
블에 넣었다고 생각하라. 그러면 지금부터는 하나의 테이블에 있는 정보를 가공 처리하는 단순한 형태가 된다.
추출되어야 할 결과 집합의 로우 단위 를 명확히 해라. 즉, 어떤 단위로 중분류를 해야 하는가(G roup by ) 를 결
정하라.
한 레코드씩 추출될 추출 단위( 중분류) 별로 내부에 속한 실제 로우들의 가공 처리 방법을 결정한다. 각각의 레코드마다 여
러 개의 실제 로우가 모여서 한 레코드가 되는 것이므로 여러 개의 실제 로우를 경우에 따라 어떤 방법으로 가공시키라는
것은 곧 SUM( x x x x ) 문 에 서 'x x x x '로 표시된 부분에 각 로우마다 해당되는 경우의 수를 처리 하는 것이다.
추출한 항목이 완성되었으 면 남겨 두었던 전체 집합을 구할 방법을 구체적으로 생각한다.
조인 이나 UNION 등을 활용하되 액세스 경로의 양호한 정도를 감안 한다.
SQ L을 수행시켜 가면서 약간의 보정을 통해 결론에 도달한다. 이때 수행 속도 에 대한 대비책도 같이 테스트 해야 한
다.
- 대용량 데이터베이스 솔루션 Ⅱ의 1장 89페이지 중에서
5. JOIN
MySQL JOIN Syntax
manual comment…
table_references: table_reference [, table_reference] ...
• table_factor 구문은 SQL 표준에 비해 확장 되었다.
table_reference: table_factor | join_table
• MySQL에서, CROSS JOIN 은 INNER JOIN과 동등하다. 표준 SQL에서
table_factor: 는 그렇지 않다. INNER JOIN은 ON 절과 함께 쓰이며 CROSS JOIN은
tbl_name [[AS] alias] [index_hint_list] 그렇지 않다.
| table_subquery [AS] alias
| ( table_references ) • STRAIGHT_JOIN 은 왼쪽 테이블이 오른쪽 테이블보다 항상 먼저 읽힌
| { OJ table_reference LEFT OUTER JOIN table_reference 다는 점을 제외하면 JOIN과 동일하다. JOIN optimizer가 테이블을 잘못
ON conditional_expr } 된 순서로 놓을 경우에 사용될 수 있다.
join_table: MySQL 5.0.12에서 변경된 JOIN연산
table_reference [INNER | CROSS] JOIN table_factor [join_condition]
| table_reference STRAIGHT_JOIN table_factor • NATURAL 이나 USING join의 컬럼들은 이전 버전과 다를 수 있다.
| table_reference STRAIGHT_JOIN table_factor ON conditional_expr • SQL:2003표준과 비교하여 MySQL에서의 확장은 MySQL이 NATURAL
| table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition 이나USING join의 common 컬럼 들을 조절 할수 있게 하였는데 이는 표
| table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor 준 SQL문에서는 허용되지 않는다.
join_condition:
ON conditional_expr
| USING (column_list) + arkiz comment…
index_hint_list: • MySQL은 기본적으로 Nested Join을 수행한다.
index_hint [, index_hint] ... • FROM절의 테이블중 index가 없는 테이블이 구동테이블
• 둘 다 인덱스가 있는 경우 가장 왼쪽부터(표준은 오른쪽부터)
index_hint:
USE {INDEX|KEY} • Table Driving은 FROM절 가장 왼쪽 테이블부터 구동된다.
[FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
| IGNORE {INDEX|KEY} • STRAIGHT_JOIN, index hint 는 가급적 사용하지 않도록 하며, 필요 시
[FOR {JOIN|ORDER BY|GROUP BY}] (index_list) DB파트와 상의하여 사용한다.
| FORCE {INDEX|KEY}
[FOR {JOIN|ORDER BY|GROUP BY}] (index_list) • 외부조인시 LEFT, RIGHT JOIN 절 뒤에 오는 table 의 해당하는 컬럼이
WHERE절에서 언급되면 외부조인은 내부조인문으로 변경 될 수 있다.
index_list: index_name [, index_name] ...
6. SUBQUERY
subquery sample Scalar subquery
- SELECT List절에 한 개 column 값만을 반환
SELECT
(SELECT Inline view
column2 Scalar subquery
FROM table - FROM 절에 레코드 리스트를 반환
WHERE column1 = a.column1)
FROM (SELECT
columns Inline view Subquery
FROM table) AS a - SELECT statement에 포함하는 또 다른 SELECT
WHERE column1 > (SELECT value
FROM table subquery statement
WHERE column2 = 1)
AND column2 > (SELECT value
FROM table Correlated subquery Correlated subquery
WHERE column2 = a.column1) - FROM 절에 레코드 리스트를 반환
* 적용 기준(권장사항)
1. Select List Scalar Subquery를 수행할 결과집합이 대량이 아닌 경우
2. 코드성 테이블의 조인이 많아 실행계획이 복잡해져 제어가 어려운 경우
3. 코드성 테이블에서 명칭만 가져오는 경우 (단, 코드에서 명칭만 가져오더라도 결과 집합이 대량이면 스칼라 서브쿼리가 불리할
수 있으므로 대량인 경우 조인을 사용할 것)
4. 한 개의 테이블에서 복수 개의 컬럼을 가져오는 경우 스칼라 서브쿼리(두개의 컬럼을 ||로 묶어서 한 개의 컬럼을 리턴)를 사용
하지 말고 조인을 사용하도록 함