반응형

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

그룹화된 데이터 필터링하기


SELECT 그룹화할 열 이름1, 
FROM 테이블명
WHERE 조건절
GROUP BY 열 이름1
HAVING 집계함수조건;

 

WHERE 조건절과의 차이점

  • WHERE 조건절은 무수히 많은 데이터에서 원하는 행만 보고 싶을 때 사용
  • HAVING 조건절은 행이 아닌 그룹화된 변수(GROUP BY 절 결과 이후)에 대해 필터링할 경우에 사용

 

2022.02.16 - [SQL] - [SQL] 데이터의 그룹화 (GROUP BY)

위의 글의 테이블을 참고하여 GROUP BY절을 이용하여 추출한 결과는 아래와 같다.

이름 ENG MATH GENDER
김필호 28 49 남자
이치훈 68 98 남자
김영숙 87 87 여자
성은영 65 78 여자

 

SELECT GENDER,
       AVG(ENG) AS ENG_AVERAGE,
       AVG(MATH) AS MATH_AVERAGE
FROM CLASS_SCORE
GROUP BY GENDER;
GENDER ENG_AVERAGE MATH_AVERAGE
남자 48.0 73.5
여자 76.0 82.5
  • GROUP BY 를 사용하여 성별(Gender)로 평균값을 계산 및 출력

 

이때, 수학 평균 정수(MATH_AVERAGE)가 80 이상인 그룹만 출력하길 원한다면? -> HAVING 절을 사용할 수 있다. 

SELECT GENDER,
       AVG(ENG) AS ENG_AVERAGE,
       AVG(MATH) AS MATH_AVERAGE
FROM CLASS_SCORE
GROUP BY GENDER
HAVING MATH_AVERAGE >=80;
GENDER ENG_AVERAGE MATH_AVERAGE
여자 76.0 82.5

 

예제 


고객구매 테이블: PROD_SALES

  • 열 설명: 고객 이름, 제품 코드, 구매금액
CUST_NM PRD_ID SALES_AMT
LEE 546 3000
KIM 324 4780
KANG 564 87900
KWON 556 45478
KIM 254 3000
YOO 567 78900
PARK 877 89787
LEE 890 10000
KIM 787 2341
PARK 566 50000
더보기
CREATE TABLE PROD_SALES
(
	CUST_NM CHAR(20) NOT NULL,
	PRD_ID INT NOT NULL,
	SALES_AMT INT NOT NULL,
	PRIMARY KEY('PRD_ID')
);

INSERT INTO PROD_SALES
VALUES
('LEE', 546,  3000),
('KIM', 324,  4780),
('KANG', 564, 87900),
('KWON', 556, 45478),
('KIM', 254,  3000),
('YOO', 567,  78900),
('PARK', 877, 89787),
('LEE', 890,  10000),
('KIM', 787,  2341),
('PARK', 566, 50000);

 

Q1. 구매 횟수가 두 번 이상인 고객에게 마케팅을 하려고 한다. 마케팅 대상자는 누구일까? 

더보기

A1. 

1단계. 먼저 COUNT 함수와 GROUP BY 절을 이용해 고객별 구매 횟수를 추출

SELECT CUST_NM, COUNT(*)
FROM PROD_SALES
GROUP BY CUST_NM;
CUST_NM COUNT(*)
KANG 1
KIM 3
KWON 1
LEE 2
PARK 2
YOO 1

 

2단계. HAVING 절을 이용해 구매 횟수가 2번 이상인 대상자를 추출

SELECT CUST_NM, COUNT(*)
FROM PROD_SALES
GROUP BY CUST_NM
HAVING COUNT(*)>=2;
CUST_NM COUNT(*)
KIM 3
LEE 2
PARK 2

 

 

Q2. 구매금액의 합이 7만원 이상인 고객에게 마케팅을 하려고 한다. 마케팅 대상자는 누구일까? 

더보기

A1. 

1단계. 먼저 SUM 함수와 GROUP BY 절을 이용해 고객별 구매금액을 추출

SELECT CUST_NM, SUM(SALES_AMT)
FROM PROD_SALES
GROUP BY CUST_NM;
CUST_NM SUM(SALES_AMT)
KANG 87900
KIM 10121
KWON 45478
LEE 13000
PARK 139787
YOO 78900

 

2단계. HAVING 절을 이용해 구매금액의 합이 7만원 이상인 대상자를 추출

SELECT CUST_NM, SUM(SALES_AMT)
FROM PROD_SALES
GROUP BY CUST_NM
HAVING SUM(SALES_AMT)>=70000;
CUST_NM SUM(SALES_AMT)
KANG 87900
PARK 139787
YOO 78900

 

Q3. 구매금액의 평균이 7만원 이상인 고객에게 마케팅을 하려고 한다. 마케팅 대상자는 누구일까?

더보기

A1. 

1단계. 먼저 AVG 함수와 GROUP BY 절을 이용해 고객별 구매금액을 추출

SELECT CUST_NM, AVG(SALES_AMT)
FROM PROD_SALES
GROUP BY CUST_NM;
CUST_NM AVG(SALES_AMT)
KANG 87900
KIM 3373.6667
KWON 45478
LEE 6500
PARK 69893.5
YOO 78900

 

2단계. HAVING 절을 이용해 구매금액의 평균이 7만원 이상인 대상자를 추출

SELECT CUST_NM, AVG(SALES_AMT)
FROM PROD_SALES
GROUP BY CUST_NM
HAVING AVG(SALES_AMT)>=70000;
CUST_NM AVG(SALES_AMT)
KANG 87900
YOO 78900

 

참고


  1. 그룹화 필터링 후 데이터를 정렬할 때 ORDER BY절을 사용할 수 있음
    • 순서는 ORDER BY절이 문장의 항상 마지막에 사용됨
    SELECT 열이름 
    FROM 테이블이름
    WHERE 조건절(개별 행에 대한 필터링) 
    GROUP BY 열이름
    HAVING 조건절(그룹화된 변수에 대한 필터링)
    ORDER BY 열이름
  2. WHERE 조건절의 조건은 데이터가 그룹화되기 전에 필터링하고, HAVING절의 조건은 데이터가 그룹화된 후에 필터링
  • WHERE 절에 의해 제외된 행은 그룹화할 때도 제외되기 때문에 HAVING절의 고려 대상이 아님
반응형
반응형

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

열 이름으로 그룹화


CLASS_SCORE 테이블

이름 ENG MATH GENDER
김필호 28 49 남자
이치훈 68 98 남자
김영숙 87 87 여자
성은영 65 78 여자
더보기
CREATE TABLE CLASS_SCORE
(
NAME CHAR(20) NOT NULL,
ENG INT NOT NULL,
MATH INT NOT NULL,
GENDER CHAR(20) NOT NULL,
PRIMARY KEY('NAME')
);

INSERT INTO CLASS_SCORE
VALUES
('김필호', 28, 49, '남자'),
('이치훈', 68, 98, '남자'),
('김영숙', 87, 87, '여자'),
('성은영', 65, 78, '여자');

 

1) AVG 함수를 이용해서 영어점수(ENG)와 수학점수(MATH)의 평균을 구해 테이블을 요약하는 경우

SELECT AVG(ENG) AS ENG_AVERAGE,
       AVG(MATH) AS MATH_AVERAGE
FROM CLASS_SCORE;
ENG_AVERAGE MATH_AVERAGE
62.0 78.0

 

2) 성별에 따라 영어점수와 수학점수의 평균을 구해 분석하고자 하는 경우

SELECT GENDER,
       AVG(ENG) AS ENG_AVERAGE,
       AVG(MATH) AS MATH_AVERAGE
FROM CLASS_SCORE
GROUP BY GENDER;
GENDER ENG_AVERAGE MATH_AVERAGE
남자 48.0 73.5
여자 76.0 82.5
  • GROUP BY 를 사용하여 성별(Gender)로 평균값을 계산 및 출력

 

예제 


2013년 12월 고객별 보유상품 테이블: PPC_20131

  • 열 설명 : 고객아이디, 고객등급, 카드상품보유여부, 대출상품, 보험상품, 수신상품, 펀드상품, 연 수익 

더보기
CREATE TABLE PPC_201312
(
CUST_ID INT NOT NULL,
SEG CHAR(20) NOT NULL,
CARD_FLG INT NOT NULL,
LOAN_FLG INT NOT NULL,
INSURANCE_FLG INT NOT NULL,
CTB_FLG INT NOT NULL,
FUND_FLG INT NOT NULL,
ANNL_REV INT NOT NULL,
PRIMARY KEY('CUST_ID')
);

INSERT INTO PPC_201312
VALUES
(54615, 'SILVER', 1, 1, 1, 1, 1, 1000),
(46780, 'GOLD',   0, 0, 1, 1, 0, 20000),
(23748, 'GOLD',   1, 1, 0, 1, 1, 30000),
(56432, 'DIAMOND',1, 0, 1, 1, 1, 100000),
(89647, 'SILVER', 0, 0, 1, 1, 0, 3000),
(52333, 'SILVER', 1, 1, 0, 1, 0, 2500),
(89669, 'GOLD',   1, 0, 1, 1, 0, 60000),
(21004, 'SILVER', 0, 0, 1, 1, 0, 1000),
(17890, 'DIAMOND',1, 1, 0, 1, 1, 300000);

 

Q1. 고객등급별 인당 평균 연 수익

SEG AVG(ANNL_REV)
DIAMOND 200000
GOLD 36666.667
SILVER 1875
더보기
SELECT SEG, AVG(ANNL_REV) 
FROM PPC_201312
GROUP BY SEG;

 

Q2. 고객등급별 고객 수와 해당 등급별 카드 보유여부(CARD_FLG) 확인

SEG CNT SUM(CARD_FLG)
DIAMOND 2 2
GOLD 3 2
SILVER 4 2
더보기
SELECT SEG, COUNT(*) AS CNT,
       SUM(CARD_FLG)
FROM PPC_201312
GROUP BY SEG;

 

Q3. 카드상품과 대출상품 보유 간의 관계

CARD_FLG LOAN_FLG CNT
0 0 3
1 0 2
1 1 4
더보기
SELECT CARD_FLG, LOAN_FLG, COUNT(*) AS CNT
FROM PPC_201312
GROUP BY CARD_FLG, LOAN_FLG;

 

 

참고

  • 원하는 열을 GROUP BY 절에 포함시킬 수 있음
    • 열이 한개씩 증가할수록 차원(Dimension)이 한개씩 증가하고 좀 더 세부적으로 데이터 분석 가능 (위 Q3. 참고)
  • GROUP BY 절은 WHERE 조건 절 뒤, ORDER BY 절 앞에 위치
SELECT SEG, COUNT(*), AS CNT, SUM(CARD_FLG) AS CARD_FLG
FROM PPC_201312
GROUP BY SEG
ORDER BY SEG; 

 

반응형
반응형

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

  • 집단(Population)에 대해 요약할 때는 대표성을 갖는 수치가 필요
  • EX) 합계, 평균, 오차(최대값과 최소값 간의 거리, 표준편차, 분산)

SUM 함수 


SUM 함수를 이용해 열의 합계를 계산하는 쿼리문

MAX 함수 


MAX 함수를 이용해 열에서 최대값을 계산하는 예

MIN 함수 


MIN 함수를 이용해 열에서 최소값을 계산하는 예

STD 함수


STD 함수 이용해서 열의 표준편차를 계산하는 예

  • SQLite에서는 지원하지 않는 함수
  • MySQL에서는 STD함수와 STDDEV 모두 같은 기능으로 사용 가능

AVG 함수


AVG 함수 이용해서 열의 평균을 계산하는 예

 

  • 위의 예는 NULL값을 제외한 3개의 행에 대한 평균값을 계산한 것
  • NULL값을 0으로 치환하기 위해서는?? -> COALESCE 함수 사용
SELECT AVG(COALESCE(수학점수, 0)) AS 수학점수_평균 FROM 점수테이블;

 

예제 (테이블: STUD_SCORE)


더보기
CREATE TABLE STUD_SCORE
(
STUDENT_ID INT NOT NULL,
MATH_SCORE INT NOT NULL,
ENG_SCORE INT NULL,
PHIL_SCORE INT NULL,
MUSIC_SCORE INT NULL,
PRIMARY KEY('STUDENT_ID')
);

INSERT INTO STUD_SCORE
VALUES 
('0123511', 89, 78, 45, 90),
('0255475', 88, 90, NULL, 87),
('9921100', 87, NULL, NULL, 98),
('9732453', 69, 98, 78, 78),
('0578981', 59, 90, 89, NULL),
('0768789', 94, 80, 87, 99),
('9824579', 90, 90, 78, 87),
('0565789', 58, 64, 72, NULL);

 

Q1. 수학 점수의 총 합계

SELECT SUM(MATH_SCORE) AS MATH_TOTAL FROM STUD_SCORE;
MATH_TOTAL
634

 

Q2. 음악 점수의 평균 (NULL값 행 제외)

SELECT AVG(MUSIC_SCORE) AS MUSIC_AVG FROM STUD_SCORE;
MATH_AVG
89.83333

 

Q3. 음악 점수의 평균 (NULL값 행 포함)

SELECT AVG(COALESCE(MUSIC_SCORE, 0)) AS MUSIC_AVG FROM STUD_SCORE;
MATH_AVG
67.375

 

반응형

'SQL' 카테고리의 다른 글

[SQL] 그룹화된 데이터의 필터링 (HAVING)  (0) 2022.02.17
[SQL] 데이터의 그룹화 (GROUP BY)  (0) 2022.02.16
[SQL] 행의 수 세기 (COUNT)  (0) 2022.02.14
[SQL] 조건문 적용하기 (CASE WHEN)  (0) 2022.02.14
[SQL] 숫자 함수  (0) 2022.02.12
반응형

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

COUNT 함수를 이용하면 행의 수를 셀 수 있다. 이 때, NULL 값의 포함여부/ 중복 포함 여부에 따라 함수 사용이 달라질 수 있다.

1. NULL값, 중복 값들 포함 모든 행의 수를 계산할 경우: COUNT(*)

2. NULL값은 제외, 중복 값은 포함하여 행의 수를 계산할 경우: COUNT(열이름)

3. NULL값, 중복값 모두 제외하여 행의 수를 계산할 경우: COUNT(DISTINCT 열이름)

예제 (테이블: STUD_SCORE)


더보기
CREATE TABLE STUD_SCORE
(
STUDENT_ID INT NOT NULL,
MATH_SCORE INT NOT NULL,
ENG_SCORE INT NULL,
PHIL_SCORE INT NULL,
MUSIC_SCORE INT NULL,
PRIMARY KEY('STUDENT_ID')
);

INSERT INTO STUD_SCORE
VALUES 
('0123511', 89, 78, 45, 90),
('0255475', 88, 90, NULL, 87),
('9921100', 87, NULL, NULL, 98),
('9732453', 69, 98, 78, 78),
('0578981', 59, 90, 89, NULL),
('0768789', 94, 80, 87, 99),
('9824579', 90, 90, 78, 87),
('0565789', 58, 64, 72, NULL);

 

Q1. NULL 값을 포함한 행의 개수 

SELECT COUNT(*) AS CNT FROM STUD_SCORE;
CNT
8

 

Q2. NULL 값을 제외한 음악 점수 보유자를 세는 쿼리문 

SELECT COUNT(MUSIC_SCORE) AS MUSIC_CNT FROM STUD_SCORE;
MUSIC_CNT
6

 

 Q3. 테이블을 사용하여 NULL값 및 중복된 값 제외한 영어 점수 보유자를 세는 쿼리문

SELECT COUNT(DISTINCT ENG_SCORE) AS ENG_CNT FROM STUD_SCORE;
ENG_CNT
6

 

반응형
반응형

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

조건문을 적용하면 아래 표와 같이 수학점수에 조건을 적용하여 새로운 열을 생성할 수 있다.

CASE WHEN 


SELECT 열이름1, 
CASE WHEN [조건1] THEN[결과값1]
     WHEN [조건2] THEN[결과값2]
     ELSE [결과값3] END AS 새로운 열 이름 
  • 조건1을 만족하면 결과값1, 조건2를 만족하면 결과값2, 나머지는 결과값3으로 보여주고 결과값은 [새로운 열 이름]으로 나타냄

예제 (직원 연봉 테이블: STAFF_SAL)


ID JOB CURRENT_SAL ENG_SCORE
2148 OFFICER 40000 90
5780 CLERK 32000 98
6870 MANAGER 100000 81
4565 CLERK 30000 79
9687 CLERK 33000 66
7337 MANAGER 100000 95
1321 OFFICER 43000 80
9895 CLERK 30000 50
더보기
CREATE TABLE STAFF_SAL
(
ID INT NOT NULL,
JOB CHAR(20) NOT NULL,
CURRENT_SAL INT NOT NULL,
ENG_SCORE INT NOT NULL,
PRIMARY KEY ('ID')
);

INSERT INTO STAFF_SAL
VALUES
(2148, 'OFFICER', 40000, 90),
(5780, 'CLERK', 32000, 98),
(6870, 'MANAGER', 100000, 81),
(4565, 'CLERK', 30000, 79),
(9687, 'CLERK', 33000, 66),
(7337, 'MANAGER', 100000, 95),
(1321, 'OFFICER', 43000, 80),
(9895, 'CLERK', 30000, 50);

 

Q1. 직업(JOB)이 CLERK는 7%, OFFICER는 5%, MANAGER는 3%로 연봉을 인상하기로 했다. STAFF_SAL 테이블을 사용하여 각 직원별 인상 연봉을 예상해보자

ID JOB CURRENT_SAL NEXT_SAL
2148 OFFICER 40000 42000
5780 CLERK 32000 34240
6870 MANAGER 100000 103000
4565 CLERK 30000 32100
9687 CLERK 33000 35310
7337 MANAGER 100000 103000
1321 OFFICER 43000 45150
9895 CLERK 30000 32100
SELECT ID, JOB, CURRENT_SAL,
	CASE WHEN JOB = 'CLERK' THEN CURRENT_SAL*1.07
		 WHEN JOB = 'OFFICER' THEN CURRENT_SAL*1.05
		 WHEN JOB = 'MANAGER' THEN CURRENT_SAL*1.03
		 ELSE CURRENT_SAL
		 END AS NEXT_SAL
 FROM STAFF_SAL;

 

Q2. 다음 표와 같이 연봉 인상이 직급, 영어 점수와 연관될 경우 테이블을 이용하여 각 직원별 인상 연봉을 예상해보자.

JOB  영어점수 80점 이상 영어점수 80점 미만
CLEAR 7% 6%
OFFICER 5% 4%
MANAGER 3% 2%
ID JOB CURRENT_SAL ENG_SCORE NEXT_SAL
2148 OFFICER 40000 90 42000
5780 CLERK 32000 98 34240
6870 MANAGER 100000 81 103000
4565 CLERK 30000 79 31800
9687 CLERK 33000 66 34980
7337 MANAGER 100000 95 103000
1321 OFFICER 43000 80 45150
9895 CLERK 30000 50 31800
SELECT ID, JOB, CURRENT_SAL,
	CASE WHEN JOB = 'CLERK' AND ENG_SCORE >= 80 
	     THEN CURRENT_SAL * 1.07 
	     WHEN JOB = 'CLERK' AND ENG_SCORE < 80 
		 THEN CURRENT_SAL * 1.06
		 WHEN JOB = 'OFFICER' AND ENG_SCORE >= 80 
		 THEN CURRENT_SAL * 1.05
		 WHEN JOB = 'OFFICER' AND ENG_SCORE < 80 
		 THEN CURRENT_SAL * 1.04
		 WHEN JOB = 'MANAGER' AND ENG_SCORE >= 80 
		 THEN CURRENT_SAL * 1.03
		 WHEN JOB = 'MANAGER' AND ENG_SCORE < 80 
		 THEN CURRENT_SAL * 1.02
		 ELSE CURRENT_SAL
		 END AS NEXT_SAL
FROM STAFF_SAL;
반응형
반응형

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

숫자 함수


숫자 함수 목록

함수  설명
ROUND
  • 수점의 자리수 지정하여 반올림
  • ROUND(열이름, 나타내고 싶은 소수점 자리수)
TRUNC 해당 소수점 자리에서 잘라냄
MOD(M,N) M을 N으로 나눈 나머지
ABS 값을 절대값으로 변환
SIGN 양수면 1, 음수면 0
SQRT 제곱근을 나타냄
COS 지정한 각도의 cos값 나타냄 
SIN 지정한 각도의 sin값을 나타냄
PI 지정한 각도의 파이값을 나타냄
TAN 지정한 각도의 tan값을 나타냄

예제


제품판매 테이블: PROD_SALES

PROD_ID  TOTAL_SALES  SALES_NUM  ECON_INCOME
65478 7883.64 564 301
56870 2156.12 412 -241
13540 5701.74 230 62
89744 224.33 96 12
23787 5703.5 170 70
56706 744.57 21 -120
96384 570.55 54 57
33187 977.98 90 91
  • Primary Key는 PROD_ID
더보기
CREATE TABLE PROD_SALES
(
PROD_ID INT NOT NULL,
TOTAL_SALES FLOAT NOT NULL,
SALES_NUM INT NOT NULL,
ECON_INCOME INT NOT NULL,
PRIMARY KEY('PROD_ID')
);

INSERT INTO PROD_SALES
VALUES
(65478, 7883.64, 564, 301),
(56870, 2156.12, 412, -241),
(13540, 5701.74, 230, 62),
(89744, 224.33, 96, 12),
(23787, 5703.5, 170, 70),
(56706, 744.57, 21, -120),
(96384, 570.55, 54, 57),
(33187, 977.98, 90, 91);

 

Q1. 소수점 둘째 자리에서 반올림한 제품 판매금액(TOTAL_SALES)을 계산한 후 별칭을 SALES_REV로 설정하는 쿼리문

PROD_ID  TOTAL_SALES  SALES_REV
65478 7883.64 7883.6
56870 2156.12 2156.1
13540 5701.74 5701.7
89744 224.33 224.3
23787 5703.5 5703.5
56706 744.57 744.6
96384 570.55 570.6
33187 977.98 978.0
더보기
SELECT PROD_ID, TOTAL_SALES, ROUND(TOTAL_SALES, 1) 
AS SALES_REV
FROM PROD_SALES;

 

Q2. 제품 판매금액을 제품 판매수량(SALES_NUM)으로 나눈 나머지를 구한 후 별칭을 SALES_BALANCE로 설정 

더보기
SELECT MOD(TOTAL_SALES, SALES_NUM) AS SALES_BALANCE
FROM PROD_SALES;

 

  • SQlite에서는 MOD 함수가 지원 안됨
반응형
반응형

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

문자 함수


  • 함수란 변수를 특정한 형태로 변환시키는 것

문자 함수 목록

함수 설명
LOWER 모든 문자를 소문자로 변환
UPPER 모든 문자를 대문자로 변환
LENGTH 문자의 길이를 나타냄
SUBSTR 문자 값 중 원하는 길이만큼만 나타냄
RTRIM 문자열 오른쪽 공백을 잘라냄
LTRIM 문자열 왼쪽 공백을 잘라냄
TRIM 문자열의 왼쪽, 오른쪽 공백 잘라냄
REPLACE 특정 문자열을 다른 문자열로 대체
COALESCE 조건에 따라 여러 가지 값으로 치환
INITCAP 첫 글자는 대문자, 나머지는 소문자로 변환

예제


벤더 테이블: VENDOR_INFO

ID  NAME  COUNTRY
1 Sue Germany
2 David Switzerland
3 Sam France
4 Jihoon Brazil
5 Sunwoo France
6 Berney Italy
7 Sandy Germany
8 Young Korea
  • Primary Key는 ID
더보기
CREATE TABLE VENDOR_INFO
(
ID INTEGER NOT NULL,
NAME CHAR(20) NOT NULL,
COUNTRY CHAR(20) NOT NULL,
PRIMARY KEY('ID')
);

INSERT INTO VENDOR_INFO
VALUES
(1, 'Sue', 'Germany'),
(2, 'David', 'Switzerland'),
(3, 'Sam', 'France'),
(4, 'Jihoon', 'Brazil'),
(5, 'Sunwoo', 'France'),
(6, 'Berney', 'Italy'),
(7, 'Sandy', 'Germany'),
(8, 'Young', 'Korea')
;

 

Q1. 위 테이블 사용하여 이름을 소문자로 변환하고 NAME_SMALL이라는 별칭을 설정하는 쿼리문

ID  NAME  NAME_SMALL
1 Sue sue
2 David david
3 Sam sam
4 Jihoon jihoon
5 Sunwoo sunwoo
6 Berney berney
7 Sandy sandy
8 Young young
더보기
SELECT ID, NAME, LOWER(NAME) AS NAME_SMALL 
FROM VENDOR_INFO;

 

Q2. 이름을 대문자로 변환하고 NAME_CAP이라는 별칭 설정

ID  NAME  NAME_CAP
1 Sue SUE
2 David DAVID
3 Sam SAM
4 Jihoon JIHOON
5 Sunwoo SUNWOO
6 Berney BERNEY
7 Sandy SANDY
8 Young YOUNG
더보기
SELECT ID, NAME, UPPER(NAME) AS NAME_CAP
FROM VENDOR_INFO;

 

Q3. 이름의 자릿수를 세고 NAME_CNT라는 별칭 설정

ID  NAME  NAME_CNT
1 Sue 3
2 David 5
3 Sam 3
4 Jihoon 6
5 Sunwoo 6
6 Berney 6
7 Sandy 5
8 Young 5
더보기
SELECT ID, NAME, LENGTH(NAME) AS NAME_CNT
FROM VENDOR_INFO;

 

Q4. 이름의 두번째에서 네번째 위치한 글자를 나타내고 NAME_STR 별칭 설정

ID  NAME  NAME_STR
1 Sue ue
2 David avi
3 Sam am
4 Jihoon iho
5 Sunwoo unw
6 Berney ern
7 Sandy and
8 Young oun
더보기
# SUBSTR(열이름, 시작위치, 자리수)
SELECT ID, NAME, substr(NAME,2,3) as NAME_CNT FROM VENDOR_INFO;

 

반응형
반응형

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

결합 연산자 '||' 는 2개 이상의 열을 결합하여 하나의 열에 표현하고 싶을 때 사용된다.

문자 삽입하기


SELECT 열이름1 || '삽입하고 싶은 문자열' || 열이름2
FROM 테이블명;

예제 (고객정보 테이블 : 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. 위 테이블을 사용하여 '도시(나라)' 로 표현되도록 필드를 결합하는 쿼리문

1. 먼저 2개 이상의 열 결합하기(결합 연산자 '||')에서 배운대로 ‘도시’와 ‘나라’ 열을 결합

SELECT CITY || COUNTRY FROM CUSTOMERS;
CITY || COUNTRY
BERLINGERMANY
BERNSWITZERLAND
NANTESFRANCE
RESENDEBRAZIL
VERSAILLESFRANCE
BERGAMOITALY
BERLINGERMANY
SEOULKOREA

 

2. 단순히 결합만 하면 가독성이 떨어지기 때문에 괄호를 추가하면,

SELECT CITY || '(' || COUNTRY|| ')' FROM CUSTOMERS;
CITY || '(' ||COUNTRY || ')'
BERLIN(GERMANY)
BERN(SWITZERLAND)
NANTES(FRANCE)
RESENDE(BRAZIL)
VERSAILLES(FRANCE)
BERGAMO(ITALY)
BERLIN(GERMANY)
SEOUL(KOREA)

 

3. 마지막으로 ADDR 별칭 추가

SELECT CITY || '(' || COUNTRY|| ')' AS ADDR FROM CUSTOMERS;
ADDR
BERLIN(GERMANY)
BERN(SWITZERLAND)
NANTES(FRANCE)
RESENDE(BRAZIL)
VERSAILLES(FRANCE)
BERGAMO(ITALY)
BERLIN(GERMANY)
SEOUL(KOREA)
반응형

'SQL' 카테고리의 다른 글

[SQL] 숫자 함수  (0) 2022.02.12
[SQL] 문자 함수  (0) 2022.02.11
[SQL] 2개 이상의 열 결합하기(결합 연산자 '||')  (0) 2022.02.11
[SQL] 키워드 필터링 (LIKE)  (0) 2022.02.11
[SQL] 논리 연산자 (IN, NOT IN)  (0) 2022.02.11
반응형

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

결합 연산자 '||' 는 2개 이상의 열을 결합하여 하나의 열에 표현하고 싶을 때 사용된다.

결합 연산자를 이용하여 2개의 필드 결합

|| 연산자


SELECT 열이름1 || 열이름2 FROM 테이블명;
혹은
SELECT 열이름1 || 열이름2 AS 새로운 열이름 FROM 테이블명;

 

예제 (고객정보 테이블 : 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. 위 테이블에서 ID와 NAME 열을 하나로 묶어서 출력하는 쿼리문

ID NAME ID_NAME
1 SUE 1SUE
2 DAVID 2DAVID
6 BERNEY 3BERNEY
7 SANDY 7SANDY
더보기
SELECT ID, NAME,
ID || NAME AS ID_NAME
FROM CUSTOMERS;
  • 결합연산자 ‘||’ 또는 ‘+’가 사용되는데 DBMS마다 지원되는 기호가 다르지만 보통 ‘||’를 많이 사용
반응형
반응형

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

 

반응형

+ Recent posts