[MySQL] DML

2019. 3. 4. 18:22DataBase

DML(Data Manipulation Language)


DML은 DBMS에서 정보를 저장/수정/삭제/조회 하는데 많이 사용하게 될 것입니다. 한 번 정리해보도록 하겠습니다!


DML의 종류

  • SELECT : 검색 
  • INSERT : 등록
  • UPDATE : 수정
  • DELETE : 삭제


SELECT

데이터를 검색하고 싶을 떈, 바로 이 SELECT를 사용하면 검색 결과를 테이블로 뽑아냅니다. (질의어라고 합니다)

ex)
SELECT 컬럼이름 FROM 테이블이름;
SELECT DISTINCT  컬럼이름 FROM 테이블이름;  --> DISTINCT를 사용하면 column의 중복되는 행을 제거합니다.
SELECT 컬럼이름 as 별칭 FROM 테이블이름; --> 컬럼이름을 as를 사용해 별칭(Alias)을 부여해 검색할 수 있습니다!

SELECT concat(컬럼, ' - ' ,다른 컬럼) as '별칭FROM 테이블이름
--> 컬럼의 합성 (Concatenation). 문자열을 결합하는 concat()을 사용해  두 개의 컬럼을 하나의 칼럼으로 출력할 수 있습니다. 
이 때 컬럼과 컬럼사이에 어떤 문자열을 넣으면 그 사이에 문자열을 넣어 출력합니다!

mysql> select * from products;

+------+----------+-----------+----------+-------+ | id | category | name | quantity | price | +------+----------+-----------+----------+-------+ | 1001 | PEN | Pen Red | 5000 | 1.23 | | 1002 | PEN | Pen Blue | 8000 | 1.25 | | 1003 | PCL | Pencil 2H | 10000 | 0.49 | | 1004 | PCL | Pencil 2B | 9000 | 0.48 | +------+----------+-----------+----------+-------+ 4 rows in set (0.39 sec)

mysql> select name from products; +-----------+ | name | +-----------+ | Pen Red | | Pen Blue | | Pencil 2H | | Pencil 2B | +-----------+ 4 rows in set (0.00 sec) mysql> select name,price from products; +-----------+-------+ | name | price | +-----------+-------+ | Pen Red | 1.23 | | Pen Blue | 1.25 | | Pencil 2H | 0.49 | | Pencil 2B | 0.48 | +-----------+-------+ 4 rows in set (0.00 sec)


mysql> select name as 이름, price as 가격 from products; +-----------+--------+ | 이름 | 가격 | +-----------+--------+ | Pen Red | 1.23 | | Pen Blue | 1.25 | | Pencil 2H | 0.49 | | Pencil 2B | 0.48 | +-----------+--------+ 4 rows in set (0.00 sec)


mysql> select concat(name,' - ',price) as '이름-가격' from products; +------------------+ | 이름-가격 | +------------------+ | Pen Red - 1.23 | | Pen Blue - 1.25 | | Pencil 2H - 0.49 | | Pencil 2B - 0.48 | +------------------+ 4 rows in set (0.00 sec)

WHERE

 : 조건에 맞는 검색을 하고 싶을 때 where절로 조건을 줘서 검색할 수 있습니다.
SELECT 칼럼명 FROM 테이블명 WHERE 조건식;
비교 :  where price < 1.0
범위 :  where price BETWEEN 0.5 AND 1.24   --> 0.5달러 이상 1.24달러 이하. (1.23만 검색)
집합 : where quantity IN (5000, 9000)  ---> quantity가 5000,9000인 것만 검색. 
패턴 : where name LIKE = '%신'     // 해당 컬럼(name)에서 '신' 으로 끝나는 행을 검색
   where name LIKE = '장%'     //  해당 컬럼에서 '장'으로 시작하는 행을 검색
   where name LIKE = '%길%'  // '길'이 포함된 문자를 가진 행을 검색
   where name LIKE = '_길%'   // 두 번째 글자가 '길'로 시작하는 행을 검색
   where name LIKE = '김%훈' //김으로 시작해 훈으로 끝나는 모든 행을 검색

복합조건 : AND/OR/NOT 같은 논리 연산자를 사용할 수 있습니다.
where NOT category='PEN'  // category가 PEN이 아닌 행을 검색합니다.
where price < 1.0 AND name LIKE='%H'; price가 1.0미만이며 H로 끝나는 이름을 검색합니다.

NULL : Null에 대한 조건을 검색할 수 있습니다
IS NULL : null인 데이터를 갖는 행을 검색합니다.
IS NOT NULL : null이 아닌 데이터를 갖는 행을 검색합니다.

mysql> select * from products where price < 1.0 AND quantity > 8000 AND name LIKE '%B'; +------+----------+-----------+----------+-------+ | id | category | name | quantity | price | +------+----------+-----------+----------+-------+ | 1004 | PCL | Pencil 2B | 9000 | 0.48 | +------+----------+-----------+----------+-------+ 1 row in set (0.00 sec)


SELECT구문에서 함수 사용

기본적으로 select절에서 내장된 함수를 사용해 값을 구할 수도 있습니다.

FLOOR(x) : x보다 크지 않은 가장 큰 정수 반환
CEILING(x) : x보다 작지 않은 가장 작은 정수 반환
ROUND(x) : x에 가장 근접한 정수 반환
GREATEST(x,y,z, ....) : 가장 큰 값을 반환
LEAST(x,y,z, ...) : 가장 작은 값을 반환
CURDATE() , CURRENT_DATE : 현재 날짜를 반환 (YYYY-MM-DD나 YYYYMMDD 형식)
CURTIME() , CURRENT_TIME : 현재 시작을 반환 (HH:MM:SS / HHMMSS 형식)
NOW() , SYSDATE() , CURRENT_TIMESTAMP : 현재 시각을 YYYY-MM-DD HH:MM:SS 이나 YYYYMMDDHHMMSS 형식으로 반환
DATE_FORMAT(data, format) : 입력된 date를 format 형식으로 반환
PERIOD_DIFF(p1, p2) : YYMM이나 YYYYMM으로 표기되는 p1과 p2 차이 개월을 반환

SELECT구문의 그룹함수

COUNT(column명) : non-null인 row의 숫자를 반환
COUNT(*) : row의 숫자를 반환
AVG(column명) : 해당 칼럼의 필드들의 평균값 반환
MIN(column명) : 해당 칼럼의 필드들의 최소값 반환
MAX(column명) : 해당 칼럼의 필드들의 최대값 반환
SUM(column명) : 해당 칼럼의 필드들의 합 반환
SUM(column명) : 해당 칼럼의 필드들의 표준 편차 반환
GROUP_CONCAT(column명) : 해당 칼럼의 필드들을 concatenated한 문자를 반환

mysql> select count(quantity) from products; +-----------------+ | count(quantity) | +-----------------+ | 4 | +-----------------+ 1 row in set (0.00 sec)

mysql> select avg(price), sum(quantity) from products; +--------------------+---------------+ | AVG(price) | SUM(quantity) | +--------------------+---------------+ | 0.8625000044703484 | 32000 | +--------------------+---------------+ 1 row in set (0.00 sec)

mysql> select min(price), max(price) from products; +---------------------+------------+ | min(price) | max(price) | +---------------------+------------+ | 0.47999998927116394 | 1.25 | +---------------------+------------+ 1 row in set (0.00 sec)

mysql> select group_concat(quantity) from products; +------------------------+ | group_concat(quantity) | +------------------------+ | 5000,8000,10000,9000 | +------------------------+ 1 row in set (0.00 sec)


INSERT (데이터 입력)

지금까지 SELECT절을 이용해 Table에서 데이터를 검색하는 방법을 알아봤습니다. 그런데 데이터를 직접 Table에 입력을 해야  SELECT절로 데이터를 찾을 수 있겠죠. 이렇게 데이터를 입력하기위해 INSERT문을 사용할 수 있습니다.
INSERT INTO 테이블 (co1, col2, col3, ....) VALUES ( 24, 'str1', 'str2', ...); 

해당 column의 데이터 타입에 맞춰서 values들을 넣어야한다. 
col1이 INT형이면 INT로 
col2가 STRING형이면 STRING으로 작성합니다. // STRING은 ' '안에 담아서 넣는다 

테이블의 칼럼 수와 넣을 값들의 쌍이 맞아야합니다. 순서대로 매핑됩니다.
(null값을 넣을 수 있지만, 저는 TABLE을 만들 때 모두 NOT NULL 속성을 줘서 NULL을 못 넣었습니다 ^^;;)

mysql> select * from products; +------+----------+-----------+----------+-------+ | id | category | name | quantity | price | +------+----------+-----------+----------+-------+ | 1001 | PEN | Pen Red | 5000 | 1.23 | | 1002 | PEN | Pen Blue | 8000 | 1.25 | | 1003 | PCL | Pencil 2H | 10000 | 0.49 | | 1004 | PCL | Pencil 2B | 9000 | 0.48 | +------+----------+-----------+----------+-------+ 4 rows in set (0.00 sec)

mysql> INSERT INTO products (id,category,name,quantity,price) values (1005,'FOU','monc', 1500, 8.00); Query OK, 1 row affected (0.01 sec)

mysql> select * from products; +------+----------+-----------+----------+-------+ | id | category | name | quantity | price | +------+----------+-----------+----------+-------+ | 1001 | PEN | Pen Red | 5000 | 1.23 | | 1002 | PEN | Pen Blue | 8000 | 1.25 | | 1003 | PCL | Pencil 2H | 10000 | 0.49 | | 1004 | PCL | Pencil 2B | 9000 | 0.48 | | 1005 | FOU | monc | 1500 | 8 | +------+----------+-----------+----------+-------+ 5 rows in set (0.00 sec)

UPDATE (데이터 수정)

지금까지 SELECT절을 이용해 Table에서 데이터를 검색하는 방법을 알아봤습니다. 그런데 데이터를 직접 Table에 입력을 해야  SELECT절로 데이터를 찾을 수 있겠죠. 이렇게 데이터를 입력하기위해 INSERT문을 사용할 수 있습니다.

UPDATE 테이블명 SET 필드1 = 수정할 값, 필드2 = 수정할 값, ...  WHERE 조건식;

조건식을 통해 특정 row만 변경할 수 있습니다. 조건식을 주지 않으면 전체 row에 영향을 미치니...WHERE절을 꼭 적절히 사용해서 수정해야 합니다.

mysql> select * from products; +------+----------+-----------+----------+-------+ | id | category | name | quantity | price | +------+----------+-----------+----------+-------+ | 1001 | PEN | Pen Red | 5000 | 1.23 | | 1002 | PEN | Pen Blue | 8000 | 1.25 | | 1003 | PCL | Pencil 2H | 10000 | 0.49 | | 1004 | PCL | Pencil 2B | 9000 | 0.48 | | 1005 | FOU | monc | 1500 | 8 | +------+----------+-----------+----------+-------+ 5 rows in set (0.00 sec) mysql> update products -> set name = 'fountain pen' where id=1005; Query OK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from products; +------+----------+--------------+----------+-------+ | id | category | name | quantity | price | +------+----------+--------------+----------+-------+ | 1001 | PEN | Pen Red | 5000 | 1.23 | | 1002 | PEN | Pen Blue | 8000 | 1.25 | | 1003 | PCL | Pencil 2H | 10000 | 0.49 | | 1004 | PCL | Pencil 2B | 9000 | 0.48 | | 1005 | FOU | fountain pen | 1500 | 8 | +------+----------+--------------+----------+-------+ 5 rows in set (0.00 sec)



WHERE로 조건을 안주면 해당 column의 filed 전체가 다 수정할 값으로 변경되어버립니다. 크리티컬한 문제를 일으킬 수 있으니 WHERE절을 꼭 명시해서 해당 filed만 바꾸도록 합시다.

mysql> update products set quantity = 2500; Query OK, 5 rows affected (0.35 sec) Rows matched: 5 Changed: 5 Warnings: 0 mysql> select * from products; +------+----------+--------------+----------+-------+ | id | category | name | quantity | price | +------+----------+--------------+----------+-------+ | 1001 | PEN | Pen Red | 2500 | 1.23 | | 1002 | PEN | Pen Blue | 2500 | 1.25 | | 1003 | PCL | Pencil 2H | 2500 | 0.49 | | 1004 | PCL | Pencil 2B | 2500 | 0.48 | | 1005 | FOU | fountain pen | 2500 | 8 | +------+----------+--------------+----------+-------+ 5 rows in set (0.00 sec)


DELETE (데이터 삭제)

검색하고, 데이터 입력을 해봤으니 데이터 삭제하는 법도 있어야겠죠? 데이터를 삭제하기 위해서는 DELETE문을 사용하면 됩니다.

DELETE FROM 테이블명 WHERE 조건식;

DELETE 또한 조건식을 통해 특정 row만 변경할 수 있습니다. 조건식을 주지 않으면 전체 row에 영향을 미치니...WHERE절을 꼭 적절히 사용해서 수정해야 합니다.

mysql> select * from products; +------+----------+--------------+----------+-------+ | id | category | name | quantity | price | +------+----------+--------------+----------+-------+ | 1001 | PEN | Pen Red | 5000 | 1.23 | | 1002 | PEN | Pen Blue | 5500 | 1.25 | | 1003 | PCL | Pencil 2H | 3000 | 0.49 | | 1004 | PCL | Pencil 2B | 3300 | 0.48 | | 1005 | FOU | fountain pen | 1500 | 8 | +------+----------+--------------+----------+-------+ 5 rows in set (0.00 sec) mysql> delete from products where id=1005; Query OK, 1 row affected (0.00 sec) mysql> select * from products; +------+----------+-----------+----------+-------+ | id | category | name | quantity | price | +------+----------+-----------+----------+-------+ | 1001 | PEN | Pen Red | 5000 | 1.23 | | 1002 | PEN | Pen Blue | 5500 | 1.25 | | 1003 | PCL | Pencil 2H | 3000 | 0.49 | | 1004 | PCL | Pencil 2B | 3300 | 0.48 | +------+----------+-----------+----------+-------+ 4 rows in set (0.00 sec)


[ edwith - 웹프로그래밍 부스트코스 ] 를 개인적으로 공부하고 정리한 공간입니다. 잘못된 부분은 피드백 주시면 감사하겠습니다


'DataBase' 카테고리의 다른 글

[MySQL]DDL  (0) 2019.03.05
[MySQL] SQL  (0) 2019.03.04
[MySQL] DB vs DBMS  (0) 2019.03.02