※ 구분은 대소문자 상관없지만 가독성을 위해 대문자를 이용(변수는 대소문자 지켜야 함)
※ 구문 실행 순서에 따라 AS로 지정한 별칭이 적용되지 않는 구문이 있다.
SELECT / FROM / WHERE / GROUP BY / HAVING / ORDER BY / OFFSET FETCH
FROM / WHERE / GROUP BY / HAVING / SELECT / ORDER BY / etc..
1. SELECT
- 질의라고 함.
- 모든 열을 가지고 올때는 '*'를 사용한다.
- 여러 열들을 가지고 올때는 ','로 구분한다.
- 특정 열의 별칭을 달고 싶을때는 '열명 AS 별칭'을 사용한다.
- 갯수 지정이 가능하다 (상위 10개 : TOP 10 *, 상위 10% : TOP 10 PERCENT *)
2. FROM
- 테이블 명을 입력한다.
- 조건구문. 원하는 조건의 행을 가져온다.
- 조건 연산자는 문자로 풀어서 사용한다.
!= NULL |
IS NOT NULL |
== NULL |
IS NULL |
&& |
AND |
|| |
OR |
- LIKE : 문자 패턴 매칭
% : 임의의 문자열 |
ex) 'Hello%' : Hello가 들어간 모든 값을 얻을 수 있음 |
_ : 임의의 문자 |
ex) 'Hell_' : Hell과 나머지 문자 1개가 들어간 모든 값을 얻을 수 있음 |
- 그룹핑
- 중복을 제거하는 DISTINCT와 다르게 집계의 인수로 값을 넘겨줄 수 있다.
- GROUP BY에 대한 추가 조건을 입력하는 구문
- 결과를 정렬한다.
- 오름차순(ASC), 내림차순(DESC)가 있다. (기본값 : ASC)
- 정렬은 테이블에 영향을 주지 않는다.
- 여러 열들을 정렬할 때 ','로 구분한다.
- 원하는 구간을 지정할 수 있다.
- ex) 50위 부터 100위의 순위를 가지고 온다 : OFFSET 50 ROWS FETCH NEXT 50 ROWS ONLY
- 사용빈도가 낮다. (알고만 있을것)
- DATE : 연/월/일
- TIME : 시/분/초
- DATETIME : 연/월/일/시/분/초
- 날짜는 문자열로 관리할 경우 정확한 날짜 비교가 쉽지 않다.
(문자열은 비교 대상끼리 일치를 보는것이 아닌 사전 순서의 일치를 보는것)
- 문자열로 입력시 DATETIME 형식 : YYYYMMDD / YYYYMMDD hh:mm:ss.nnn / YYYY-MM-DDThh:mm
- 문자열로 시간 형식을 맞춰 입력하면 CAST 함수를 사용하지 않아도 자동으로 CAST가 된다.
- GETDATE() : T-SQL 한정 현재 시간 가져오는 함수 (표준 : CURRENT_TIMESTAMP)
- GETUTCDATE() : 그리니치 표준시(글로벌 서비스 시)
- 기타 함수 : DATEADD(시간 더하기), DATEDIFF(시간 차), DATEPART(특정 시간 가져오기(연 or 월 or 일 등))
- DATEPART(DAY, sometime) == DAY(somtime)
- Null의 연산 결과는 Null이다.
- 한글의 경우 문자열 앞에 N을 붙여 유니코드로 변경해준다. (기본 값으로는 ?로 표기가 됨)
- 문자열 연산 : CONCAT(), SUBSTRING(), TRIM() 등이 있다.
- CASE 열명 WHEN 조건 THEN 값 END
- CASE WHEN 조건 THEN 값 END
- default는 ELSE로 표기한다.
- ELSE를 넣어주지 않았을때 ELSE에 해당되는 값이 들어가면 그 값은 Null이다.
- COUNT(), SUM(), AVG(), MIN(), MAX()가 있다.
- 집계 함수는 값이 Null인 경우는 무시하고 실행된다.
- 인수에 '*'를 넣을 수 있는 함수는 COUNT()가 유일하다.
- MIN(), MAX()는 문자열이나 날짜에도 사용이 가능하다.
- WHERE 구에서는 사용이 불가능하다.
- DISTINCT 뒤에 붙인 열명이 여러개인 경우, 붙인 열들의 값이 전부 일치해야 중복 처리가 된다.
- INSERT INTO [테이블 명] VALUES [열의 값, 열의 값, ....]
- VALUES의 값이 모자라면 에러가 발생한다.
- DELETE FROM [테이블 명] WHERE [조건]
- UPDATE [테이블 명] SET [열 = 값] WHERE [조건]
※ 물리삭제(DELETE)와 논리삭제(UPDATE)
- 논리삭제의 경우 Delete flag의 열을 둔 뒤, Delete flag 값의 변경으로 유저의 삭제 여부를 알수있음.
- 논리삭제의 경우 물리적으로 삭제한것이 아니기 때문에 추후에 복구가 가능함.
- 개인정보(SNS)등을 포함한 정보는 물리삭제를 한다.
※ INSERT SELECT
- 테이블의 데이터를 다른 테이블에 복사할때 사용한다.
- SubQuery와 유사하지만 기능의 차이가 있다.
- SQL 명령문 안에 지정하는 하부 SELECT.
- 서브쿼리의 결과가 다중행인 경우 IN을 사용한다.
- 다른 구문에서도 사용 가능하지만 주로 WHERE 구문에서 사용된다.
※ 상관 관계 서브쿼리
- EXISTS, NOT EXISTS가 있다.
- IN과 유사하지만 확장성이 높다.
- CREATE INDEX [인덱스 명] ON [테이블 명(열 명)]
- DROP INDEX [테이블 명.인덱스 명]
1. PRIMARY KEY = 대부분 CLUSTERED INDEX
- 테이블당 1개만 존재한다.
- 제일 빠름.
- 등록시 명시하지 않으면 기본적으로 CLUSTERED로 설정된다.
- Dictionary의 KEY와 같음. (사전 순서)
2. 나머지 = NON CLUSTERED INDEX
- 갯수 제한이 없다.
- 이진 탐색을 한다.
- 따로 관리하는 일종의 LOOK UP 테이블
- 색인과 같다.
- 합집합
- Query UNION Query
- 교집합
- Query INTERSECT Query
- 차집합
- Query EXCEPT Query
- 교차 결합
- SELECT * FROM [테이블] CROSS JOIN [테이블]
- 두 개의 테이블을 가로로 결합.
- 결합 기준은 ON으로 설정한다.
- 양쪽에 정보를 갖고있는 것만 JOIN이 된다.
- SELECT * FROM [테이블] INNER JOIN [테이블] ON [조건]
- JOIN 방향의 정보는 무조건 표시, 반대 방향의 테이블의 정보가 JOIN 방향의 테이블에 없으면 NULL로 채움.
- SELECT * FROM [테이블] LEFT / RIGHT JOIN [테이블] ON [조건]
- BEGIN TRAN [명령] COMMIT or ROLLBACK
- 명시하지 않으면 자동으로 COMMIT을 수행한다.
- TRY CATCH로 응용이 가능함.
※ 주의점
- TRAN이 오래걸리는 작업을 수행하게 되면 해당 작업이 끝날때 까지 다른 쿼리들이 대기하므로 주의.
- DECLARE [변수 명] AS 자료형 (+ 초기화 가능)
- SET [변수 명] = 으로 대입 가능
- SELECT 구문에서 대입 가능 (SQL SERVER에서만 가능)
- 테이블 변수도 만들 수 있다. (만들어진 테이블은 tempdb에 임시로 저장된다)
- GO
- { } 블록과 같은 기능을 가진다.
- BEGIN / END
- SSMS 관련 함수 참고 : https://docs.microsoft.com/ko-kr/sql/t-sql/functions/functions?view=sql-server-ver15