일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
조인에 대해 이제 찬찬히 이야기를 드려 보지요.
Join은 2개 이상의 테이블에서 1개의 테이블 집합을 생성해 질의 결과를 얻게 해주는 방법.
RDBMS는 정규화 과정을 거쳐 테이블을 나누어 설계 하게 됨.
이때 여러개의 테이블중 논리적인 테이블을 만들어 결과를 생성하게 하는 방법을 의미함.
조인의 종류는 5가지로 나뉘어 집니다.
1. INNER JOIN
2. OUTER JOIN
3. CROSS JOIN
4. FULL OUTER JOIN
5. SELF JOIN
조인의 방식은 3가지로 나뉘어 집니다.
1. Nested loop Join
2. Hash Join
3. Merge Join
종류에 대한 이야기니 그렇구나 하시면 되구요..
주로 사용되는 조인은? 맨 처음의 INNER JOIN 이라는 녀석 입니다.
위의 ID-성별 처럼 두개의 테이블을 합칠때 사용되는 녀석 이지요.
먼저 INNER JOIN에 대해 말을 드리지요.
1. INNER JOIN
두개의 관련된 키가 있는 테이블에서 Column의 값을 비교 후
Join 조건에 맞는 행만 검색합니다.
SQL서버의 기본 조인 방식 입니다.
SELECT * from authors
|
자 위의 조인문이 중요한 것은 아닙니다. 우선은 샘플만 보여 드린 거지요.
위의 두개 SELECT 구문은 데이터를 먼저 찬찬히 봐 보시라는 의미 이며..
세번째 쿼리가 JOIN 쿼리 입니다.
이제 INNER JOIN의 좀더 다른 샘플을 보도록 하지요.
ID-이름 테이블
ID | 이름 |
KONAN | 김대우 |
BAEZZANG | 이동혁 |
DEVIL | 은정범 |
이런 테이블이 있구요.
아울러.
ID - 정보 테이블
ID | 나이 | 성별 |
KONAN | 18 | 남 |
BAEZZANG | 45 | 남 |
의 식이라고 생각해 보세요 아시겠지요?
여기서!!! 가능한 모든 조합을 한번 뽑아 보도록 하지요.
ID-이름의 이름 | ID-이름의 ID | ID-정보의 ID | ID-정보의 나이 | ID-정보의 성별 |
김대우 | KONAN | KONAN | 18 | 남 |
김대우 | KONAN | BAEZZANG | 45 | 남 |
김대우 | KONAN | NULL | NULL | NULL |
이동혁 | BAEZZANG | KONAN | 18 | 남 |
이동혁 | BAEZZANG | BAEZZANG | 45 | 남 |
이동혁 | BAEZZANG | NULL | NULL | NULL |
은정범 | DEVIL | KONAN | 18 | 남 |
은정범 | DEVIL | BAEZZANG | 45 | 남 |
은정범 | DEVIL | NULL | NULL | NULL |
이런 식이 될겁니다.
그렇지요?
여기서!!!
결과들중!!! 바로 파란색으로 된 녀석들!!!!
ID-이름 테이블의 ID컬럼과 ID-정보 테이블의 ID 컬럼이 같은 녀석들이 의미 있는
값이라는 것이지요!!!! 다른 값들은 바로 쓰레기 값이다!!! 라는 의미 입니다.
나온 결과중 의미 있는 결과는!!!
ID-이름의 이름 | ID-이름의 ID | ID-정보의 ID | ID-정보의 나이 | ID-정보의 성별 |
김대우 | KONAN | KONAN | 18 | 남 |
이동혁 | BAEZZANG | BAEZZANG | 45 | 남 |
이런 식이 될겁니다.
이런식으로 생각해 보시면 조금 빨리 이해가 되시지요?
이렇게 여러 조합중 조건에 맞는 즉! 조건 컬럼이 같은 녀석을 뽑아 내는 것이 바로
JOIN 입니다.
따라서 이런 결과과 되지요.
이를 SQL문으로 생각해 본다면?
--실행 안됩니다. SELECT id-이름.이름, id-이름.ID, id-정보.id, id-정보.나이,id-정보.성별 FROM id-이름 INNER JOIN id-정보 ON id-이름.ID = id-정보.ID
|
이런 식이 되겠지요!! 조건은 바로 맨 아래줄의 ON 키워드 라는 것입니다.
자 상당히 많은 내용을 배우셨네요.
다음 내용은? INNER JOIN의 문법과 간단한 샘플들 입니다.
조인의 구현
각 테이블에서 하나의 컬럼을 사용하여 두개의 테이블을 연결하는 것
- 고려사항
- 연결하려는 컬럼은 조인에 포함된 각 테이블에 있는 데이터를 쉽게 일치시키거나 비교할 수 있어야 한다.
- ANSI SQL 문법 또는 SQL 서버 문법을 사용할 수 있다.
- 하나의 SELECT 문에서 동시에 ANSI SQL문법과 SQL서버 문법을 사용 할 수 없다.
- 두 테이블 모두에 존재하는 컬럼 이름을 참조하는 경우에는 반드시 table_name.column_name 형식을 따라야 한다.
조인의 구현 - ANSI SQL 문법
SELECT table_name.column_name [, table_name.column_name…]
FROM {table_name[join_type] JOIN table_name ON search_conditions}
WHERE [search_condition…]
- WHERE 절을 사용한 행의 선택에서 연결된 테이블을 구성한다.
형식
SELECT table_name.column_name[, table_name.column_name…]
FROM {table_name, table_name}
WHERE table_name.column_name join_operator table_name.column_name
- 컬럼 들의 값을 한 행씩 비교하여 비교 결과가 참일때 그 행을 나열한다.
- FROM절에 조인에 관련되는 모든 테이블을 나열하고 WHERE절에 어떤 행동들이 결과에 포함되어야 하는지를 명시한다.
WHERE 절에 사용할 수 있는 연산자들
=, >, <, >=, <=, <>
Inner 조인
두 테이블을 연결 조건에 맞는 행들만 포함하는 세번째 테이블로 연결한다.
내부 연결의 일반적 유형
- Equijoin
- 비교되는 컬럼의 값이 같을 경우에 연결이 이루어진다.
- 중복된 컬럼 정보를 만들게 된다.
- Natural join
- Equijoin 이 만들어 내는 결과 집합에서 중복된 컬럼의 데이터를 제거한다.
SELECT pub_name, title FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id
|
/* ANSI 조인 */ USE pubs SELECT authors.au_lname, authors.state, publishers.* FROM publishers INNER JOIN authors ON publishers.city = authors.city
|
/*T-SQL 조인*/ USE pubs SELECT authors.au_lname, authors.state, publishers.* FROM publishers, authors WHERE publishers.city = authors.city
|
북스 온라인 상에서는 T-SQL조인을 사용하기 보다는 ANSI 조인의 사용을 권하고 있습니다.
T-SQL조인은 사실 약간 모호할 가능성이 있기 때문 입니다.
추후 스터디를 위해서라도 가능하심 ANSI - SQL로 배우시길 바랍니다.
다음은 두번째의 OUTER JOIN 입니다.
LEFT 또는 RIGHT OUTER JOIN.
두 테이블에서 지정된 쪽인 LEFT 또는 RIGHT 쪽의
모든 결과를 보여준후 반대쪽에 대해는 매칭값이 없어도
보여주는 JOIN을 의미
조금 난해 하지요?
역시나 샘플을 보시면? 감이 빡빡 오실 겁니다.
위의 샘플과 마찬 가지로...
ID-이름 테이블
ID | 이름 |
KONAN | 김대우 |
BAEZZANG | 이동혁 |
DEVIL | 은정범 |
이런 테이블이 있구요.
아울러.
ID - 정보 테이블
ID | 나이 | 성별 |
KONAN | 18 | 남 |
BAEZZANG | 45 | 남 |
다시 가능한 모든 조합입니다.
ID-이름의 이름 | ID-이름의 ID | ID-정보의 ID | ID-정보의 나이 | ID-정보의 성별 |
김대우 | KONAN | KONAN | 18 | 남 |
김대우 | KONAN | BAEZZANG | 45 | 남 |
김대우 | KONAN | NULL | NULL | NULL |
이동혁 | BAEZZANG | KONAN | 18 | 남 |
이동혁 | BAEZZANG | BAEZZANG | 45 | 남 |
이동혁 | BAEZZANG | NULL | NULL | NULL |
은정범 | DEVIL | KONAN | 18 | 남 |
은정범 | DEVIL | BAEZZANG | 45 | 남 |
은정범 | DEVIL | NULL | NULL | NULL |
이때 INNER JOIN과 다른점은?
다시 가능한 모든 조합입니다.
ID-이름의 이름 | ID-이름의 ID | ID-정보의 ID | ID-정보의 나이 | ID-정보의 성별 |
김대우 | KONAN | KONAN | 18 | 남 |
이동혁 | BAEZZANG | KONAN | 18 | 남 |
이동혁 | BAEZZANG | BAEZZANG | 45 | 남 |
은정범 | DEVIL | NULL | NULL | NULL |
따라서 이런 결과과 됩니다.
즉!!!
FROM id-이름 LEFT OUTER JOIN id-정보
ON id-이름.ID = id-정보.ID
이런 LEFT OUTER JOIN 키워드가 있을 경우 JOIN의 왼쪽에 표시된 테이블인
id-이름 테이블은 오른쪽에 매칭 되는 결과가 없어도!!! 왼쪽 테이블을 우선 보여 준다는
의미 입니다.
그래서 ID-이름 테이블의 은정범 : DEVIL 은 매칭되는 ID-정보 테이블의 로우가 없어도
우선은 보여 준다는 의미 이지요.
이를 SQL문으로 생각해 본다면?
SELECT id-이름.이름, id-이름.ID, id-정보.id, id-정보.나이,id-정보.성별 FROM id-이름 LEFT OUTER JOIN id-정보 ON id-이름.ID = id-정보.ID
|
의 식이 된다. 이것이 LEFT OUTER JOIN 이다.
RIGHT OUTER JOIN 역시 같습니다. 오른쪽 테이블은 무조건 보이고 왼쪽은 NULL로
표기 한다는 의미 입니다. LEFT 와 같지요?
코난이의 경우 대부분 LEFT를 많은 사람이 사용하는 경우를 보았지..
RIGHT는 쓰시는 분이 거의 없더군요..
그렇다면!!! 이 LEFT OUTER JOIN은 주로 언제 사용하는가!!!
코난이의 경우 몇번 전자 상거래 구축시 사용한 경험이 있습니다.
바로 제품 - 판매량을 볼때 이지요.
특정 제품들의 리스트를 보기위해 아래의 표와 같은 데이터를 보려 합니다.
이런 테이블을 INNER JOIN해 볼때는? C 제품의 경우..
즉!! 하나도 팔리지 않은 제품도 분명히 있을 겁니다.
제품 | 판매량 |
A | 10 |
B | 20 |
C | NULL |
이때..!
C제품도 우선은 보이게 하고 판매량은 NULL로 보이더라도 우선은 보이고 싶을때
입니다. 그래서 LEFT OUTER JOIN을 사용하게 되는 것이지요..
비슷한 케이스가 상당히 많으니.. 이 LEFT OUTER JOIN도 알아두심 많은 도움 되실 겁니다.
이러한 OUTER JOIN의 구문 정보와 샘플 입니다.
Outer 조인
한 테이블에 있는 행에는 제한 조건을 가하지 않는
반면에 다른 테이블에 대해서는 행에 제한을 한다.
고려사항
- 관계된 테이블에서 일치하지 않는 outer 테이블의 모든 행을 보여준다.
- 두 테이블간에만 이루어질 수 있다.
- 기본키와 참조키가 동기화 되지 않았는지 등을 알아보는데 유용하게 사용된다.
SELECT title, stor_id, ord_num, qty, ord_date
|
다음은 CORSS JOIN 입니다.
CROSS JOIN
연관된 두개의 테이블에서 가능한 모든 조합을 찾는다.
SELECT au_fname, au_lname, pub_name |
자 역시 찬찬히 풀어서 말을 드릴 차례 이지요~~
위의 샘플과 마찬 가지로...
ID-이름 테이블
ID | 이름 |
KONAN | 김대우 |
BAEZZANG | 이동혁 |
DEVIL | 은정범 |
이런 테이블이 있구요.
아울러.
ID - 정보 테이블
ID | 나이 | 성별 |
KONAN | 18 | 남 |
BAEZZANG | 45 | 남 |
다시 가능한 모든 조합입니다.
ID-이름의 이름 | ID-이름의 ID | ID-정보의 ID | ID-정보의 나이 | ID-정보의 성별 |
김대우 | KONAN | KONAN | 18 | 남 |
김대우 | KONAN | BAEZZANG | 45 | 남 |
김대우 | KONAN | NULL | NULL | NULL |
이동혁 | BAEZZANG | KONAN | 18 | 남 |
이동혁 | BAEZZANG | BAEZZANG | 45 | 남 |
이동혁 | BAEZZANG | NULL | NULL | NULL |
은정범 | DEVIL | KONAN | 18 | 남 |
은정범 | DEVIL | BAEZZANG | 45 | 남 |
은정범 | DEVIL | NULL | NULL | NULL |
지금 보고 계신 이 모든 가능한 조합이? 바로 CORSS JOIN 의 결과 입니다.
자 여기엔 쓰레기 값이 상당히 많습니다.
LRFT OUTER JOIN에서 사용되는 맨 아래 줄을 제외 하더라도..
6개의 노란 셀로 표시된 로우는 모두 쓰레기 값이라는 것이지요.
그래도 CORSS JOIN에서는? 모두 보여 줍니다.
코난이의 경우 실무에서는 한번도 사용해 본적 없지만..
이런게 있다는 것은 알아 두시길 바랍니다.
다음은 FULL OUTER JOIN 입니다.
FULL OUTER JOIN
LEFT OUTER JOIN의 결과와 RIGHT OUTER JOIN의
결과를 표시한후 한번 중복되는 값(INNER JOIN의 값)의 중복을 제거한 값을 표시한다.
SELECT a.au_fname, a.au_lname, p.pub_name
|
이는? LEFT OUTER JOIN과 RIGHT OUTER JOIN을 실행 해 보심 아실 수 있습니다.
두 OUTER JOIN을 실행한후..
겹치는 부분인 INNER JOIN의 결과 부분이 두번 나오겠지요?
이 INNER JOIN의 결과를 한번 제외한 결과 라고 생각 하심 빠릅니다.
LEFT , RIGHT 조인을 실행 한다고 생각하심 빠르다는 의미 입니다.
코나니는 실무에서 사용해본 경험이 없습니다. - 거의 사용 안한다는 말이지요.
다음은 SELF JOIN 입니다.
SELF JOIN
사용하는 경우 :
1. 계층적인 구조를 테이블화 할 경우.
2. 한 테이블에서 일치하는 값을 찾고자 하는 경우.
아울러 반드시 테이블 Alias 명을 사용해 질의해야 한다.
판매 라는 테이블이 있다고 생각해 보세요..
우선 판매 라는 테이블을 별명으로 판매 a 라고 잡겠습니다.
판매a
구매자 ID | 물품 |
KONAN | 디아블로2 |
KONAN | 스타크래프트 |
BAEZZANG | 니드포스피드 |
DEVIL | 프리셀 |
DEVIL | 디아블로2 |
아울러 판매 b 라는 테이블이 또 있다고 생각 하지요.. 바로
구매자 ID | 물품 |
KONAN | 디아블로2 |
KONAN | 스타크래프트 |
BAEZZANG | 니드포스피드 |
DEVIL | 프리셀 |
DEVIL | 디아블로2 |
이렇게 같은 테이블 입니다.
구매자 ID | 물품 | 구매자 ID |
KONAN | 디아블로2 | DEVIL |
이런 식으로 찾기를 원한다고 생각해 보세요..
바로!!! 같은 물품을 구매한 다른 사람을 찾고 싶을때 입니다.
SELECT au_fname, au_lname, zip, city
|
이 쿼리를 먼저 실행해서 결과를 확인한후 Self-Join 의 쿼리를 실행해 보지요.
결과를 찬찬히 봐 보세요.. ZIP 코드가 같은 작가들이 있습니다.
이때 이를 찾을때 어떻게 찾으면 될까요?
SELECT au1.au_fname, au1.au_lname, au2.au_fname, au2.au_lname, au1.zip
|
이 쿼리는 오클랜드 지역에 사는 작가들중 zip 코드가 같은 사람이 있는가 하는 쿼리 이다.
즉, 오클랜드 지역에 같은 zip코드에 거주하는 사람이 있는가 하는 쿼리 이다.
코나니가 책회사 사장 이라면? 같은 지역에 거주하는 작가들 끼리 서로의 정보를
공유해 더 좋은 책을 쓰게 함 좋겠죠? 이럴 경우 사용 가능한 질의 입니다.
이제 SELF JOIN의 구문정보 입니다.
Self 조인
테이블의 행을 같은 테이블 안에 있는 다른 행과 연관시킨다.
- 비교되는 컬럼은 같은 자료형이어야 하고 여러 방법에 대해 비교 가능해야 한다.
- 같은 테이블을 조인하기 위해서는 하나의 테이블을 두개의 다른 논리적인 테이블로
참조 할 수 있도록 별명을 할당해야 한다.
ANSI SQL 문법
SELECT column_name, column_name [, column_name…]
FROM table_name alias [join_type] JOIN table_name alias
ON search_conditions
T - SQL 서버 문법
SELECT column_name, column_name [, column_name…]
FROM table_name alias, table_name alias [, table_name…]
WHERE alias.column_name join_operator alias.column_name
코나니의 경우 SELF 조인을 가끔 사용한 경험이 있습니다.
아울러 최근 많은 이슈가 되고 있는 CRM(Customer Relationship Management)
에서 종종 사용될 경우가 있으니.. 주의해 보심 많은 도움 되실 겁니다.
다음은 둘 이상의 테이블을 조인할 경우 입니다.
둘 이상의 테이블 조인
ASNI SQL 문법
SELECT table_name.column_name [, table_name.column_name…]
FROM table_name[join_type]
JOIN table_name ON search_conditions…[join_type]JOIN table_name ON search_conditions
WHERE [search_condition…]
T - SQL문법
SELECT table_name.column_name[, table_name.column_name…]
FROM table_name, table_name[, table_name…]
WHERE table_name.column_name join_operator
table_name.column_name
[AND table_name.column_name join_operator
table_name.column_name…]
ANSI 표준을 가능하면 보시고.. 간단히 ON 키워드에 추가추가 하심 됩니다.
/*ASNI 조인*/ SELECT stor_name, qty, title FROM titles INNER JOIN sales ON titles.title_id = sales.title_id INNER JOIN stores ON stores.stor_id = sales.stor_id /*T - SQL 조인*/ SELECT stor_name, qty, title FROM titles, sales, stores WHERE titles.title_id = sales.title_id AND stores.stor_id = sales.stor_id
|
끝으로 조인의 방식에 대한 이야기 입니다.
조인의 방식은 3가지로 나뉘어 집니다.
1. Nested loop Join
2. Hash Join
3. Merge Join
의 식입니다.
이는 조인이 내부적으로 사용하는 알고리즘에 대한 이야기 입니다.
이에 대한 내용은 알고리즘 이야기 인데..
코난이가 화일 시스템 시간에 배웠던 HASH의 이야기완 조금 틀리고..
MERGE 조인의 경우 제가 알고있는 MERGE에 대한 내용과 역시나 틀리 더군요.
아울러 Nested Loop는 루프를 돌며 조건 찾기로 아마 이해가 쉬우실 겁니다.
이에 대한 자료를 sqler의 Tip 게시판에 올려 두었으니 참고 하시길 바랍니다.
많은걸 배우 셨네요...
테이블 다이어 그램 생성하기....
간단한 정규화와 테이블에 대한 짧은 이야기...
조인의 다양한 방식들...
수고하셨네요...
그럼 다음 이야기인.. Sub Query에서 뵙지요.
9. JOIN을 이용한 테이블의 연결 문서의 끝입니다.
-----출처 http://sqler.pe.kr/sql2k/29.asp
1. Collation(정렬)설정하는 법
- 데이터베이스나 컬럼별로 정렬설정가능
- 대소문자구분해야함
2. 로컬접속의 의미
- 네트워크를 타고 밖으로 나갔다가 다시 들어오지 않는 네트워크 라이브러리를 무시함.
3. 멀티인스턴스
- 다중 서버의 존재가능하지만 하나의 서버를 사용하는것을 권장
- 스레드(thread)사용(하나의 프로세서 안에서 연결마다 새로운 스레드를 만드는 것이 훨씬 부하를 적게함)
4. SQL Server 2000에서 멀티 인스턴스를 지원하는 이유
- 개발과 테스트를 동시에 이용
- 클러스터링을 사용할 때 절대적 필요
5. 업그레이드
- 6.5업그레이드 : 업그레이드마법사사용
- 7.0업그레이드 : 자동으로 가능
(7.0과 2000버전은 호환성유지)
---------------------------------------------------------------
<2장 복습문제>
문제) 6.5에서 백업 받은 데이터베이스를 2000에서 바로 리스토어 할 수 있는가?
답) X, 업그레이드 마법사를 사용해야함
문제) 서비스를 시작하고 중지할 수 있는 모든 방법
답)서비스관리자,엔터프라이즈관리자,내컴퓨터/관리/서비스/net start/stop명령
문제) collation은 설치 후에 바꿀 수 있는가? 2000에서의 collation은 7.0과 비교해서 어떤점이 어떤 도구를 사용할 수 있는가?
답) 바꿀 수 있다. 7.0은 설치 시에 지정한 collation만을 사용할수 있지만, 2000은 데이터베이스 마다, 테이블 컬럼 마다 바꿀 수 있다.
문제) 설치후 클라이언트에서 서버로 접속이 되지 않는다. 이때 확인할 것들은 어떤 것이 있는가? 어떤도구를 사용할수있는가?
답) 프로토콜,서비이름,서비스시작여부,로컬서버접속여부 등을 확인한다. readpipe,makepipe,ping등을 사용한다.
문제) NT 4.0에 SQL을 설치하려면 사전에 요구되는것은?
답) 서비스팩5이상설치
---------------------------------------------------------------
< 3장 >
1. 온라인 설명서 사용하기
- 설명서를 참조하여 직접 설치해본다(설치과정)
2. 기본적인 SELECT 문
- SELECT 나열한 컬럼목록
- FROM 가져올테이블
- WHERE 가져올 행의 조건
3. 자료형 함수(책에 나왔던 함수만 시험에 나온대요)
INT 정수형
NUMERIC (= DECIMAL)
FLOAT 부동소수점값
DATETIME 8바이트 날짜와 시간
CHAR 8000자이하의 문자
VARCHAR
4. 사용자 정의 자료형
- 한컬럼에 대한 데이터 유형을 쉽게 사용하려할 때 적용
5. SELECT에서 자료형 바꾸기
- as 를 사용하여 컬럼이름을 바꿀수있다.
- CONVERT : 주어진자료형을 원하는 자료형으로 바꿈
- SUBSTRING : 문자자료형에 대한 길이만 줄여줌
6. 날짜에 대한 함수(이건 너무많아요~책참조)
- 함수
GETDATE () 현재날짜와 시간
DATEADD : datepart 부분에 number값을 더한다
DATEDIFF : 두날짜 사이의 datepart값
- 유형
ANSI yy.mm.dd
USA mm/dd/yy or mm-dd-yy
Japan yy/mm/dd
- datepart
7. 시스템함수(책에 나왔던 함수만 시험에 나온대요)
- ISNULL
- PARSENAME
8. NULL
- ANSI설정에서 널값에 대해 비교할 때 = 를 사용해서는 안된다. 반드시 IS NULL 또는 IS NOT NULL을 사용해야 한다.
9. 문자열/LIKE와 패턴 매칭
- _ : 문자가 와야 한다.
- % : 어떤것이라도 상관없다.
- []: []안에 있는 글자들
- [^]: ^다음에 있는 글자는 제외한 다른것이 와야한다.
10. WHERE 절을 사용할 때 고려 할 것
- *를 사용하지 말라.(작업의 용의를 위하여)
- 연산자 앞에는 컬럼만 오도록 하자(WHERE절에 사용하는 컬럼은 무조건 연산자 왼쪽에 두고 더 이상의 가공을 하지 않도록 하는 것이 좋다. 왜냐하면, NOT을 사용하지 말자는 것과 같다)
- 적절한 ()와 띄어쓰기
---------------------------------------------------------------
<3장 복습문제>
문제) 널값을 계산함수들에서 사용될 때 어떻게 처리되는가? 이때 어떤 경고 메시지가 나타나는가?
답) 널값은 계산함수에서 제외. ANSI WARNING이 설정되었을 때는 경고 메시지가 나타난다.
문제) 다음문장은 무슨 문제를 가지고 있는가?
SELECT 'TODAY IS' + GETDATE ()
정답) 자료형이 맞지 않다
SELECT 'TODAY IS' + CONVERT(VARCHAR(30),GETDATE (),102)
문제) float와 real을 사용하여 부동 소수점 데이터를 처리할 때 나타날 수 있는 문제점은 무엇인가?
답) float와 real은 한계 범위를 넘어가면 부정확한 연산을 한다. decimal 이나 numeric을 사용한다.
문제) WHERE절을 사용할 때 고려할 점은?
답)
1) *를 SELECT문에 사용하지 않도록 한다
2)컬럼이 나온 후에는 바로 연산자가 나오도록 한다
3)적절한 띄어쓰기, ()등을 사용한다.
---------------------------------------------------------------
<4장>
1. 정규화3가지
- 제 1정규화
- 제 2정규화
- 제 3정규화
- 비정규화
---------------------------------------------------------------<5장>
1. 연산함수
- AVG : 각각의 평균값
- COUNT : 각각의 개수
- COUNT (*): 선택된 모든행의 개수
- MAX : 최대값
- MIN : 최소값
- SUM : 각각의 합계
2. ISNULL - NULL 값을 다른값으로 바꾸기
3. GROUP BY / HAVING - 직계함수가 나오면 사용
- GROUP BY : 지정된 컬럼에 대한 그룹지정
- HAVING : 그룹함수에 걸어주는 조건(WHERE와 같은 기능이지만, 반드시 GROUP BY에는 HAVING를 사용해야 함)
4. COMPUTE / COMPUTE BY
ex) select type,title_id, price
from titles
order by type
compute avg(price) by type
= type에 의거해 가격의 평균을 구하고, type로 정렬해서 세부내역을 보여달라.
※ compute by 와 order by의 정렬순서가 만드시 같아야 함.
5. ROLLUP 과 CUBE
- GROUP BY 하단에 WITH ROLLUP(컬럼안에 자료를 그룹으로 묶어서 결과처리, 오른쪽에서 왼쪽으로 결과돌출)
- CUBE 는 ROLLUP 처리후 그 바로밑에 컬럼의 기준을 바꾸어 한번더 자료를 보여줌)
6. JOIN (정규화로 나누어진 테이블 혹은 컬럼을 다시 모음)
- INNER JOIN : 교집합과 같은 내용
- CROSS JOIN : 모든 자료를 곱한 결과
- OUTER JOIN : 기준에 맞추어(오른쪽,왼쪽) 조건에 맞는 데이터만 불러옴(기준은 그대로 존재하고 상대TABLE은 조건데이터만 불러옴, 조건에 맞지 않으면 모두 NULL값으로 나옴)
- SELF JOIN : 스스로의 자료를 조건에 맞게 불러오기 위해서 자기를 복사해서 자료를 돌출하되, 조건문에서 WHERE과 AND를 사용하여 중복되는것은 빼고 불러온다(<,>사용)
※ JOIN의 경우에는 ANSI문법을 그대로 사용할것을 권장함. bug의 주요 요인이 될수있음.
7. 하위질의(=부질의=subquery)
- select안에 또다시 select가 존재함. 안쪽 질의의 결과에 의해 수행됨.
- 하위질의(안쪽)질의만 수행해도 결과가 수행된다.
8. 상관하위질의(Correlated subquery)
- 상위질의에서 선택된 행이 안쪽 질의의 WHERE 절에 다시 참조됨.(바깥-안쪽-바깥)
9. IN / EXISTS
- ex) where title_id in(select title_id from sales)
= sales에서 title_id를 보여달라. 그리고 그 결과를 다시 title_id에 넣어서 보여달라.(괄호안의 항목과 일치하는 것이 있어야 참이 됨)
- DISTINCT : 내용이 중복된 것은 삭제
- ex) where exist(select * from titles .....)
= 괄호안에 어떤 것이든 결과만 돌려지만 참이 된다.
10. SELECT INTO
- 현재있는 테이블의 내용 전체나 일부를 선택하여 새로운 테이블을 만들 때 사용.
- 새로만들기 : ex) select * into sales_temp from sales
= sales로부터 sales_temp 테이블만듬.
- 삭제하기 : ex) drop table sales_temp
- ex) select * into #sales from sales(임시테이블)
ex) select * into ##sales from sales(프로그램닫을때까지만의 임시테이블)
11. UNION
- JOIN은 정규화된 테이블을 연결시키기 위한 반면,
UNION은 비정규화된 테이블을 연결시키기 위함.(자료형과 순서등이 맞으면 내용이 맞지않게 그냥 불러옴)
---------------------------------------------------------------
<5장 복습문제>
문제) JOIN을 걸면 데이터는 정렬되는가?
답) 정렬되지 않을수도 있다.정렬하려면 ORDER BY를 사용해야한다.
문제) 하위질의와 상관하위 질의의 차이는 무엇인가?
답) 하위질의-괄호안의 질의를 따로 실행시키면 수행되지만, 성관관계가 있는 하위질의는 그 자체만으로 수행되지 않는다. 상관관계있는 하위질의는 바깥(OUTER)질의의 결과가 안쪽(INNER)질의에 영향을 미치고 다시 그결과를 바깥질의에 돌려주기 때문이다.
문제) 같은 테이블을 둘로 나누었을 때(수평적으로)이를 연결시키는 문장은 무엇인가?
답) UNION
문제) 하위질의와 JOIN으로 모두 원하는 자료 처리 가능한 경우는 어느 것으로 처리하는 것이 일반적으로 나은가?
답) 하위질의보다 JOIN일 일반적으로 더 빠른 처리를 한다.
---------------------------------------------------------------
<6장>
1. 데이터베이스 개체 이름 붙이기
- 형식 :
server_name.datebase_name.owner_name.object_name
(소유자이름,테이블이름)
2. 테이블만들기
- ex) create table tempdb.dbo.emp1(id int,name char(10)
- ex) create table tempdb.dbo.emp1
(id int not null,name char(10) null)
= 널값허용여부지정하기
3. 테이블 수정하기
- 새로운컬럼추가
= 형식) alter table 내테이블
add 새컬럼 varchar(20) null
- 컬럼변경하기
= 형식) alter table 내테이블
alter column 새컬럼 varchar(40) null
- 컬럼삭제하기
= 형식) alter table 내테이블
drop column 새컬럼
- 테이블삭제하기
= 형식) drop table table_name
- 기본키설정하기
ex) create table pk_test (in int primary key)새테이블
ex) create table pk_test (in int not null)
go alter table a add
constraint pk_id primary key (id) 기존테이블
---------------------------------------------------------------
<6장 복습문제>
문제) 이미 데이터가 들어있는 테이블에 널을 허용하지 않는 새로운 컬럼을 추가할 수있는가? 어떻게 해야하나?
답) 할수있다. 디폴트 값을 설정하면 된다.
문제) 한글 테이블명/컬럼명을 사용해도 되는가?
답) 된다.
문제) 설치 할 때 사용한 자료 정렬은 모든 테이블을 만들때 다시는 병경할 수 없다(참,거짓)
답) 거짓, COLLATE을 사용하여 테이블을 만들때 변경할 수 있다.
문제) 데이터베이스 개체의 완전한 이름을 붙이는 규칙은 어떻게 되는가?
답) 서비이름, 데이터베이스이름, 소유자,개체이름이다.
문제) EM에서 만든 테이블의 스크립트는 어떻게 만들어 내는가?
답) EM/해당테이블/모든작업/SQL스크립트 생성으로 할 수 있다.
---------------------------------------------------------------
<7장>
1. INSERT
- 형식) INSERT 테이블
VALUES 컬럼에 들어갈 값
2. IDENTITY 와 DEFAULT
- IDENTITY : 데이터가 순차적으로 자동 들어가지는 값
- TIMESTAMP : 입력된 시간이 서버에 도장처럼 찍혀져있다.
3. INSERT...SELECT : SELECT...INTO
- 이미 존재하는 테이블에서 새로운 테이블을 만들어 데이터를 입력하고자 할때 사용.
4. DELETE
- 형식) DELETE 테이블명
5. 트랜잭션에 대한 기초개념
- 지운값을 다시 되돌릴때 사용
- ROLLBACK :되돌리기(취소)
- COMMIT : 그대로 저장
※ COMMIT 한후에 ROLLBACK는 안된다.
6. TRUNCATE TABLE
- 우리가 보이는 데이터는 똑같고, 대신 주소값만 삭제됨
7. UPDATE
8. 한UPDATE문은 같은 데이터를 두 번이상 UPDATE할 수없다.
---------------------------------------------------------------
<7장 복습문제>
문제) 계속적으로 증가하는 값을 사용하기 위해서는 어떤 속성을 사용하여야 하는가?
답) IDENTITY속성을 사용한다.
문제) 변경시킨 데이터를 되돌릴 수있는가?
답) 트랜잭션을 사용하면 된다. BEGIN TRAN / COMMIT TRAN을 사용.
문제) 이미존재하는 테이블에 다량의 데이터를 입력하려면 어떤 문장을 사용하여야 하는가?
답) INSERT...SELECT를 사용한다.
문제) DELETE 과 TRUNCATE TABLE의 차이점은 무엇인가?
답) DELETE은 WHERE절을 사용할 수 있으며 실제 데이터를 모두 로그에 기록하며 지우는데 비해, TRUN-CATE TABLE은 데이터를 모두 지우며(WHERE)절을 사용할 수 없다), 실제 행들을 하나씩 지우는 것이 아니라 전체를 지우기 때문에 빠르다.
---------------------------------------------------------------
<8장>
1. 데이터 무결성 3가지
영역무결성(entity) : 다른영역은 들어갈 수없다.
실체무결성(domain) : 나는유일하다. 둘이면 하나는 귀신~
참조무결성(referential) : 참조당하는것은 바뀔수없다.
2. 절차적방법/서술적방법
절차적 : 먼저정의하고, 다시 바인드하는 식으로 절차를 거쳐 정의하고 사용한다. 재활용 가능
서술적 : 테이블을 서술할 때 함께 서술됨. 재활용이 불가능하지만 문서화를 하기에 매우 쉽고, 읽기 좋다.
3. 컬럼에 대한 세가지 속성
NOT NULL(NN) 널을 허락하지 않음.NOT NULL, PR KEY
NO Duplicate(ND) 중복된값을 허락하지 않음.UNIQUE, PR KEY
NI Change(NC) 값의 변경을 허락하지 않는다.
(FOREIGN KEY로 참조당할 때)
4. NULL (P240 참조)
5. 고유제약(UNIQUE)
6. IDENTITY(P246 참조)
7. DEFAULT제약과 절차적 방법의 DEFAULT(247)
8. RULE과 CHECK 제약
9. 참조키
10. 제약중지시키기/기존 데이터 검사하지 않기
(Disable/Defer)
11. 무결성 강화 객체들을 사용할 때 고려할 사항
(256그림중요)
---------------------------------------------------------------
<8장 복습문제>
문제) 무결성을 강화시켜주는 구성 요소들을 나열해 보라
답) 자료형, 사용자정의 자료형,스토어드 프로시저,색인
제약(기본키,참조키,UNIQUE, DEFAULT),RULE,DEFAULT,트리거
문제) 기본키는 NN, ND, NC중에서 어떤것들을 지켜주는가?
답) NN, ND
문제) 참조키는 NN, ND, NC중에서 어떤것들을 지켜주는가?
답) NC
문제) 기본키와 유일 제약의 차이는 무엇인가?
답) 널값의 허용여부
문제) 7.0이후 널 값을 사용할 때 왜 주의해야 하는가?
답) ANSI92규정을 지키고자 변경된 것들이 많다.
예를 들어 널 + 문자는 널이다.
문제) 참조 키를 만들면 색인이 만들어 지는가?
답) 색인이 만들어지지 않는다