MySQL(DML) : SELECT, INSERT, UPDATE, DELETE

msung99·2022년 10월 26일
0
post-thumbnail

지난 포스팅에서는 DDL 에 대해서 알아봤습니다. DDL 의 명령어로는 CREATE, ALTER, DROP, TRUNCATE 총 4가지의 명령어가 존재하고 그들로 테이블을 생성, 수정, 삭제, 초기화 등의 작업을 진행할 수 있었습니다.

이번 포스팅에서는 DML 에 대해서 알아보도록 하겠습니다. DML 이란 데이터 조작어(Data Manipulation Language) 로, 데이터를 조회.삽입.수정.삭제가 가능한 명령어들의 집합을 의미합니다.


DML (데이터 조작어 : Data Manipulation Language)

DML 의 명령어 종류는 아래와 같습니다.

SELECT : 데이터를 조회
INSERT : 데이터 삽입
UPDATE : 데이터 수정
DELETE : 데이터 삭제


SELECT : 데이터 조회

  • 데이터를 조회할 떄 쓰는 명령어로, 기본적으로 아래와 같은 형태를 취한다.

SELECT [원하는 컬럼] from [테이블명]

그리고 전체적인 형태는 아래와 같습니다.

 SELECT [ALL | DISTINCT] 컬럼명 [,컬럼명...]
 FROM 테이블명 [,테이블명...]
 [WHERE 조건식]
 [GROUP BY 컬럼명 [HAVING 조건식]]
 [ORDER BY 컬럼명]
 GROUP BY 컬럼명[,컬럼명...]
 ORDER BY 컬럼명[,컬럼명...]

1. 전체 필드 SELECT 하기

SELECT * FROM [테이블];

2. 특정 필드 선택하여 SELECT

SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME FROM EMPLOYEES;

3. 별칭(ALIAS) 사용하기 - "SELECT AS"

SELECT Employee_ID AS "종업원ID", LAST_NAME AS "성", FROM Employee_table;

필드값에 별칭을 사용하여 결과출력을 할 수 있습니다.
별칭을 사용할때는 큰따옴표""로 감싸거나 빼고 명령을 해도 됩니다.
=> 즉, 각 필드에 별칭을 부여하여 데이터를 확인하는 것입니다.

4. 중복제거 DISTINCT

SELECT DISTINCT [속성1], [속성2] ... FROM [테이블];

중복된 데이터가 있다면 하나로 보고싶을때 사용하면 됩니다.
필드값을 여러개 사용한다면 해당 필드가 함께 고유한 값을 보여줍니다.

SELECT DISTINCT JOB_ID FROM EMPLOYEES;

JOB_ID 중복제거하고 데이터를 보여준다.
만약 필드값을 두개 이상 EX(JOB_ID, FIRST_NAME)으로 지정한다면
JOB_ID 와 FIRST_NAME을 같이 포함해서 중복을 제거한 데이터를 보여준다.


SELECT의 절 - WHERE, FROM, GROUP BY, ORDER BY

Where (조건문)

  • where 컬럼명 between 값1 and 값2
    • 지정된 컬럼의 값이 값1 이상 값2 이하인 행을 선택합니다.
  • where 컬럼명 in (값1, 값2, 값3)

    • 지정된 컬럼의 값이 값1, 값2, 값3 중의 하나와 일치하는 행을 선택합니다.
    • 괄호안에 포함되는 값의 개수는 제한이 없습니다.
  • where 컬럼명 like '문자패턴'

    • 지정된 컬럼의 값이 문자패턴과 유사한 행을 선택합니다.
오라클의 문자패턴 형식

where job_id  like 'ST%' <---job_id가 'ST'로 시작하는 것 검색 : 'ST_MAN' 'ST_CLERK'

where job_id  like '%ST' <---job_id가 'ST'로 끝나는 것 검색 : 'ST_MAN' 'SH_MAN' 'SR_MAN'

where first_name  like '%e%' <---first_name가 'e'를 포함하는 것 검색 : 'elsa' 'gabliel' 'jane'

where name like '이__' <---이름이 '이**'인 사람을 검색 : '이순신' '이성계'

where name like '이_' <---이름이 '이*'인 사람을 검색 : '이황' '이이' '이산'
  • where 컬럼명 is null

    • 지정된 컬럼의 값이 null인 행을 선택합니다.
  • where 컬럼명 in not null

    • 지정된 컬럼의 값이 null이 아닌 행을 선택합니다.
    • 컴럼의 값이 null이 아닌 행을 선택할 때 where컬럼명 != null과 같이 사용하지 않습니다.
1. 이름이 '홍길동'인 사람을 검색
SELECT * FROM table01 WHERE my_kor = '홍길동'

2. 나이가 25샇인 사원의 한국이름과 나이 조회
SELECT language, age FROM table01 WHERE age>=25 

3. 나이가 25살이 아닌 사원 조회
SELECT * FROM my_table age<>25

4. 사원번호가 '0315' 이고 나이가 25살보다 작거나 이름이 '홍길동'인 사원 조회
SELECT * FROM table01 WHERE number = '0315' AND (age<25 OR name = '홍길동')

5. 사원번호가 '0315' 이거나 나이가 25살 이상이면서 이름이 '홍길동'인 사원 조회
SELECT * FROM My_Table WHERE No_Emp = '0315' OR (Age>=25 AND Nm_Kor = '홍길동')

6. 소속부서 아이디가 30, 60, 90인 사원의 아이디, 이름, 직종, 부서아이디를 조회
select employee_id, first_name, job_id, department_id
from employees
where department_id in (30, 60, 90);

7. 부서정보에서 담당자가 지정되어 있지 않는 부서의 아이디, 부서이름을 조회하기

select department_id, department_name
from DEPARTMENTS
where manager_id is NULL;

8. 사원정보에서 커미션을 받는 사원의 아이디, 이름, 급여, 커미션을 조회하기
select employee_id, first_name, salary, commission_pct
from EMPLOYEES
where COMMISSION_PCT is not null;

Like (~로 시작/포함/끝나는 단어)

1. '김'으로 시작하는 사원 조회
SELECT * FROM My_Table WHERE No_Emp = '0315' OR (Age>=25 AND Nm_Kor = '홍길동')

2. 김이 들어가는 시작하는 사원 조회
SELECT * FROM My_Talbe WHERE Nm_Kor LIKE '%김%'

IN (~이거나)

1. 나이가 20살, 24살, 26살인 사원조회
SELECT * FROM table01 WHERE age IN(20,24, 26)

2. 사원번호가 0000 이거나 00004 이고, 나이가 20살, 24살, 28살인 사원조회
SELECT * FROM table01 WHERE number IN('0000','0004') AND age IN(20,24,28)

Between(~부터 ~까지)

1. 나이가 20살~25살까지의 사원조회

SELECT * FROM table01 WHERE age Between 20 AND 24

2. 나이가 사원번호가 '0000' ~ '0010' 까지이거나 나이가 30살~40살인 사원의 이름 조회
SELECT age FROM table01 WHERE (number BETWEEN '0000' AND '0010') OR (age BETWEEN 30 AND 40)

참고

https://cmelcmel.tistory.com/30
https://coding-factory.tistory.com/81


INSERT

1. INSERT 문의 기본형태

INSERT INTO 테이블 이름 (열1, 열2, ...)
VALUE (값1, 값2 , ….)

INSERT INTO table01 (deptno, dname, loc)  // 컬럼 deptno, dname, loc 에다
VALUES (50, 'IT TEAM', 'SEOUL')   // 값 50, 'IT TEAM', 'SEOUL' 을 할당

2. 동시에 여러행 INSERT 하기

VALUES 뒤에 입력할 행을 쉼표(,)로 구분하여 여러 행을 한 번에 입력할 수 있습니다.

INSERT INTO table01 (deptno, dname, loc)
VALUES (70, 'DBA', 'HI'), (80, 'DESIGN TEAM', 'GANGNAM')

3. SELECT 결과를 INSERT 하기

INSERT INTO 테이블이름 ( 열1,열2,열3,열4 ….)
SELECT 테이블에 들어갈 값
FROM select값을 구하기 위한 테이블
WHERE 조건

위 선언문을 조금 더 구체화해보면 아래와 같습니다.

INSERT INTO [테이블명] ([칼럼1], [칼럼2], [칼럼3] ...) 
SELECT [값1], [값2], [값3] ... FROM [테이블명] 
WHERE ...

INSERT 문의 컬럼 개수와 테이터 형식을 SELECT 절에서 컬럼의 개수와 데이터 형식을 동일하게 조회하여 여러 건의 데이터를 한 번에 입력할 수 있습니다.

INSERT INTO table01 (deptno, dname, loc)
  SELECT deptno + 1, dname, 'JEJU ISLAND' FROM dept
  WHERE deptno IN (60, 70, 80)

참고

https://121202.tistory.com/25
https://gent.tistory.com/498


UPDATE

UPDATE 문의 기본형태

UPDATE [테이블] SET [열] = '변경할값' WHERE [조건]

만일 업데이트할 칼럼이 여러 개인 경우 SET 절에서 쉼표(,)로 구분하여 컬럼과 값을 기술하면 됩니다.

UPDATE table01
   SET dname = 'SALES TEAM'
     , loc = 'TEXAS'
   WHERE deptno = 30

다를 테이블과 JOIN 하여 UPDATE 하기

형태

 UPDATE table01
     SET loc = 'Korea'
     FROM table01.emp a
     JOIN table01.emp b
     ON a.mgr = b.empno
     WHERE b.ename = 'SCOTT'
     AND dept.deptno = b.deptno 

서브쿼리를 사용하여 UPDATE 하는 방법

  1. SET 절에서 스칼라 서브쿼리를 사용하여 값을 업데이트할 수 있습니다.
    서브쿼리의 결과는 하나의 행, 하나의 열이 조회되어야 합니다.
UPDATE table01
   SET loc = (SELECT a.loc FROM table01 a WHERE a.deptno = 10)
 WHERE deptno IN (20, 30)
  1. WHERE 절에서 서브쿼리를 사용하여 업데이트할 데이터 항목을 가져올 수 있습니다. JOIN을 사용하지 않을 경우 WHERE 절에서 서브쿼리를 자주 사용합니다.
UPDATE dbo.dept
   SET loc = 'TEXAS'
 WHERE dept.deptno IN (SELECT a.deptno
                         FROM dbo.emp a
                        WHERE a.job = 'SALESMAN')
  1. 위의 IN 연산자를 사용한 쿼리를 EXISTS 연산자로 변경한 쿼리문이다. IN 연산자와 동일한 기능을 한다.
UPDATE dbo.dept
   SET loc = 'TEXAS'
 WHERE EXISTS (SELECT 1
                 FROM dbo.emp a
                WHERE a.job = 'SALESMAN'
                  AND a.deptno = dept.deptno)

참고

https://121202.tistory.com/28
https://gent.tistory.com/499


DELETE

DELETE 의 기본형태

DELETE FROM [테이블] WHERE [조건]

  • DELETE 문은 간단합니다. DELETE 다음에 데이터를 삭제할 대상 테이블 명을 명시하고, 해당 테이블에서 어떤 데이터를 지울 것인지 WHERE 절에 명시하면 됩니다. WHERE 절을 생략하면 테이블에 있는 모든 데이터를 삭제합니다. 테이블명 앞에 FROM 구문은 생략 가능합니다.
DELETE FROM table01
WHERE emp_id = 4;    // emp_id 값이 4인 데이터 삭제

DROP vs DELETE

DROP은 폴더를 자체를 삭제하며, DELETE 는 폴더의 내용을 삭제 한다.

참고

https://121202.tistory.com/37

profile
https://haon.blog

0개의 댓글