DB/SQL

DQL - SELECT

제주니어 2022. 8. 26. 22:07

1. SELECT

  • SELECT 문은 테이블에서 데이터를 조회하기 위한 SQL 구문이다.
  • SELECT 문을 사용하여 테이블의 특정 컬럼, 특정 행 또는 여러 테이블의 특정 컬럼과 행을 조회할 수 있다.
  • 데이터를 조회한 결과를 Result Set이라고 한다.
  • Result Set은 테이블 형태로 값을 반환하고 0개 이상의 행이 포함될 수 있다.
  • 모든 컬럼을 조회할 경우 컬럼명 대신 <*> 기호 사용할 수 있다.
-- 모든 컬럼 조회 시 컬럼 명 대신 '*' 기호 사용 가능
SELECT 컬럼 명 [, 컬럼명, ...]  
FROM 테이블 명 
WHERE 조건식
ORDER BY 컬럼명 | 별칭 | 컬럼 순번 [ASC/DESC] [NULLS FIRST | LAST];
-- EMPLOYEE 테이블에서 전체 사원들의 사원, 이름, 급여만 조회
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE;
    
-- 아래와 같이 쿼리는 대소문자를 가리지 않지만 관례상 대문자로 작성한다.    
select emp_id, emp_name, salary 
from employee;

1) 컬럼의 산술 연산

  • 컬럼 값에 대해 산술 연산한 결과를 조회할 수 있다.
SELECT EMP_NAME, 
       SALARY * 12, 
       (SALARY + (SALARY * BONUS)) * 12
FROM EMPLOYEE;
-- EMPLOYEE 테이블에서 직원명, 직원의 연봉 (연봉 = 급여 * 12) 조회
SELECT EMP_NAME, SALARY * 12
FROM EMPLOYEE;

-- EMPLOYEE 테이블에서 직원명, 급여, 연봉, 보너스가 포함된 연봉((급여 + (보너스 * 급여))*12) 조회
-- 산술 연산 중 NULL 값이 존재할 경우 산술 연산한 결과값은 무조건 NULL이다.
SELECT EMP_NAME, 
       SALARY * 12, 
       BONUS,
--   (SALARY + (SALARY * BONUS))*12
     (SALARY + (NVL(BONUS, 0) * SALARY))*12
FROM EMPLOYEE;

-- EMPLOYEE 테이블에서 직원명, 입사일, 근무일수
-- SYSDATE는 현재 날짜를 출력한다. 
SELECT SYSDATE
FROM DUAL;

-- DATE 타입도 연산이 가능하다.
SELECT EMP_NAME,  
       HIRE_DATE,
       SYSDATE - HIRE_DATE
FROM EMPLOYEE;

SELECT EMP_NAME,  
       HIRE_DATE,
       CEIL(SYSDATE - HIRE_DATE) -- CEIL : 매개값으로 전달되는 수를 올림하는 함수
FROM EMPLOYEE;

2) 컬럼 별칭

  • 조회된 컬럼명에 별칭을 지정할 수 있다.
  • 표현법: 컬럼 AS 별칭 / 컬럼 AS "별칭" / 컬럼 별칭 / 컬럼 "별칭”
  • 산술연산을 하게 되면 컬럼명이 지저분해진다. 이때 컬럼명에 별칭을 부여해서 깔끔하게 보여줄 수 있다.
  • 별칭을 지정할 때 띄어쓰기 혹은 특수문자가 별칭에 포함될 경우에는 반드시 큰따옴표(" ")로 감싸준다.
SELECT EMP_NAME AS 이름, 
       SALARY * 12 AS "연봉(원)", 
       (SALARY + (SALARY * BONUS)) * 12 "총 소득(원)"
FROM EMPLOYEE;
SELECT EMP_NAME AS 직원명,
       SALARY * 12 AS "연봉", 
     (SALARY + (BONUS * SALARY))*12 "총 소득(원)"
FROM EMPLOYEE;

3) 리터럴

  • 리터럴을 SELECT 절에 사용하면 테이블에 존재하는 데이터처럼 Result Set의 모든 행에 반복해서 표시된다.
  • 문자나 날짜 리터럴은 ' ' 기호를 사용한다.
SELECT EMP_NAME, '안녕하세요'
FROM EMPLOYEE;

SELECT EMP_ID,
       SALARY,
       '원' AS 단위
FROM EMPLOYEE;

2. DISTINCT

  • 컬럼에 포함된 데이터 중 중복 값을 제외하고 한 번씩만 표시하고자 할 때 사용한다.
  • SELECT 절에 한 번만 기술할 수 있다.
  • 컬럼이 여러 개이면 컬럼 값들이 모두 동일해야 중복 값으로 판단되어 중복이 제거된다.
-- SELECT 절에 한 번만 기술할 수 있다.
SELECT DISTINCT JOB_CODE
FROM EMPLOYEE
ORDER BY JOB_CODE; -- 오름차순
-- DISTINCT는 SELECT 절에 한 번만 기술할 수 있다. 
-- SELECT DISTINCT JOB_CODE, DISTINCT DEPT_CODE [ERROR]
SELECT DISTINCT JOB_CODE, DEPT_CODE
FROM EMPLOYEE
ORDER BY JOB_CODE;

3. WHERE

  • 테이블에서 데이터를 검색할 때 컬럼의 조건을 설정하여 조건을 만족하는 값을 가진 행을 조회할 수 있다.
SELECT EMP_NAME, 
       DEPT_CODE,
       SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D6';

다양한 연산자를 함께 사용하여 다양한 조건을 만족하는 행을 조회할 수 있다.

SELECT EMP_NAME, 
       DEPT_CODE,
       SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D6' AND SALARY > 2000000;
-- EMPLOYEE 테이블에서 부서 코드가 D9와 일치하는 사원들의 모든 컬럼 조회
SELECT * 
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9';

-- EMPLOYEE 테이블에서 부서 코드가 D9와 일치하는 사원들의 직원명, 부서 코드, 급여 조회
SELECT EMP_NAME, 
       DEPT_CODE, 
       SALARY
FROM EMPLOYEE
WHERE DEPT_CODE ='D9';

-- EMPLOYEE 테이블에서 부서 코드가 D9와 일치하는 않는 사원들의 사번, 직원명, 부서 코드 조회
SELECT EMP_ID,
       EMP_NAME,
       DEPT_CODE
FROM EMPLOYEE
-- WHERE DEPT_CODE != 'D9';
-- WHERE DEPT_CODE ^= 'D9';
WHERE DEPT_CODE <> 'D9';

-- EMPLOYEE 테이블에서 급여가 400만원 이상인 직원들의 직원명, 부서 코드, 급여 조회
SELECT EMP_NAME AS "직원명",
       DEPT_CODE AS "부서코드",
       SALARY AS "급여"
FROM EMPLOYEE
WHERE SALARY >= 4000000;

-- EMPLOYEE 테이블에서 재직 중인 직원들의 사번, 이름, 입사일을 조회
SELECT EMP_ID AS "사번",
       EMP_NAME AS "직원명",
       HIRE_DATE AS "입사일"
FROM EMPLOYEE
WHERE ENT_YN = 'N';
-- WHERE ENT_DATE IS NULL;

4. ORDER BY

SELECT 문으로 조회된 데이터를 정렬을 할 때 작성하는 구문이다.

SELECT 구문의 가장 마지막에 작성하며 가장 마지막에 실행된다.

  • ORDER BY 컬럼|별칭|컬럼 순번 [ASC|DESC] [NULLS FIRST|NULLS LAST];
  • ASC : 오름차순 정렬 (ASC, DESC 생략시 기본값)
  • DESC : 내림차순 정렬
  • NULLS FIRST : 정렬하고자 하는 컬럼 값에 NULL이 있는 경우 NULL 값을 맨 앞으로 정렬한다.
  • NULLS LAST : 정렬하고자 하는 컬럼 값에 NULL이 있는 경우 NULL 값을 맨 뒤로 정렬한다.
-- EMPLOYEE 테이블에서 BONUS로 오름차순 정렬
SELECT * 
FROM EMPLOYEE
--ORDER BY BONUS;
--ORDER BY BONUS ASC; -- 오름차순 정렬은 기본적은 NULLS LAST
--ORDER BY BONUS NULLS FIRST;
ORDER BY BONUS ASC NULLS FIRST;

-- EMPLOYEE 테이블에서 BONUS로 내림차순 정렬(단, BONUS 값이 일치할 경우에는 SALARY 가지고 오름차순 정렬)
SELECT * 
FROM EMPLOYEE
-- ORDER BY BONUS DESC; -- 내림차순의 정렬은 기본적으로 NULLS FIRST 
ORDER BY BONUS DESC NULLS LAST, SALARY; 
-- SALARY의 ASC는 생략 가능 - SALARY 가지고 오름차순 정렬
-- 정렬 기준 여러 개를 제시할 수 있다. 

-- EMPLOYEE 테이블에서 연봉별 내림차순으로 정렬된 직원들의 직원명, 연봉 조회
SELECT EMP_NAME AS "직원명", 
       SALARY * 12 AS "연봉"
FROM EMPLOYEE
--ORDER BY SALARY * 12 DESC;
--ORDER BY "연봉" DESC;
ORDER BY 2 DESC; -- 컬럼 순번으로 정렬 기준

 

 

 

* 위 내용은 KH 정보교육원 수업을 정리한 내용을 바탕으로 작성된 글입니다. *

'DB > SQL' 카테고리의 다른 글

INNER JOIN & OUTER JOIN  (0) 2022.09.01
GROUP BY & HAVING  (0) 2022.08.30
함수(FUNCTION)  (0) 2022.08.29
DQL - 연산자  (0) 2022.08.28
실습 환경 구축  (0) 2022.08.25