SELECT는 원하는 데이터를 뽑아내고 자 할 때 가장 많이 쓰는 쿼리 명령어로 WHERE, LIKE, HAVING, JOIN 등의 구문과 함께 쓰일 수 있다.
SELECT를 다음과 같이 다양하게 활용 가능하다.
AS
SELECT로 선택한 Column에 별칭을 부여하는 역할
결과 테이블이 출력될 때 Column 이름은 별칭으로 나타남
ORDER BY
결과 테이블의 레코드를 오름차순 또는 내림차순으로 정렬
WHERE
SELECT 구문에 조건을 추가할 때 사용
일반적 구문 형식은 가장 기본적인 select ~ from 구문 뒤에 where 키워드와 조건을 붙임
조건식은 주로 'Column 이름', '연산 기호', '조건 값' 순서로 온다.
LIKE
WHERE 구문 안에 위치
SELECT에서 뽑은 Column 안의 문자열 데이터의 패턴을 명시하여 찾을 때 사용
조건절에서 어떻게 사용하느냐에 따라 수많은 로그에서 내가 원하는 로그만을 출력할 때 매우 유용하게 사용
문자열의 패턴을 명시할 때는 와일드카드라는 것을 사용한다.
DB 종류마다 와일드카드가 조금씩 다르며, 다음 표와 같이 대표적인 와일드카드가 있다.
[표 1] 와일드카드 설명
기호
설명
예시
%
0개 또는 여러 개의 문자가 올 수 있다는 의미
se%는 se, seek, seel, sell, secret 등 se로 시작하는 문자열 의미 c%t는 cat, cut 등 c로 시작하고 t로 끝나는 문자열 의미 %p는 app, cup, sip 등 p로 끝나는 문자열 중 하나를 의미하며, 0개의 문자열이 올 수도 있으므로 p도 해당
_
하나의 문자가 올 수 있다는 의미
s_t는 sit, sat 등 s와 t 사이에 하나의 문자가 오는 문자열 의미
[]
[]안에 명시한 문자들 중 하나의 문자가 올 수 있다는 의미
h[i,a]t는 hit 또는 hat을 의미
-
문자의 범위를 나타낼 때 사용
h[a-l]t는 h와 t 사이에 a부터 l 중 하나의 문자가 올 수 있다는 것을 의미 hat, hit가 여기에 해당
^
NOT을 의미
h[^a-l]t는 h와 t 사이에 a부터 l까지의 문자를 제외한 다른 하나의 문자만이 들어올 수 있다는 것을 의미 hat, hit은 여기에 포함되지 않고, hot, hut이 포함
MS Access의 경우 %는 *로, _는 ?로, ^는 !로 사용하며, 하나의 숫자 문자를 나타낼 때는 #을 사용한다.
AND, OR, NOT
WHERE 구문과 함꼐 조건문을 만족하는 레코드만을 뽑아낼 때 사용
BETWEEN
WHERE 구문에서 조건을 명시할 때 값의 범위 표현
IN
WHERE 구문의 조건에서 다양한 값을 명시할 때 사용
IN 안에 또 다른 SELECT 구문을 사용하여 조건에 여러 값을 명시할 수 있다.
IN 안의 SELECT 구문이 가장 먼저 수행 된다.
먼저 email_list 테이블에서 email 문자열 데이터가 '@gmail.com'으로 끝나는 것들 중 user_name을 뽑아낸다.
여기서 뽑아낸 데이터들이 바깥에 있는 WHERE 구문 emp_name의 조건 값이 된다.
만약 IN 안의 SELECT 구문을 실행하여 얻어낸 데이터들이 'Betty', Carol', 'Demian' 이라면 employee_table에서 emp_name이 'Betty', 'Carol', 'Demian'인 레코드의 emp_name과 emp_num 정보를 보여주는 결과 테이블이 출력된다.
COUNT, SUM, AVG, MIN, MAX
다음과 같은 함수를 집계 함수라고 하며, 숫자 데이터를 계산할 때 유용
COUNT는 조건을 만족하는 모든 레코드의 개수를 셈
SUM은 숫자 값을 담는 Column의 데이터 총 합을 계산
AVG는 숫자 값을 담는 Column의 데이터 평균 값을 계산
MAX는 해당 Column의 가장 큰 값을 반환
MIN은 해당 Column의 가장 작은 값을 반환
HAVING ~ GROUP BY
GROUP BY는 주로 위에서 소개한 집계 함수와 함께 쓰인다.
집계 함수의 결과를 특정 Column을 기준으로 그룹을 짓는 역할을 한다.
HAVING은 GROUP BY와 함께 쓰이며 집계 함수 조건절을 추가할 때 사용한다.
[표 2] Group By 실행 결과 테이블
Employee Number
Country
20
USA
15
China
11
Argentina
8
Germany
5
France
4
Canada
4
UK
3
Brazil
2
Korea
JOIN
둘 이상의 테이블이 서로 연관된 Column을 가지고 있을 때 JOIN 명령으로 테이블들의 레코드 결합 가능
테이블 1 : Order_Info
cust_num
cust_name
order_date
total_charge
001
Alice Green
2020-01-04
257,800
002
Bob Smith
2020-01-01
25,000
003
Carol White
2020-01-02
65,000
004
Daniel Cruze
2020-01-03
147,350
테이블 2 : Customer_Info
cust_num
user_ID
email
birth
001
alice0306
hialice_0306@gmail.com
1997-03-06
003
sing_carol
sing_carol@gmail.com
1998-10-15
005
espressoholic
needscaffein@gmail.com
1995-11-17
008
blacksheep_DC
blacksheep_DC@gmail.com
1999-06-23
위 두 개 테이블에서 동일한 Column은 cust_num이다
따라서 cust_num을 기준으로 두 개의 테이블을 결합할 수 있다.
JOIN은 결합 형식에 따라 INNER JOIN, LEFT JOIN, RIGHT JOIN이 있다.
INNER JOIN
두 테이블에 모두 매치되는 값을 가진 레코드만 반환
cust_name
user_ID
email
Alice Green
alice0306
hialice_0306@gmail.com
Carol White
sing_carol
sing_carol@gmail.com
LEFT (OUTER) JOIN
반드시 출력되는 테이블을 결정
cust_name
user_ID
email
Alice Green
alice0306
hialice_0306@gmail.com
Carol White
sing_carol
sing_carol@gmail.com
NULL
espressoholic
needscaffein@gmail.com
NULL
blacksheep_DC
blacksheep_DC@gmail.com
왼쪽 테이블은 반드시 출력되어야 하므로, Customer_Info의 cust_num과 일치하지 않는 레코드로 출력
(위 예문에서는 Order_Info)
RIGHT (OUTER) JOIN
반대로 오른쪽 테이블이 반드시 출력
cust_name
user_ID
email
Alice Green
alice0306
hialice_0306@gmail.com
Bob Smith
NULL
NULL
Carol White
sing_carol
sing_carol@gmail.com
Daniel Cruze
NULL
NULL
이번에는 오른쪽 테이블(Customer_Info)이 반드시 출력된다.
나) INSERT INFO
테이블에 새로운 레코드를 추가
테이블의 Column이 어떠한 순서로 조직되어 있는지 모른다면, 테이블명 뒤에 Column을 나열
그 순서대로 VALUES 뒤에 추가할 데이터를 입력
만약 테이블의 Column 순서를 알고 있다면, 위 예시처럼 Column을 나열할 필요가 없다.
다만 추가할 데이터를 반드시 Column 순서대로 입력해야 한다.
다) UPDATE
테이블의 레코드 데이터를 갱신
WHERE 절로 데이터를 갱신할 레코드를 지정해주지 않으면 테이블의 모든 레코드 데이터가 갱신되므로 주의한다.
라) DELETE
테이블의 레코드 데이터 삭제
UPDATE와 마찬가지로 WHERE 절로 갱신할 레코드를 지정해주지 않으면 테이블의 모든 레코드 데이터 삭제