Primary Key
데이터 베이스 테이블에서 한 행을 고유하게 식별하게 사용되는 컬럼 혹은 컬럼의 집합을 말한다.
Clustered Index
테이블의 데이터를 물리적으로 정렬하는 순서를 결정하는 인덱스이다. 반대되는 개념으로 Non- Clustered Index가 존재한다.물리적으로 정렬되어있어 Non - Clustered 보다 검색 속도는 빠르지만 데이터의 입력,삭제시 매번 인덱스에의해 정렬을 해줘야하므로 이 부분은 Non - Clustered Index보다 느리다.
보통 Primary Key를 설정하면 자동으로 Clustered Index로 설정된다.이것 때문에 primary key와 clustered Index가 무슨차이인가 싶겠지만 Primary key가 곧 Clustered Index를 뜻하는것은 아니므로 두 개를 다르게 설정할 수있다.
복수의 테이블을 다룰대 WHERE에 여러 조건을 달아서 처리할수도있지만 조건이 까다로운경우 WHERE문도 그만큼 어려워지기때문에 분류후에 테이블을 합치는 방식이 간단할 수 있다.
예시를 들자면
1.커리어 평균 연봉이 3000000이상인 선수들의 playerID
SELECT playerID, AVG(salary)
FROM salaries
GROUP BY playerID
HAVING AVG(salary) >= 3000000
2.생일이 12월인 선수들의 playerID
SELECT playerID, birthMonth
FROM players
WHERE birthMonth = 12
두 코드는 각각 연봉,생일을 기준으로 playerID를 추출하고있다.여기서 조건을
커리어 평균 연봉이 3000000이상 OR 생일이 12월인 선수들의 playerID라고 주어진다면?
절차적으로 생각해보면 서로 다른 테이블로부터 조건에 부합하는 데이터를 뽑아오고 두 데이터를 합치는 작업이 필요할것이다.
MS SQL은 UNION이라는 명령어로 이 작업을 수행할수있도록 지원한다.
집합에 대해서 배웠다면 UNION은 합집합을 뜻하고 중복된값은 수학의 집합과 마찬가지로 하나로 처리한다.
하지만 ALL이라는 키워드를 붙이면 중복을 허용할수도있다.
사용법도 매우 간단한게 사이에 UNION을 넣어주기만하면된다.
SELECT playerID, AVG(salary)
FROM salaries
GROUP BY playerID
HAVING AVG(salary) >= 3000000
UNION
SELECT playerID, birthMonth
FROM players
WHERE birthMonth = 12
그렇다면 당연히 교집합(INTERSECTION)에 해당하는 INTERSECT라는 명령어와 차집합 기능인 EXCEPT
도 존재한다.
JOIN
또다른 결합방식인 JOIN을 소개해보겠다 UNION과의 차이점이라면 JOIN은 테이블을 공통된 데이터를 기준으로 결합하고 추출하는 것이고
UNION은 테이블을 세로로결합하고 공통된 데이터를 추출하는 차이점인것 같다.
CROSS JOIN
잘 사용되지는 않지만 testA와 testB테이블을 만들고 CROSS JOIN을 해보자
명시적으로 FROM 옆에 CROSS JOIN을 해도되지만 그냥 FROM에 두 테이블을 나열하면 CROSS JOIN을 해준다.
CREATE TABLE testA
(
a INTEGER
)
CREATE TABLE testB
(
b VARCHAR(10)
)
INSERT INTO testA VALUES(1)
INSERT INTO testA VALUES(2)
INSERT INTO testA VALUES(3)
INSERT INTO testB VALUES('A')
INSERT INTO testB VALUES('B')
INSERT INTO testB VALUES('C')
SELECT *
FROM testA,testB

A의 원소와 B의 원소 각각 한 개씩 선택했을때 나올수있는 집합의 원소들을 보여준다.(중복이 허용됨)
INNER JOIN
일치하는 열을 기준으로 결합시킨다.두 테이블중에 해당하는 열 value가 없으면 자동으로 제외시킨다.
USE BaseballData
SELECT *
FROM players
ORDER BY playerID
SELECT *
FROM salaries
ORDER BY playerID
--INNER JOIN
SELECT *
FROM players AS p
INNER JOIN salaries AS s
ON p.playerID = s.playerID
OUTER JOIN
INNER JOIN과 다르게 매칭되는 데이터가 없을때 어느 한쪽은 NULL로 표기하는데 LEFT와 RIGHT중 어딜 NULL로 표기하느냐에 따라 LEFT JOIN과 RIGHT JOIN으로 분류된다.
SELECT *
FROM players AS p
LEFT JOIN salaries AS s
ON p.playerID = s.playerID
SELECT *
FROM players AS p
RIGHT JOIN salaries AS s
ON p.playerID = s.playerID
LEFT JOIN의 경우 p.playerID와 일치하는 s.playerID가 없으면 playerID의 salaries 정보는 NULL로 표시한다.
RIGHT JOIN의 경우 p.playerID와 일치하는 s.playerID가 없으면 playerID의 players 정보를 NULL로 표시한다.
'MS SQL' 카테고리의 다른 글
| [MS SQL]7.인덱스 분석 (0) | 2025.02.07 |
|---|---|
| [MS SQL]6.TRANSACTION,변수와 흐름 제어 (0) | 2025.02.06 |
| [MS SQL]4.데이터 베이스 작성 (0) | 2025.02.02 |
| [MS SQL]3.GROUP BY,INSERT,DELETE,UPDATE,서브 쿼리 (0) | 2025.02.02 |
| [MS SQL]2.수치와 문자열,DATETIME,CASE,집계 함수 (0) | 2025.01.31 |