SQL 기초 (NULL, 집합연산자, 정렬처리)

김하은·2023년 3월 25일
0

SQL

목록 보기
2/12
post-thumbnail

📌 NULL 데이터

  1. database에서는 테이블 내에 특정 컬럼에 데이터가 없는 것을 NULL이라고 한다.
  2. 미확인 값이나 아직 값이 적용되지 않는 것을 의미한다.
  3. 0이나 ' '(공백)과 구분되어 정의되지 않는 값을 의미한다.
    - ' '도 null로 인식하는 경우가 있다.
    - cf) 프로그램의 primitive 데이터의 초기값 설정과 차이가 있다.
    SELECT * FROM emp_cp100;
    INSERT INTO EMP_CP100 (ename) values(null);
    INSERT INTO EMP_CP100 (ename) values(''); --DB에서는 null로 처리된다.
    INSERT INTO EMP_CP100 (ename) values(' ');
  1. NULL값은 다른 데이터와 연산 결과값은 NULL로 된다.
    select sal + NULL ==> NULL
  2. 위와 같이 특정한 숫자형 데이터와 연산시, NULL이 되므로 NULL값이 나올 때는 default값을
    0으로 설정하여야 정상적인 연산을 할 수 있다.
    cf) 이때, null 처리 관련 함수들이 필요하다. nvl, nullif
    대표적인 nvl(데이터, null일때 처리할 default값)
  3. [주의!!]조건절에 null 검색하려면 컬럼명 = null는 처리가 안된다.
    반드시 컬럼명 is null 형태로 처리해야 한다.
    cf) null 아닌 경우를 검색할 때는 컬럼명 is not null
  4. null값의 연산 결과는 null이 된다.
    SELECT sal, comm, sal+comm 합산, sal+nvl(comm,0) nvl처리합산 
    FROM emp;
    SELECT *
    FROM emp; -- comm가 null인 데이터를 검색

    SELECT empno, comm 
    FROM EMP e 
    WHERE comm IS NULL; -- comm = NULL; 안됨
    SELECT empno, comm
    FROM EMP e
    WHERE comm IS NOT NULL; -- NULL 아닌 데이터 검색

ex1) 관리자 번호가 null인 사원과 같은 부서에 있는 사원을 출력하세요

    SELECT *
    FROM EMP e2 
    WHERE deptno in(
    SELECT deptno FROM emp WHERE mgr IS null);

ex2) 보너스가 있는 사원의 사원명과 급여와 보너스의 합산을 출력하세요

    SELECT ename, sal, comm, sal+comm "합산" 
    FROM EMP e 
    WHERE nvl(comm,0)>0; -- null과 0을 함께 제외
    -- 📌 데이터가 0인 경우와 null인 경우를 둘다 제외시켜야 되는 경우가 많이 발생한다. 
    -- 📌 이런 경우, 함수(nvl)을 활용하여 처리한다. 

📌 집합 연산자

  1. 테이블을 구성하는 행집합에 대해 테이블의 부분 집합을 결과로 변환하는 연산자
  2. 집합 연산의 대상이 되는 두 테이블의 컬럼 수가 같고, 대응되는 컬럼까지 데이터 타입이
    동일할 떄 활용된다.
    select empno
    from emp;
    1000
    1001
    1002
    select empno
    from emp2;
    1001
    1002
    1003
    select empno, ename
    from emp3;
    1001 '홍길동'
     1002 '김길동' 1003 '신길동' select empno, ename
    from emp4;
    1001 '홍길동' 1003 '마길동' 1006 '오길동' select empno, ename
    from emp4;
    1001 5555
    1003 4444
    1006 3333
    위와 같이 emp에 있는 empno와 emp2에 있는 empno를 두개의 집합개념으로 
    union, union all, intersect, minus로 집합 연산자에 의해서 처리하는 것을 말한다.
    두개의 집합이 동일한 유형의 데이터type이어야 하고, 동일한 컬럼의 갯수가 같아야 한다.
  1. 기본 형식
	SELECT 명령문1
	UNION, UNION ALL, INTERSECT, MINUS
	SELECT 명령문2
  1. 집합 연산자 종류
    1) union : 두 집합에 대해 중복되는 행을 제외한 합집합
    crossing check를 하기에 부하가 일어난다.
    테이블4 테이블4 16 중복 체크, 동일한 데이터는 제외
    2) union all : 두 집합에 대해 중복되는 행을 포함한 합집합
    crossing check하지 않음.
    테이블5 테이블6 그대로 순서대로 출력
    3) minus : 두 집합간의 차집합
    4) intersect : 두 집합간의 교집합

    cf) 복사테이블 만들기
    CREATE TABLE 만들테이블명
    AS 기존 테이블의 sql
    -- emp_cp100 테이블 생성
    CREATE TABLE emp_cp100
    AS SELECT * FROM emp
    WHERE deptno = 10;

    -- emp_cp100 테이블에 데이터 삽입
    INSERT INTO emp_cp100 values(7999, '홍길동', '사원', 7839, sysdate, 3000, NULL,40); 

    -- 중복데이터를 제거한 데이터 : union
    SELECT empno, ename
    FROM emp
    UNION
    SELECT empno, ename 
    FROM emp_cp100; 

    -- 중복데이터를 포함한 데이터 : union all
    SELECT empno, ename FROM emp
    UNION ALL
    SELECT empno, ename FROM emp_cp100; 

    -- 차집합처리 : minus
    SELECT empno, ename, deptno FROM emp
    MINUS
    SELECT empno, ename, deptno FROM emp_cp100; 

    -- 교집합처리 : intersect
    SELECT empno, ename, deptno FROM emp
    INTERSECT
    SELECT empno, ename, deptno FROM emp_cp100;
    a05_ordering

📌 정렬처리

  1. sql명령문에서 검색된 결과는 테이블에 데이터가 입력된 순서대로 출력한다.
  2. 데이터의 출력 순서를 특정 컬럼을 기준으로 오름차순/내림차순으로 정렬하는 경우에 활용된다
  3. 여러 개의 컬럼에 대해 정렬 순서를 지정해서 정렬할 경우는 다음과 같이 처리한다.
  • 입사일은 오름차순, 급여는 내림차순 : 입사일을 일단 기준으로 오름 차순으로 처리하되, 입사일이 같은 데이터가 있는 경우는 그다음 정렬 기준인 sal을 기준으로 가장 높은 것부터 낮은
    것으로 정렬.
		ORDER BY hiredate ASC, sal DESC
  1. 기본적인 정렬 방법
  • 문자값은 알파벳순으로 출력되고, 한글은 가나다라 순으로 출력된다.
  • 숫자 값은 가장 적은 값으로 먼저 출력
  • 날짜는 가장 과거의 날짜로부터 최근 날짜로 출력된다.
  1. 기본 형식

SELECT *
FROM 테이블
WHERE..
GROUP BY 그룹함수
ORDER BY 컬럼 [ASC/DESC]
ASC : default로 오름차순 정렬
DESC : 내림차순 정렬

-- ex1) 입사일을 기준으로 최근부터 과거로 정렬처리하여 출력
SELECT *
FROM EMP e 
ORDER BY hiredate DESC; 

-- ex2) 직책을 기준으로 A~Z로 정렬 
SELECT * 
FROM emp
ORDER BY job; 

-- ex2) 직책을 기준으로 A~Z로 정렬, 두번째 정렬기준인 급여 오름차순으로 처리
SELECT ename, job, sal
FROM emp
ORDER BY job, sal; -- asc는 default로 생략이 가능하다. 

--ex3) 부서번호 오름차순, 연봉 내림차순으로 정렬처리. 
SELECT *
FROM EMP e 
ORDER BY deptno ASC, sal DESC;
profile
개발자국

0개의 댓글