[DataBase] DML (데이터 조작어)

 

데이터베이스


(1) DML (Data Mgnipulation Language, 데이터 조작어)

  • 데이터베이스의 데이터 조회나 검색하는 명령어 SELECT

  • 데이터 삽입, 수정, 삭제하는 명령어 INSERT, UPDATE, DELETE

 

가) SELECT

  • 데이터베이스에서 원하는 데이터 조회

  • 다양한 활용 가능

  • 매우 자주 쓰이는 명령어 중 하나

[그림 1] SELECT

 

SELECT는 원하는 데이터를 뽑아내고 자 할 때 가장 많이 쓰는 쿼리 명령어로 WHERE, LIKE, HAVING, JOIN 등의 구문과 함께 쓰일 수 있다.

 

SELECT를 다음과 같이 다양하게 활용 가능하다.

 

AS

  • SELECT로 선택한 Column에 별칭을 부여하는 역할

  • 결과 테이블이 출력될 때 Column 이름은 별칭으로 나타남

[그림 2] SELECT AS

 

ORDER BY

  • 결과 테이블의 레코드를 오름차순 또는 내림차순으로 정렬 

[그림 3] SELECT ORDER BY

 

WHERE

  • SELECT 구문에 조건을 추가할 때 사용

  • 일반적 구문 형식은 가장 기본적인 select ~ from 구문 뒤에 where 키워드와 조건을 붙임

[그림 4] SELECT WHERE

 

조건식은 주로 'Column 이름', '연산 기호', '조건 값' 순서로 온다.

 

[그림 5] SELECT WHERE 조건식

 

LIKE

  • WHERE 구문 안에 위치

  • SELECT에서 뽑은 Column 안의 문자열 데이터의 패턴을 명시하여 찾을 때 사용

  • 조건절에서 어떻게 사용하느냐에 따라 수많은 로그에서 내가 원하는 로그만을 출력할 때 매우 유용하게 사용

[그림 6] SELECT LIKE

 

문자열의 패턴을 명시할 때는 와일드카드라는 것을 사용한다.

 

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 구문과 함꼐 조건문을 만족하는 레코드만을 뽑아낼 때 사용

[그림 7] AND, OR, NOT

 

 

BETWEEN

  • WHERE 구문에서 조건을 명시할 때 값의 범위 표현

[그림 8] BETWEEN

 

IN

  • WHERE 구문의 조건에서 다양한 값을 명시할 때 사용

[그림 9] IN

 

IN 안에 또 다른 SELECT 구문을 사용하여 조건에 여러 값을 명시할 수 있다.

 

[그림 10] 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의 가장 작은 값을 반환

[그림 11] COUNT, SUM, AVG, MIN, MAX

 

HAVING ~ GROUP BY

[그림 12] 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

  • 두 테이블에 모두 매치되는 값을 가진 레코드만 반환

[그림 13] 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

  • 반드시 출력되는 테이블을 결정

[그림 14] 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

  • 반대로 오른쪽 테이블이 반드시 출력

[그림 15] 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 뒤에 추가할 데이터를 입력

[그림 16] INSERT INFO (1)

 

만약 테이블의 Column 순서를 알고 있다면, 위 예시처럼 Column을 나열할 필요가 없다.

 

다만 추가할 데이터를 반드시 Column 순서대로 입력해야 한다.

 

[그림 17] INSERT INFO (2)

 

 

다) UPDATE

  • 테이블의 레코드 데이터를 갱신

[그림 18] UPDATE (1)

 

WHERE 절로 데이터를 갱신할 레코드를 지정해주지 않으면 테이블의 모든 레코드 데이터가 갱신되므로 주의한다.

 

[그림 19] UPDATE (2)

 

 

라) DELETE

  • 테이블의 레코드 데이터 삭제

  • UPDATE와 마찬가지로 WHERE 절로 갱신할 레코드를 지정해주지 않으면 테이블의 모든 레코드 데이터 삭제

[그림 20] DELETE


# Reference

 

http://www.yes24.com/Product/Goods/87579830

+ Recent posts