-
데이터베이스 조인 조건 반복 동적(2020.06.10)데이터베이스 2020. 6. 10. 11:45
*****조인******
두 개의 테이블을 하나처럼 봐서 결과를 도출하는 방법.
INNER JOIN 개념
- 조인 중 가장 많이 사용됨
- 일반적인 조인은 이 INNER JOIN을 얘기하는 것임
SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인될 조건>
[WHERE 검색조건]
책을 예로 들면
장르를 아래와 같이 주먹구구식으로 지으면
IT 전문서적
it 전문서
IT 전문 -> 구분테이블
DIVISION ( 구분 테이블 )
B001 | IT 전문서적
B002 | 소설
B003 | 자기계발서
B001~3 = CHAR(4)
B001은 한눈에 봤을 때 모르기 때문에 묶어서 보면 장르를 알 수 있다.
정규화의 종류 중 하나로써 위 두개의 테이블을 조인하면 매칭함으로써 분류가 가능하다.
내부 조인 (JOIN)
앞에 테이블이 기준이고 뒤에 테이블을 붙여서 매칭된다. FROM뒤에 적은 테이블이 먼저 나오고 그 옆에 INNER JOIN 뒤에 붙은 테이블이 나온다.
위에서 양 쪽 테이블에 모두 다 있는 userID열을 제외하고 앞에 ' b. ' 와 ' u. ' 은 생략 가능 하지만 JOIN 안에 있는 테이블은 생략이 불가능하다.
세개의 테이블 조인
테이블 생성 및 데이터 집어넣기
외부 조인 (JOIN)
우리 쇼핑몰에서 구매 안한 놈들을 알고 싶을 때 쓰는게 외부 조인이다. 내부조인은 조인의 조건인 만족되지 않는 행은 출력되지 않지만, 외부 조인은 조건이 만족되지 않는 행까지 출력됨
SELECT <열 목록>
FROM <첫 번째 테이블 (LEFT 테이블)>
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT TABLE)>
ON <조인될 조건>
[WHERE 검색조건]
세가지 종류가 있다 (LEFT RIGHT FULL) FULL은 거의 안씀. 골 때린다.
RIGHT OUTER 조인
위에는 조관우, 김경호, 임재범, 이승기, 윤종신이 안나온다. 기준이 다른 것 오른쪽 (FROM 뒤와 RIGHT OUTER JOIN뒤에를 기준으로) 즉 buyTBL을 기준으로 했기 때문에 기준이 될 것이 없기 때문에 그대로 buyTBL 이 그대로 나온다
stdTbl stdclubTbl 왼쪽을 기준으로 하기 때문에 가입된 정보가 없으므로 LEFT OUTER 조인 결과가 성시경이 나오는데 오른쪽 테이블에 정보가 없기 때문에 NULL로 출력된다.
RIGHT OUTER 조인은 기준을 바꾸고 싶을 때 쓰는 경우가 많고 LEFT OUTER조인이 많이 쓴다.
CROSS JOIN 안씀
SELF JOIN 안씀
UNION, UNION ALL
UNION 은 두 쿼리의 결과를 행으로 합치는 것. 단 중복을 제거한다. UNION 은 중복까지 허용함.
*데이터타입이 같아야 UNION가능하다. * 굳이 하려면 형변환 CONVERT( VARCHAR, t.num) 잘 쓰진 않음
두 테이블 결합
중복 제거 중복 포함 EXCEPT 는 첫 번째 쿼리의 결과 중에서, 두 번째 쿼리에 해당하는 것을 제외하기 위한 구문이다.
IF ELSE
IF 부울식표현
BEGIN
문장
END
ELSE
BEGIN
문장
END
주의할점은 비교 연산자 c# 에서는 == 이지만 SQL SERVER 는 = 만 쓴다. 대입도 = 비교도 =
== 쓰지않는다.
CASE WHEN THEN
print 로도 출력 가능
아우터 조인 부분에 아래와 같이 바꿔도 똑같다.
FROM userTBL AS b
LEFT OUTER JOIN buyTBL AS b
반복문 WHILE, BREAK, CONTINUE, RETURN
조건문이 참인 동안 계속 반복
반복문 계속하면 CONTINUE
반복문 중단하면 BREAK
GOTO 안씀 쓰면 안좋음
WAITFOR
TRY/CATCH 에러핸들링 나중에
EXEC(동적 SQL)
저장 프로시저를 실행할 때 쓰는 명령
동적 쿼리 ' ~ ' 안에 있는 쿼리문이 동작한다.
SET @curDate = FORMAT(GETDATE(), 'yyyyMMddhhmmss');
SET @sql = 'CREATE TABLE testTBL_' + @curDate
SET @sql += '(Id int, name NCHAR(10);'
EXEC @sql 로 동적으로 바뀌는 시간을 테이블의 이름으로 활용할 수 있다.
'데이터베이스' 카테고리의 다른 글
데이터베이스 인덱스, 트랜잭션, 저장 프로시저(2020.06.11) (0) 2020.06.11 데이터베이스 테이블과 뷰(2020.06.10) (0) 2020.06.10 데이터베이스 Transact-SQL 기본, 고급(2020.06.09) (0) 2020.06.09 데이터베이스 Transact-SQL 기본 (2020.06.08) (0) 2020.06.08 데이터베이스 전체 운영 실습, 툴과 유틸리티 (2020.06.08) (0) 2020.06.08