본문 바로가기
데이터베이스 Database

SQL (Structured Query Language) - DML 총정리

by 코딩균 2021. 12. 9.

방식

  • 대화식 SQL : workbench, datagrip 등에서 직접 DBMS에 접근해 질의를 작성하여 실행
  • 삽입 SQL : python, java 등의 언어로 작성된 application에 들어가서 DB와 소통

분류

  • 데이터 정의어 DDL (Data Define Language) : 테이블 생성 / 변경 / 제거에 사용하는 명령어
  • 데이터 조작어 DML (Data Manipulate Language) : 데이터 삽입 / 삭제 / 변경/ 수정/ 검색에 사용하는 명령어
  • 데이터 제어어 DCL (Data Controll Language) : 데이터에 접근 권한 부여 및 취소하는 명령어

 

데이터 조작어 DML

데이터 삽입 INSERT
  • 속성값을 지정한 후 넣는 경우
    • VALUES에 들어가는 값과 INTO 속성이 1:1 대응해야 함
  • INSERT INTO 고객(고객아이디, 고객이름, 등급, 주소) VALUES ('gyun', '균', 1, '서울시 서울동 서울아파트');​

 

  • 테이블을 대상으로 넣는 경우
    • VALUES에 들어가는 값과 테이블의 속성들이 1:1 대응해야 함
  • INSERT INTO 고객 VALUES ('gyun', '균', 1, '서울시 서울동 서울아파트');​

 

  • 부속 질의문을 이용하여 넣는 경우
    • 다른 테이블에서 검색한 값을 테이블에 넣는 경우
  • INSERT INTO 우수고객 SELECT 고객아이디, 이름, 등급, 주소 FROM 고객 WHERE 등급 = 1;​

 

데이터 수정 UPDATE
    • 속성값 일괄 수정
      • 테이블 소속 모든 튜플의 속성값을 전체 수정
UPDATE 고객 SET 등급 = 등급 + 1;​

 

    • 속성값 지정 수정
      • 테이블 소속 튜플 중 하나의 속성 값 수정
UPDATE 고객 SET 등급 = 1, 주소 = '부산시 부산구 부산동' WHERE 고객아이디 = 'gyun';​

 

    • 부속 질의문을 통한 수정
      • 다른 테이블에서 추출한 값들을 가지고 테이블의 내용을 수정  ex) 주문자이름 '균'이 주문한 주문 상태 '배송중'으로 변경
UPDATE 주문 SET 상태 = '배송중' WHERE 고객아이디 IN((SELECT 고객아이디 FROM 고객 WHERE 고객이름='균');​

 

 

데이터 삭제 DELETE
    • 테이블 튜플 전체 삭제
DELETE FROM 주문​

  

    • 조건에 따른 테이블 튜플 삭제
DELETE FROM 주문 WHERE 주문일 = '2019-11-04');​

 

    • 부속 질의문을 사용한 테이블 튜플 삭제
DELETE FROM 주문 WHERE 고객아이디 IN(SELECT 고객아이디 FROM 고객 WHERE 이름='균');​

  

 

데이터 검색 SELECT
SELECT [ALL|DISTINCT] 속성1, 속성2, 속성3 FROM 테이블
  • ALL (DEFAULT) - 결과가 중복을 허용
  • DISTINCT - 결과가 중복 허용하지 않고 제거 되어서 나옴

 

 

  • AS - 결과테이블에서의 속성 이름 출력 바꿔주기(별칭주기)
  • SELECT 고객이름 AS 이름, 주소 FROM 고객

 

  • 조건에 따라 결과 테이블 만들기
  • SELECT 고객이름, 고객아이디 FROM 고객 WHERE 등급 >=2;

 

  • 부분적으로 일치하는 데이터 검색하기 LIKE 
    • % - 0개 이상의 문자 의미
    • _ - 1개의 문자 의미
  • SELECT 고객아이디 FROM 고객 WHERE 고객이름 LIKE 'g%'
    • 'g%' - g로 시작하는 이름이거나 g인 경우
    • '%g%' - g를 포함하는 이름
    • '%g' - g로 끝나거나 g인 경우
    • '_ _ _ g' - g로 끝나는 네글자 단어
    • '_ _ _ g%' - g로 끝나는 네글자이거나 네번째 글자가 g인 단어

 

  • NULL 사용
    • IS NULL - NULL인 것
    • IS NOT NULL - NULL 아닌 것
  • SELECT 고객아이디 FROM 고객 WHERE 주소 IS NOT NULL;

 

  • 정렬된 결과로 검색 ORDER BY
    • DESC - 내림차순
    • ASC - 오름차순
SELECT 고객아이디 FROM 고객 
WHERE 주소 IS NOT NULL
ORDER BY 등급 DESC;

# 등급으로 내림차순, 동일 등급은 이름으로 오름차순
SELECT 고객아이디, 고객이름 FROM 고객
ORDER BY 등급 DESC, 고객이름 ASC

 

 

    • 집계 함수 이용
      • COUNT - 속성 값의 개수
      • MAX - 속성 값의 최댓값
      • MIN - 속성 값의 최솟값
      • SUM - 속성 값의 합계 (숫자에만 사용가능)
      • AVG - 속성 값의 평균 (숫자에만 사용가능)
SELECT AVG(등급) FROM 고객 # 고객들의 등급 평균 

SELECT COUNT(*) FROM 고객 # 고객의 수 
SELECT COUNT(DISTINCT 등급) FROM 고객 # 고객의 등급 개수

#DISTINCT 같은 경우 집계함수 안에 넣어서 해당 속성의 중복값을 제거하고 계산할 수 있도록 함​

 

 

  • 그룹별 검색 GROUP BY - HAVING
    • GROUP BY - 특정 속성들 혹은 속성의 값이 같은 튜플을 모아 그룹을 만듬
    • HAVING - 그룹에 대한 조건
SELECT 상품고유번호, SUM(수량) AS 총주문수량 FROM 주문
GROUP BY 상품고유번호;

# 총주문수량이 10개 이상인 상품과 총주문수량
SELECT 상품고유번호, SUM(수량) AS 총주문수량 FROM 주문
GROUP BY 상품고유번호 HAVING SUM(수량)>=10;

SELECT 등급, COUNT(*) AS 고객수 FROM 고객
GROUP BY 등급;

# 해당 등급의 고객수가 10명 이상인 등급과 고객수
SELECT 등급, COUNT(*) AS 고객수 FROM 고객
GROUP BY 등급 HAVING COUNT(*)>=10;

# 주문 제품과 주문 고객에 따른 분류
SELECT 상품고유번호,, 고객아이디 SUM(수량) AS 총주문수량 FROM 주문
GROUP BY 상품고유번호, 고객아이디

 

 

  • 테이블을 Join 하여 검색
    • 여러개의 테이블을 연결하여 데이터 검색 -> 외래키를 통해서 join 진행
    • WHERE 절을 통해 join 조건을 제시
    • 테이블별로 속성을 구분하기 위해 점(.) 앞에 해당 속성 소속 테이블명 명시
  • SELECT 주문.상품고유번호, 주문.주문일 FROM 주문, 고객 WHERE 고객이름='gyun' AND 주문.고객아이디 = 고객.고객아이디;

 

  • 부속질의문을 통한 검색
    • 상위 질의문 + 하위 질의문 결합을 통한 쿼리 작성
    • 하위질의문의 결과가 1개 인 경우 : '=' 사용 가능
    • 하위질의문의 결과가 다수인 경우 : IN 사용
SELECT 고객이름, 등급 FROM 고객
WHERE 등급 = (SELECT MAX(등급) FROM 고객);

# 3등급인 고객들의 주문 내역 뽑기
SELECT 상품고유번호, 수량, 고객아이디 FROM 주문
WHERE 고객아이디 IN (SELECT 고객아이디 FROM 고객 WHERE 등급=3);

# 3등급이 아닌 고객들의 주문 내역 뽑기
SELECT 상품고유번호, 수량, 고객아이디 FROM 주문
WHERE 고객아이디 NOT IN (SELECT 고객아이디 FROM 고객 WHERE 등급=3);

# 고객 아이디가 gyun인 사람이 하나라도 있는 경우 주문 정보
SELECT 상품고유번호, 수량, 고객아이디 FROM 주문
WHERE EXISTS(SELECT * FROM 고객 WHERE 고객이름='gyun')
  • IN - 결과값 중 일치하는 것이 있으면 있는 것들 조건으로 사용
  • NOT IN - 결과값 중 일치하지 않는 것들만 조건으로 사용
  • EXISTS - 결과값이 하나라도 존재시, 조건 참
  • NOT EXISTS - 결과값이 존재하지 않으면 조건 참
  • ALL - 결과값 모두와 비교한 결과가 참이면 조건으로 사용 - 비교연산자 필수
  • ANY / SOME  - 결과값 중 하나라도 결과가 참이면 조건으로 사용 - 비교연산자 필수