반응형

본 글은 책 "칼퇴족 김대리는 알고 나만 모르는 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
반응형
반응형

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

비교연산자


비교연산자  설명
A = B A와 B가 같다
A <> B A와 B가 같지 않다
A != B A와 B가 같지 않다
A ^=B A와 B가 같지 않다
A < B A가 B보다 작다
A <=B A가 B보다 작거나 같다
A > B A가 B보다 크다
A >= B A가 B보다 크거나 같다
BETWEEN A AND B 지정된 두 값 사이에 있는지 확인하는 경우 사용
IS NULL NULL값을 가진 열을 검색하는 경우 사용
IS NOT NULL NULL값이 아닌 열을 검색하는 경우 사용

위와 같은 종류의 비교연산자들이 있고 크게 SELECT문과 WHERE 조건절에서 사용될 수 있다.

SELECT문에서 사용되는 경우


SELECT 열이름1 산술연산자 열이름2 AS 새로운이름
FROM 테이블명;
  • 2개의 열들을 비교/산술 연산자를 이용해 계산한 결과를 새로운 열에 추가하는 경우에 사용
  • SELECT 문에서 산술연산자는 AS 와 같이 사용되는 경우가 많음

 

WHERE 조건절에서 사용되는 경우


SELECT 열이름 
FROM 테이블명 
WHERE (열이름1 산술연산자 열이름2) 비교연산자 비교할 대상;

 

예제


테이블 : PURCHASE_TRAN

  • Primary Key는 ID 열 
  • 열 설명 (왼쪽부터) : 고객번호, 올해 구입금액, 올해 구입건수, 작년 구입금액, 작년 구입건수

 

더보기
CREATE TABLE PURCHASE_TRAN
(
ID INTEGER NOT NULL,
PURCHASE_AMT INTEGER NOT NULL,
PURCHASE_CNT INTEGER NOT NULL,
LAST_AMT INTEGER NOT NULL,
LAST_CNT INTEGER NOT NULL,
PRIMARY KEY("ID")
);

INSERT INTO PURCHASE_TRAN
VALUES
( 145, 20000000, 12, 1231000, 21),
( 455, 1273100, 1, 2237230, 22),
( 463, 111463, 3, 214047, 1),
( 324, 154769, 3, 7474663, 13),
( 568, 25784652, 47, 1000047, 3),
( 662, 106868, 1, 277763, 1),
( 871, 9696470, 123, 798874, 2),
( 460, 65650000, 1200, 6557741, 320),
( 277, 57663000, 470, 57663000, 444),
( 309, 5579800, 415, 2333000, 135);

 

Q1. PURCHASE_TRAN 테이블에서 올해 구입금액(PURCHASE_AMT)이 1백만원 이상인 고객의 고객번호와 올해 구입금액을 나타내보자(비교연산자).

더보기
SELECT ID, PURCHASE_AMT 
FROM PURCHASE_TRAN
WHERE PURCHASE_AMT>=1000000;
ID PURCHASE_AMT
145 20000000
277  57663000
309  5579800
455  1273100
460  65650000
568  25784652
871  9696470

 

Q2. 테이블에서 작년 구입금액(LAST_AMT)이 1백만원 이상 5천만원 이하인 고객의 고객번호와 작년 구입금액을 나타내보자.

더보기

아래 1), 2), 3)은 각각 같은 역할로 한가지 선택 가능

SELECT ID, LAST_AMT
FROM PURCHASE_TRAN
1) WHERE LAST_AMT BETWEEN 1000000 AND 50000000;

2) WHERE 1000000 <= LAST_AMT <= 50000000;

3) WHERE LAST_AMT >= 1000000 AND LAST_AMT <= 500000000;
ID LAST_AMT
145 1231000
309 2333000
324 7474663
455 2237230
460 6557741
568 1000047

 

Q3. 테이블에서 올해 구입건수(PURCHASE_CNT)가 작년도 구입건수(LAST_CNT)보다 많은 고객들의 고객번호, 올해 구입건수, 작년도 구입건수를 나타내고 고객번호를 기준으로 오름차순 정렬해보자.

더보기
SELECT ID, PURCHASE_CNT, LAST_CNT
FROM PURCHASE_TRAN
WHERE PURCHASE_CNT > LAST_CNT
ORDER BY ID;
ID PURCHASE_CNT LAST_CNT
277 470 444
309 415 135
460 1200 320
463 3 1
568 47 3
871 123 2

 

 

Q4. 올해 판매가격(PURCHASE_AMT)의 순 매출마진이 10%라고 가정하자. 테이블에서 순이익의 별칭을 INCOME_AMT라고 사용하여 올해 고객별 순이익을 구해보자.

더보기
SELECT ID, PURCHASE_AMT*0.1 AS INCOME_AMT
FROM PURCHASE_TRAN;
ID INCOME_AMT
145 2000000
277 5766300
309 557980
324 15476.9
455 127310
460 6565000
463 11146.3
568 2578465.2
662 10686.8
871 969647

 

 

반응형
반응형

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

WHERE 조건절은 전체 테이블에서 특정한 행을 추출하는데 사용된다.

숫자형 데이터 조건 주기


SELECT 열이름 FROM 테이블명 WHERE 비교할 열 이름=숫자;

 

문자/날짜형 데이터 조건 주기


SELECT 열이름 FROM 테이블명 WHERE 비교할 열 이름='문자';
  • 문자에 대한 조건을 줄때는 작은 따옴표(’ ‘)를 사용

 

예제


보험 테이블: INS_INFO

  • Primary Key는 ID 열
  • 열 설명 (왼쪽부터) : 고객번호, 계약번호, 계약일, 계약 종류, 상품명, 해지일, 가입금액
ID  CNRT_NO  CNRT_DT  CNRT_CD  PRDT_NM  CNCL_DT  CNRT_AMT
224 2533274 2013-07-01 1 다이렉트자동차보험   1000000
225 6111075 2012-08-07 2 5년만기저축보험   300000
226 4447330 2014-06-12 1 다이렉트자동차보험   1100000
684 4932004 2011-11-23 1 자동차보험   1200000
233 9633703 2013-05-31 2 10년만기저축보험 2013-11-03 700000
762 1378934 2013-01-12 2 3년만기저축보험   500000
789 3701447 2010-05-05 1 다이렉트자동차보험   900000
183 6678966 2011-12-08 2 10년만기 저축보험   10000000
831 8463112 2013-04-16 1 다이렉트자동차보험 2013-08-11 1000000
더보기
CREATE TABLE INS_INFO(
ID CHAR(20) NOT NULL,
CNRT_NO CHAR(20) NOT NULL,
CNRT_DT date NOT NULL,
CNRT_CD CHAR(20) NOT NULL,
PRDT_NM CHAR(20) NOT NULL,
CNCL_DT date NULL,
CNRT_AMT INT NOT NULL,
PRIMARY KEY("ID") 
);

INSERT INTO INS_INFO
VALUES
('224', '2533274', '2013-07-01', '1', '다이렉트자동차보험', NULL, 1000000),
('225', '6111075', '2012-08-07', '2', '5년만기저축보험', NULL, 300000),
('226', '4447330', '2014-06-12', '1', '다이렉트자동차보험', NULL, 1100000),
('684', '4932004', '2011-11-23', '1', '자동차보험', NULL, 1200000),
('233', '9633703', '2013-05-31', '2', '10년만기저축보험', '2013-11-03', 700000),
('762', '1378934', '2013-01-12', '2', '3년만기저축보험', NULL, 500000),
('789', '3701447', '2010-05-05', '1', '다이렉트자동차보험', NULL, 900000),
('183', '6678966', '2011-12-08', '2', '10년만기 저축보험', NULL, 10000000),
('831', '8463112', '2013-04-16', '1', '다이렉트자동차보험', '2013-08-11', 1000000);

 

위 테이블에서 고객들의 고객번호(ID), 계약번호(CNRT_NO), 가입금액(CNRT_AMT)를 추출하는 쿼리문

SELECT ID, CNRT_NO, CNRT_AMT 
FROM INS_INFO;
ID  CNRT_NO  CNRT_AMT
224 2533274 1000000
225 6111075 300000
226 4447330 1100000
684 4932004 1200000
233 9633703 700000
762 1378934 500000
789 3701447 900000
183 6678966 10000000
831 8463112 1000000

Q1. 가입금액이 1백만원 이상인 고객들의 고객번호, 계약번호, 가입금액을 추출하면?

더보기

 

SELECT ID, CNRT_NO, CNRT_AMT 
FROM INS_INFO
WHERE CNRT_AMT >=1000000;
ID  CNRT_NO  CNRT_AMT
224 2533274 1000000
226 4447330 1100000
684 4932004 1200000
183 6678966 10000000
831 8463112 1000000

 

Q2. 상품명이 '다이렉트 자동차 보험'인 고객들의 고객번호(ID), 계약일(CNRT_DT), 상품명(PRDT_NM)을 추출 후 고객번호는 오름차순으로 정렬

더보기
SELECT ID, CNRT_DT, PRDT_NM
FROM INS_INFO
WHERE PRDT_NM='다이렉트자동차보험' 
ORDER BY ID ASC;
ID  CNRT_DT PRDT_NM
224 2013-07-01 다이렉트자동차보험
226 2014-06-12 다이렉트자동차보험
789 2010-05-05 다이렉트자동차보험
831 2013-04-16 다이렉트자동차보험

 

Q3. 상품 계약일이 2013년 04월 16일 이후인 고객들의 고객번호(ID), 계약일(CNRT_DT), 상품명(PRDT_NM)을 추출하고 고객번호는 오름차순으로 정렬

더보기
SELECT ID, CNRT_DT, PRDT_NM 
FROM INS_INFO
WHERE CNRT_DT >='2013-04-16'
ORDER BY ID ASC;
ID  CNRT_DT PRDT_NM
224 2013-07-01 다이렉트자동차보험
226 2014-06-12 다이렉트자동차보험
233 2013-05-31 10년만기저축보험
831 2013-04-16 다이렉트자동차보험
반응형
반응형

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

AS 키워드는 특정 열을 새로운 열 이름으로 출력하는데 사용됩니다. 

'POSITION' 열을 '직급' 열로 변경해서 출력

예제


인사고과 테이블: EMP

  • Primary Key는 ID 열 
ID  POSITION  PARTY_NM  MANAGER_ID  TEAM_NM  GRADE
210 차장 문보미 3914 인사팀 3
345 대리 오윤경 1270 마케팅부 2
347 차장 정호천 3942 기획팀 3
540 과장 장성수 3221 리스크부 2
650 대리 이재훈 1270 마케팅부 1
711 과장 이재중 3914 인사팀 2
970 부장 김영성 3221 리스크부 2
더보기
더보기
CREATE TABLE EMP
(
ID INT NOT NULL,
POSITION CHAR(20) NOT NULL,
PARTY_NM CHAR(20) NOT NULL,
MANAGER_ID INT NOT NULL,
TEAM_NM CHAR(20) NOT NULL,
GRADE INT NOT NULL,
PRIMARY KEY('ID')
);

INSERT INTO EMP
VALUES
(210, '차장', '문보미', 3914, '인사팀', 3),
(345, '대리', '오윤경', 1270, '마케팅부', 2),
(347, '차장', '정호천', 3942, '기획팀', 3),
(540, '과장', '장성수', 3221, '리스크부', 2),
(650, '대리', '이재훈', 1270, '마케팅부', 1),
(711, '과장', '이재중', 3914, '인사팀', 2),
(970, '부장', '김영성', 3221, '리스크부', 2);

 

EMP 테이블에 어떤 직급들이 있는지 확인하기 위해서 POSITION 열을 출력

SELECT POSITION FROM EMP;
POSITION
차장
대리
차장
과장
대리
과장
부장

 

POSITION 열을 직급 열로 변경하기 위해 AS 키워드 (혹은 " ")를 사용

SELECT ID AS 직급 FROM EMP;
혹은
SELECT ID "직급" FROM EMP;
직급
차장
대리
차장
과장
대리
과장
부장

 

반응형
반응형

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

DISTINCT 키워드는 중복되는 행을 제거하는데 사용된다. 

DISTINCT 키워드를 사용한 중복되는 행 제거

예제


인사고과 테이블: EMP

  • Primary Key는 ID 열 
ID  POSITION  PARTY_NM  MANAGER_ID  TEAM_NM  GRADE
210 차장 문보미 3914 인사팀 3
345 대리 오윤경 1270 마케팅부 2
347 차장 정호천 3942 기획팀 3
540 과장 장성수 3221 리스크부 2
650 대리 이재훈 1270 마케팅부 1
711 과장 이재중 3914 인사팀 2
970 부장 김영성 3221 리스크부 2
더보기
더보기
CREATE TABLE EMP
(
ID INT NOT NULL,
POSITION CHAR(20) NOT NULL,
PARTY_NM CHAR(20) NOT NULL,
MANAGER_ID INT NOT NULL,
TEAM_NM CHAR(20) NOT NULL,
GRADE INT NOT NULL,
PRIMARY KEY('ID')
);

INSERT INTO EMP
VALUES
(210, '차장', '문보미', 3914, '인사팀', 3),
(345, '대리', '오윤경', 1270, '마케팅부', 2),
(347, '차장', '정호천', 3942, '기획팀', 3),
(540, '과장', '장성수', 3221, '리스크부', 2),
(650, '대리', '이재훈', 1270, '마케팅부', 1),
(711, '과장', '이재중', 3914, '인사팀', 2),
(970, '부장', '김영성', 3221, '리스크부', 2);

 

EMP 테이블에 어떤 직급들이 있는지 확인하기 위해서 POSITION 열을 출력

SELECT POSITION FROM EMP;
POSITION
차장
대리
차장
과장
대리
과장
부장
  • 중복되는 값들도 모두 출력됨 (차장 2번, 대리 2번, 과장 2번)
  • 중복 값은 하나만 출력하여 어떤 종류의 변수들이 있는지 확인하기 위해서는 DISTINCT 키워드를 사용
SELECT DISTINCT POSITION FROM EMP;
POSITION
차장
대리
과장
부장

 

직급 별 인사 고과(GRADE) 확인


  • DISTINCT 키워드 뒤에 2개 이상의 열을 나열하면 2개 이상의 열이 하나의 레코드로 인식하여 중복된 값을 제거
SELECT DISTINCT POSITION, GRADE FROM EMP;
POSITION  GRADE
차장 3
대리 2
과장 2
대리 1
부장 2

 

DISTINCT 키워드를 사용하지 않으면?

SELECT POSITION, GRADE FROM EMP;
POSITION  GRADE
차장 3
대리 2
차장 3
과장 2
대리 1
과장 2
부장 2
  • POSITION이 ‘차장’이면서 GRADE가 ‘3’인 경우가 두 번 출력 됨

 

참고로 DISTINCT 키워드의 반대는 ALL이고 SQL에서는 ALL이 기본 값이다.
SELECT ALL POSITION FROM EMP;
= SELECT POSITION FROM EMP;

 

반응형
반응형

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

한 가지 열로 데이터 정렬하기


1. ‘ORDER BY 열 이름’

SELECT 열이름1, 열이름2 FROM 테이블명 ORDER BY 열 이름1;

 

2. 'ORDER BY 열 위치'

SELECT 열이름1, 열이름2 FROM 테이블명 ORDER BY 2;
  • ‘ORDER BY 2’는 두번째 열을 기준으로 정렬한다는 의미

 

여러가지 열로 데이터 정렬하기


SELECT 열이름1, 열이름2 FROM 테이블명 ORDER BY 열이름1, 열이름2;
  • ‘ORDER BY 열이름1, 열이름2’는 데이터 정렬 우선순위가 첫번째 열에 있고, 그 다음이 두번째라는 의미

 

예제


직원정보 테이블: CLERK

ID  STAFF_NM  DEF_NM  GENDER  BIRTH_DT  EMP_FLAG
142 김선명 영업지원부 M 1971-12-08 Y
488 김선주 영업지원부 M 1973-06-08 Y
489 김선선 영업지원부 M 1974-12-13 Y
334 고현정 기업영업지원부 F 1965-01-12 Y
더보기
CREATE TABLE CLERK
(
ID INT NOT NULL,
STAFF_NM CHAR(20) NOT NULL,
DEF_NM CHAR(20) NOT NULL,
GENDER CHAR(1) NOT NULL,
BRITH_DT CHAR(20) NOT NULL,
EMP_FLAG CHAR(1) NOT NULL,
PRIMARY KEY('ID')
);

INSERT INTO CLERK
VALUES
(142, '김선명', '영업지원부', 'M', '1971-12-08', 'Y'),
(488, '김선주', '영업지원부', 'M', '1973-06-08', 'Y'),
(489, '김선선', '영업지원부', 'M', '1974-12-13', 'Y'),
(334, '고현정', '전략기획부', 'F', '1965-01-12', 'Y');

 

ORDER BY DEF_NM; 의 결과

SELECT * FROM CLERK ORDER BY DEF_NM;
ID STAFF_NM  DEF_NM  GENDER BIRTH_DT  EMP_FLAG
334 고현정 기업영업지원부 F 1965-01-12 Y
142 김선명 영업지원부 M 1971-12-08 Y
488 김선주 영업지원부 M 1971-12-08 Y
489 김선선 영업지원부 M 1971-12-08 Y
  • ‘DEF_NM’ 컬럼을 이용해 오름차순으로 정렬됨

ORDER BY DEF_NM, STAFF_NM; 의 결과

SELECT * FROM CLERK ORDER BY DEF_NM, STAFF_NM;

 

ID  STAFF_NM  DEF_NM  GENDER  BIRTH_DT  EMP_FLAG
334 고현정 기업영업지원부 F 1965-01-12 Y
142 김선명 영업지원부 M 1971-12-08 Y
489 김선선 영업지원부 M 1971-12-08 Y
488 김선주 영업지원부 M 1971-12-08 Y
  • 먼저 'DEF_NM' 열이 오름차순으로 정렬됨
  • 그 후 ‘영업지원부’ 내에서 ‘STAFF_NM’ 열에 의해 오름차순으로 정렬됨 (가나다 순으로 명 -> 선 -> 주 정렬)

오름차순으로 데이터 정렬하기


SELECT 열이름1, 열이름2 FROM 테이블명 ORDER BY 열이름1 ASC, 열이름2 ASC;
  • SQL에서 기본값으로 오름차순 정렬을 실행하기 때문에 ASC 생략 가능

내림차순으로 데이터 정렬하기


SELECT 열이름1, 열이름2 FROIM 테이블명 ORDER BY 열이름1 DESC, 열이름2 DESC;
반응형
반응형

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

지정한 열 가져오기


1. 지정한 열이 한 개일 경우

SELECT 열 이름 FROM 테이블명;

2. 지정한 열이 두 개 이상인 경우

SELECT 열이름1, 열이름2, 열이름3 FROM 테이블명;

예제


직원 정보 테이블: CLERK

ID  STAFF_NM  DEF_NM  GENDER  BIRTH_DT  EMP_FLAG
121 신지원 리스크부 F 1978-05-28 Y
135 이민성 마케팅부 M 1984-02-11 Y
142 김선명 영업지원부 M 1971-12-08 Y
144 이기동 마케팅분석부 M 1981-03-03 Y
334 고현정 전략기획부 F 1965-01-12 Y
703 송지희 검사부 F 1985-05-14 Y
732 연승환 기업영업지원부 M 1990-01-26 Y
911 이명준 여의도지점 M 1988-06-11 N
  • CLERK 테이블의 Primary Key는 ID
더보기
CREATE TABLE CLERK
(
ID INT NOT NULL,
STAFF_NM CHAR(20) NOT NULL,
DEF_NM CHAR(20) NOT NULL,
GENDER CHAR(1) NOT NULL,
BRITH_DT CHAR(20) NOT NULL,
EMP_FLAG CHAR(1) NOT NULL,
PRIMARY KEY('ID')
);

INSERT INTO CLERK
VALUES
(121, '신지원', '리스크부', 'F', '1978-05-28', 'Y'),
(135, '이민성', '마케팅부', 'M', '1984-02-11', 'Y'),
(142, '김선명', '영업지원부', 'M', '1971-12-08', 'Y'),
(144, '이기동', '마케팅분석부', 'M', '1981-03-03', 'Y'),
(334, '고현정', '전략기획부', 'F', '1965-01-12', 'Y'),
(703, '송지희', '검사부', 'F', '1985-05-14', 'Y'),
(732, '연승환', '기업영업지원부', 'M', '1990-01-26', 'Y'),
(911, '이명준', '여의도지점', 'M', '1988-06-11', 'N');

 

Q1. 아래 쿼리문의 결과는? (한개의 열 출력)

SELECT ID FROM CLERK;
더보기
ID 
121
135
142
144
334
703
732
911

 

Q2. 아래 쿼리문의 결과는? (2개의 열 출력)

SELECT ID, STAFF_NM FROM CLERK;
더보기

 

ID STAFF_NM
121 신지원
135 이민성
142 김선명
144 이기동
334 고현정
703 송지희
732 연승환
911 이명준

모든 열 가져오기


1. 모든 열 이름을 적기

SELECT 열이름1, 열이름2, 열이름3, 열이름4 FROM 테이블명;

2. 문자 * 를 사용하기

SELECT * FROM 테이블명;

Q3.  CLERK 테이블에서 모든 열 출력 

더보기
ID  STAFF_NM  DEF_NM  GENDER  BIRTH_DT  EMP_FLAG
121 신지원 리스크부 F 1978-05-28 Y
135 이민성 마케팅부 M 1984-02-11 Y
142 김선명 영업지원부 M 1971-12-08 Y
144 이기동 마케팅분석부 M 1981-03-03 Y
334 고현정 전략기획부 F 1965-01-12 Y
703 송지희 검사부 F 1985-05-14 Y
732 연승환 기업영업지원부 M 1990-01-26 Y
911 이명준 여의도지점 M 1988-06-11 N
반응형
반응형

데이터베이스(DB)의 정의

  • 여러 사람에게 공유되어 사용될 목적을 가지고, 구조적인 방식으로 관리되는 데이터들의 집합

데이터베이스 관리 시스템(DBMS: Database Management System)

  • 데이터를 정리하고 보관하기 위한 용도로 사용되고 데이터 추가, 변경, 삭제, 검색 등의 기능을 수행
  • 대표적인 DBMS 는 Oracle, MySQL

DBMS의 특성

  1. 실시간 접근성
    • 컴퓨터가 접근할 수 있는 저장 장치에서 관리되는 데이터베이스는 지속적이고 비정형적인 질의에 대하여 실시간 처리가 가능해야 함
  2. 계속적인 변화
    • 데이터베이스 상태는 동적
    • 기존 데이터베이스에 새로운 데이터 삽입, 삭제, 갱신등의 변화를 주어 정확한 데이터 유지 필요
  3. 동시 공용
    • 다수의 사용자가 동시에 각자 원하는 데이터에 접근하여 이용할 수 있어야 함
  4. 내용에 의한 참조
    • 레코드의 주소나 위치에 의해서가 아니라 사용자가 요구하는 데이터의 내용, 즉 데이터가 가지고 있는 값에 따라 참조

SQL 사용을 위해 필요한 DB 용어

  1. 테이블
    • 엑셀에서 스프레드 시트의 의미
    • 동일한 두 개의 테이블 이름은 허락되지 않음
  2. 스키마(Schema)
    • 테이블에 데이터가 저장되는 방식을 정의
    • 데이터베이스에 존재하는 자료의 구조 및 내용과 자료들의 논리적, 물리적 특성에 대한 정보를 표현하는 논리적 구조
  3. 열(Column)
    • 테이블을 구성하는 각각의 정보
    • 테이블을 여러 가지 열로 나누는 일은 매우 중요
      : 아래 CASE 2와 같이 데이터를 저장하는 경우 지역에 따른 고객의 분포에 대한 자료를 추출하고자 할 때 추가 작업없이 추출 가능

      CASE 1. 전화번호를 한 개의 열에 모두 입력고객 ID 전화번호
      고객 ID 자택전화번호
      123 0237003333
      CASE 2. 전화번호를 지역번호, 앞자리, 뒷자리 3개의 열에 나눠서 입력고객 ID 지역번호 전화번호 앞자리 전화번호 뒷자리
      고객 ID 지역번호 전화번호 앞자리 전화번호 뒷자리
      123 02 3700 3333
  4. 행(Row)
    • 테이블의 데이터는 행에 저장됨
    • 고객이 3명이면 3개의 행으로 구성
    • 레코드라고 표현하기도 함
  5. 기본 키(Primary Key) 
    • 각 행을 고유하게 하는 열
    • 기본 키는 테이블 생성 시 반드시 필요

 

SQL이란?

  • Structured Query Language로, 데이터베이스에 접근할 수 있는 데이터 하부 언어를 지칭

SQL의 종류

  1. 데이터 정의어(DDL : Data Definition Language)
    • 데이터가 저장된 공간이 ‘테이블’, 테이블 형식이 ‘스키마’라면 DDL은 데이터와 그 형식을 정의하는 언어
      • CREATE: 데이터베이스 테이블 생성
      • DROP : 데이터베이스 테이블 삭제
      • ALTER : 기존 데이터베이스 테이블 재정의
  2. 데이터 조작어(DML : Data Manipulation Language)
    • DDL로 테이블과 스키마를 만들었다면, DML 그 공간에 데이터를 저장, 수정, 삭제, 조회하는 언어
      • INSERT : 테이블에 데이터 삽입
      • DELETE : 테이블의 데이터 삭제
      • UPDATE : 기존 테이블 안의 데이터 수정
      • SELECT : 테이블 내 데이터 검색
  3. 데이터 제어어(DCL : Data Control Language)
    1. 데이터 베이스 사용자의 권한 제어를 위해 사용되는 언어
      1. GRANT : 테이블에 권한 부여
      2. REVOKE : 부여한 권한 취소/회수
반응형

+ Recent posts