본문 바로가기

Programming

SQL 문법 정리 - SELECT

SQL 특징

SQL은 C, 자바와 달리 명령을 위한 예약어에 대소문자를 구분하지 않는다. 단, 'Person', 'person'과 같이 데이터베이스에 저장된 내용을 검색할 경우에는 대소문자를 구분한다.

문자열은 작은 따옴표!!!
같음은 =를 하나만 사용한다  ( c언어     ==      2개 )
문장 맨 뒤에 ;을 붙여준다.
SQL 예약어는 대문자로, 테이블이나 속성 이름은 소문자로 적으면 가독성이 좋다.


SQL 분류

1. 데이터 정의어(DDL) : 테이블이나 관계의 구조를 생성하는 데 사용하며 CREATE, ALTER, DROP 문 등이 있다.

2. 데이터 조작어(DML) : 테이블에 데이터를 검색, 삽입, 수정, 삭제하는 데 사용하며 SELECT, INSERT, DELETE,
UPDATE 문 등이 있다. 여기서 SELECT 문은 특별히 질의어(query)라고 부른다.

3. 데이터 제어어(DCL) : 데이터의 사용 권한을 관리하는 데 사용하며 GRANT, REVOKE 문 등이 있다.



데이터 조작어 - 검색


SELECT [ALL | DISTINCT] 속성이름(들)           - '*'은 모든 열을 나타내고 ,DISTINCT는 중복을 제거한다.

FROM 테이블이름(들)                       
[ WHERE 조건(들) ]                  
[ GROUP BY 속성이름 ]
[ HAVING 검색조건(들) ]
[ ORDER BY 속성이름 [ ASC | DESC ]            - ASC는 오름차순이고 DESC는 내림차순 이다.


처리순서

1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE 또는 WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP


WHERE 조건

 

연산자 

사용 예 

비교 

= , <>, <, <=, >, >=

price < 20000               ※ <>은 다름을 의미

범위 

BETWEEN 

price BETWEEN 10000 AND 20000  

집합

IN , NOT IN 

price IN ( 10000, 20000, 30000) 

패턴 

LIKE 

bookname LIKE '축구의 역사' 

NULL 

IS NULL , IS NOT NULL 

price IS NULL 

복합조건 

AND , OR , NOT 

(price < 20000 ) AND ( bookname LIKE '축구의 역사') 


LIKE와 같이 사용하는 와일드 문자

와일드 문 

의미 

사용예 

 +

 문자열을 연결 

 '골프 ' + '바이블' : '골프 바이블' 

 % 

 0개 이상의 문자열과 일치 

 '%축구%' : 축구를 포함하는 문자열 

 [] 

 1개의 문자와 일치 

 '[0-5]%' : 0-5 사이 숫자로 시작하는 문자열 

 [^] 

 1개의 문자와 불일치 

 '[^0-5]%' : 0-5 사이 숫자로 시작하지 않는 문자열 

 _ 

 특정 위치의 1개의 문자와 일치 

 '_구%' : 두 번째 위치에 '구'가 들어가는 문자열 


집계 함수

 집계 함수

 문법 

 사용 예 

 SUM 

 SUM([ALL | DISTINCT] 속성이름 )

SUM(price) 

 AVG 

 AVG([ALL | DISTINCT] 속성이름) 

AVG(price) 

 COUNT 

 COUNT({[[ALL | DISTINCT] 속성이름]|*}) 

COUNT(*) 

 MAX 

 MAX([ALL | DISTINCT] 속성이름) 

MAX(price) 

 MIN 

 MIN([ALL | DISTINCT] 속성이름) 

MIN(price) 


GROUP BY를 사용한 SELECT 절에는 GROUP BY에서 사용한 속성집계함수만 나올 수 있다.

HAVING 절은 GROUP BY 절의 결과 나타나는 그룹을 제한하는 역할을 한다.
또, GROUP BY 절과 같이 작성해야 하고 WHERE 절보다 뒤에 나와야 한다.
검색 조건에는 집계함수가 와야한다. 아래는 예시이다.

1
2
3
4
5
SELECT custid, COUNT(*) AS 도서수량   --AS를 써서 별칭을 설정한다.
FROM Orders
WHERE saleprice >= 8000
GROUP BY custid
HAVING count(*>= 2;
cs

       


여러 테이블에서의 SQL 질의

조건없이 테이블 간의 조인이 이루어진다. ( 카티전 프로덕트 )

1
2
SELECT *
FROM Customer, Orders;     
cs

조건을 추가함으로써 적절히 매칭된 결과를 획득 ( 동등 조인)

1
2
3
SELECT *
FROM Customer, Orders
WHERE Customer.custid = Orders.custid;   
cs

동등 조인의 표현 INNER JOIN 사용

1
2
3
SELECT *
FROM Customer INNER JOIN Orders 
ON Customer.custid = Orders.custid;       
cs

외부조인

1
2
3
4
SELECT < 속성들>
FROM 테이블1 { LEFT | RIGHT | FULL [OUTER]} JOIN
       테이블2 ON <조인조건>
WHERE <검색조건>
cs


부속질의( 중첩질의 )

SELECT 문의 WHERE 절에 또 다른 테이블 결과를 이용하기 위해 다시 SELECT 문을 괄호로 묶는 것을 부속질의 라고 한다. 일반적으로 데이터가 대량일 경우 데이터를 모두 합쳐서 연산하는 조인보다 필요한 데이터만 찾아서 공급해주는 부속질의가 성능에 더 좋다.


예제1 - 부속질의의 결과가 단일행-단일열(1 X 1)인 경우

1
2
3
SELECT bookname
FROM price = (SELECT MAX(price)
              FROM Book);
cs

예제2 - 부속질의의 결과가 다중행-단일열(n X 1)인 경우

1
2
3
SELECT name
FROM Customer
WHERE custid IN (1234);
cs


※ 부속질의는 SELECT 문에 나오는 결과 속성을 FROM 절의 테이블에서만 얻을 수 있고, 조인은 조인한 모든 테이블에서 결과 속성을 얻을 수 있다.

부속질의의 종류

 명칭

위치

설명 

 스칼라 부속질의 

 SELECT 절 

 단일 값을 반환하기 때문에 스칼라 부속질의라 한다. 결과 값은 단일 행, 단일 열의 스칼라 값으로 반환한다.

 인라인 뷰 

 FROM 절 

 FROM 절에서 결과를 뷰 형태로 반환하기 때문에 인라인 뷰라 한다. 조인에 참여하기 직전 필요한 데이터만 추출이 가능하므로 성능의 손실을 줄일 수 있다.

 중첩질의 

 WHERE 절 

WHERE 절에 술어와 같이 사용되며 결과를 한정시키기 위해 사용된다. 


스칼라 부속질의


예제1)

1
2
3
SELECT custid, (SELECT name FROM Customer cs WHERE cs.custid=od.custid), SUM(saleprice)
FROM Orders od
GROUP BY custid;
cs

예제2)

1
2
3
4
5
6
UPDATE sell
SET bookname=(SELECT bookname
                FROM Book
                WHERE Book.bookid = Orders.bookid);
 
 
cs


인라인 뷰


예제1)

1
2
3
4
5
6
7
SELECT a.name, SUM(b.saleprice) "total"
FROM ( SELECT custid, name
        FROM Customer
        WHERE custid <= 2) a,
        Orders b
WHERE a.custid = od.custid
GROUP BY a.name;
cs


집합연산

합집합 - UNION
차집합 - EXCEPT ( MINUS )
교집합 - INTERSECT


예제)

1
2
3
4
5
6
7
SELECT name
FROM customer
EXCEPT
SELECT name
FROM Customer
WHERE custid IN (SELECT custid
                  FROM Orders);
cs


ALL, SOME(ANY)
비교 연산자를 예로 들면 >ALL은 모든 값보다 크다는 것을 의미합니다. 즉, 최대값보다 크다는 것을 나타냅니다. 예를 들어 >ALL (1, 2, 3)은 3보다 크다는 것을 의미합니다. >ANY는 적어도 하나의 값보다 큼 즉, 최소값보다 크다는 것을 의미합니다. 따라서 >ANY (1, 2, 3)은 1보다 큼을 의미합니다

1
2
3
4
5
SELECT orderid, saleprice
FROM Orders
WHERE saleprice > ALL ( SELECT saleprice
                        FROM orders
                        WHERE custid = '3');
cs


EXISTS
EXISTS는 다른 연산자와 달리 왼쪽에 스칼라 값이나 열을 명시하지 않는다. 때문에 반드시 부속질의에 주질의의 열이름이 제공되어야 한다. 조건에 맞는 튜플이 존재하면 결과에 포함시킨다. 즉 부속질의문의 어떤 행이 조건에 만족하면 참이다.반면 NOT EXISTS는 부속질의문의 모든 행이 조건에 만족하지 않을 떄만 참이다.

1
2
3
4
5
SELECT name, address
FROM Customer cs
WHERE EXISTS ( SELECT *
                 FROM Orders od
                WHERE cs.custid = od. custid);
cs


① cs의 첫 행을 가져와서 부속질의문에 cs 값으로 입력한다.
② od의 어떤 행에서 cs의 고객번호와 같은 것을 찾으면 EXISTS는 참이 되어 cs의 첫 행에 대한 name과 address가 반환된다.
③ 다음으로 cs의 두 번째 행이 부속질의문에 입력되고 이것은 cs의 모든 행에 대하여 반복된다.


TOP n 질의

SQL 실행 결과에서 상위 n개의 행만 반환한다.

1
2
3
SELECT TOP 2 custid, name, phone
FROM Customer
ORDER BY name;
cs


'Programming' 카테고리의 다른 글

SQL 문법 정리 - INSERT, UPDATE, DELETE  (0) 2015.02.04
SQL 문법 정리 - CREATE , ALTER , DROP  (0) 2015.02.04
관계 데이터 모델  (0) 2015.01.31
Move , Turn  (0) 2015.01.30
C# 스크립트  (0) 2015.01.29