*이 포스팅 내용은 개인 학습 내용을 정리한 것입니다.
* Transact-SQL (T-SQL) : 현재 SQL서버에서 사용중인 SQL문
1. SELECT문
SELECT문의 형식 ( []문 안의 내용은 옵션)
SELECT [DISTINCT] [TOP] <컬럼별칭과 반환될 컬럼, 표현식, 상수값들> [INTO] <새로운 테이블명> FROM <기초 테이블명과 별칭들> [WHERE] <검색 조건들> [GROUP BY] <집계 기준 컬럼들> [HAVING] <집계함수결과에 대한 조건들> [ORDER BY] <정렬될 기준 컬럼들> |
SELECT문의 기본 구조는 다음과 같다.
SELECT * FROM (MyDB.dbo.)MyTable |
*은 모든 컬럼을 가져오라는 와일드카드. MyTable은 내가 조회하여 올 컬럼이다. 만약 MyDB를 현재 사용중이라면 'MyDB.dbo.'이 부분은 생략해도 된다.
FROM절에는 SQL2000에서 지원하는 사용자 정의함수를 사용할 수 있다. 즉, 다음과 같은 구문도 OK
SELECT * FROM ::fn_helpcollaptions(); |
사용자 정의 함수에 대해서는 추후에 올릴 예정
2. 식별자
- DB의 개체 이름은 식별자이다. 일반식별자의 규칙을 따르지 않는 경우, '"'(큰 따옴표)나, '[]'(대괄호)로 구분해서 구분식별자로 사용하여야 한다.
- 위의 두 경우 모두, 식별자 이름 길이는 최대 128자. (임시테이블의 경우 116자)
- 구분식별자에는 일반식별자에서 포함되는 내용 외에 다음 문자들을 추가로 사용할 수 있다.
물결표(~), 하이픈(-), 느낌표(!), 좌측중괄호({),우측중괄호(}), 아포스트로피('). 백분율(%), 캐럿(^) 앰퍼샌드(&), 마침표(.), 좌측괄호((), 우측괄호()), 백슬래시(\), 악센트기호(`) -출처 : MS TechNet( http://technet.microsoft.com/ko-kr/library/ms176027(v=sql.105).aspx) |
- 큰따옴표(")를 구분자로 사용하려면, SET QUOTED_IDENTIFIER ON으로 세션 옵션이 설정되어야 한다.
3. 문자열과 작은따옴표 표현
- 문자열 표현을 위해 작은따옴표(')를 사용한다. 문자열에 작은따옴표를 포함하고 싶다면, '' (두번표시)를 하여 처리하면 된다.
- SET QUOTED_IDENTIFIER OFF로 세션옵션이 설정되면, 큰따옴표 (")를 문자열 표현에 사용할 수 있다. 이런경우에 작은따옴표는 '로 표시가 가능하다.
SELECT 'hello''s'는 SET QUOTED_IDENTIFIER OFF SELECT "Hello's"와 같다. |
QUOTED_IDENTIFIER 가 OFF일 경우, 큰따옴표는 ""로 표시하면 된다.
4. SELECT, FROM, WHERE
예를들어 다음과 같은 테이블이 있다고 가정하자.
stor_id |
title_id |
qty |
price |
P01 |
테스트1 |
30 |
500 |
S01 |
테스트2 | 45 | NULL |
P02 | 테스트3 |
20 |
10 |
D01 |
테스트4 |
35 |
5000 |
P03 |
테스트5 | 40 | NULL |
S02 |
테스트6 | 60 | 300 |
[테이블 : 상점정보. 이름은 'Sales']
(1) Sales에서 모든 데이터를 불러오고 싶다면 다음과 같은 쿼리를 수행한다.
SELECT * FROM Sales |
(2) 이 테이블에서, title_id가 '테스트1'인 상점을 찾고 싶다면 다음과 같이 쿼리문을 작성할 수 있다.
SELECT * FROM Sales WHERE title_id='테스트1' |
- 이 구문은 문자열이 정확하게 일치하여야 한다.
(3) 특정 패턴을 가지는 문자열을 찾고 싶다면 (예를들어stor_id가 P로 시작하는 경우)
SELECT * FROM Sales WHERE stor_id LIKE 'P%' |
- LIKE문을 사용하고, 여기에 추가할 수 있는 패턴 문자열은 아래와 같다.
(4) 범위 검색 : BETWEEN을 사용한다. (예 판매수량이 30개이상, 40개 이하인 경우)
SELECT * FROM Sales WHERE qty BETWEEN 30 AND 40 |
이 구문은 다음 구문과 같다
> SELECT * FROM Sales WHERE qty >= 30 AND qty <= 40
(5) 특정 값 안에 있는지 여부 : IN (예를들어 S01, P03을 찾으려고 할 경우)
SELECT * FROM Sales WHERE stor_id IN ('P03','S01') 위 구문은 아래와 같다 SELECT * FROM Sales WHERE stor_id = 'P03' OR stor_id='S01' |
(6) IN으로 비교할 비교 값에는 하위 쿼리를 사용할 수 있다. 즉, 다음과 같은 쿼리가 가능하다
SELECT * FROM Sales WHERE stor_id IN (SELECT stor_id FROM Stores WHERE name='test') |
(7) NULL값 비교
- NULL값과의 비교를 위해서는 IS NULL 구문을 사용하여야 한다. 반대로, != NULL을 비교하기 위해서는 IS NOT NULL을 사용하여야 한다.
SELECT stor_id, price FROM Sales WHERE price IS NULL 결과> S01 NULL P03 NULL |
4,5에서처럼 아래 구문도 동일한 동작을 할까?
SELECT stor_id, price FROM Sales WHERE price = NULL |
위 구문은 정상적으로 동작하지 않는다. 위 구문의 동작을 위해서는 다음 옵션을 설정하여 주어야 한다.
SET ANSI_NULLS OFF |
ANSI_NULLS 옵션을 OFF로 해주어야 한다. ANSI표준은 IS NULL, IS NOT NULL을 사용하는 것이다.
(8) WHERE절에서는 NOT, AND, OR 논리연산자를 사용하여 조건을 중첩할 수 있다. 우선순위는 NOT, AND, OR순이다. 하지만 괄호를 사용하여 명시적으로 우선순위를 두는 것이 좋다.
5. ORDER BY
- SELECT문으로 조회한 결과를 조건에 의해 정렬할 때 사용하는 구문, ntext, text, mage데이터 형식에는 해당 조건을 줄 수 없다.
- 오름차순의 경우 ASC키워드를, 내림차순의 경우 DESC키워드를 사용한다. 기본은 오름차순이다.
6. TOP n
- 조회된 결과의 상위 n개의 자료만 조회할 때 사용함.
예제 구문은 다음과 같다. (4에서의 테이블을 사용한다고 가정)
SELECT TOP 3 stor_id, qty FROM Sales ORDER BY qty DESC 결과> S02 60 S01 45 |
7. DISTINCT
- 중복된 값을 배제하고 고유한 값을 가져오고 싶을 때 사용한다. 이와 반대로 ALL을 사용하여 모든 데이터를 가져올 수 있다. 자세한 내용은 차후에 다시 설명됨
8. GROUP BY, HAVING
- 요약 정보를 위해 GROUP BY절과 집계함수를 사용할 수 있다. 집계함수는 NULL값을 제외하고 처리한다. (COUNT는제외). GROUP BY에서 주의할 점은 SELECT에서 사용될 컬럼은, GROUP BY에 언급되거나, 집계함수에 의해 만들어진 함수여야 한다.
9. SELECT ~ INTO
이 구문을 사용하면 select된 결과를 새로운 테이블을 생성하여 데이터를 삽입할 수 있다. 예제 구문은 아래와 같다.
SELECT * INTO SalesTest3 FROM (SELECT stor_id, qty FROM Sales) AS temp |
10. JOIN
- JOIN : 여러 테이블을 쿼리하여 하나의 결과물을 만들음
- JOIN은 아래와 같이 세가지 유형이 있음
(1) INNER JOIN : 연결조건을 모두 만족하는 행을 조회함 가장 일반적인 조인
SELECT <getCols> FROM <tableA> INNER JOIN <tableB> ON <condition> |
위와 같이 사용한다.
- 여러 테이블에 대한 조인을 반복하기 위해서는 JOIN~ON~을 계속 붙이면 된다.
(2) CROSS JOIN : 상호조인. 조인조건이 없음, 왼쪽 테이블의 모든 행을 오른쪽 테이블의 모든 행과 조인한다.
SELECT <getCols> FROM <tableLeft> CROSS JOIN <tableRight> |
- 모든 행이 조회된다. 만약 각 테이블이 5행, 6행일 경우 결과는 30행이 나온다.
- 조인은 같은 테이블끼리의 조인이 가능하므로, CROSS JOIN의 경우 각 행의 모든 경우의 수를 만드는데는 쓸 수 있을 것 같다.
(3) OUTER JOIN : 조건을 만족하는 행과 만족하지 못하는 행을 모두 확인하고 싶을 때 사용.
- 조인의 종류는 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN. T-SQL에서는 *=, =*(각각 좌,우 외부조인임)를 사용할 수 있다. FULL OUTER JOIN은 ANSI표준을 사용하여야 한다
a) LEFT OUTER JOIN
ANSI표준> SELECT <getCols> FROM <tableA> LEFT OUTER JOIN <tableB> ON <Condition> T-SQL> SELECT <getCols> FROM <tableA>, <tableB> WHERE <tableA.col> *= <tableB.col> |
- 좌측 테이블에 있는 데이터를 기준으로 조회하여 올 수 있다. (좌측테이블에 없으면 조회되지 않음)
b) RIGHT OUTER JOIN
ANSI표준> SELECT <getCols> FROM <tableA> RIGHT OUTER JOIN <tableB> ON <Condition> T-SQL> SELECT <getCols> FROM <tableA>, <tableB> WHERE <tableA.col> =* <tableB.col> |
- 우측 테이블(TableB)의 항목을 기준으로 조회
c) FULL OUTER JOIN
SELECT <getCols> FROM <TableA> FULL OUTER JOIN <TableB> ON <Condition> |
- 좌,우 테이블 모든 항목을 가지고 조회한다.
- T-SQL로 외부조인 사용시 검색조건에 NULL을 비교하는 경우에는 조인조건인지 검색조건인지 명확하지 않아 잘못된 결과를 얻을 수 있다. 그래서 NULL검색조건에서는 ANSI표준을 사용하는 것을 권장한다.
쿼리> SELECT Meals.Menu_id, Menu_name, Date, Amount FROM Menus LEFT OUTER JOIN Meals ON Menus.Menu_id = Meals.Menu_id WHERE Date IS NULL 결과> Menu_id Menu_name date Amount ----------------------------------------------------------- NULL 김치찌개 NULL NULL
쿼리> SELECT Meals.Menu_id, Menu_name, Date, Amount FROM Menus , Meals WHERE Menus.Menu_id *= Meals.Menu_id AND Date IS NULL Menu_id Menu_name date Amount ----------------------------------------------------------- NULL 백반 NULL NULL NULL 순두부 NULL NULL NULL 김치찌개 NULL NULL 4 짬뽕 NULL 3800 |
이후는 다음 포스팅에
- 출처 : SQL Server Advanced programming
댓글