반응형

본 글은 책 "칼퇴족 김대리는 알고 나만 모르는 SQL 기초 편"의 정리 내용입니다.

특정 열에 특정 키워드가 포함된 레코드를 찾을 때 → % 사용

LIKE 연산자를 이용한 데이터 추출

LIKE 연산자


# 뒤에 나오는 문자들 모를 때
SELECT 열이름 FROM 테이블 WHERE 열이름 LIKE '찾고싶은문자%';
 
# 앞에 나오는 문자들 모를 때
SELECT 열이름 FROM 테이블 WHERE 열이름 LIKE '%찾고싶은문자';

# 앞뒤 나오는 문자들 모를 때
SELECT 열이름 FROM 테이블 WHERE 열이름 LIKE '%찾고싶은문자%';

# 뒤에 나오는 문자 모를 때
SELECT 열이름 FROM 테이블 WHERE 열이름 LIKE '찾고싶은문자_';
  • % 는 자주 사용하는 와일드카드로 모든 문자를 의미한다고 생각하면 됨
  • 와일드카드란?
    • 문자열에서 특정한 문자 또는 문자들을 대체하기 위해 사용하는 문자를 의미
      • % : 숫자 0 또는 문자들을 대체하기 위해 사용됨
      • _ : 한 개의 단어를 대체하기 위해 사용됨

예시( 고객정보 테이블 : CUSTOMERS)


ID  NAME  CITY COUNTRY
1 SUE BERLIN GERMANY
2 DAVID BERN SWITZERLAND
3 SAM NANTES FRANCE
4 KIM RESENDE BRAZIL
5 LEE VERSAILLES FRANCE
6 BERNEY BERGAMO ITALY
7 SANDY BERLIN GERMANY
8 YOUNG SEOUL KOREA
  • Primary Key는 ID
더보기
CREATE TABLE CUSTOMERS
(ID INT NOT NULL,
NAME CHAR(20) NOT NULL,
CITY CHAR(20) NOT NULL,
COUNTRY CHAR(20) NOT NULL,
PRIMARY KEY('ID')
);

INSERT INTO CUSTOMERS
VALUES
(1, 'SUE', 'BERLIN', 'GERMANY'),
(2, 'DAVID', 'BERN', 'SWITZERLAND'),
(3, 'SAM', 'NANTES', 'FRANCE'),
(4, 'KIM', 'RESENDE', 'BRAZIL'),
(5, 'LEE', 'VERSAILLES', 'FRANCE'),
(6, 'BERNEY', 'BERGAMO', 'ITALY'),
(7, 'SANDY', 'BERLIN', 'GERMANY'),
(8, 'YOUNG', 'SEOUL', 'KOREA');

문제


Q1. 위 테이블에서 BER로 시작하는 도시에 거주하는 고객들을 찾아서 출력하는 쿼리문

ID NAME CITY COUNTRY
1 SUE BERLIN GERMANY
2 DAVID BERN SWITZERLAND
6 BERNEY BERGAMO ITALY
7 SANDY BERLIN GERMANY
더보기
SELECT *
FROM CUSTOMERS 
WHERE CITY LIKE 'BER%';

 

Q2. 'NY'로 끝나는 나라에 거주하는 고객

ID NAME CITY COUNTRY
1 SUE BERLIN GERMANY
7 SANDY BERLIN GERMANY
더보기
SELECT *
FROM CUSTOMERS 
WHERE COUNTRY LIKE '%NY';

 

Q3. ES를 포함한 도시에 거주하는 고객

더보기
SELECT *
FROM CUSTOMERS 
WHERE CITY LIKE '%ES%';

 

반응형
반응형

본 글은 책 "칼퇴족 김대리는 알고 나만 모르는 SQL 기초 편"의 정리 내용입니다.

논리 연산자 IN 은 여러 개의 OR 연산자를 하나로 묶은 것과 같음

IN 논리 연산자를 이용한 데이터 추출

IN 연산자


SELECT 열이름 FROM 테이블명 WHERE 비교할 열 이름 IN (조건1, 조건2);
  • IN 연산자는 여러 조건들 중 하나만 만족해도 출력 → 여러 개의 OR 연산자를 하나로 묶은 것과 같음

예제 (테이블명 : BRNCH_INFO)


  • 각 열에 대한 설명
    : 영업점 번호, 영업점 이름, 영업점 신선일, 영업점 폐쇄일, 영업점 인원, 경영평가
BRNCH_NO  BRNCH_NM  OPEN_DT  CLOSE_DT  BRANCH_NUM  BRNCH_PERF
789 시청 1990-03-12 NULL 13 A
640 여의도 2005-08-07 NULL 8 B
368 대치 2005-08-01 2013-07-09 13 C
248 창동 2000-11-30 NULL 12 A
547 종각 1993-02-21 NULL 11 C
780 명동 1999-09-22 NULL 8 A
987 역삼 2008-08-30 NULL 7 B
456 대학로 2010-12-01 NULL 8 B
650 신촌 2002-05-17 NULL 10 C
  • Primary Key는 BRNCH_NO
더보기
CREATE TABLE BRNCH_INFO
(
BRNCH_NO INT NOT NULL,
BRNCH_NM CHAR(20) NOT NULL,
OPEN_DT date NOT NULL,
CLOSE_DT date NULL,
BRNCH_NUM INT NOT NULL,
BRNCH_PERF CHAR(20) NOT NULL
);

INSERT INTO BRNCH_INFO
VALUES
(789, '시청', '1990-03-12', NULL, 13, 'A'),
(640, '여의도', '2005-08-07', NULL, 8, 'B'),
(368, '대치', '2005-08-01', '2013-07-09', 13, 'C'),
(248, '창동', '2000-11-30', NULL, 12, 'A'),
(547, '종각', '1993-02-21', NULL, 11, 'C'),
(780, '명동', '1999-09-22', NULL, 8, 'A'),
(987, '역삼', '2008-08-30', NULL, 7, 'B'),
(456, '대학로', '2010-12-01', NULL, 8, 'B'),
(650, '신촌', '2002-05-17', NULL, 10, 'C');

문제


Q1. 위 테이블에서 직원 수가 10명 또는 8명이면서 경영평가가 'A' 또는 'B'인 영업점 번호, 영업점 이름, 영업점 인원, 경영평가를 출력하는 쿼리문

BRNCH_NO BRNCH_NM BRNCH_NUM BRNCH_PERF
640 여의도 8 B
780 명동 8 A
456 대학로 8 B
더보기
SELECT BRNCH_NO, BRNCH_NM, BRNCH_NUM, BRNCH_PERF
FROM BRNCH_INFO
WHERE BRNCH_NUM IN (8, 10)
 AND BRNCH_PERF IN ('A', 'B');

NOT IN 연산자


SELECT 열이름 FROM 테이블명 WHERE 비교할 열 이름 NOT IN (조건1, 조건2);
  • NOT IN 연산자는 뒤에 있는 조건을 부정할 때 사용
  • IN 연산자 내부의 조건들은 OR 인 반면, NOT IN 연산자 내부의 조건들은 AND

문제


Q2. 아직 폐쇄되지 않았거나 2000년도 이전에 신설한 영업점 중 경영평가가 ‘A’가 아닌 영업점 번호, 영업점 이름, 신설일, 폐쇄일, 경영평가를 출력

BRNCH_NO BRNCH_NUM OPEN_DT BRNCH_NUM BRNCH_PERF
368 대치 2005-08-01 2013-07-09 C
547 종각 1993-02-21 NULL C
더보기
SELECT BRNCH_NO, BRNCH_NM, OPEN_DT, CLOSE_DT, BRNCH_PERF
FROM BRNCH_INFO
WHERE CLOSE_DT IS NOT NULL OR OPEN_DT < '2000-01-01')
      AND BRNCH_PERF NOT IN ('A');

 

반응형
반응형

본 글은 책 "칼퇴족 김대리는 알고 나만 모르는 SQL 기초 편"의 정리 내용입니다.

논리연산자는 두 개 이상의 조건을 주기 위해 사용된다. 

OR 논리 연산자를 이용한 예

OR 연산자


SELECT 열이름1, 열이름2 FROM 테이블명 WHERE 조건절1 OR 조건절2;

예제 (테이블명 : BRNCH_INFO)


  • 각 열에 대한 설명
    : 영업점 번호, 영업점 이름, 영업점 신선일, 영업점 폐쇄일, 영업점 인원, 경영평가
BRNCH_NO  BRNCH_NM  OPEN_DT  CLOSE_DT  BRANCH_NUM  BRNCH_PERF
789 시청 1990-03-12 NULL 13 A
640 여의도 2005-08-07 NULL 8 B
368 대치 2005-08-01 2013-07-09 13 C
248 창동 2000-11-30 NULL 12 A
547 종각 1993-02-21 NULL 11 C
780 명동 1999-09-22 NULL 8 A
987 역삼 2008-08-30 NULL 7 B
456 대학로 2010-12-01 NULL 8 B
650 신촌 2002-05-17 NULL 10 C
  • Primary Key는 BRNCH_NO
더보기
CREATE TABLE BRNCH_INFO
(
BRNCH_NO INT NOT NULL,
BRNCH_NM CHAR(20) NOT NULL,
OPEN_DT date NOT NULL,
CLOSE_DT date NULL,
BRNCH_NUM INT NOT NULL,
BRNCH_PERF CHAR(20) NOT NULL
);

INSERT INTO BRNCH_INFO
VALUES
(789, '시청', '1990-03-12', NULL, 13, 'A'),
(640, '여의도', '2005-08-07', NULL, 8, 'B'),
(368, '대치', '2005-08-01', '2013-07-09', 13, 'C'),
(248, '창동', '2000-11-30', NULL, 12, 'A'),
(547, '종각', '1993-02-21', NULL, 11, 'C'),
(780, '명동', '1999-09-22', NULL, 8, 'A'),
(987, '역삼', '2008-08-30', NULL, 7, 'B'),
(456, '대학로', '2010-12-01', NULL, 8, 'B'),
(650, '신촌', '2002-05-17', NULL, 10, 'C');

문제

Q1. 위 테이블에서 직원수(BRANCH_NUM)가 10명 이상이거나 경영평가(BRNCH_PERF)가 ‘A’인 영업점 번호(BRNCH_NO), 영업점 인원(BRNCH_NUM), 경영평가(BRNCH_PERF)를 출력

BRNCH_NO BRNCH_NUM BRNCH_PERF
368 13 C
547 11 C
650 10 C
더보기
SELECT BRNCH_NO, BRNCH_NM, BRNCH_NUM, BRNCH_PERF 
FROM BRNCH_INFO
WHERE BRNCH_NUM >=10 OR BRNCH_PERF='A';

 

참고


  • 연산의 우선순위에 있어서 AND가 OR보다 높음
    • OR 연산자를 먼저 처리하기 위해서는 괄호가 필요

EXAMPLE 1) 아래 쿼리문의 결과는? (괄호 사용 X)

SELECT * 
FROM BRNCH_INFO
WHERE OPEN_DT <= '1999-12-31' OR BRNCH_NUM = 8 AND BRNCH_PERF = 'A';

 

과정 1

  • 위의 WHERE 조건을 나눠서 생각
  • 괄호가 없으므로 AND 연산을 먼저 처리
SELECT * 
FROM BRNCH_INFO
WHERE BRNCH_NUM = 8 AND BRNCH_PERF = 'A';
BRNCH_NO  BRNCH_NM  OPEN_DT  CLOSE_DT  BRNCH_NUM  BRNCH_PERF
780 명동 1999-09-22   8 A

과정 2

  • 추가적으로 OR 연산 앞에 있는 조건을 이용해 출력
SELECT * 
FROM BRNCH_INFO
WHERE OPEN_DT <= '1999-12-31';
BRNCH_NO  BRNCH_NM  OPEN_DT  CLOSE_DT  BRNCH_NUM  BRNCH_PERF
789 시청 1990-03-12   13 A
547 종각 1993-02-21   11 C
780 명동 1999-09-22   8 A
  • 최종적으로 위 두 쿼리문의 결과를 OR 연산으로 출력하면 BRNCH_NO가 780인 경우가 중복되므로 아래와 같음

최종 결과

BRNCH_NO  BRNCH_NM  OPEN_DT  CLOSE_DT  BRNCH_NUM  BRNCH_PERF
789 시청 1990-03-12   13 A
547 종각 1993-02-21   11 C
780 명동 1999-09-22   8 A

 

EXAMPLE 2) 아래 쿼리문의 결과는? (괄호 사용)

SELECT * 
FROM BRNCH_INFO
WHERE (OPEN_DT <= '1999-12-31' OR BRNCH_NUM = 8) AND BRNCH_PERF = 'A';

 

과정 1

  • 괄호가 있는 OR연산 먼저 처리
SELECT * 
FROM BRNCH_INFO
WHERE (OPEN_DT <= '1999-12-31' OR BRNCH_NUM = 8);
BRNCH_NO  BRNCH_NM  OPEN_DT CLOSE_DT  BRNCH_NUM  BRNCH_PERF
789 시청 1990-03-12   13 A
640 여의도 2005-08-07   8 B
547 종각 1993-02-21   11 C
780 명동 1999-09-22   8 A
456 대학로 2010-12-01   8 B

 

과정 2

  • AND 연산 뒷 조건 처리
SELECT * 
FROM BRNCH_INFO
WHERE BRNCH_PERF = 'A';
BRNCH_NO  BRNCH_NM  OPEN_DT CLOSE_DT  BRNCH_NUM  BRNCH_PERF
789 시청 1990-03-12   13 A
248 창동 2000-11-30   12 A
780 명동 1999-09-22   8 A
  • 마지막으로 AND 연산을 처리하면 중복되는 BRNCH_NO가 789780만 있으므로 최종 출력은 아래와 같음

최종 결과

BRNCH_NO  BRNCH_NM  OPEN_DT CLOSE_DT  BRNCH_NUM  BRNCH_PERF
789 시청 1990-03-12   13 A
780 명동 1999-09-22   8 A

⇒ 결론적으로 괄호의 사용에 따라 연산의 우선순위가 달라지기 때문에 최종 결과도 달라짐

반응형
반응형

본 글은 책 "칼퇴족 김대리는 알고 나만 모르는 SQL 기초 편"의 정리 내용입니다.

논리연산자는 두 개 이상의 조건을 주기 위해 사용된다. 

AND 논리 연산자를 이용한 예

AND 연산자


SELECT 열이름1, 열이름2 FROM 테이블명 WHERE 조건절1 AND 조건절2;

예제 (테이블명 : BRNCH_INFO)


  • 각 열에 대한 설명
    : 영업점 번호, 영업점 이름, 영업점 신선일, 영업점 폐쇄일, 영업점 인원, 경영평가
BRNCH_NO  BRNCH_NM  OPEN_DT  CLOSE_DT  BRANCH_NUM  BRNCH_PERF
789 시청 1990-03-12 NULL 13 A
640 여의도 2005-08-07 NULL 8 B
368 대치 2005-08-01 2013-07-09 13 C
248 창동 2000-11-30 NULL 12 A
547 종각 1993-02-21 NULL 11 C
780 명동 1999-09-22 NULL 8 A
987 역삼 2008-08-30 NULL 7 B
456 대학로 2010-12-01 NULL 8 B
650 신촌 2002-05-17 NULL 10 C
  • Primary Key는 BRNCH_NO
더보기
CREATE TABLE BRNCH_INFO
(
BRNCH_NO INT NOT NULL,
BRNCH_NM CHAR(20) NOT NULL,
OPEN_DT date NOT NULL,
CLOSE_DT date NULL,
BRNCH_NUM INT NOT NULL,
BRNCH_PERF CHAR(20) NOT NULL
);

INSERT INTO BRNCH_INFO
VALUES
(789, '시청', '1990-03-12', NULL, 13, 'A'),
(640, '여의도', '2005-08-07', NULL, 8, 'B'),
(368, '대치', '2005-08-01', '2013-07-09', 13, 'C'),
(248, '창동', '2000-11-30', NULL, 12, 'A'),
(547, '종각', '1993-02-21', NULL, 11, 'C'),
(780, '명동', '1999-09-22', NULL, 8, 'A'),
(987, '역삼', '2008-08-30', NULL, 7, 'B'),
(456, '대학로', '2010-12-01', NULL, 8, 'B'),
(650, '신촌', '2002-05-17', NULL, 10, 'C');

문제

Q1. 위 테이블에서 직원수(BRANCH_NUM)가 10명 이상, 경영평가(BRNCH_PERF)가 ‘C’인 영업점 번호(BRNCH_NO), 영업점 이름(BRNCH_NM), 영업점 인원(BRNCH_NUM), 경영평가(BRNCH_PERF)를 출력

BRNCH_NO BRNCH_NM BRNCH_NUM BRNCH_PERF
368 대치 13 C
547 종각 11 C
650 신촌 10 C
더보기
SELECT BRNCH_NO, BRNCH_NM, BRNCH_NUM, BRNCH_PERF
FROM BRNCH_INFO
WHERE BRNCH_NUM >=10 AND BRNCH_PERF='C';

 

Q2. 테이블을 사용하여 직원 수(BRANCH_NUM)가 10명이상이고 경영평가(BRNCH_PERF)가 ‘C’이면서 영업점이 폐쇄된 영업점 번호(BRNCH_NO), 영업점 이름(BRNCH_NM), 영업점 인원(BRNCH_NUM), 경영평가(BRNCH_PERF)를 출력

BRNCH_NO BRNCH_NM CLOSE_DT BRNCH_NUM BRNCH_PERF
368 대치 2013-07-09 13 C
더보기
SELECT BRNCH_NO, BRNCH_NM, CLOSE_DT, BRNCH_NUM, BRNCH_PERF
FROM BRNCH_INFO
WHERE BRNCH_NUM >=10
      AND BRNCH_PERF='C'
      AND CLOSE_DT IS NOT NULL;

 

반응형
반응형

본 글은 책 "칼퇴족 김대리는 알고 나만 모르는 SQL 기초 편"의 정리 내용입니다.

NULL값의 처리


  • NULL값은 0과는 다른 의미
  • NULL값이 포함된 사칙연산의 결과 (EX) NULL * 3)는 NULL값이므로 이를 방지하기 위해 결측치 처리(Missing value imputation)라는 작업을 해야 함 
  • NULL값을 처리하기 위해 COALESCE 함수가 많이 사용됨 

COALESCE 함수의 문법

  • COALESCE는 '합치다' 혹은 '합체하다'의 뜻
  • 열 중 NULL값이 아닌 첫 번째 값을 화면에 출력하는 역할

COALESCE(EXPRESSION 1, EXPRESSION 2, EXPRESSION 3 ...)
  • 함수의 인자인 EXPRESSION들 중 첫 번째부터 NULL이 아닌 인자를 반환
  • COALESCE(’A’, ‘B’) → ‘A’ 반환
  • COALESCE(NULL, ‘B’, ‘C’) → ‘B’ 반환
  • COALESCE(NULL, NULL, ‘C’) → ‘C’ 반환

예제


ID VALUE
1 12
2 24
3 NULL
4 NULL
더보기
CREATE TABLE TABLE_A
(
ID INT NOT NULL,
VALUE INT);

INSERT INTO TABLE_A
VALUES
( 1, 12),
(2, 24),
(3, NULL),
(4, NULL);
  • VALUE 열에 포함되어있는 NULL값들을 0으로 반환하기 위해 COALESCE 함수 사용
SELECT ID ,COALESCE(VALUE, 0)
FROM TABLE_A;
ID VALUE
1 12
2 24
3 0
4 0
반응형

+ Recent posts