본문 바로가기
Programming/DB (SQL)

[SQL Server] Chapter 03. T-SQL기초(1)

by 곰네Zip 2014. 12. 3.

 *이 포스팅 내용은 개인 학습 내용을 정리한 것입니다.

 

* 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

반응형

댓글