22.05.10

오혜원·2022년 5월 10일
0

SQL

목록 보기
1/7

SQL

Database
: data를 저장해 놓은 것

Database Table
: Database에 data를 저장하는 기본 단위


기본 문법

주석

/* 
여러 줄 주석
*/

--한 줄 주석

SELECT
: 검색 명령어

▷ SELECT (속성) from (테이블);
: 테이블의 속성에 속한 데이터를 모두 검색
: 속성이 여러 개일 경우 ,(comma)로 구분
: 모든 속성을 선택할 경우 * 사용 (비추천)
→ 시스템 성능 저하, 가독성 X

SELECT ENAME FROM EMP;

출력 결과

ENAME     
----------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

▷ SELECT (속성) from (테이블) WHERE (조건절);
: 조건에 부합하는 속성의 값을 테이블에서 검색
: 조건절 - (조건 속성) (조건 연산자) (값)
→ 조건 연산자 : >(초과), <(미만), >=(이상), <=(미만), <>(다름), !=(다름), ^=(다름), =(같음)
→ 숫자 비교 뿐 아니라 문자 비교도 가능 (ASCII Code 값 비교)

SELECT EMPNO, ENAME, JOB, HIREDATE, SAL, DEPTNO FROM EMP WHERE EMPNO < 7782;
SELECT EMPNO, ENAME, JOB, HIREDATE, SAL, DEPTNO FROM EMP WHERE ENAME > 'SCOTT';

출력 결과

     EMPNO ENAME      JOB       HIREDATE        SAL     DEPTNO
---------- ---------- --------- -------- ---------- ----------
      7369 SMITH      CLERK     80/12/17        800         20
      7499 ALLEN      SALESMAN  81/02/20       1600         30
      7521 WARD       SALESMAN  81/02/22       1250         30
      7566 JONES      MANAGER   81/04/02       2975         20
      7654 MARTIN     SALESMAN  81/09/28       1250         30
      7698 BLAKE      MANAGER   81/05/01       2850         30
     EMPNO ENAME      JOB       HIREDATE        SAL     DEPTNO
---------- ---------- --------- -------- ---------- ----------
      7369 SMITH      CLERK     80/12/17        800         20
      7521 WARD       SALESMAN  81/02/22       1250         30
      7844 TURNER     SALESMAN  81/09/08       1500         30

▷ SELECT (속성) from (테이블) WHERE (조건절 1) AND / OR (조건절 2);
: AND - true and true
→ 두 조건절을 모두 부합하는 결과 검색
: OR - true or ture
→ 각각의 조건절에 부합하는 모든 결과 검색

SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE DEPTNO = 30 AND JOB = 'SALESMAN';
SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE DEPTNO = 30 OR JOB = 'MANAGER';

출력 결과

     EMPNO ENAME      JOB           DEPTNO
---------- ---------- --------- ----------
      7499 ALLEN      SALESMAN          30
      7521 WARD       SALESMAN          30
      7654 MARTIN     SALESMAN          30
      7844 TURNER     SALESMAN          30
     EMPNO ENAME      JOB           DEPTNO
---------- ---------- --------- ----------
      7499 ALLEN      SALESMAN          30
      7521 WARD       SALESMAN          30
      7566 JONES      MANAGER           20
      7654 MARTIN     SALESMAN          30
      7698 BLAKE      MANAGER           30
      7782 CLARK      MANAGER           10
      7844 TURNER     SALESMAN          30
      7900 JAMES      CLERK             30

▷ SELECT (속성) from (테이블) WHERE (조건 속성) BETWEEN (값 1) AND (값 2);
: 조건 속성의 범위에 해당하는 결과 검색

SELECT * FROM EMP WHERE ENAME BETWEEN 'H' AND 'R';

출력 결과

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7934 MILLER     CLERK           7782 82/01/23       1300                    10

▷ SELECT (속성) from (테이블) WHERE (조건 속성) (NOT) IN (값 1, 값 2, 값 3 ...);
: 조건 속성 중 지정된 값이 포함된 결과 검색
→ (조건 속성) = (값 1) OR (조건 속성) = (값 2) OR (조건 속성) = (값 3) 과 동일
: NOT의 경우, 지정된 값이 제외된 결과 검색
→ (조건 속성) != (값 1) AND (조건 속성) = (값 2) AND (조건 속성) = (값 3) 과 동일

SELECT * FROM EMP WHERE SAL IN (800, 1600, 2450);
SELECT * FROM EMP WHERE SAL NOT IN (800, 1600, 2450);

출력 결과

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7788 SCOTT      ANALYST         7566 82/12/09       3000                    20
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7844 TURNER     SALESMAN        7698 81/09/08       1500                    30
      7876 ADAMS      CLERK           7788 83/01/12       1100                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7934 MILLER     CLERK           7782 82/01/23       1300                    10

▷ SELECT (속성) from (테이블) ORDER BY (정렬 속성) (ASC / DESC);
: 테이블의 속성에 속한 데이터를 ASC(오름차순) 혹은 DESC(내림차순)으로 정렬 검색
→ 기본적으로는 오름차순 정렬 / NULL의 경우 ASC일 때 최하단, DESC일 때 최상단
: 정렬할 속성이 여러 개일 경우 ,(comma)로 구분
→ 작성된 순서로 정렬 후, 그 안에서 다음에 오는 속성으로 정렬

SELECT * FROM EMP ORDER BY DEPTNO DESC;

출력 결과

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7844 TURNER     SALESMAN        7698 81/09/08       1500                    30
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7788 SCOTT      ANALYST         7566 82/12/09       3000                    20
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7876 ADAMS      CLERK           7788 83/01/12       1100                    20
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7934 MILLER     CLERK           7782 82/01/23       1300                    10
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10

▷ SELECT (속성) from (테이블) WHERE (조건 속성) LIKE (조건 값, % or _와 함께 작성);
: LIKE - 유사한 데이터 검색
: % - 모든 글자를 의미(글자 수와 무관)
→ 'A%', A로 시작하는 모든 문자열 / '%L%', 중간에 L이 들어가는 모든 문자열 / '%T', T로 끝나는 모든 문자열
: _ - 한 글자를 의미
→'_L%', 이름 두 번째 자리에 L이 들어가는 모든 문자열 / '__A__', 이름이 다섯 글자이고 세 번째 자리에 A가 들어가는 모든 문자열

SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE ENAME LIKE 'J%';
SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE ENAME LIKE '%S';
SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE ENAME LIKE '__A__';

출력 결과

     EMPNO ENAME      JOB           DEPTNO
---------- ---------- --------- ----------
      7566 JONES      MANAGER           20
      7900 JAMES      CLERK             30
     EMPNO ENAME      JOB           DEPTNO
---------- ---------- --------- ----------
      7566 JONES      MANAGER           20
      7876 ADAMS      CLERK             20
      7900 JAMES      CLERK             30
     EMPNO ENAME      JOB           DEPTNO
---------- ---------- --------- ----------
      7698 BLAKE      MANAGER           30
      7782 CLARK      MANAGER           10
      7876 ADAMS      CLERK             20

▷ SELECT DISTINCT (속성) from (테이블);
: DISTINCT - 중복 제거 표현

SELECT DISTINCT JOB FROM EMP;

출력 결과

JOB      
---------
CLERK
SALESMAN
MANAGER
ANALYST
PRESIDENT

▷ SELECT COUNT(속성) from (테이블);
: COUNT(속성) - () 안에 있는 속성의 개수
→ () 안에 (DISTINCT 속성) 이 들어가면 중복이 제거된 속성의 개수

SELECT COUNT(DISTINCT JOB) FROM EMP;

출력 결과

COUNT(DISTINCTJOB)
------------------
                 5

▷ SELECT (사칙 연산) from DUAL;
: SELECT 절에서 사칙 연산 가능
: DUAL - 오라클에서 제공하는 일종의 가상 테이블

SELECT ENAME, JOB, SAL, SAL * 12, DEPTNO FROM EMP;
SELECT 7 + 8 FROM DUAL;

출력 결과

ENAME      JOB              SAL     SAL*12     DEPTNO
---------- --------- ---------- ---------- ----------
SMITH      CLERK            800       9600         20
ALLEN      SALESMAN        1600      19200         30
WARD       SALESMAN        1250      15000         30
JONES      MANAGER         2975      35700         20
MARTIN     SALESMAN        1250      15000         30
BLAKE      MANAGER         2850      34200         30
CLARK      MANAGER         2450      29400         10
SCOTT      ANALYST         3000      36000         20
KING       PRESIDENT       5000      60000         10
TURNER     SALESMAN        1500      18000         30
ADAMS      CLERK           1100      13200         20
JAMES      CLERK            950      11400         30
FORD       ANALYST         3000      36000         20
MILLER     CLERK           1300      15600         10
       7+8
----------
        15

▷ SELECT (속성) as "가명" from (테이블);
: Alias - 속성에 가명
→ 기본적으로 as가 원칙이지만 생략 가능
→ ""(큰 따옴표) 사용 / 생략 가능 (하지만 가명에 공백이 있을 경우 "" 필수)

SELECT ENAME, JOB, SAL, SAL * 12 AS "연봉", DEPTNO FROM EMP;

출력 결과

ENAME      JOB              SAL         연봉     DEPTNO
---------- --------- ---------- ---------- ----------
SMITH      CLERK            800       9600         20
ALLEN      SALESMAN        1600      19200         30
WARD       SALESMAN        1250      15000         30
JONES      MANAGER         2975      35700         20
MARTIN     SALESMAN        1250      15000         30
BLAKE      MANAGER         2850      34200         30
CLARK      MANAGER         2450      29400         10
SCOTT      ANALYST         3000      36000         20
KING       PRESIDENT       5000      60000         10
TURNER     SALESMAN        1500      18000         30
ADAMS      CLERK           1100      13200         20
JAMES      CLERK            950      11400         30
FORD       ANALYST         3000      36000         20
MILLER     CLERK           1300      15600         10

▷ SELECT (속성) from (테이블) "가명";
: Alias - 테이블에 가명
→ ""(큰 따옴표) 사용 / 생략 가능 (하지만 가명에 공백이 있을 경우 "" 필수)
→ 속성과 달리 as 사용 X

▷ SELECT (테이블.속성) from (테이블);
▷ SELECT (테이블가명.속성) from (테이블) "테이블가명";
: 테이블.속성 혹은 테이블가명.속성이 가능
: 속성 가명은 불가능

SELECT EMP.ENAME, EMP.JOB, EMP.SAL, EMP.DEPTNO from EMP;
SELECT ETAB.ENAME, ETAB.JOB, ETAB.SAL, ETAB.DEPTNO from EMP "ETAB";

▷ SELECT (속성) from (테이블) WHERE (속성) IS (NOT) NULL;
: NULL - 없음. 0이나 공백 X
→ NULL과 연산한 결과는 NULL
: 특정 속성이 NULL인 데이터 검색 / NULL이 아닌 데이터 검색

SELECT ENAME, JOB, SAL, SAL * 12 + COMM AS "연봉" FROM EMP;

출력 결과

ENAME      JOB              SAL         연봉
---------- --------- ---------- ----------
SMITH      CLERK            800           
ALLEN      SALESMAN        1600      19500
WARD       SALESMAN        1250      15500
JONES      MANAGER         2975           
MARTIN     SALESMAN        1250      16400
BLAKE      MANAGER         2850           
CLARK      MANAGER         2450           
SCOTT      ANALYST         3000           
KING       PRESIDENT       5000           
TURNER     SALESMAN        1500           
ADAMS      CLERK           1100  
JAMES      CLERK            950           
FORD       ANALYST         3000           
MILLER     CLERK           1300           

▷▷ NVL(NULL 속성, A)
: NULL 속성을 A 값으로 변환
: 해당 함수를 통해 NULL값과의 연산 가능

SELECT ENAME, JOB, SAL, SAL * 12 + NVL(COMM, 0) AS "연봉" FROM EMP;

출력 결과

ENAME      JOB              SAL         연봉
---------- --------- ---------- ----------
SMITH      CLERK            800       9600
ALLEN      SALESMAN        1600      19500
WARD       SALESMAN        1250      15500
JONES      MANAGER         2975      35700
MARTIN     SALESMAN        1250      16400
BLAKE      MANAGER         2850      34200
CLARK      MANAGER         2450      29400
SCOTT      ANALYST         3000      36000
KING       PRESIDENT       5000      60000
TURNER     SALESMAN        1500      18000
ADAMS      CLERK           1100      13200
JAMES      CLERK            950      11400
FORD       ANALYST         3000      36000
MILLER     CLERK           1300      15600

주의
: SQL 명령어, 속성, 테이블 이름에서는 대소문자를 가리지 않음
→ 테이블에 저장된 문자 데이터예외
: 오라클에서 문자열은 ''(작은 따옴표) 안에 작성

UNION / UNION ALL / INTERSECT / MINUS

공통 주의 사항
: SELECT문 결과의 개수가 동일해야 함
: SELECT문 결과의 data type이 동일해야 함

UNION
: 둘 이상의 SELECT문 결과를 합치는 명령어
: 합집합, 중복 data 자동 제거

▷ 문법
SELECT (속성) from (테이블)
UNION
SELECT (속성) from (테이블);

SELECT * FROM EMP WHERE DEPTNO = 30
UNION
SELECT * FROM EMP WHERE JOB = 'MANAGER';

출력 결과

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7844 TURNER     SALESMAN        7698 81/09/08       1500                    30
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10

UNION ALL
: 둘 이상의 SELECT문 결과를 합치는 명령어
: 합집합, 중복 data 제거 X

▷ 문법
SELECT (속성) from (테이블)
UNION ALL
SELECT (속성) from (테이블);

SELECT * FROM EMP WHERE DEPTNO = 30
UNION ALL
SELECT * FROM EMP WHERE JOB = 'MANAGER';

출력 결과

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7844 TURNER     SALESMAN        7698 81/09/08       1500                    30
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10

INTERSECT
: 둘 이상의 SELECT문 결과 중에서 공통 부분만 출력하는 명령어
: 교집합, 중복 data 자동 제거

▷ 문법
SELECT (속성) from (테이블)
INTERSECT
SELECT (속성) from (테이블);

SELECT * FROM EMP WHERE DEPTNO = 30
INTERSECT
SELECT * FROM EMP WHERE JOB = 'MANAGER';

출력 결과

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30

MINUS
: 상단의 SELECT문의 결과에서 하단의 SELECT문의 결과를 뺌

▷ 문법
SELECT (속성) from (테이블)
MINUS
SELECT (속성) from (테이블);

SELECT * FROM EMP WHERE DEPTNO = 30
MINUS
SELECT * FROM EMP WHERE JOB = 'MANAGER';

출력 결과

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7844 TURNER     SALESMAN        7698 81/09/08       1500                    30
      7900 JAMES      CLERK           7698 81/12/03        950                    30

QUIZ

-- QUIZ --
--1. emp 사원 이름, 급여, 입사일 출력
SELECT ENAME, SAL, HIREDATE from EMP;

--2. emp에서 별명 부여 : deptno > 부서번호
SELECT DEPTNO AS "부서번호" from EMP;

--3. emp에서 job을 중복 제거 출력
SELECT DISTINCT JOB from EMP;

--4. emp에서 급여가 1500이하인 직원의 사번, 이름, 직무, 급여, 부서번호 출력
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO from EMP WHERE SAL <= 1500;

--5. emp에서 이름이 MARTIN인 직원 정보 출력
SELECT * from EMP WHERE ENAME = 'MARTIN';

--6. emp에서 급여가 950 또는 1250 또는 2975인 직원 정보 출력
SELECT * from EMP WHERE SAL IN (950, 1250, 2975);

--7. emp에서 급여가 950 또는 1250 또는 2975가 아닌 직원 정보 출력
SELECT * from EMP WHERE SAL NOT IN (950, 1250, 2975);

--8. emp에서 이름이 S로 끝나는 직원 정보 출력
SELECT * from EMP WHERE ENAME LIKE '%S';

--9. emp에서 MGR이 NULL인 직원 정보 출력
SELECT * from EMP WHERE MGR IS NULL;

--10. emp에서 모든 직원의 사번, 이름, 직무, 입사일, 부서번호를 입사일 최근 순으로 출력
SELECT EMPNO, ENAME, JOB, HIREDATE, DEPTNO from EMP ORDER BY HIREDATE DESC; 

--11. emp에서 모든 직원의 사번, 이름, 직무, 입사일, 부서번호를 입사일이 오래된 순으로 출력
SELECT EMPNO, ENAME, JOB, HIREDATE, DEPTNO from EMP ORDER BY HIREDATE;

0개의 댓글