본문 바로가기

SQL/기본 개념

SELECT (DML / DQL)

▶ 주요 용어

▶ SQL (Structured Query Language)

  • 관계형 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용하는 표준 검색 언어
  • 원하는 데이터를 찾는 방법이나 절차를 기술하는 것이 아닌 조건을 기술하여 작성

▶ SELECT

  • 데이터를 조회(SELECT)하면 조건에 맞는 행들이 조회
    조회된 결과 행의 집합 = RESULT SET(결과 집합)
  • RESULT SET은 0행 이상이 포함될 수 있음
    조회 조건에 맞는 행이 없을 수도 있기 때문에, 0행도 포함됨

  • EX-1) EMP 테이블에서 모든 사원의 정보 조회
SELECT * FROM EMPLOYEE;
-- * : ALL, 모든, 전부
  • EX-2) EMP 테이블에서 모든 사원의 사번, 이름, 이메일, 급여 조회
SELECT EMP_ID, EMP_NAME, EMAIL, SALARY
FROM EMPLOYEE;

▶ SELECT _ 컬럼값 산술 연산

  • 컬럼값 : 테이블의 한 칸(= 한 셀)에 적용된 값(DATA)
  • SELECT문 작성 시 컬럼명에 산술 연산을 작성하면
    조회되는 결과 컬럼값에 산술 연산이 반영됨

  • EX-1) EMP 테이블에서 모든 사원의 사번, 이름, 급여, 급여+1000000 조회
SELECT EMP_ID, EMP_NAME, SALARY, SALARY+1000000
FROM EMPLOYEE;

▶ SELECT _ ★ ★ 오늘 날짜 조회 ★ ★

SELECT SYSDATE FROM DUAL;
  • SYSDATE : 시스템 상의 현재 날짜
  • DUAL(DUmmy tAbLe) : 가짜 테이블(임시 테이블, 단순 조회 테이블)
  • ★ DB는 날짜 데이터의 연산( +, - )이 가능함 (일 단위) ★
SELECT SYSDATE, SYSDATE+1, SYSDATE-1 FROM DUAL;
  • EX) EMP 테이블에서 사원명, 입사일, 오늘까지 근무한 날짜(년수) 조회
SELECT EMP_NAME, HIRE_DATE, (SYSDATE-HIRE_DATE) / 365
FROM DUAL;

▶ SELECT _ 컬럼 별칭 지정

  • SELECT 조회 결과의 집합인 RESULT SET에 컬럼명 지정
  • 1) 컬럼명 AS 별칭 : 띄어쓰기 X, 특수문자 X, 문자 O
  • 2) 컬럼명 별칭       : 1번에서 AS만 생략한 것

  • 3) 컬럼명 AS "별칭" : 띄어쓰기 O, 특수문자 O, 문자 O
  • 4) 컬럼명 "별칭"       : 3번에서 AS만 생략

  • EX) EMP 테이블에서 사번, 이름, 급여(원), 근무 일수를 조회
SELECT EMP_ID AS 사번, EMP_NAME 이름, SALARY AS "급여(원)", (SYSDATE-HIRE_DATE) "근무 일수"
FROM EMPLOYEE;

▶ SELECT _ 리터럴

  • DB에서의 리터럴 : 임의로 지정한 값을 기존 테이블에 존재하는 값처럼 사용
    → 리터럴 표기법 : '  ' (홑따옴표)
SELECT EMP_NAME, SALARY, '원' AS 단위
FROM EMPLOYEE;

▶ SELECT _ DISTINCT : 조회 시 컬럼에 포함된 중복 값을 한 번만 표시할 때 사용

  • 주의사항
    1) DISTINCT는 SELECT문에 딱 한 번만 작성할 수 있음
    2) DISTINCT는 SELECT문 가장 앞에 작성되어야 함
  • EX) EMP 테이블에 저장된 직원들이 속해 있는 부서코드 종류 조회
SELECT DEPT_CODE FROM EMPLOYEE; -- 전 직원의 부서코드 조회(중복값 포함)
-->
SELECT DISTINCT DEPT_CODE FROM EMPLOYEE; --중복값 제거

▶ SELECT _ WHERE절

  • 테이블에서 조건을 충족하는 값을 가진 행만 조회하고자 할 때 사용
  • 비교연산자 : >, <, >=, <=, = (같다), ( != / <>) (같지 않다)
  • EX) EMP 테이블에서 급여가 300만원 초과인 직원의 사번, 이름, 급여, 부서코드 조회
SELECT EMP_ID, EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE SALARY > 3000000;
  • <해석 순서>
    세 번째(3) : SELECT EMP_ID, EMP_NAME, SALARY, DEPT_CODE [ 해당 사원 정보 조회]
    첫 번째(1) : FROM EMPLOYEE [ 전체 테이블에서 ]
    두 번째(2) : WHERE SALARY > 3000000; [급여가 300만원 이상인 조건 ] 

▶ SELECT _ 논리 연산자(AND, OR)

  • EX-1) EMP 테이블에서 급여가 200만원 이상이고, 부서코드가 'D6'인 사원의
    사원명, 급여, 부서코드 조회
SELECT EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE SALARY >= 2000000
AND DEPT_CODE = 'D6';
  • EX-2) EMP 테이블에서 부서코드가 'D6' 또는 'D9'인 사원의 사번, 사원명, 부서코드 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D6'
OR DEPT_CODE = 'D9';

▶ SELECT _ 컬럼명 BETWEEN A AND B : 컬럼값이 A 이상 B 이하인 경우 

  • EX) EMP 테이블에서 급여가 300만원 이상, 500만원 이하인 직원의 사번, 이름, 급여 조회
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 3000000 AND 5000000;
  • 컬럼명 NOT BETWEEN A AND B : 컬럼값이 A 이상 B 이하가 아닌 경우
                                                             = 컬럼값이 A 미만, B 초과인 경우
  • EX) EMP 테이블에서 급여가 300만원 미만, 500만원 초과인 직원의 사번, 이름, 급여 조회
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY NOT BETWEEN 3000000 AND 5000000;
  • BETWEEN을 이용한 날짜 비교
  • EX) EMP 테이블에서 입사일이 1990/01/01 ~ 1999/12/31( = 90년도 입사자 ) 직원의 사번, 이름, 입사일 조회
SELECT EMP_ID, EMP_NAME, HIRE_DATE
FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '1990/01/01' AND '1999/12/31';

※ 1990/01/01 날짜를 문자열 형식으로 작성하게 되면, DB가 알아서 판단하여 날짜타입(DATE)으로 형변환 진행

▶ SELECT _ LIKE

  • LIKE : 비교하려는 값이 특정한 패턴을 만족시키면 조회하는 연산자
  • [ 작성법 ]
    WHERE 컬럼명 LIKE '패턴'
  • LIKE 패턴(와일드 카드) : ' % ' (포함) ,  ' _ ' (글자 수)
  • % (포함)
    %A    : 문자열이 A로 끝나는 모든 컬럼값
    A%    : 문자열이 A로 시작하는 모든 컬럼값
    %A% : A가 포함된 문자열
  • _ (글자 수)
    A_     : A 뒤에 아무거나 한 글자
    ___A : A 앞에 아무거나 세 글자(4글자 문자열이면서   A로 끝나야 함)

  • EX) EMP 테이블에서 성이 '이'씨인 사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE
WHERE EMP_NAME = '이%';
  • EX) EMP 테이블에서 전화번호가 010으로 시작하지 않는 직원 조회
  • NOT LIKE (LIKE 결과 부정)
SELECT EMP_ID, EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';
  • EX) EMP 테이블에서 이메일에 _ 앞글자가 세 글자인 사원의 사번, 이름, 이메일 조회
SELECT EMP_ID, EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '___$_%' ESCAPE '$';

※ 와일드 카드 문자( _ )와 패턴에 사용된 일반 문자 ( _ )의 모양이 같아서 문제 발생
    → ESCAPE OPTION을 이용하여 일반 문자로 처리할 ' _ ', ' % ' 앞에 아무 특수문자나 붙임

  • 연산자 우선 순위
    1) 산술 연산자
    2) 연결 연산자 : ( | | )
    3) 비교 연산자
    4) IN NULL / IS NOT NULL / LIKE / IN / NOT IN
    5) BETWEEN AND / NOT BETWEEN AND
    6) NOT (논리 연산자)
    7) AND (논리 연산자)
    8) OR (논리 연산자)

▶ SELECT _ IN 연산자

  • IN 연산자 : 비교하려는 값과 목록에 작성된 값 중 일치하는 것이 있으면 조회하는 연산자
    → OR 연산을 연달아 작성한 효과
  • [ 작성법 ]
    컬럼명 IN (값1, 값2, 값3, ...)

  • EX) EMP 테이블에서 부서코드가 D1 또는 D6 또는 D9인 사원의 사번, 이름, 부서코드 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE
FROM EMDPLOYEE
WHERE DEPT_CODE IN ('D1', 'D6', 'D9');
  • EX) EMP 테이블에서 사번이 200, 205, 210이 아닌(NOT) 사원의 사번, 이름 조회
    → NOT IN
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE
WHERE EMP_ID NOT IN (200,'205',210); -- 숫자도 홑따옴표로 작성 가능

▶ SELECT _ 연결 연산자( | | )

  • 연결 연산자( | | ) : 여러 값을 하나의 컬럼값으로 연결하는 연산자 (자바의 문자열 이어쓰기 효과)
  • EX)
SELECT EMP_NAME || '의 급여는 ' || SALARY || '원 입니다.' AS 결과
FROM EMPLOYEE;

▶ SELECT _ NULL 처리 연산자

  • DB에서 NULL : 컬럼값이 없다.
    ※ JAVA에서 NULL : 참조하는 객체가 없다.
  • 1) IS NULL : 컬럼값이 NULL인 경우 조회
  • 2) IS NOT NULL : 컬럼값이 NULL이 아닌 경우 조회
  • [ 작성법 ]
    컬럼값 IN [NOT] NULL

  • EX) EMP 테이블에서 전화번호가 없는 사원의 사번, 이름, 전화번호 조회
SELECT EMP_ID, EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE IS NULL;
  • EX) EMP 테이블에서 보너스를 받은 사원의 이름, 보너스 조회
SELECT EMP_NAME, BONUS
FROM EMPLOYEE
WHERE BONUS IS NOT NULL;

▶ SELECT _ ORDER 절

  • ORDER절 : SELECT문의 조회 결과(RESULT SET)를 정렬할 때 작성하는 구문
  • ★ ★ ★ SELECT문 가장 마지막에 해석★ ★ ★
  • [ 해석순서 / 작성법 ]
    세 번째(3) : SELECT 컬럼명 AS 별칭, 컬럼명, 컬럼명,...
    첫 번째(1) : FROM 테이블명
    두 번째(2) : WHERE 조건식
    네 번째(4) : ORDER BY 컬럼명 | 별칭 | 컬럼순서 [정렬 방식(오름/내림)] [NULLS FIRST | LAST]

  • EX-1) EMP 테이블에서 급여 오름차순으로 이름, 급여 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
ORDER BY SALARY ASC; --ASCENT
-- ASC 생략 가능(ORDER BY 정렬 방식은 기본적으로 오름차순)

※ ASC 생략 가능 : ORDER BY 정렬방식은 기본적으로 오름차순
★ 정렬은 숫자, 문자, 날짜 모두 사용 가능 ★

  • EX-2) EMP 테이블에서 급여 내림차순으로 이름, 급여 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
ORDER BY SALARY DESC; -- DESCENT

  • EMP 테이블에서 보너스 정렬
SELECT EMP_NAME, BONUS
FROM EMPLOYEE
ORDER BY BONUS NULLS FIRST;

※ ORDER BY BONUS; : NULLS LAST 기본값
※ ORDER BY BONUS DESC; : NULLS FIRST 기본값

  • 정렬 중첩 ( 큰 분류를 먼저 정렬하고, 내부에 작은 분류를 정렬 )
  • EX) EMP 테이블에서 부서코드 오름차순 정렬 후 부서별 급여 내림차순 정렬
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
ORDER BY DEPT_CODE, SALARY DESC;

※ 오름차순(ASC) 기본값이라서 생략 가능

 

'SQL > 기본 개념' 카테고리의 다른 글

JOIN  (0) 2024.12.16
GROUP BY / HAVING  (0) 2024.12.16
그룹(GROUP) 함수  (0) 2024.12.16
함수  (0) 2024.12.16
Database 개요  (0) 2024.12.16