본문 바로가기

Data_Analysis_Track_33/SQL

SQL_02(SELECT, WHERE)

SELECT (조회)
• SELECT 기본구문
SELECT 조회컬럼 [별칭][, 조회컬럼,...]
FROM 테이블이름 [별칭]
[WHERE 제약조건]
[GROUP BY 그룹화할 기준컬럼]
[HAVING 조건]
[ORDER BY 정렬기준컬럼 [ASC | DESC]]


• 항목
– SELECT 절 : 조회할 컬럼들 지정. 모든 컬럼 조회시 *. 별칭(alias)–조회 결과의 컬럼명(별칭)
– FROM 절 : 조회대상 테이블이름. 별칭 – 테이블이름 대신 쿼리 내에서 사용할 별칭
– WHERE 절 : 조회할 행에 대한 선택 조건.
– GROUP BY 절 : 집계결과 조회시 어떤 컬럼의 값이 같은 것 끼리 묶어서 조회할지 지정
– HAVING 절 : 집계결과 조회 시 그 결과에 대한 조회조건을 넣는다.
– ORDER BY : 조회결과 정렬. (ASC:오름차순(Default), DESC내림차순)

• ex)
SELECT * FROM employee  -- employee 테이블의 모든 컬럼을 조회

SELECT department_name 부서명, location 위치
FROM department
WHERE location= ‘서울’ 
ORDER BY department_no DESC  -- department 테이블의 location 컬럼이 '서울'인 데이터들의 
                                                         -- department_name, location 컬럼을 각각 부서명, 위치라는 별칭으로 
                                                         -- department_no의 내림차순으로 조회

SELECT department_no, avg(salary)
FROM employee
GROUP BY department_no
HAVING avg(salary) > 30000000

-- employee 테이블의 같은 department_no를 가진 컬럼들의 salary의 평균이 30000000 넘는 경우
-- 그 department_no와 avg(salary)를 조회

연산자
▪ 컬럼이나 상수값에 사칙연산을 이용할 수 있다.
 – SELECT 조회 컬럼에 사용시 연산은 행 단위로 이루어진다.
 – 연산자
▪ +, -, *, /
▪ %, MOD : 나머지 연산자
▪ DIV: 몫 연산자
▪ 연산자 우선순위지정은 ( ) 로 묶는다.

WHERE 절에서 사용하는 검색 조건의 주요 연산자
연산자 설명
AND, OR 논리 연산자로 조건이 하나 이상일 경우 연결 연산자.
 - AND : 두 조건을 모두 만족하는 것. OR : 둘 중 하나만 만족하는 것
=, <> (!=), >, <, >=, <= 
 - = : 같은 것 조회, != 같지 않은 것 조회, > : 큰 값들 조회, < : 작은 값들 조회
BETWEEN a AND b 
 - a와b사이의 데이터를 조회(a, b값 포함)
IN (list)  
 - list의 값 중 어느 하나와 일치하는 데이터를 조회
LIKE 
 - 문자 형태로 부분일치하는 데이터를 조회 (%, _사용)
IS NULL 
 - NULL값을 가진 데이터를 조회
NOT BETWEEN a AND b 
 - a와b사이에 있지 않은 데이터를 조회(a, b값 포함하지 않음)
NOT IN (list) 
 - list의 값과 일치하지 않는 데이터를 조회
NOT LIKE 
 - 문자 형태와 일치하지 않는 데이터를 조회
IS NOT NULL 
 - NULL값을 갖지 않는 데이터를 조회

• where 절은 update, delete, select 에서 행을 선택할 때 사용한다. 
• 조건이 여러 개인 경우 and 나 or 로 연결한다. 
• 연산의 우선순위를 바꿀 경우 ( ) 를 사용한다.

 

예제를 시작하기 전에 예제에 사용될 데이터베이스와 테이블은 SQL_01_문제풀이(DB 생성 및 사용, select & distinct & concat) (tistory.com) 에서 확인할 수 있다. (주어진 Database와 Table 생성의 코드블록 활용)


예제 (WHERE 절)

 

/* *************************************
where 절을 이용한 행 선택 
************************************* */
-- EMP 테이블에서 직원_ID(emp_id)가 110인 직원의 이름(emp_name)과 부서명(dept_name)을 조회
select emp_name, dept_name from emp where emp_id = 110;
 
-- EMP 테이블에서 'Sales' 부서에 속하지 않은 직원들의 ID(emp_id), 이름(emp_name),  부서명(dept_name)을 조회.
select emp_id, emp_name, dept_name from emp where dept_name != 'Sales';
select emp_id, emp_name, dept_name from emp where dept_name <> 'Sales'; -- <> 가능


-- EMP 테이블에서 급여(salary)가 $10,000를 초과인 직원의 ID(emp_id), 이름(emp_name)과 급여(salary)를 조회
select emp_id, emp_name, salary from emp where salary > 10000;
 
-- EMP 테이블에서 커미션비율(comm_pct)이 0.2~0.3 사이인 직원의 ID(emp_id), 이름(emp_name), 커미션비율(comm_pct)을 조회.
select emp_id, emp_name, comm_pct from emp where comm_pct between 0.2 and 0.3;
-- 0.2와 0.3을 포함 시키고 싶지 않다면 between 0.200001 and 0.29999999 처럼 데이터들의 소수점 자리보다 크게 소수점 자리를 늘린다. 

-- EMP 테이블에서 커미션을 받는 직원들 중 커미션비율(comm_pct)이 0.2~0.3 사이가 아닌 직원의 ID(emp_id), 이름(emp_name), 커미션비율(comm_pct)을 조회.
select emp_id, emp_name, comm_pct from emp where comm_pct not between 0.2 and 0.3;

-- EMP 테이블에서 업무(job)가 'IT_PROG' 거나 'ST_MAN' 인 직원의  ID(emp_id), 이름(emp_name), 업무(job)을 조회.
select emp_id ID, emp_name 이름, job 업무 from emp where job = 'IT_PROG' or job = 'ST_MAN';
select emp_id ID, emp_name 이름, job 업무 from emp where job in ('IT_PROG', 'ST_MAN');

-- EMP 테이블에서 업무(job)가 'IT_PROG' 나 'ST_MAN' 가 아닌 직원의  ID(emp_id), 이름(emp_name), 업무(job)을 조회.
select emp_id ID, emp_name 이름, job 업무 from emp where job = 'IT_PROG' xor not job = 'ST_MAN';
-- xor 하나라도 만족하면 True이기에 둘다 만족시키지 않기 위해 where not을 붙였다.
select emp_id ID, emp_name 이름, job 업무 from emp where job not in ('IT_PROG', 'ST_MAN');

-- EMP 테이블에서 직원 이름(emp_name)이 S로 시작하는 직원의  ID(emp_id), 이름(emp_name)을 조회.
select emp_id, emp_name from emp where emp_name like 'S%'; -- % : 0개 이상의 모든 글자

-- EMP 테이블에서 직원 이름(emp_name)이 S로 시작하지 않는 직원의  ID(emp_id), 이름(emp_name)을 조회
select emp_id, emp_name from emp where not emp_name like 'S%';

-- EMP 테이블에서 직원 이름(emp_name)이 en으로 끝나는 직원의  ID(emp_id), 이름(emp_name)을 조회
select emp_id, emp_name from emp where emp_name like '%en';

-- EMP 테이블에서 직원 이름(emp_name)의 세 번째 문자가 “e”인 모든 사원의 이름을 조회
select emp_id, emp_name from emp where emp_name like '__e%';

-- EMP 테이블에서 직원의 이름에 '%' 가 들어가는 직원의 ID(emp_id), 직원이름(emp_name) 조회
-- 패턴문자를 조회조건에서 사용해야 하는 경우 escape 구문을 이용해 패턴문자를 검색문자로 표시하는 특수문자를 지정한다.
select emp_id, emp_name from emp where emp_name like '%\%%'; -- escape defalut 값 -> \
select emp_id, emp_name from emp where emp_name like '%#%%' escape '#'; -- %나 _ 자체를 검색하는 문자(상수)로 사용할 경우, 특수문자%, 특수문자_. 특수문자는 escape로 지정할 수 있다.

/*
XX로 시작하는지 : like 'XX%', XX가 들어갔는지 : like '%XX%', XX로 끝나는지 : '%XX', 글자수명시 -> 글자수만큼 _ 사용
*/

-- EMP 테이블에서 부서명(dept_name)이 null인 직원의 ID(emp_id), 이름(emp_name), 부서명(dept_name)을 조회.
select emp_id, emp_name, dept_name from emp where dept_name is null;

-- 부서명(dept_name) 이 NULL이 아닌 직원의 ID(emp_id), 이름(emp_name), 부서명(dept_name) 조회
select emp_id, emp_name, dept_name from emp where dept_name is not null;

예제 (WHERE 조건이 여러개인 경우 AND, OR)

 

/* *************************************
 WHERE 조건이 여러개인 경우
 AND OR
 
 참 and 참 -> 참: 조회 결과 행
 거짓 or 거짓 -> 거짓: 조회 결과 행이 아님.
 
 연산 우선순위 : and > or
 
 where 조건1 and 조건2 or 조건3
 1. 조건 1 and 조건2
 2. 1결과 or 조건3
 
 or를 먼저 하려면 where 조건1 and (조건2 or 조건3)
 **************************************/
  
--  EMP 테이블에서 업무(job)가 'SA_REP' 이고 급여(salary)가 $9,000인 직원의 직원의 ID(emp_id), 이름(emp_name), 업무(job), 급여(salary)를 조회.
select emp_id, emp_name, job, salary from emp where job = 'SA_REP' and salary = 9000;

--  EMP 테이블에서 업무(job)가 'FI_ACCOUNT' 거나 급여(salary)가 $8,000 이상인 직원의 ID(emp_id), 이름(emp_name), 업무(job), 급여(salary)를 조회.
select emp_id, emp_name, job, salary from emp where job = 'FI_ACCOUNT' or salary >= 8000;

예제 (ORDER BY를 이용한 정렬)

 

/* *******************************************************************
order by를 이용한 정렬
- order by절은 select문의 마지막에 온다.
- order by 정렬기준컬럼 정렬방식 [, ...]
    - 정렬기준컬럼 지정 단위: 컬럼이름, 컬럼의순번(select절의 선언 순서)
     select salary, hire_date from emp ...
	 에서 salary 컬럼 기준 정렬을 설정할 경우. 
     order by salary 또는 1
    - 정렬방식
        - ASC : 오름차순, 기본방식(생략가능)
        - DESC : 내림차순
		
문자열 오름차순 : 숫자 -> 대문자 -> 소문자 -> 한글     
Date 오름차순 : 과거 -> 미래
null 오름차순 : null이 먼저 나온다.

ex)
order by salary asc, emp_id desc
- salary로 전체 정렬을 하고 salary가 같은 행은 emp_id로 정렬.
******************************************************************* */

--  직원들의 전체 정보를 직원 ID(emp_id)가 큰 순서대로 정렬해 조회
select * from emp order by emp_id desc;

--  직원들의 id(emp_id), 이름(emp_name), 업무(job), 급여(salary)를 
--  업무(job) 순서대로 (A -> Z) 조회하고 업무(job)가 같은 직원들은 급여(salary)가 높은 순서대로 2차 정렬해서 조회.
select emp_id id, emp_name 이름, job 업무, salary 급여 from emp order by job asc, salary desc; -- asc는 default여서 생략 가능하다.
select emp_id id, emp_name 이름, job 업무, salary 급여 from emp order by 3 asc, 4 desc; -- 3번째(job), 4번째(salary)


-- 부서명을 부서명(dept_name)의 오름차순으로 정렬해 조회하시오.
select dept_name from emp order by dept_name asc; -- null은 가장 작다.
select dept_name from emp order by 1 asc;