7 minute read

SQL을 이용한 데이터 조작

데이터 검색: SELECT문

기본 검색

  • SELECT키워드와 함께 검색하고 싶은 속성의 이름 나열
  • FROM키워드와 함께 검색하고 싶은 속성이 있는 테이블의 이름 나열
  • 검색 결과는 테이블 형태로 반환된다.
  • SELECT [ALL | DISTINCT] 속성리스트  
    FROM 테이블리스트;
    
  • ALL
    결과 테이블이 튜플의 중복을 허용하도록 지정, 생략 가능하다.
  • DISTINCT
    결과 테이블이 튜플의 중복을 허용하지 않도록 지정
    중복은 하나로만 표현되며 데이터 연산에서 프로젝트의 개념이다.
  • 예시
    • 고객 테이블에서 고객아이디, 고객이름, 등급 속성을 검색
      SELECT 고객아이디, 고객이름, 등급
      FROM 고객;
      
    • 고객 테이블에 존재하는 모든 속성을 검색
      SELECT *
      FROM 고객;
      
    • 제품 테이블에서 제조업체 속성을 중복 없이 검색
      SELECT DISTINCT 제조업체
      FROM 제품;
      
  • AS 키워드를 이용해 결과 테이블에서 속성의 이름을 바꾸어 출력 가능하다.
    • 예시
      제품 테이블에서 제품명과 단가를 검색하되 단가를 가격이라는 새 이름으로 출력
      SELECT 제품명, 단가 AS 가격
      FROM 제품;
      

산술식을 이용한 검색

  • SELECT키워드와 함께 산술식 제시
    산술식은 속성의 이름과 산술 연산자(+, -, /, * 등)와 상수로 구성된다.
  • 속성의 값이 실제로 변경되는 것은 아니고 결과 테이블에서만 계산된 값이 출력된다.
  • 예시
    제품 테이블에서 제품명과 단가 속성을 검색하되, 단가에 500원을 더해 조정단가라는 새 이름으로 출력
    SELECT 제품명, 단가 + 500 AS 조정단가
    FROM 제품;
    

조건 검색

  • 조건을 만족하는 데이터만 검색
    SELECT [ALL | DISTINCT] 속성리스트  
    FROM 테이블리스트
    [WHERE 조건];
    
  • WEHRE키워드와 함께 비교 연산자(=, !=, <, >, <=, >=)와 논리 연산자(AND, OR, NOT)를 이용한 조건 제시
    조건에서 문자나 날짜 값은 작은 따옴표로 묶어서 표현
  • 예시
    주문 테이블에서 애플 고객이 15개 이상 주문한 주문제품, 수량, 주문일자를 검색
    SELECT 주문제품, 수량, 주문일자
    FROM 주문
    WHERE 주문고객 = '애플' AND 수량 >= 15;
    

LIKE를 이용한 검색

  • LIKE키워드를 이용해 부분적으로 일치하는 데이터를 검색
  • 문자열을 이용하는 조건에만 LIKE키워드를 사용 가능하다.
  • ‘_‘는 한개의 문자, ‘%’는 임의의 길이(0자도 포함)를 나타낸다.
  • 예시
    • 임의의 값 3자와 서울로 끝나는 데이터 조회
      SELECT 주소
      FROM 고객
      WHERE 주소 LIKE'___서울'
      
    • 서울로 시작해 임의의 길이로 끝나는 데이터 조회
      SELECT 주소
      FROM 고객
      WHERE 주소 LIKE'서울%'
      
    • 고객 테이블에서 고객아이디가 5자인 고객의 고객아이디, 고객이름, 등급을 검색
      SELECT 고객아이디, 고객이름, 등급
      FROM 고객
      WHERE 고객아이디 LIKE '_____';
      

NULL을 이용한 검색

  • IS NULL키워드를 이용해 검색 조건에서 특정 속성의 값이 널 값인지를 비교
  • IS NOT NULL키워드를 이용해 검색 조건에서 특정 속성의 값이 널 값이 아닌지를 비교
  • 예시
    고객 테이블에서 나이가 아직 입력되지 않은 고객의 고객이름을 검색
    SELECT 고객이름
    FROM 고객
    WHERE 나이 IS NULL;
    

정렬검색

  • ORDER BY 키워드를 이용해 결과 테이블 내용을 사용자가 원하는 순서로 출력
  • ASC(오름차순), DESC(내림차순)
    여러 기준에 따라 정렬하려면 정렬 기준이 되는 속성을 차례대로 제시
  • SELECT [ALL | DISTINCT] 속성리스트  
    FROM 테이블리스트
    [WHERE 조건]
    [ORDER BY 속성리스트 [ASC | DESC]];
    
  • 예시
    주문 테이블에서 수량이 10개 이상인 주문의 주문고객, 주문제품, 수량, 주문일자를 검색하라. 단, 주문제품을 기준으로 오름차순 정렬하고, 동일 제품은 수량을 기준으로 내림차순 정렬
    SELECT 주문고객, 주문제품, 수량, 주문일자
    FROM 주문
    WHERE 수량 >= 10
    ORDER BY 주문제품 ASC, 수량 DESC;
    

집계 함수를 이용한 검색

  • 특정 속성 값을 통계적으로 계산한 결과를 검색하기 위해 집계 함수를 이용
  • 집계 함수는 NULL인 속성 값은 제외하고 계산한다.
  • 집계 함수는 WHERE 절에서는 사용할 수 없고 SELECT절이나 HAVING절에서만 사용한다.
  • 종류
    • COUNT
      속성 값의 개수
      사용 가능한 속성: 모든 데이터
      NULL값이 존재할 경우 기준에 따라 값이 달라질 수 있으므로 정확한 개수를 계산하기 위해서는 ‘*‘나 기본키로 계산한다.
    • MAX
      속성 값의 최대값
      사용 가능한 속성: 모든 데이터
    • MIN
      속성 값의 최솟값
      사용 가능한 속성: 모든 데이터
    • SUM
      속성 값의 합계
      사용 가능한 속성: 숫자 데이터
    • AVG
      속성 값의 평균
      사용 가능한 속성: 숫자 데이터
  • 예시
    • 한빛제과에서 제조한 제품의 재고량 합계를 제품 테이블에서 검색
      SELECT SUM(재고량)
      FROM 제품
      WHERE 제조업체 = '한빛제과';
      
    • 제품 테이블에서 제조업체 수를 검색
      SELECT COUNT(DISTINCT 제조업체)
      FROM 제품;
      

그룹별 검색

  • SELECT [ALL | DISTINCT] 속성리스트  
    FROM 테이블리스트
    [WHERE 조건]
    [GROUP BY 속성리스트 [HAVING 조건]]
    [ORDER BY 속성리스트 [ASC | DESC]];
    
  • GROUP BY 키워드를 이용해 특정 속성의 값이 같은 튜플을 모아 그룹을 만들고 그룹별로 검색한다.
  • GROUP BY 키워드와 함께 그룹을 나누는 기준이 되는 속성을 지정한다.
    • HAVING 키워드를 함께 이용해 그룹에 대한 조건을 작성한다.
    • 그룹을 나누는 기준이 되는 속성을 SELECT 절에도 작성하는 것이 좋다.
  • 예시
    • 주문 테이블에서 주문제품별 수량의 합계를 검색
      SELECT 주문제품, SUM(수량)
      FROM 주문
      GROUP BY 주문제품;
      

      그룹핑한 속성을 SELECT절에도 작성해야 식별할 수 있다.

    • 제품 테이블에서 제조업체별로 제조한 제품의 개수와 제품 중 가장 비싼 단가를 검색하되, 제품의 개수는 제품수라는 이름으로 출력하고 가장 비싼 단가는 최고가라는 이름으로 출력
      SELECT 제조업체, COUNT(*) AS 제품수, MAX(단가) AS 최고가
      FROM 제품
      GROUP BY 제조업체;
      
    • 제품 테이블에서 제품을 3개이상 제조한 제조업체별로 제품의 개수와, 제품 중 가장 비싼 단가를 검색
      SELECT 제조업체, COUNT(*), MAX(단가)
      FROM 제품
      GROUP BY 제조업체 HAVING COUNT(*) >= 3;
      

      집계 함수를 이용한 조건은 WHERE절에는 작성할 수 없고 HAVING절에 작성!

    • 주문 테이블에서 각 주문고객이 주문한 제품의 총주문수량을 주문제품별로 검색
      SELECT 주문제품, 주문고객, SUM(수량)
      FROM 주문
      GROUP BY 주문제품, 주문고객;
      

여러 테이블에 대한 조인 검색

  • 조인 검색
    여러 개의 테이블을 연결하여 데이터를 검색하는 것
  • 조인 속성
    조인 검색을 위해 테이블을 연결해주는 속성
    • 연결하려는 테이블 간에 조인 속성의 이름은 달라도 되지만 도메인은 같아야 한다.
    • 일반적으로 외래키가 조인 속성으로 이용된다.
  • FROM절에 검색에 필요한 모든 테이블을 나열한다.
  • WHERE절에 조인 속성의 값이 같아야 함을 의미하는 조인 조건을 제시한다.
  • 같은 이름의 속성이 서로 다른 테이블에 존재할 수 있기 때문에 속성 이름 앞에 해당 속성이 소속된 테이블의 이름을 표시한다.
  • 예시
    • 판매 데이터베이스에서 바나나 고객이 주문한 제품의 이름을 검색
      SELECT 제품.제품명
      FROM 주문, 제품
      WHERE 주문.주문고객 = '바나나' AND 제품.주문제품 = 주문.제품번호;
      
    • 판매 데이터베이스에서 나이가 30세 이상의 고객이 주문한 제품의 주문제품과 주문일자를 검색
      SELECT 주문.주문제품, 주문.주문일자
      FROM 고객, 주문
      WHERE 고객.나이 >= 30 AND 고객.고객아이디 = 주문.주문고객;
      
    • 판매 데이터베이스에서 철수 고객이 주문한 제품의 제품명을 검색
      SELECT 제품.제품명
      FROM 고객, 주문, 제품
      WHERE 고객.고객이름 = '철수' AND 고객.고객아이디 = 주문.주문고객 AND 제품.제품번호 = 주문.주문제품;
      
  • 여러 테이블에 대한 조인 검색
    SELECT *
    FROM 고객, 주문
    WHERE 고객.고객아이디 = 주문.주문고객
    

    아래와 같이 작성 가능

    SELECT *
    FROM 고객 INNER JOIN 주문 ON 고객.고객아이디 = 주문.주문고객
    

부속 질의문을 이용한 검색

  • SELECT문 안에 또 다른 SELECT문을 포함하는 질의
    • 상위 질의문(주 질의문)
      다른 SELECT문을 포함하는 SELECT문
    • 하위 질의문(서브 질의문)
      다른 SELECT문 안에 내포된 SELECT문
      • 괄호로 묶어서 작성한다. ORDER BY절을 사용할 수 없다.
      • 단일 행 부속 질의문
        하나의 행을 결과로 반환
      • 다중 행 부속 질의문
        하나 이상의 행을 결과로 반환
  • 부속 질의문을 먼저 수행하고 그 결과를 이용해 상위 질의문을 수행
  • 부속 질의문과 상의 질의문을 연결하는 연산자가 필요
    • 단일 행 부속 질의문은 비교 연산자 사용 가능
    • 다중 행 부속 질의문은 비교 연산자 사용 불가능
  • 다중 행 부속 질의문에 사용 가능한 연산자

    연산자 설명
    IN 부속 질의문의 결과 값 중 일치하는 것이 있으면 검색 조건이 참
    NOT IN 부속 질의문의 결과 값 중 일치하는 것이 없으면 검색 조건이 참
    EXISTS 부속 질의문의 결과 값이 하나라도 존재하면 검색 조건이 참
    NOT EXISTS 부속 질의문의 결과 값이 하나도 존재하지 않으면 검색 조건이 참
    ALL 부속 질의문의 결과 값 모두와 비교한 결과가 참이면 검색 조건을 만족(비교 연산자와 함께 사용)
    ANY(SOME) 부속 질의문의 결과 값 중 하나라도 비교한 결과가 참이면 검색 조건을 만족(비교 연산자와 함께 사용)
  • 예시
    • 판매 데이터베이스에서 달콤비스킷과 같은 제조업체에서 제조한 제품의 제품명과 단가를 검색
      SELECT 제품명, 단가
      FROM 제품
      WHERE 제조업체 = (
      SELECT 제조업체
      FROM 제품
      WHERE 제품명 = '달콤비스킷'
      );
      
    • 판매 데이터베이스에서 적립금이 가장 많은 고객의 고객이름과 적립금을 검색
      SELECT 고객이름, 적립금
      FROM 고객
      WHERE 적립금 = (
      SELECT MAX(적립금)
      FROM 고객
      );
      
    • 판매 데이터베이스에서 바나나 고객이 주문한 제품의 제품명과 제조업체를 검색
      SELECT 제품명, 제조업체
      FROM 제품
      WHERE 제품번호 IN (
      SELECT 주문제품
      FROM 주문
      WHERE 주문고객 = '바나나'
      );
      
    • 판매 데이터베이스에서 대한식품이 제조한 모든 제품의 단가보다 비싼 제품의 제품명, 단가, 제조업체를 검색
      SELECT 제품명, 단가, 제조업체
      FROM 제품
      WHERE 단가 > ALL (
      SELECT 단가
      FROM 제품
      WHERE 제조업체 = '대한식품'
      );
      

INSERT문

데이터 직접 삽입

INSERT
INTO 테이블이름[(속성리스트)]
VALUES (속성값리스트);
  • INTO키워드와 함께 튜플을 삽입할 테이블의 이름과 속성의 이름을 나열
    속성 리스트를 생략하면 테이블을 정의할 때 지정한 속성의 순서대로 값이 삽입된다.
  • VALUES키워드와 함께 삽입할 속성 값들을 나열
  • INTO절의 속성 이름과 VALUES절의 속성 값은 순서대로 일대일 대응되어야 한다.
  • 예시
    판매 데이터베이스의 고객 테이블에 고객아이디가 딸기, 고객이름이 민수, 나이가 30세, 등급이 vip인 새로운 고객의 정보롤 삽입.
    INSERT
    INTO 고객(고객아이디, 고객이름, 나이, 등급)
    VALUES ('딸기', '민수', 30, 'vip');
    

    해당 테이블의 모든 속성에 값을 넣을거면 아래와 같이 작성 가능

    INSERT
    INTO 고객
    VALUES ('딸기', '민수', 30, 'vip');
    
    INSERT
    INTO 고객
    VALUES ('딸기', '민수', NULL, 'vip');
    

    나이 속성을 NULL로 넣기

    INSERT
    INTO 고객(고객아이디, 고객이름, 등급)
    VALUES ('딸기', '민수', 'vip');
    

    이렇게도 가능

부속 질의문을 이용한 데이터 삽입

SELECT문을 이용해 다른 테이블에서 검색한 데이터를 삽입

INSERT
INTO 테이블이름[(속성리스트)]
SELECT ;
  • 예시
    INSERT
    INTO 한빛제품(제품명, 재고량, 단가)
    FROM 제품
    WHERE 제조업체 = '한빛제과';
    

UPDATE문

  • 테이블에 저장된 튜플에서 특정 속성의 값을 수정
    UPDATE 테이블이름
    SET 속성이름1 = 1, 속성이름2 = 2, ...
    [WHERE 조건];
    
  • SET 키워드 다음에 속성 값을 어떻게 수정할 것인지를 지정
  • WHERE 절에 제시된 조건을 만족하는 튜플에 대해서만 속성 값을 수정
    WHERE절을 생략하면 테이블에 존재하는 모든 튜플을 대상으로 수정
  • 예시
    • 제품 테이블에서 제품번호가 a1인 제품의 제품명을 파이로 수정
      UPDATE 제품
      SET 제품명 = '파이'
      WHERE 제품번호 = 'a1';
      
    • 제품 테이블에 있는 모든 제품의 단가를 10% 인상
      UPDATE 제품
      SET 단가 = 단가 * 1.1;
      
    • 판매 데이터베이스에서 철수 고객이 주문한 제품의 주문수량을 5개로 수정
      UPDATE 주문
      SET 수량 = 5
      WHERE 주문고객 = (
      SELECT 고객아이디
      FROM 고객
      WHERE 고객이름 = '철수'
      );
      

DELETE문

  • 테이블에 저장된 데이터를 삭제
    DELETE
    FROM 테이블이름
    [WHERE 조건];
    
  • WHERE절에 제시한 조건을 만족하는 튜플만 삭제
    WHERE절을 생략하면 테이블에 존재하는 모든 튜플을 삭제해 빈 테이블이 된다.
    테이블 자체가 삭제되는 것이 아니다.
  • 예시
    판매 데이터베이스의 주문 테이블에 존재하는 모든 튜플을 삭제
    DELETE
    FROM 주문;
    

Leave a comment