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;'Data_Analysis_Track_33 > SQL' 카테고리의 다른 글
| SQL_05(Foreign key, JOIN 이론) (0) | 2023.09.05 |
|---|---|
| SQL_04(집계함수, group by, having, with rollup, grouping) (0) | 2023.09.04 |
| SQL_03(함수) (0) | 2023.09.01 |
| SQL_01(테이블, SQL(DDL, DML, DCL)) (2) | 2023.08.30 |
| SQL_00(MySQL설치 및 설정, Database란?) (0) | 2023.08.30 |