ERD

ERD : 데이터베이스 개체 설계도

  • ERD(Entity Relationship Diagram) : 개체(테이블) 간의 관계를 이해하기 쉽게 그림으로 표현한 것으로 데이터를 조작하고 분석하는 기초 자료로 활용됨. 데이터베이스의 설계 도면.
  • 개체(entity) : 정보를 저장하고 관리하기 위한 집합이자 식별 가능한 것

기본 키(primary key) : 주민등록번호와 같은 개념

  • 유일하게 데이터를 구분,
  • 데이터를 식별하는 ‘식별자’ 역할,
  • 중복 값을 가질 수 없음(unique),
  • null 값을 가질 수 없고,
  • 변경될 수도 없음

고유 키(unique key) : email 등

  • 행에서 유일한 값을 갖는 데이터 값으로 구성된 열,
  • 중복 값이 없는 유일한 값을 갖음,
  • 기본 키가 아닌 데이터 값이 존재,
  • 유니크 값 또는 유니크 키라 부름

외래 키(foreign key)

  • 테이블 간에 서로 연결 관계를 정의,
  • 테이블의 구성 열,
  • 다른 테이블과 연결을 위한 열

오라클 데이터베이스의 대표적인 제약조건

제약조건 내용
기본 키(primary key) UNIQUE + NOT NULL을 만족하며 테이블을 대표하며 각 행을 유일하게 식별하는 값
외래 키(foreign key) 열 값이 부모 테이블의 참조 열 값을 반드시 참조, 참조되는 열은 유니크(unique)하거나 기본 키(primary key)임(null 허용 가능)
고유 키(unique key) 중복된 값을 허용하지 않음, 유일한 값으로 존재(null 허용 가능)
NOT NULL null 값을 허용하지 않음, 값 입력 필수
CHECK 범위나 조건을 설정하여 지정된 값만 허용

Oracle SQL Daveloper에서 ERD를 확인하는 방법

  1. 메뉴 > Data Modeler > 임포트 > 데이터 딕셔너리 클릭
  2. 접속할 계정 선택 > 다음 클릭
  3. 데이터베이스 선택 > 다음 클릭
  4. 임포트할 객체 선택 > 다음 클릭
  5. 완료 클릭

사각형 : 개체(테이블), 테이블의 이름과 어떤 속성(열)을 가지고 있는지 표현
개체간의 관계 : 점선, 실선으로 표현된 화살표 모양의 선
관계 차수 : 1:1, 1:N, M:N 등
화살표 방향 : 어느 쪽에 속하는지를 나타냄
1 : 관계를 맺는 개체와 하나의 관계를 갖음
0 또는 1 : 관계를 맺는 개체와 0이거나 1의 관계를 갖음
1 이상 : 관계를 맺는 개체와 1이거나 여러 개의 관계를 갖음
0 이상 : 관계를 맺는 개체와 0이거나 여러 개의 관계를 갖음
실선 : 필수 관계, 예) A(실선)B, B가 존재하려면 A가 반드시 존재해야 함
점선 : 선택적 관계, 예) A(점선)B, B는 A가 없어도 존재

자료출처: 모두의 SQL

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

sql where 조건절 02

WHRER 조건 절을 활용한 데이터 검색 02

  1. 논리 연산자 : 조건 논리를 계속 연결하기

AND(교집합) : 앞의 조건과 뒤의 조건을 동시에 만족해야 한다.
OR(합집합) : 앞의 조건과 뒤의 조건 중 한쪽이라도 참이면 참이다.
NOT : 뒤의 조건에 대해 반대 결과를 반환한다.

(1) employees 테이블에서 salary가 4000을 초과하면서 job_id가 IT_PROG인 값을 조회하세요.

SELECT *
FROM employees
WHERE salary > 4000
AND job_id = ‘IT_PROG’;

(2) employees 테이블에서 salary가 4000을 초과하면서, job_id가 IT_PROG거나 FI_ACCOUNT인 경우를 조회하세요.

SELECT *
FROM employees
WHERE salary > 4000
AND job_id = ‘IT_PROG’
OR job_id = ‘FI_ACCOUNT’;

  1. 부정 연산자의 종류
  • 부정 비교

!= : 같지 않다.
<> : 같지 않다(ISO 표준).
NOT 열 이름 = : ~와 같지 않다.
NOT 열 이름 > : ~보다 크지 않다.

  • 부정 SQL

NOT BETWEEN a AND b : a와 b 사이에 값이 없다.
NOT IN (list) : list 값과 일치하지 않는다.
IS NOT NULL : null 값을 갖지 않는다.

(1) employees 테이블에서 employee_id가 105가 아닌 직원을 조회해보세요.

SELECT *
FROM employees
WHERE employee_id <> 105;

(2) employees 테이블에서 manager_id가 null 값이 아닌 직원을 조회해 보세요.

SELECT *
FROM employees
WHERE manager_id IS NOT NULL;

자료출처: 모두의 SQL

sql where 조건절 01

WHERE 조건 절을 활용한 데이터 검색 01

  • 사용자가 원하는 데이터를 조회할 때 사용하는 것이 where절
  • ‘어디에서 어떻게’ 가져올지 정함

데이터가 조회되는 논리 순서

  • 참조하려는 테이블로부터 (FROM)
  • 해당 조건식으로 (WHERE)
  • 열을 선택(SELECT)하여 조회합니다.

연산자 우선순위

  • 괄호 > 부정 연산 > 비교 연산 > SQL 연산 순으로 처리
  • 논리 연산자는 NOT, AND, OR 순으로 처리
  1. 비교 연산자 : 비교 조회 조건 주기

    등호 연산자 =

    (1) employee_id가 100인 직원 정보를 출력하세요.

    SELECT *
    FROM employees
    WHERE employee_id = 100;

    (2) employees 테이블에서 first_name이 David인 직원 정보를 출력하세요.

    SELECT *
    FROM employees
    WHERE first_name = ‘David’;

    (3) employees 테이블에서 employee_id가 105이상인 직원 정보를 출력하세요.

    SELECT *
    FROM employees
    WHERE employee_id >= 105;

  2. SQL 연산자 : 조회 조건 확장하기

    BETWEEN a AND b : a와 b 사이에 값이 있다.(a, b를 포함)
    IN(list) : list 중 어느 값이라도 일치한다. 여러개의 값을 지정할 수 있다.
    LIKE’비교 문자’ : 비교 문자와 형태가 일치한다(%, _ 사용)
    IS NULL : null 값을 갖는다.

    (1) employees 테이블에서 salary가 10000 이상이고, 20000 이하인 직원 정보를 출력하세요.

    SELECT *
    FROM employees
    WHERE salary BETWEEN 10000 AND 20000;

    (2) employees 테이블에서 salary가 10000, 17000, 24000인 직원 정보를 출력하세요.

    SELECT *
    FROM employees
    WHERE salary IN (10000, 17000, 24000);

    (3) employees 테이블에서 job_id 값이 AD를 포함하는 모든(%) 데이터를 조회하세요.

    SELECT *
    FROM employees
    WHERE job_id LIKE ‘AD%’;

    (4) employees 테이블에서 AD를 포함하면서 AD 뒤에 따라오는 문자열이 3자리인 데이터 값을 갖는 직원 정보를 조회하세요.

    SELECT *
    FROM employees
    WHERE job_id LIKE ‘AD___‘;

    (5) employees 테이블에서 manager_id가 null 값인 직원 정보를 출력해 보세요.

    SELECT *
    FROM employees
    WHERE manager_id IS NULL;

자료출처: 모두의 SQL

sql

select 문의 기본 문법

  1. SQL문 작성 규칙

    (1) 대소문자 구별 하지 않음

    • 명령어 대문자, 나머지 소문자로 작성하길 권장함

    (2) 한줄 또는 여러줄로 작성 가능

    • 코드 수준에 따른 들여쓰기는 SQL문장의 가독성을 좋게함
  2. 전체 데이터 조회하기

    (1) employees 테이블의 모든 정보를 출력하세요.

    SELECT *
    FROM employees;

    * : 모든 열 조회
    FROM : ~ 테이블로부터 라는 의미

  3. 원하는 열만 조회하고 정렬하기
    (1) employees 테이블에서 employees_id, first_name과 last_name을 출력하세요.

    SELECT employees_id, first_name, last_name
    FROM employees;

    (2) employees 테이블에서 employee_id, first_name, last_name을 출력하고 employee_id를 기준으로 내림차순으로 정렬하세요.

    SELECT employee_id, first_name, last_name
    FROM employees
    ORDER BY employee_id DESC;

    • ORDER BY 명령문 default : 오름차순 정렬(ASC)
    • ORDER BY 열 이름, 열 이름 DESC, 열 이름 ASC 가능
  4. 중복된 출력 값 제거하기

    (1) employees 테이블에서 중복 값이 생기지 않도록 job_id를 출력하세요.

    SELECT DISTINCT job_id
    FROM employees;

    • DISTINCT 명령어 뒤에 열 이름을 계속 나열하면 순서대로 DISTINCT가 모두 적용됨
  5. SQL 문을 효율적으로 작성하기 위해 별칭 사용하기
    (1) employees 테이블에서 employees_id는 ‘사원번호’, first_name은 ‘이름’, last_name은 ‘성’으로 출력하세요.

    SELECT employees_id AS 사원번호, first_name AS 이름, last_name AS 성
    FROM employees;

  6. 데이터 값 연결하기
    (1) employees 테이블에서 employees_id를 출력하고 first_name과 last_name을 붙여서 출력하세요.

    SELECT employees_id, first_name||last_name
    FROM employess;

    (2) employees 테이블에서 employee_id를 출력하고, first_name과 last_name을 붙여서 출력하되 가운데 한 칸을 띄워주세요. 다음 열에는 email을 출력하되 @company.com 문구를 붙여서 출력하세요.

    SELECT employee_id, first_name||’ ‘||last_name, email||@company.com
    FROM employees;

  7. 산술 처리하기 : 데이터 값끼리 계산
    (1) employees 테이블에서 employee_id, salary, salary에 500을 더한 값, 100을 뺀 값, 10%를 추가해서 2로 나눈 값을 출력하세요.

    SELECT employee_id, salary, salary+500, salary-100, (salary1.1)/2
    FROM employees;
    (2) employees에서 employee_id를 ‘사원번호’, salary를 ‘급여’, salary+500을 ‘추가급여’, salary-100을 ‘인하급여’, (salary
    1.1)/2를 ‘조정급여’로 출력하세요.

    SELECT employee_id AS 사원번호,
                    salary AS 급여,
                    salary+500 AS 추가급여,
                    salary-100 AS 인하급여,
                    (salary*1.1)/2 AS 조정급여
    FROM employees;

자료출처: 모두의 SQL