8 분 소요

Data Manipulation Language

  • 테이블의 데이터를 입력/수정/삭제/조회하는 역할
  • 입력(INSERT), 수정(UPDATE), 삭제(DELETE), 조회(SELECT)



INSERT

  • 테이블에 데이터를 신규로 입력할 때 사용
  • 신규데이터 입력
      INSERT INTO subwayStation T (T.stationNo, T.lineName, T.stationName)
      VALUES ('00001', '신분당선', '판교');
      -- 해당 테이블의 (칼럼)에 ('칼럼값') 입력
      COMMIT; -- DB에 최종적으로 커밋(영구저장)
    



UPDATE

  • 테이블 내 행의 칼럼값 수정
  • 한번의 UPDATE문 실행으로 여러 개의 행에 대한 여러 개의 칼럼 수정 가능
  • 데이터 수정
      UPDATE subwayStation A
      SET A.lineName = '빨간색', A.stationName = '동판교'
      WHERE A.stationNo = '00001';
      -- 조건에 부합하는 해당 테이블의 (칼럼을 '해당칼럼값')으로 변경한다.
      COMMIT; -- 커밋
    



DELETE

  • 테이블의 내의 행 삭제
  • 한번의 DELETE문 실행으로 여러개의 행 삭제 가능
  • 조건에 부합하는 행을 삭제할 수 있으며, 수행 후 커밋 혹은 롤백이 가능하다.
  • 하지만 TRUNCATE TABLE문은 테이블 전체를 삭제하며, 한 번 실행하면 롤백이 불가능하다.
  • 데이터 삭제
      DELETE FROM subwayStation A
      WHERE A.stationNo = '00001';
      -- 조건에 부합하는 해당테이블의 행을 삭제한다.
      COMMIT;
    



SELECT

  • 테이블에서 데이터를 조회하는 데 사용
  • 데이터 조회
      SELECT A.stationNo, A.lineName, A.stationName
      -- 해당 칼럼을 조회한다.
      FROM subwayStation A
      -- 해당 테이블의
      WHERE stationName = '동판교' ;
      -- 역이름이 동판교인(조건)
    
  • SELECT 문의 조회 순서

    FROM절 > WHERE절 > GROUP BY절 > HAVING절 > SELECT절 > ORDER BY


집합 연산자 (SET OPERATOR)

  • SELECT문의 결과집합 간의 연산을 수행하는 연산자
  • UNION, UNION ALL, MINUS
  • 여러개의 SQL문을 하나의 SQL문으로 만드는 연산자

UNION

  • 여러 개 SQL문의 결과에 대한 합집합
  • 중복된 행에 대해 중복을 제거한 유일한 값을 가진 행 출력
  • 정렬 발생 가능하지만 정렬을 보장하기 위해 ORDER BY 문 사용
      SELECT 문
    
      UNION
    
      SELECT 문
    

UNION ALL

  • 여러 개 SQL문의 결과에 대한 합집합
  • 중복된 행에 대해 중복을 제거하지 않고 그대로 출력
  • 정렬 발생하지 않아 정렬을 보장하기 위해서는 ORDER BY 문 사용
      SELECT 문
    
      UNION ALL
    
      SELECT 문
    

INTERSECT

  • 여러 개의 SQL문에 대한 교집합 출력
  • 중복된 행이 있다면 중복을 제거하고 1개의 행으로 출력
      SELECT 문
    
      INTERSECT
    
      SELECT 문
    

MINUS

  • 위의 SQL문의 결과집합에서 아래의 SQL문의 집합을 뺀 결과 출력
      SELECT 문
    
      MINUS
    
      SELECT 문
    



FROM

  • 조회 테이블을 참조



WHERE

  • 조회 대상 행을 조회
  • 테이블에 존재하는 모든 데이터를 조회하는 경우도 있지만, 대부분의 경우에는 필요한 데이터만을 조회, 추출하게 된다.
  • 이 경우 WHERE절을 이용하여 추출되는 행을 제한한다.
      SELECT B.clientNo, B.clientName, B.clientAdd
      FROM bankClient B
      WHERE clientAdd LIKE '%경기도%';
    
    • 은행고객(bankClient) 테이블에서 고객의 주소(clientAdd) 칼럼의 값이 ‘경기도’라는 단어를 포함하는 행을 출력
  • SELECT문 사용 시 사용자들은 원하는 자료만 검색하기 위해 WHERE절을 이용하여 출력 데이터의 행을 제한한다.


연산자

  • WHERE절에서 대상 칼럼과 입력값을 비교하는 데 사용한다.

비교연산자

  • 숫자 값 혹은 문자 값의 크기를 비교하는데 사용

    연산자 연산자의 의미
    = ~와 같다.
    > ~보다 크다.
    >= ~보다 크거나 같다.
    < ~보다 작다.
    <= ~보다 작거나 같다.

SQL 연산자

  • SQL문에서 사용하도록 기본적으로 예약되어 있는 연산자

    연산자 연산자의 의미
    BETWEEN A AND B A와 B 사이에 있으면 된다.
    IN (리스트) 리스트에 있는 값 중 하나라도 있으면 된다.
    LIKE ‘비교문자열’ 비교문자열의 형태와 일치하면 된다. (와일드카드 사용)
    IS NULL 값이 NULL이면 된다.
    IS NOT NULL 값이 NULL이 아니면 된다.

LIKE

  • LIKE 연산자 사용 시 퍼센트(%) 라는 와일드카드를 사용해 행을 조회한다.

      SELECT B.clientNo, B.clientName, B.clientAdd
      FROM bankClient B
      WHERE clientName LIKE '김%';
    
    • 고객 이름(clienName) 칼럼의 값이 ‘김’으로 시작하는 행을 출력
    • 첫 시작이 ‘김’이라면 뒤에는 어떤 문자가 오든지 상관없이 조회가 가능하다. (아무런 문자가 오지 않아도 추출)
  • LIKE 연산자 사용 시 언더바(_) 와일드카드를 사용해 행을 조회한다. SQL SELECT B.clientNo, B.clientName, B.clientAdd FROM bankClient B WHERE clientName LIKE '김_'; - 고객 이름(clienName) 칼럼의 값이 ‘김’으로 시작하고 뒤에 1개의 문자만 존재하는 행을 출력 - ‘김’으로 시작하면서 뒤에 문자가 단 1개만 존재하면 추출

  • 퍼센트(%)와 언더바(_) 함께 사용

      SELECT B.clientNo, B.clientName, B.clientAdd
      FROM bankClient B
      WHERE clientName LIKE '김_%';
    
    • 고객 이름(clienName) 칼럼의 값이 ‘김’으로 시작하고 뒤에 1개의 문자만 존재하며, 그 뒤에는 어떠한 문자가 오든지 상관없이 행을 출력
    • ‘김’으로 시작하면서 뒤에 문자가 1개 이상만 되면 추출

IS NULL

  • 칼럼이 NULL인 행을 조회하는 SQL문
  • 특정 칼럼의 값이 NULL인 데이터를 추출할 경우 IS NULL 연산자를 사용
      SELECT B.clientNo, B.clientName, B.clientAdd
      FROM bankClient B
      WHERE clientAdd IS NULL;
    
    • 고객의 주소(clientAdd) 칼럼의 값이 NULL인 행을 출력
  • NULL 비교 시 “=” 연산자를 사용하면 데이터가 1건도 나오지 않는 공집합이 리턴

IS NOT NULL

  • 칼럼이 NOT NULL인 행을 조회하는 SQL문
      SELECT B.clientNo, B.clientName, B.clientAdd
      FROM bankClient B
      WHERE clientAdd IS NOT NULL NULL;
    
    • 고객의 주소(clientAdd) 칼럼의 값이 NOT NULL인 행을 출력


논리연산자

  • 비교 연산자 혹은 SQL 연산자로 이루어진 여러 개의 조건들을 논리적으로 조합하기 위해 사용하는 연산자 |연산자|연산자의 의미| |—|—–| |AND| 앞 조건과 뒤 조건이 모두 참이어야 한다. |OR| 앞 조건과 뒤 조건 중 하나라도 참이어야 한다. |NOT| 조건이 거짓이면 된다.

예시

  • 경기도에 존재하는 은행 중 국민은행, 신한은행 매장을 찾는다.
  • 하남시에 존재하는 매장은 집합에서 제외한다.
      SELECT B.bankName AS 은행명, B.branchName AS 지점이름, B.branchAdd AS 지점주소
      FROM bankBranch B
      WHERE B.branchAdd LIKE '경기도%'
      AND
      (
          B.bankName LIKE '%국민은행%'
          B.bankName LIKE '%신한은행%'
      )
      AND NOT B.branchAdd LIKE '%하남시%'
    

결과 (출력된 지점이름과 지점주소는 실제가 아님)

은행명   | 지점이름     | 지점주소          |
--------------------------------------------
국민은행 | 서현점       | 경기도 성남시 ··· |
국민은행 | 분당점       | 경기도 성남시 ··· |
신한은행 | 야탑점       | 경기도 성남시 ··· |
국민은행 | 야탑점       | 경기도 성남시 ··· |
신한은행 | 용인시청점   | 경기도 용인시 ··· |
신한은행 | 수지구청점   | 경기도 용인시 ··· |
신한은행 | 일산시청점   | 경기도 일산시 ··· |
국민은행 | 수지점       | 경기도 용인시 ··· |
···

부정연산자

  • 비교 연산자의 부정표현은 부정 비교 연산자로, SQL 연산자의 부정표현은 부정 SQL 연산자로 가능

부정 비교 연산자

|연산자|연산자의 의미| |—|—–| |!=, <>, ^=|같지 않다.| |NOT 칼럼명 =|~칼럼의 값이 ~와 같지 않다.| |NOT 칼럼명 >|~칼럼의 값이 ~보다 크지 않다. |NOT 칼럼명 <|~칼럼의 값이 ~와 작지 않다.

부정 SQL 연산자

|연산자|연산자의 의미| |—|—–| |NOT BETWEEN A AND B| A와 B의 값 사이에 있지 않다. |NOT IN(LIST)| LIST를 포함하지 않는다. |IS NOT NULL| NULL 값이 아니다.



문자열 비교

CHAR VS VARCHAR2

  • CHAR : 고정 길이 문자열
  • VARCHAR2 : 가변 길이 문자열

양쪽이 모두 CHAR 타입

  • 길이가 서로 다르면 작은 쪽에 공백을 추가하여 길이를 같게 한다.
  • 서로 다른 문자가 나올 때까지 비교한다.
  • 달라진 첫 번째 값에 따라 크기를 결정
  • 공백의 수만 다르다면 같은 값으로 결정
      CREATE TABLE tableChar( 
          charNo char(4), char4 char(4), char5 char(5),
          CONSTRAINT PK_tableChar PRIMARY KEY(charNo) 
      );
    
      INSERT INTO tableChar(charNo, char4, char5) 
      VALUES ('0001', 'SQLD', 'SQLD ');
    
      INSERT INTO tableChar(charNp, char4, char5)
      VALUES ('0002', 'SQLP', 'SQLP');
    
      SELECT 
      REPLACE(char4, ' ', '_') AS char4,
      REPLACE(char5, ' ', '_') AS char5
      FROM tableChar
    

    결과

      char4 | char5 |
      ---------------
      SQLD  | SQLD_ |
      SQLP  | SQLP_ |
    
    • CHAR(5)에 4개의 문자열만 저장하면 나머지의 자리가 공백으로 채워진다.

CHAR형 데이터 간 비교

SELECT charNo, REPLACE(char4, ' ','_') AS char4,
REPLACE(char5, ' ','_') AS char5,
FROM tableChar
WHERE char4=SQLD AND char4=char5;

결과

charNo | char4 | char5 |
------------------------
0001   | SQLD  | SQLD_ |
  • CHAR 데이터 칼럼끼리 비교할 때 길이가 서로 달라도 공백만 다르다면 같다고 판단
  • 데이터 뒤에 있는 공백은 결과집합에 영향을 주지 않는다.

한쪽이 VARCHAR2인 경우

  • 서로 다른 문자가 나올 때까지 비교
  • 길이가 다르면 짧은 것이 끝날 때 까지만 비교한 후 길이가 긴 것이 크다고 판단
  • 길이가 같고 다른 것이 없다면 같다고 판단
  • VARCHAR2는 공백도 문자로 판단
      CREATE TABLE tbVarChar2 (
          varCharNo char(4), char4 char(4), varChar2_5 varchar2(5),
          CONSTRAINT PK_tbVarChar2 PRIMARY KEY(varCharNo)
      );
    
      INSERT INTO tbVarChar2(varCharNo, char4, varChar2_5) 
      VALUES ('0001', 'SQLD', 'SQLD ');
      INSERT INTO tbVarChar2(varCharNo, char4, varChar2_5)
      VALUES ('0002', 'SQLP', 'SQLP ');
    
      SELECT REPLACE (char4, ' ', '_') AS char4,
      REPLACE (varChar2_5, ' ', '_') AS varCahr2_5
      FROM tbVarChar2;
    

    결과

      char4 | varChar2_5 |
      --------------------
      SQLD  | SQLD_      |
      SQLP  | SQLP_      |
    

CHAR형과 VARCHAR2 타입 비교

  • CHARVARCHAR2 타입 비교 시, VARCHAR2는 공백도 문자로 판단하기 때문에 서로 다른 문자라고 판단한다.
  • TRIM함수를 이용해 문자열을 비교한다.
      SELECT varCharNo, REPLACE(char4, ' ','_') AS char4,
      REPLACE(varChar2_5, ' ','_') AS varChar2_5,
      FROM tbVarChar2
      WHERE varCharNo='0001' AND char4 = TRIM(varChar2_5);
    

    결과

      charNo | char4 | char5 |
      ------------------------
      0001   | SQLD  | SQLD_ |
    


상수 값과 비교

  • 상수 쪽을 칼럼의 데이터형과 동일하게 바꾸고 비교
  • 칼럼이 CHAR이면 CHAR 타입인 경우를 적용(공백은 문자로 판단 X)
  • 칼럼이 VARCHAR2이면 VARCHAR2 타입인 경우를 적용(공백도 문자로 판단)



ROWNUM

  • 특정 테이블에서 데이터가 조회될 때 출력되는 행의 순번을 의미하는 Pseudo 칼럼
  • 모든 데이터를 출력할 필요가 없는 경우 WHERE절에서 ROWNUM 조건을 이용하여 결과 행의 건수를 제한

      SELECT 
      ROWNUM AS RNUM, A.koResident AS 주민번호, A.koName AS 이름, A.koresidence AS 거주지
      FROM koPopulation A
      WHERE ROWNUM <= 10;
    
    • 10개의 행만 출력된다.



GROUP BY

  • 대상 행을 그룹화
  • GROUP BY 절은 일반적으로 FROM절 아래에 위치하며, GROUP BY 절에 기재한 칼럼을 기준으로 결과집합을 그룹화한다.

      GROUP BY 칼럼명
    


HAVING

  • 그룹화한 값에서 조건에 맞는 것을 출력
  • HAVING절은 WHERE절과 유사한 기능을 한다.
  • WHERE절은 테이블에서 추출할 행을 제한
  • HAVING절은 그룹핑한 결과집합에 대한 조건을 주어 추출할 집계 데이터를 제한
      HAVING 표현식 
    
      SELECT A.popGender, A.popAge, SUB(A.popCount) AS "인구수합계"
      FROM tbPopulation WHERE A.yearM = '202010'
      GROUP BY A.popGender, A.popAge
      HAVING SUM(A.popCount) < 1000000;
    
    • 인구테이블에서 성별구분코드+연령구분코드 칼럼 조합별 인구수 칼럼의 합계를 구하는 쿼리문
    • 인구수 합계가 100만 명 미만인 성별구분코드+연령구분코드 조합별 인구수합계를 구하는 쿼리문



ORDER BY

  • 출력되는 결과집합을 정렬
  • ORDER BY 절은 SELECT문에서 조회한 데이터 집합을 특정 칼럼 기준으로 정렬한 후 데이터를 출력
  • 칼럼명 대신에 SELECT 절에서 사용한 앨리어스명이나 칼럼 순서를 나타내는 정수도 사용 가능
  • ORDER BY절에 개재한 칼럼 뒤에 정렬 방식 기재 가능
    • ASC(오름차순)
    • DESC(내림차순)
    • 디폴트 값 오름차순(ASC)
    • 정렬 시 NULL은 가장 큰 값으로 인식
  • SELECT 절에 기재하지 않은 칼럼을 기준으로도 정렬 가능
  • GROUP BY 절을 이용한 SELECT문에서 ORDER BY절에 기재하는 칼럼이 SELECT절에 존재하는 칼럼이나 표현식이 아닌 경우 에러 발생



DISTINCT

  • SQL문의 결과집합이 중복된 행이 존재하는 상황에서 SELECT절 맨 앞에 DISTINCT를 사용하면 중복된 행이 제거되어 유일한 값을 가진 행만 출력
      SELECT DISTINCT A.gender
      FROM koPopulation A
    

    결과

      gender  |
      ---------
      F       |
      M       |
    
  • 2개의 칼럼 출력 : 두 칼럼의 중복을 제거
      SELECT DISTINT A.gener, A.livePlace
      FROM koPopulation A
    

    결과

      gender  | livePlace |
      --------|-----------|
      F       | 001       |
      M       | 003       |
      F       | 003       |
      F       | 002       |
      ···
    



SELECT *

  • FROM절 내 테이블이 가지고 있는 모든 칼럼 출력
      SELECT * FROM koPopulation A
    



AS (앨리어스)

  • 테이블 및 칼럼에 앨리어스를 지정할 수 있다.
      SELECT A.gender AS 성별, A.livePlaceName AS 거주지명, A.clientNo AS 회원번호
      FROM koPopulation A
      WHERE livePlaceName = '서울';
    

    결과

      성별    | 거주지명  | 회원번호
      F       | 서울      | 0001
      F       | 서울      | 0002
      M       | 서울      | 0007
      F       | 서울      | 1230
      M       | 서울      | 0025
      ···
    



DUAL

  • 오라클 DB의 기본적인 테이블 DUAL을 이용한 다양한 연산 기능
  • 칼럼 DUMMY, 칼럼값 ‘X’
      SELECT ((1+9)*5)/2 AS 연산결과
      FROM DUAL;
    

댓글남기기