group function

그룹 함수 : 그룹으로 요약하기

  • 여러 행에 함수가 적용되어 하나의 결과를 나타내는 함수
  • 집계 함수라고도 함
  • GROUP BY : 기준 열에 대해 같은 데이터 값끼리 그룹을 묶고, 묶은 행의 집합에 대해 그룹 함수 연산이 필요한 경우, GROUP BY를 이용하여 처리
  • HAVING : 묶은 그룹에 대해 조건이 필요하다면 HAVING 절을 이용

1. 그룹 함수의 종류와 사용법

  • 굵게 표시된 부분은 필수 기본 문법

SELECT          그룹 함수(열 이름)
FROM              테이블 이름
[WHERE         조건식]
[ORDER BY   열 이름];

  • 그룹 함수의 종류
함수 설명 null처리
COUNT 행 개수를 셈 COUNT(salary) (*)의 경우 null 값도 개수로 셈
SUM 합계 SUM(salary) null 값을 제외하고 연산
AVG 평균 AVG(salary) null 값을 제외하고 연산
MAX 최댓값 MAX(salary) null 값을 제외하고 연산
MIN 최솟값 MIN(salary) null 값을 제외하고 연산
STDDEV 표준편차 STDDEV(salary) null 값을 제외하고 연산
VARIANCE 분산 VARIANCE(salary) null 값을 제외하고 연산

2. COUNT 함수

  • COUNT는 지정한 열의 행 개수를 세는 함수

    COUNT(열 이름)

(1) employees 테이블에서 salary 열의 행 수가 몇 개인지 세어서 출력하세요.
SELECT COUNT(salary) salary행수
FROM employees;

3. SUM, AVG 함수

  • SUM : 열의 합계
  • AVG : 열의 평균

    SUM(열 이름) / AVG(열 이름)

(1) employees 테이블에서 salary의 합계와 평균을 구해 보세요. 또한 AVG 함수를 사용하지 말고 평균을 구해보세요.

SELECT SUM(salary) 합계, AVG(salary) 평균, SUM(salary)/COUNT(salary) 계산된평균
FROM employees;

  • 실무 활용 팁 : AVG 합수는 null 값을 제외하고 연산함, null 값을 포함해서 평균을 계산해야 한다면 AVG(NVL(salary, o)) 형태로 계산해야 함

4. MAX, MIN 함수

  • 모든 데이터 타입에 적용 가능
  • 문자열의 경우 : 알파벳순, 날짜순 등으로 연산하여 결과를 출력함

MAX(열 이름) / MIN(열 이름)

(1) employees 테이블에서 salary의 최댓값과 최솟값, first_name의 최댓값과 최소값을 출력해 보세요.

SELECT MAX(salary) 최댓값, MIN(salary) 최솟값, MAX(first_name) 최댓값문자, MIN(first_name) 최솟값문자
FROM employees;

GROUP BY : 그룹으로 묶기

  • SELECT 절에 열 이름과 그룹 함수를 함께 기술했다면 GROUP BY 절을 반드시 사용해야 함
  • 그룹화는 열 이름 순서대로 수행됨
  • WHERE 절을 사용하면 GROUP BY 보다 먼저 적용됨
  • SELECT 절에 그룹 함수를 사용하지 않고 GROUP BY 절만으로도 사용할 수 있음

SELECT           기준 열, 그룹 함수(열 이름)
FROM              테이블 이름
[WHERE          조건식]
GROUP BY     열 이름
[ORDER BY    열 이름]

(1) employees 테이블에서 employee_id가 10 이상인 직원에 대해 job_id별로 그룹화하여 job_id별 총 급여와 job_id별 평균 급여를 구하고, job_id별 총 급여를 기준으로 내림차순 정렬하세요.

SELECT         jobid 직무, SUM(salary) 직무별총급여, AVG(salary) 직무별평균급여
FROM            employees
WHERE         employee_id >= 10
GROUP BY   job_id
ORDER BY   직무별
총급여 DESC, 직무별_평균급여;

  • 그룹에 대한 그룹이 필요한 경우

    GROUP BY 대그룹, 중그룹, 소그룹

SELECT          jobid job_id대그룹,
                        managerid manager_id중그룹,
                        SUM(salary) 그룹핑총급여,
                        AVG(salary) 그룹핑
평균급여,
FROM             employees
WHERE          employeeid >= 10
GROUP BY    job_id, manager_id
ORDER BY    그룹핑
총급여 DESC, 그룹핑_평균급여;

HAVING : 연산된 그룹 함수 결과에 조건 적용하기

  • HAVING 절은 그룹화된 값에 조건식을 적용할 때 사용(WHERE 절은 사용 불가)

SELECT           열 이름, 그룹 함수(열 이름)
FROM              테이블 이름
[WHERE          조건식]
GROUP BY     열 이름
[HAVING         조건절]
[ORDER BY    열 이름];

(1) employees 테이블에서 employees_id가 10 이상인 직원에 대해 job_id별로 그룹화하여 job_id별 총 급여와 job_id별 평균 급여를 구하되, job_id별 총 급여가 30000보다 큰 값만 출력하세요. 출력 결과는 job_id별 총 급여를 기준으로 내림차순 정렬하세요.

SELECT            jobid 직무, SUM(salary) 직무별총급여, AVG(salary) 직무별평균급여
FROM               employees
WHERE            employee_id >= 10
GROUP BY      job_id
HAVING           SUM(salary) > 30000
ORDER BY      직무별
총급여 DESC, 직무별_평균급여;

자료출처: 모두의 SQL

general function

반드시 알아둬야 할 일반 함수
1. NVL : NULL 값 처리하기

  • null은 그 자체로 ‘값이 없다’는 의미
  • 할당되지 않았거나 알려져 있지 않아 적용이 불가능한 값
  • 0이나 공백(space)과는 다름
  • null 값을 포함하는 산술 연산의 결과는 null

SELECT *
FROM employees
ORDER BY commission_pct;

NVL(열 이름, 치환 값)

(1) employees 테이블에서 salary에 commission_pct를 곱하되 commission_pct가 null일 때는 1로 치환하여 commission_pct를 곱한 결과를 출력하세요.

SELECT salary * NVL(commission_pct, 1)
FROM employees
ORDER BY commission_pct;

2. DECODE : 조건 논리 처리하기

  • IF-THEN-ELSE-END
  • 데이터 값이 조건 값과 일치하면 치환 값을 출력하고 일치하지 않으면 기본 값을 출력

    DECODE(열 이름, 조건 값, 치환 값, 기본 값)

(1) employees 테이블에서 first_name, last_name, department_id, salary를 출력하되 department_id가 60인 경우에는 급여를 10% 인상한 값을 계산하여 출력하고 나머지 경우에는 원래의 값을 출력하세요. 그리고 department_id가 60인 경우에는 ‘10% 인상’을 출력하고 나머지 경우에는 ‘미인상’을 출력하세요.

SELECT first_name,
                last_name,
                department_id,
                salary
                DECODE (department_id, 60, salary * 1.1, salary) 조정된급여,
                DECODE (department_id, 60, ‘10% 인상’, ‘미인상’) 인상여부,
FROM employees;

3. CASE 표현식 : 복잡한 조건 논리 처리하기

  • 등급, 나이, 지역, 날짜를 구분하여 출력 가능

CASE
                WHEN 조건 1 THEN 출력 값 1
                WHEN 조건 1 THEN 출력 값 2
                …
                ELSE 출력 값 3
END

(1) employees 테이블에서 job_id가 IT_PROG라면 employee_id, first_name, last_name, salary를 출력하되 salary가 9000 이상이면 ‘상위급여’, 6000과 8999 사이면 ‘중위급여’, 그 외는 ‘하위급여’라고 출력하세요.

SELECT employee_id, first_name, last_name, salary,
CASE
                WHEN salary >= 9000 THEN ‘상위급여’
                WHEN salary BETWEEN 6000 AND 8999 THEN ‘중위급여’
                ELSE ‘하위급여’
END AS 급여등급
FROM employees
WHERE job_id = ‘IT_PROG’;

4. RANK, DENSE_RANK, ROW_NUMBER : 데이터 값에 순위 매기기

RANK () OVER([PARTITION BY 열 이름] ORDER BY 열 이름)

  • 차이점
함수 설명 순위 예
RANK 공통 순위를 출력하되 공통 순위만큼 건너뛰어 다음 순위를 출력 1, 2, 2, 4, …
DENSE_RANK 공통 순위를 출력하되 건너뛰지 않고 바로 다음 순위를 출력 1, 2, 2, 3, …
ROW_NUMBER 공통 순위 없이 출력 1, 2, 3, 4, …

(1) RANK, DENSE_RANK, ROW_NUMBER 함수를 각각 이용해 employees 테이블의 salary 값이 높은 순서대로 순위를 매겨 출력해 보세요.

SELECT employeeid,
                salary,
                RANK()                  OVER(ORDER BY salary DESC) RANK
급여,
                DENSERANK()   OVER(ORDER BY salary DESC) DENSE_RANK급여,
                ROWNUMBER() OVER(ORDER BY salary DESC) ROW_NUMBER급여
FROM employees;

(2) RANK, DENSE_RANK, ROW_NUMBER 함수를 각각 이용해 employees 테이블 직원이 속한 department_id 안에서 salary 값이 높은 순서대로 순위를 매겨 출력해 보세요.

SELECT A.employeeid,
                A.department_id,
                B.department_name,
                salary,
                RANK()                 OVER(PARTITION BY A.department_id ORDER BY salary DESC) RANK
급여,
                DENSERANK()  OVER(PARTITION BY A.department_id ORDER BY salary DESC) DENSE_RANK급여,
                ROWNUMBER() OVER(PARTITION BY A.department_id ORDER BY salary DESC) ROW_NUMBER급여
FROM employees A, departments B
WHERE A.department_id = B.department_id
ORDER BY B.department_id, A.salary DESC;

자료출처: 모두의 SQL

Conversion function

1. 변환 함수

  • 데이터 값의 데이터 타입을 변환할 때 사용
  • 암시적 변환 : 오라클 데이터베이스 시스템에 의해 자동으로 변환
  • 명시적 변환 : 사용자에 의해 수동으로 변환

2. 자동 데이터 타입 변환

  • 자동 데이터 타입 변환 유형
FROM TO
VARCHAR2 혹은 CHAR NUMBER(숫자)
VARCHAR2 혹은 CHAR DATE(날짜)
NUMBER VARCHAR2(문자)
DATE VARCHAR2(문자)

(1) 자동 베이터 타입 변환 사례

SELECT 1 + ‘2’
FROM DUAL;

3. 수동 데이터 타입 변환

  • 수동 데이터 타입 변환 함수
함수 설명
TO_CHAR 숫자, 문자, 날짜 값을 지정 형식의 VARCHAR2 타입으로 변환
TO_NUMBER 문자를 숫자 타입으로 변환
TO_DATE 날짜를 나타내는 문자열을 지정 형식의 날짜 타입으로 변환

4. 날짜 및 시간 형식 변환하기

  • TO_CHAR

    TO_CHAR(날짜 데이터 타입, ‘지정 형식’)

지정 형식 설명 결과
CC 세기 TO_CHAR(SYSDATE, ‘CC’) 21
YYYY or YYY or YY or Y 연도 TO_CHAR(SYSDATE, ‘YYYY’) 2017, 017, 17, 7
Y, YYY 콤마가 있는 연도 TO_CHAR(SYSDATE, ‘Y, YYY’) 2,017
YEAR 문자로 표현된 연도 TO_CHAR(SYSDATE, ‘YEAR’) TWENTY SEVENTEEN
BC or AD BC/AD 지시자 TO_CHAR(SYSDATE, ‘AD’ 서기
Q 분기 TO_CHAR(SYSDATE, ‘Q’) 4
MM 두 자리 값의 월 TO_CHAR(SYSDATE, ‘MM’) 10월
MONTH 아홉 자리를 위해 공백을 추가한 월 이름 TO_CHAR(SYSDATE, ‘MONTH’) 10월
MON 세 자리의 약어로 된 월 이름(영문 설정일 경우) TO_CHAR(SYSDATE, ‘MONTH’) 10월
RM 로마 숫자 월 TO_CHAR(SYSDATE, ‘RM’) X
WW or W 연, 월의 주 TO_CHAR(SYSDATE, ‘WW’) 40, 1
DDD or DD or D 연, 월, 주의 일 TO_CHAR(SYSDATE, ‘DD’) 280, 07, 7
DAY 아홉 자리를 위해 공백을 추가한 요일 이름 TO_CHAR(SYSDATE, ‘DAY’) 토요일
DY 세 자리 약어로 된 요일 이름(영문 설정일 경우) TO_CHAR(SYSDATE, ‘DY’)
J Julian day, BC 4713년 12월 31일 이후의 요일 수 TO_CHAR(SYSDATE, ‘J’) 2459044

SELECT TO_CHAR(SYSDATE, ‘CC’)
                TO_CHAR(SYSDATE, ‘YYYY’)
                TO_CHAR(SYSDATE, ‘MM’)
                TO_CHAR(SYSDATE, ‘MON’)
                TO_CHAR(SYSDATE, ‘YYYYMMDD’) 응용적용1,
                TO_CHAR(TO_DATE(‘20171008’), ‘YYYYMMDD’) 응용적용2
FROM dual;

지정 형식 설명
AM or PM 오전 또는 오후 표시
HH / HH12 or HH24 시간 표현(112시 똫는 023시)
MI 분(0~59)
SS 초(0~59)

SELECT TO_CHAR(SYSDATE, ‘HH:MI:SS PM’) 시간형식,
                TO_CHAR(SYSDATE, ‘YYYY/MM/DD HH:MI:SS PM’) 날짜와시간조합
FROM dual;

요소 설명
/, .,- 사용문자를 출력 결과에 표현
“문자” 큰따옴표 안의 문자를 출력 결과에 표현

SELECT TO_CHAR(SYSDATE, ‘HH-MI-SS PM’) 시간형식,
                TO_CHAR(SYSDATE, ‘ “날짜:” YYYY/MM/DD “시각:” HH:MI:SS PM’) 날짜와시각표현
FROM dual;

5. 숫자 형식 변환하기

TO_CHAR(숫자 데이터 타입, ‘지정 형식’)

지정 형식 설명 결과
9 9로 출력 자릿수 지정 TO_CHAR(salary, ‘99999999’) 24000(앞에 3칸 띄움)
0 자릿수만큼 0을 출력 TO_CHAR(salary, ‘09999999’) 00024000
$ 달러 기호 TO_CHAR(salary, ‘$9999999’) $24,000
L 지역 화폐 기호(원) TO_CHAR(salary, ‘L9999999’) ₩24,000
. 명시한 위치에 소수점 TO_CHAR(salary, ‘999999.99’) 24000.00
, 명시한 위치에 쉼표 TO_CHAR(salary, ‘9,999,999’) 24,000

TO_NUMBER(number)

  • 숫자 타입의 문자열을 숫자 데이터 타입으로 변환하는 함수
  • 출력 결과 변하지 않음, 데이터 타입만 변함

SELECT TO_NUMBER(‘123’)
FROM dual;

TO_DATE(문자열, ‘지정 형식’)

  • 날짜 문자열을 명시된 날짜로 변환하는 함수

SELECT TO_DATE(‘20200713’, ‘YYMMDD’)
FROM dual;

자료출처: 모두의 SQL

date type function

1. 날짜 타입 함수

Date + Number : 날짜에 일수를 더함, Date 값을 반환
Date - Number : 날짜에 일수를 뺌, Date 값을 반환
Date - Date : 날짜에서 날짜를 뺌, 일수를 반환
Date + Number / 24 : 날짜에 시간을 더할 때는 시간을 24로 나눠서 날짜에 더함, Date 값을 반환

(1) 오늘 날짜와 시간, 오늘날짜에서 1을 더한 값, 1을 뺀 값, 2017년 12월 2일에서 2017년 12월 1일을 뺀 값, 오늘 날짜에서 13시간을 더한 값 출력하기

TO_CHAR : 문자 변환 함수, SYSDATE의 시간까지 출력하기 위해 사용함
SYSDATE : 시스템의 현재 날짜와 시간을 반환하는 함수

SELECT TO_CHAR(SYSDATE, ‘YY/MM/DD/HH24:MI’) 오늘날짜,
                SYSDATE + 1 더하기1,
                SYSDATE - 1 빼기1,
                TO_DATE(‘20171202’)-TO_DATE(‘20171201’) 날짜빼기,
                SYSDATE + 13/24 시간더하기
FROM DUAL;

날짜 함수 설명 결과
MONTHS_BETWEEN 두 날짜 사이의 월수를 계산 MONTHS_BETWEEN(SYSDATE, HIRE_DATE) 171.758
ADD_MONTHS 월을 날짜에 더함 ADD_MONTHS(HIRE_DATE, 5) 03/11/17
NEXT_DAY 명시된 날짜부터 돌아오는 요일에 대한 날짜를 출력(SUNDAY:1, MONDAY:2, …) NEXT_DAY(HIRE_DATE, 1) 03/06/22
LAST_DAY 월의 마지막 날을 계산 LAST_DAY(HIRE_DATE) 03/06/30
ROUND 날짜를 가장 가까운 연도 또는 월로 반올림(YEAR or MONTH) ROUND(HIRE_DATE, ‘MONTH’) 03/07/01
TRUNC 날짜를 가장 가까운 연도 또는 월로 절삭(YEAR or MONTH) TRUNC(HIRE_DATE, ‘MONTH’) 03/06/01

2. MONTHS_BETWEEN : 두 날짜 사이의 개월 수 계산하기

MONTHS_BETWEEN(날짜, 날짜)

(1) employees 테이블에서 department_id가 100인 직원에 대해 오늘 날짜, hire_date, 오늘 날짜와 hire_date 사이의 개월 수를 출력하세요.

SELECT SYSDATE, hire_date, MONTHS_BETWEEN(SYSDATE, hire_date) 적용결과
FROM employees
WHERE department_id = 100;

3. ADD_MONTHS : 월에 날짜 더하기

ADD_MONTHS(날짜, 숫자)

(1) employees 테이블에서 employee_iod가 100과 106 사이인 직원의 hire_date에 3개월을 더한 값, hire_date에 3개월을 뺀 값을 출력하세요.

SELECT hiredate,
                ADD_MONTHS(hire_date, 3) 더하기
적용결과,
               ADDMONTHS(hire_date, -3) 빼기적용결과
FROM employees
WHERE employee_id BETWEEN 100 AND 106;

4. NEXT_DAY : 돌아오는 요일의 날짜 계산하기

NEXT_DAY(날짜, ‘요일’ or 숫자)

(1) employees 테이블에서 employee_id가 100과 106 사이인 직원의 hire_date에서 가장 가까운 금요일의 날짜가 언제인지 문자로 지정해서 출력하고, 숫자로도 지정해서 출력하세요.

SELECT hiredate,
                NEXT_DAY(hire_date, ‘금요일’) 적용결과
문자지정,
                NEXTDYA(hire_date, 6) 적용결과숫자지정
FROM employees
WHERE employee_id BETWEEN 100 AND 106;

5. LAST_DAY : 돌아오는 월의 마지막 날짜 계산하기

LAST_DAY(날짜)

(1) employees 테이블에서 employee_id가 100과 106 사이인 직원의 hire_date를 기준으로 해당 월의 마지막 날짜를 출력해 보세요.

SELECT hire_date,
                LAST_DAY(hire_day)
FROM employees
WHERE employee_id BETWEEN 100 AND 106;

6. ROUND, TRUNC : 날짜를 반올림하거나 절삭하기

ROUND or TRUNC(날짜, 지정 값)

(1) employees 테이블에서
SELECT hire_date,
                ROUND(hire_date, ‘MONTH’) 적용결과_ROUND_M,                 ROUND(hire_date, ‘YEAR) 적용결과_ROUND_Y,
                TRUNC(hire_date, ‘MONTH’) 적용결과_TRUNC_M,
                TRUNC(hire_date, ‘YEAR’) 적용결과_TRUNC_Y
FROM employees
WHERE employee_id BTWEEN 100 AND 106;

자료출처: 모두의 SQL

sql number type function

1. 숫자 타입 함수
(1) 숫자 함수의 종류

ROUND : 숫자를 반올림한다. 0이 소숫점 첫째 자리다.
TRUNC : 숫자를 절삭한다. 0이 소수점 첫째 자리다.
MOD : 나누기 후 나머지를 구한다.
CEIL : 숫자를 정수로 올림한다.
FLOOR : 숫자를 정수로 내림한다.
SIGN : 양수(1), 음수(-1), 0인지를 구분하여 출력한다.
POWER : 거듭제곱을 출력한다.
SQRT : 제곱근을 출력한다.

2. ROUND : 숫자 반올림하기

ROUND(숫자 or 열 이름, 반올림할 자리 값)

(1) employees 테이블에서 salary를 30일로 나눈 후 나눈 값의 소숫점 첫째자리, 소수점 둘째 자리, 정수 첫째 자리에서 반올림한 값을 출력하세요.

SELECT salary,
                salary/30 일급,
                ROUND(salary/30, 0) 적용결과0,
                ROUND (salary/30, 1) 적용결과1,
                ROUND(salary/30, -1) 적용결과MINUS1
FROM    employees;

3. TRUNC:숫자 절삭하기

TRUNC(숫자 or 열 이름, 절삭할 자리 값)

(1) employees 테이블에서 salary를 30일로 나누고 나눈 값의 소수점 첫째 자리, 소수점 둘째 자리, 정수 첫째 자리에서 절삭하여 출력하세요.

SELECT salary
                salary/30 일급,
                TRUNC(salary/30, 0) 적용결과0,
                TRUNC (salary/30, 1) 적용결과1,
                TRUNC (salary/30, -1) 적용결과MINUS1
FROM employees;

자료출처: 모두의 SQL

sql string type function

함수란?

  • 미리 정의된 기능을 통해 데이터를 좀 더 편리하게 조작할 수 있도록 해줍니다.
  • 단일 행 함수 : 한번에 하나의 데이터를 처리하는 함수
  • 그룹 함수 : 여러 건의 데이터를 동시에 처리하는 함수

1. 문자 타입 함수

(1) 문자 함수의 종류

LOWER : 값을 소문자로 변환한다.
UPPER : 값을 대문자로 변환한다.
INITCAP : 첫 번째 글자만 대문자로 변환한다.
SUBSTR : 문자열 중 일부분을 선택한다.
REPLACE : 특정 문자열을 찾아 바꾼다.
CONCAT : 두 문자여릉ㄹ 연결한다(|| 연산자와 같다).
LENGTH : 문자열의 길이를 구한다.
INSTR : 명명된 문자의 위치를 구한다.
LPAD : 왼쪽부터 특정 문자로 자리를 채운다.
RPAD : 오른쪽부터 특정 문자로 자리를 채운다.
LTRIM : 주어진 문자열의 왼쪽 문자를 지운다.
RTRIM : 주어진 문자열의 오른쪽 문자를 지운다.

2. LOWER, UPPER, INITCAP : 데이터 값을 대소문자로 변환하기

(1) employees 테이블에서 last_name을 소문자와 대문자로 각각 출력하고, email의 첫 번째 문자는 대문자로 출력하세요.

SELECT last_name,
               LOWER(last_name) LOWER적용,
               UPPER(last_name) UPPER적용,
               email,
               INITCAP(email) INITCAP적용
FROM employees;

3. SUBSTR : 지정한 길이만큼 문자열 추출하기

SUBSTR(‘문자열’ or 열 이름, 시작위치, 길이)

(1) employees 테이블에서 job_id 데이터 값의 첫째 자리부터 시작해서 두 개의 문자를 출력하세요.

SELECT job_id, SUBSTR(job_id, 1, 2) 적용결과
FROM employees;

4. REPLACE : 특정 문자를 찾아 바꾸기

REPLACE(‘문자열’ or 열 이름, ‘바꾸려는 문자열’, ‘바뀔 문자열’)

(1) employees 테이블에서 job_id 문자열 값이 ACCOUNT면 ACCNT로 출력하세요.

SELECT job_id, REPLACE(job_id, ‘ACCOUNT’, ‘ACCNT’)
FROM employees;

5. LPAD, RPAD : 특정 문자로 자릿수 채우기

LPAD(‘문자열’ or 열 이름, 만들어질 자릿수, ‘채워질 문자’)

(1) employees 테이블에서 first_name에 대해 12자리의 문자열 자리를 만들되 first_name의 데이터 값이 12자리보다 작으면 왼쪽에서부터 *를 채워서 출력하세요.

SELECT first_name, LPAD(first_name, 12, ‘*‘) LPAD적용결과
FROM employees;

6. LTRIM, RTRIM : 특정 문자 삭제하기

LTRIM(‘문자열’ or 열 이름, ‘삭제할 문자’)

(1) employees 테이블에서 job_id의 데이터 값에 대해 왼쪽 방향부터 ‘F’문자를 만나면 삭제하고 또 오른쪽 방향부터 ‘T’문자를 만나면 삭제해 보세요.

SELECT job_id,
               LTRIM(job_id, ‘F’) LTRIM적용결과,
               RTRIM(job_id, ‘T’) RTRIM적용결과
FROM employees;

7. TRIM : 공백 제거하기

TRIM(‘문자열’ or 열 이름)

SELECT ‘start’||TRIM(‘ - space - ‘)||’end’ 제거된_공백
FROM dual;

  • dual 테이블 : dummy라는 하나의 열과 하나의 ‘X’테이블 값을 갖고 있는 테이블
  • 임의의 값을 알고자 하거나 특정 테이블을 참고하지 않아도 될 때 유용함
  • 앞의 예처럼, 단순히 지정 문자를 출력하거나 오늘의 날짜를 알고 싶을 때 사용

자료출처: 모두의 SQL

python function

함수

  • 반복되는 코드를 묶음으로 효율적인 코드를 작성하도록 해주는 기능
  • 기본 함수
  • 파라미터와 아규먼트
  • 리턴
  • args, *kwargs
  • docstring
  • scope
  • inner function
  • lambda function
  • Map, Filter, Reduce
  • Decorlator

1. 기본 함수

  • 함수의 선언과 호출
    1
    2
    3
    4
    5
    6
    7
    8
    # 함수선언
    def grade(point): # def : 예약어, 함수이름 : grade, 파라미터 : point
    if point >= 90:
    print("A")
    elif point >= 80:
    print("B")
    else:
    print("C")
    1
    2
    # 함수호출
    grade(88) # 함수이름(point로 넘겨줄 값을 입력)

2. 파라미터와 아규먼트

  • 파라미터: 함수를 선언할 때 호출하는 부분에서 보내주는 데이터를 받는 변수
  • 아규먼트: 함수를 호출할 때 함수에 보내주는 데이터
1
2
3
def plus(num1, num2): # 파라미터
print(num1 + num2)
plus(1, 2) # 아규먼트
1
2
3
def plus(num1, num2=10): # 디폴트 파라미터
print(num1 + num2)
plus(1, 2) # 아규먼트
1
2
3
def plus(num1, num2=10, num3=20): # 디폴트 파라미터
print(num1 + num2 - num3)
plus(1, 2) # 아규먼트
  • 키워드 아규먼트 : 특정 파라미터를 지정해서 넣고 싶을 때 사용
    1
    plus(3, num3=100) # 키워드 아규먼트

3. 리턴

  • 함수를 실행한 결과를 저장하고 싶을 때 사용합니다.
  • 함수에서 return 코드가 실행되면 무조건 함수가 종료됩니다.
  • return
    1
    2
    3
    4
    5
    def plus(num1, num2):
    print(num1 + num2)

    result = plus(1, 2)
    print(result)
    1
    2
    3
    4
    5
    6
    def plus(num1, num2):
    print(num1 + num2)
    return num1 + num2

    result = plus(1, 2)
    print(result)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def grade(point): # def : 예약어, 함수이름 : grade, 파라미터 : point
    if point >= 90:
    return "A"
    elif point >= 80:
    return "B"
    else:
    return "C"

    grade(90)
    1
    2
    3
    4
    5
    6
    7
    def passornot(result):
    pass_ = ""
    if result == "A" or result == "B":
    return "PASS"
    else:
    return "FAIL"
    passornot("A")
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def grade(point): # def : 예약어, 함수이름 : grade, 파라미터 : point
    if point >= 90:
    return "A"
    elif point >= 80:
    return "B"
    else:
    return "C"

    def passornot(result):
    pass_ = ""
    if result == "A" or result == "B":
    return "PASS"
    else:
    return "FAIL"
    1
    2
    # 함수 호출하기
    passornot(grade(98))
    1
    2
    3
    4
    5
    # 함수에서 return 코드가 실행되면 무조건 함수가 종료됩니다. 
    def echo(msg):
    if msg == 'quit':
    return
    print(msg)

4. args, *kwargs

  • 함수를 호출할 때 아규먼트와 키워드 아규먼트의 갯수를 특정지을 수 없을 때 사용
    1
    2
    3
    4
    5
    6
    7
    # 갯수에 상관없이 모든 아규먼트를 더해주는  함수
    def plus(*args):
    print(type(args), args)
    return sum(args)

    # 함수 호출
    plus(1, 2, 3, 4, 5)
    1
    2
    3
    4
    5
    6
    7
    8
    # 키워드가 있는 아규먼트
    def plus(*args, **kwargs):
    print(type(args), args)
    print(type(kwargs), kwargs)
    return sum(args) + sum(kwargs.values())

    # 함수 실행
    plus(1, 2, 3, 4, 5, num1=6, num2=7)
    1
    2
    3
    4
    5
    def func(num1, num2, num3):
    return num1 + num2 + num3

    data = [1, 2, 3]
    func(*data) # func(1, 2, 3)
    1
    2
    3
    4
    5
    def func(num1, num2=10, num3=20):
    return sum(num1) + num2 + num3

    data = [1, 2, 3]
    func(data) # func([1, 2, 3])
    1
    2
    3
    4
    5
    def func(num1, num2, num3):
    return num1 + num2 + num3

    data = [1, 2, 3]
    func(*data) # func(1, 2, 3)
    1
    2
    3
    4
    5
    6
    7
    def func(num1, num2, num3):
    return num1 + num2 + num3
    data = {
    "num2": 100,
    "num3": 200,
    }
    func(1, **data) # func(1, num2=100, num3=200)
  • 문장을 입력받아서 문법에 맞도록 결과를 출력하는 코드를 작성
  • 마지막 문자는 . 이 있을수도 있고 없을수도 있습니다.
  • 논리적인 문제해결 순서 -> 코드로 변경
  • str.upper(), str.lower(), offset index [], str.add(문자열 덧셈)
  • python IS the best Language
  • python IS the best Language.
  • Python is the best lagnuage.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 1. 문자열 입력받기
    sentence = input('input sentence : ')

    # 2. 모두 소문자로 변경
    result = sentence.lower() # lower함수는 리턴이 있는 함수이므로 result에 저장

    # 3. 가장 앞글자를 대문자로 변경
    result = result[0].upper() + result[1:] # 가장 앞글자 + 나머지 글자

    # 4. 마지막 문자가 .인지 확인해서 .이 아니면 .을 추가
    if result[-1] != ".":
    result += "."

    result
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 6자리의 로또번호를 생성하는 코드를 작성하세요. 
    # 6자리의 번호는 중복이 없어야 합니다.
    # 문자열, 숫자, 리스트
    # while, not in, in, list.append(), break, len(), list.sort()
    # 문제가 조금 복잡하면 간단한 기능부터 구현하고 업데이트를 하는 방법으로 해결
    # 랜덤한 숫자 6개 출력 -> 숫자가 중복되지 않는 코드를 추가

    lotto = []
    # 랜덤한 숫자 6개를 while문을 사용해서 작성
    while True:
    num = random.randint(1, 45)
    # 숫자를 추가할 때 lotto 리스트에 중복되는 숫자가 없으면 추가
    if num not in lotto:
    lotto.append(num)
    if len(lotto) >= 6:
    lotto.sort()

    break
    lotto

5. docstring

1
2
3
4
# 한줄로 작성
def echo(msg):
"echo print msg"
print(msg)
1
2
3
4
5
6
7
8
9
10
11
def echo(msg):
"""
echo func return its input agument
The operation is:
1. print msg parameter
2. return msg parameter
param : mag : str
return : str
"""
print(msg)
return msg
1
2
# docstring 확인 방법
echo?
1
echo??
1
help(echo)
1
print(echo.__doc__)

6. Scope 범위

  • 함수 안에서 선언되는 변수와 함수 밖에서 선언되는 변수의 범위가 다릅니다.
  • global(전역), local(지역)
  • 전역영역에 선언되어있으면 함수가 실행될 때 전역영역의 변수를 가져다 사용합니다.
  • 지역영역에 선언되어있으면 함수가 실행될 때 지역영역의 변수를 가져다 사용합니다.
  • 메모리를 덜 잡아먹기 때문에 로컬영역에서 선언할 수 있으면 로컬에서 선언하는 것이 좋습니다.
1
2
3
4
5
6
7
# global
gv = 10

def echo():
print(gv)

echo()
1
2
3
4
5
6
7
8
9
# local
gv = 10

def echo():
gv = 100
print(gv)

echo() # 100
gv # 10
1
2
3
4
5
6
7
8
9
gv = 10 

def echo():
global gv
gv=100
print(gv)

echo()
gv # 100

7. inner function

  • 함수가 지역영역에 선언, 함수 안에 함수가 선언
    1
    2
    3
    4
    5
    6
    def outer(a, b):

    def inner(c, d):
    return c + d

    return inner(a, b)
    1
    outer(1, 2) # 3
    1
    inner(2, 3) # 오류발생 : 전역영역에서 지역영역의 함수를 사용하려 했기 때문입니다. 지역영역에 선언된 함수이므로 지역영역에서만 사용할 수 있습니다.

inner함수 = 익명함수라고 부릅니다. 전역영역에서 가져다 사용할 수 없는 함수이기 때문입니다.

1
2
3
4
5
6
7
8
9
10
# 지역영역의 함수 사용하기
def outer(a, b):

def inner(c, d):
print(a, b)
return c + d

return inner # 리턴을 변경시켜주고

outer(1, 2)(3, 4) # inner(3, 4)

8. callback function

  • 함수를 아규먼트, 파라미터로 설정해서 사용하는 것을 의미합니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def calc(func, a, b):
    # code
    a **= 2
    b **= 2
    return func(a, b)

    def plus(a, b):
    return a + b

    def minus(a, b):
    return a - b
    1
    2
    # 덧셈
    calc(plus, 1, 2)
    1
    2
    # 뺄셈
    calc(minus, 1, 2)

9. lambda function

  • 파라미터를 간단한 계산으로 리턴되는 함수 : 삼항연산
    1
    2
    3
    4
    5
    def plus(a, b): # 파라미터
    return a + b # 리턴

    # lambda 파라미터: 리턴
    plus2 = lambda a, b: a + b
    1
    plus2(2, 3)
    1
    calc(lambda a, b: a + b, 4, 5)

10. Map, Filter, Reduce

  • map: 순서가 있는 데이터 집합에서 모든 값에 함수를 적용시킨 결과를 출력
  • 아규먼트로 func(함수), *iterable을 받음
  • iterable 한 데이터에 함수를 각 요소마다 모두 적용시킨 결과 데이터를 만들고 싶을 때 사용합니다.
  • map(func, ls1, ls2) : ls(iterable한 데이터)가 여러개 올 수 있습니다.
1
2
3
4
5
6
ls = [1, 2, 3, 4]

def odd_even(num):
return 'odd' if num % 2 else 'even'

odd_even(3), odd_even(4)
1
list(map(odd_even, ls)) # 함수, 리스트를 넣음
1
2
3
4
5
6
7
8
9
10
# input 함수로 구분자는 " "으로 여러개의 숫자를 입력 받습니다. 
# str.split(" ")리스트로 만들고
# 만들어진 리스트의 값들을 int로 형변환
datas = input("insert numbers : ") # 10 20 30 40 50 40 30 20 10
result = datas.split(" ")
result
```
```python
result = list(map(int, result))
result

10-2. Filter

  • Filter : 리스트 데이터에서 특정 조건에 맞는 value만 남기는 함수
  • filter(func, ls) : ls(iterable한 데이터)가 1개밖에 못옵니다.
  • True, False로 만듭니다.
  • func is True인 것만 리턴합니다.
    1
    2
    3
    4
    ls = range(10)

    # 홀수만 출력
    list(filter(lambda data: True if data % 2 else False, ls))

10-3. Reduce

  • 리스트 데이터를 처음부터 순서대로 특정 함수를 실행하여 결과를 누적시켜 주는 함수
    1
    2
    3
    4
    5
    6
    from functools import reduce # import 해야 사용 가능합니다. 

    ls = [3, 1, 2, 4, 5]
    # ((((1+2)+3)+4)+5)
    # 파라미터가 반드시 2개여야 함
    reduce(lambda x, y: x + y, ls)

10. Decorlator

  • 함수에서 코드를 바꾸지 않고 기능을 추가하거나 수정하고 싶을 때 사용하는 문법
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def a():
    code_1
    code_2
    code_3

    def b():
    code_1
    code_4
    code_3

데코레이터의 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def c(func): # 2. func으로 def a()이 들어옴 

def wrapper(*args, **kwargs): # inner func
code_1 # 4. 코드가 실행됨
result = func(*args, **kwargs) # 5. 코드가 실행됨
code_3 # 6. 코드가 실행됨
return result # 7. 반환함

return wrapper # 8. 반환함

@c # 1. def c라는 함수가 실행이 됨, code_1, code_3 기능이 적용됨, code_1, 3, 2가 실행됨
def a(): # def a라는 함수가 wrapper 함수로 변경됨
code_2 # 3. code_2 가 실행됨

@c # code_1, code_3 기능이 실행됨, 결과적으로 code_1, 3, 4가 실행됨
def b(): # b라는 함수가 wrapper 함수로 변경됨
code_4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# a
def plus(a, b):
print("start") # code_1
result = a + b # code_2
print("result : {}".format(result)) # code_3
return result

# b
def minus(a, b):
print("start") # code_1
result = a - b # code_4
print("result : {}".format(result)) # code_3
return result

# c : code_1, cod_3을 묶어주는 데코레이션 함수
def disp(func):
def wrapper(*args, **kwargs):
print("start") # code_1
result = func(*args, **kwargs) # code_2, code_4
print("result : {}".format(result)) # code_3
return result
return wrapper
1
2
3
4
5
@disp
def plus(a, b):
result = a + b # code_2
return result
plus(1, 2)
1
2
3
4
5
6
7
8
9
10
11
12
# 함수의 실행 시간을 출력하는 데코레이터 함수를 작성하세요. 
import time


def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time() # code 1
result = func(*args, **kwargs) # code 2, code 4
end_time = time.time() # code 3
print("running time : {}".format(end_time - start_time)) # code 3
return result
return wrapper
1
2
3
4
@timer
def test1(num1, num2):
data = range(num1, num2+1)
return sum(data)
1
2
3
4
5
6
@timer
def test2(num1, num2):
result = 0
for num in range(num1, num2+1):
result += num
return result
1
test1(1, 100000)
1
test2(1, 100000)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 패스워드를 입력받아야 함수가 실행되도록하는 데코레이터 작성
def check_password(func):
def wrapper(*args, **kwargs):
pw = 'dss12'
# datas = [
# {'id': 'test', 'pw': '1234'},
# {'id': 'test2', 'pw': '12345'}
# ]
# check password
input_pw = input('insert pw : ')
if input_pw == pw:
result = func(*args, **kwargs)
else:
result = 'not allow!'
return result
return wrapper
1
2
3
@check_password
def plus(a, b):
return a + b
1
plus(1, 2)
1
2
3
4
5
6
7
8
9
10
11
@check_password
def lotto_func():
lotto = []
while True:
number = random.randint(1, 45)
if number not in lotto:
lotto.append(number)
if len(lotto) >= 6:
lotto.sort()
break
return lotto
1
lotto_func()

join()

  • 리스트로 되어있는 데이터를 특정 문자열을 구분자로 사용해서 하나의 문장으로 만들어주는 함수
    1
    2
    ls = ['python', 'is', 'good']
    " ".join(ls)
    1
    2
    3
    4
    5
    6
    7
    8
    # pandas dataframe
    import pandas as pd

    df = pd.DataFrame([ # DataFrame : class
    {"name": "jin", "age": 20},
    {"name": "andy", "age": 21},
    ])
    df

id, pw 카운트 함수, 1. zip함수를 이용하는 방법

1
2
3
4
5
ls = ['a', 'b', 'c']
print(list(range(len(ls))))
print(list(zip(range(len(ls)), ls)))
for idx, data in list(zip(range(len(ls)), ls)):
print(idx, data)
1
2
3
4
user_datas = [
{'user': 'test', 'pw': '1234', 'count': 0},
{'user': 'python', 'pw': '5678', 'count': 0},
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# user_data를 입력받아서 아이디와 패스워드를 체크하는 데코레이터 함수를 코드로 작성하세요. 
# 로그인 될 때마다 count를 1씩 증가
def need_login(func):
def wrapper(*args, **kwargs): # inner function 만듬
# 아아디 패스워드 입력
user, pw = tuple(input("insert user pw : ").split(' ')) # user와 pw 나눈 후 tuple로 변환

# 존재하는 아이디와 패스워드 확인
for idx, user_data in zip(range(len(user_datas)), user_datas): # 카운트하기 위해 몇 번째 데이터인지 확인필요
if (user_data['user'] == user) and (user_data['pw'] == pw):
user_datas[idx]['count'] += 1 # 유저 데이터의 인덱스에서 카운트를 1씩 증가 시킴
# 함수 실행
return func(*args, **kwargs) # wrapper 함수 종료, 결과값 출력
return "wrong login data!"
return wrapper
1
2
3
4
5
@need_login
def plus(num1, num2):
return num1 + num2

plus(1, 2)
1
user_datas

2. enumerate함수를 이용하는 방법

1
list(enumerate(user_datas))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# user_data를 입력받아서 아이디와 패스워드를 체크하는 데코레이터 함수를 코드로 작성하세요. 
# 로그인 될 때마다 count를 1씩 증가
def need_login(func):
def wrapper(*args, **kwargs): # inner function 만듬
# 아아디 패스워드 입력
user, pw = tuple(input("insert user pw : ").split(' ')) # user와 pw 나눈 후 tuple로 변환

# 존재하는 아이디와 패스워드 확인
for idx, user_data in enumerate(user_datas): # 카운트하기 위해 몇 번째 데이터인지 확인필요
if (user_data['user'] == user) and (user_data['pw'] == pw):
user_datas[idx]['count'] += 1 # 유저 데이터의 인덱스에서 카운트를 1씩 증가 시킴
# 함수 실행
return func(*args, **kwargs) # wrapper 함수 종료, 결과값 출력
return "wrong login data!"
return wrapper
1
2
3
4
5
@need_login
def plus(num1, num2):
return num1 + num2

plus(1, 2)
1
user_datas