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 (1, 2, 3, 4); | 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 |