select 컬럼명 from 테이블명 [as 별칭]
select 컬럼명, 컬럼명 [, .....] => 조회할 컬럼 지정. *: 모든 컬럼
from 테이블명 => 조회할 테이블 지정.
컬럼명 [as 별칭] ==> 컬럼명에서 조회한 것을 별칭에 저장해서 보여준다.
- SQL: 대소문자 구분 안함. (값은 구분)
use hr; # hr 데이터 베이스를 사용
#emp테이블의 모든 칼럼의 모든 항목을 조회
select * from emp;
#emp테이블의 직원 ID(emp_id), 직원 이름 (emp_name), 업무(job) 컬럼의 값을 조회
select emp_id,
emp_name,
job
from emp;
```sql
## 연산자
> 산술 연산자
`- +, -, *, /, %, mod(나머지), div(몫)` - 30 div 5, 30 mod 5
- date/time/datetime
- +, - : 마지막 항목(date:일, time: 초, datetime: 초)의 값을 +/- => 계산 결과가 정수형으로 반환된다. (ex:20100102)
- 여러개 값을 합쳐 문자열로 반환
- `concat(값, 값, ...) ` => python의 join
- 피연산자가 null인경우 결과는 null
- 연산은 그 컬럼의 모든 값들에 일률적으로 적용된다.
- 같은 컬럼을 여러번 조회할 수 있다.
## select TODO
```sql
select emp_id as ID,
emp_name as 이름,
salary as 급여,
comm_pct as 커미션_PCT,
salary * comm_pct as "commission" -- 컬럼 * 컬럼 : 행별로 연산.
#2 . [as 별칭]: 테이블 값을 조회한 result set의 별칭
- select에서 나열되는 컬럼명은 중복되어도 된다 => 조회결과를 저장하는 result set이라는 임시테이블이 일시적으로 생성되는 것이기 때문에 그 테이블의 컬럼명을 지정하는 것
select salary , salary, salary * comm_pct from emp;
-- TODO: EMP 테이블의 업무(job)이 어떤 값들로 구성되었는지 조회 - 동일한 값은 하나씩만 조회되도록 처리
select * from emp;
select distinct job from EMP;
-- TODO: EMP 테이블에서 직원의 ID(emp_id), 이름(emp_name), 급여(salary), 커미션_PCT(comm_pct), 급여에 커미션_PCT를 곱한 값을 조회
select emp_id as ID,
emp_name as 이름,
salary as 급여,
comm_pct as 커미션_PCT,
salary * comm_pct as "commission" -- 컬럼 * 컬럼 : 행별로 연산
from EMP;
-- TODO: EMP 테이블에서 급여(salary)을 연봉으로 조회. (곱하기 12)
select salary *12 as "연봉"
from EMP;
--TODO: EMP 테이블에서 직원이름(emp_name)과 급여(salary)을 조회. 급여 앞에 $를 붙여 조회.
select emp_name as 직원이름 ,
concat('$',salary) as 급여
from EMP;
where 절은 행에 제약조건을 거는 것이고, order by절은 컬럼의 정렬기준(ASC,DESC)을 거는 것이다
SELECT 조회컬럼 [별칭][,조회컬럼,...]
FROM 테이블이름 [별칭][WHERE 제약조건]
[GROUP BY 그룹화할 기준컬럼 ][HAVING 조건]
[ORDER BY 정렬기준컬럼 [ASC |DESC]]
WHERE절 검색조건 주요 연산자
- =, <> (!=)⭐, >, <, >=, <=
= :같은 것 조회 , != 같지 않은 것 조회 > : 큰 값들 조회 , < : 작은 값들 조회- BETWEEN a AND b | a이상 b이하 값 조회
- IN(list - 쉼표로 값들 구분) | 값 들중 하나와 일치하는 데이터 조회
- LIKE
- IS NULL ⭐ | NULL 값을 가진 데이터를 조회
- NOT BETWEEN a AND b | a미만 b 초과 값 조회
NOT IN (list) | list 값과 일치하지 않는 데이터를 조회
NOT LIKE | 문자 형태와 일치하지 않는 데이터를 조회
IS NOT NULL |
# where 절을 이용한 행 선택
-- EMP 테이블에서 직원_ID(emp_id)가 110인 직원의 이름(emp_name)과 부서명(dept_name)을 조회
-- -- 컬럼 : emp_name, dept_name -- 행 :emp_id = 110
select emp_name,
dept_name
from emp
where emp_id = 110; -- 조회 안될 시 빈표 출력
1) 데이터 베이스에서 EMP 테이블 존재하는지 확인 : from
2) emp_id = 110 인 행이 존재하는 지 위에서 부터 순차적으로 확인 : where
3) 해당 행의 emp_name, dept_name 값을 불러서 result set에 불러옴 : select
select * from emp; -- 테이블 전체 확인용
-- EMP 테이블에서 직원_ID(emp_id)가 110인 직원의 이름(emp_name)과 부서명(dept_name)을 조회
-- -- 컬럼 : emp_name, dept_name -- 행 :emp_id = 110
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';
-- where dept_name != 'Sales';
-- 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;
-- where comm_pct >= 0.2
-- and comm_pct <= 0.3;
-- 0.2 초과 0,3 이하 값 조건 => and 연산자 사용
-- where comm_pct between 0.20001 and 0.3;
-- 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; # comm_pct <0.2 or comm_pct > 0.3
-- EMP 테이블에서 업무(job)가 'IT_PROG' 거나 'ST_MAN' 인 직원의 ID(emp_id), 이름(emp_name), 업무(job)을 조회.
select emp_id,
emp_name,
job
from emp
where job in ('IT_PROG', 'ST_MAN');
-- where job = 'IT_PROG'
-- or job = 'IT_MAN';
-- EMP 테이블에서 업무(job)가 'IT_PROG' 나 'ST_MAN' 가 아닌 직원의 ID(emp_id), 이름(emp_name), 업무(job)을 조회.
select emp_id,
emp_name,
job
from emp
where job not in ('IT_PROG','ST_MAN');
-- where job <> 'IT_PROG'
-- and job <> 'ST_MAN';
-- EMP 테이블에서 직원 이름(emp_name)이 S로 시작하는 직원의 ID(emp_id), 이름(emp_name)을 조회.
select emp_id,
emp_name
from emp
where emp_name like 'S%'; -- S% = S[0개 이상의 모든 글자]
-- EMP 테이블에서 직원 이름(emp_name)이 S로 시작하지 않는 직원의 ID(emp_id), 이름(emp_name)을 조회
select emp_id,
emp_name
from emp
where emp_name not 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_name
from emp
where emp_name like '__e%'; -- '_' : 한개의 모든 글자
-- EMP 테이블에서 직원의 이름에 '%' 가 들어가는 직원의 ID(emp_id), 직원이름(emp_name) 조회
select emp_id,
emp_name
from emp
where emp_name like '%#%%' escape '#';
-- #%,#_
-- %나 _ 자체를 검색하는 문자(상수)로 사용할 경우. 특수문자%, 특수문자_ (특수문자는 escape 다음에 지정)
/*
XX로 시작하는지 : like 'XX%'
XX로 들어갔는지: like '%XX%'
XX로 끝나는지 : like '%XX'
글자수명시 -> '_' like '__AB__BB___가'
*/
-- 패턴 문자를 조회조건에서 사용해야하는 경우 escape 구문을 이용해 패턴문자를 검색문자로 표시하는 특수문자를 지정한다.
-- TODO: EMP 테이블에서 2007년 이후 입사한 직원들의 ID(emp_id), 이름(emp_name), 입사일(hire_date)을 조회.
-- 참고: date/datatime에서 년도만 추출: year(값). ex) year('2020-10-10') => 2020
-- year(now()), month(now()),day(now()) -- 현재 날짜 정보
select * from emp;
select emp_id,
emp_name,
hire_date
from emp
where year(hire_date) >= 2007;
-- TODO: EMP 테이블에서 2004년에 입사한 직원들의 ID(emp_id), 이름(emp_name), 입사일(hire_date)을 조회.
select * from emp;
select emp_id, emp_name, hire_date
from emp
where year(hire_date) = 2004;
-- where hire_date between '2004-01-01' and '2004-12-31';
or를 먼저 하려면 where 조건1 and (조건2 or 조건3)
-- EMP 테이블에서 업무(job)가 'SA_REP' 이고 급여(salary)가 $9,000인 직원의 직원의 ID(emp_id), 이름(emp_name), 업무(job), 급여(salary)를 조회.
-- 직원의 직원의 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 >= 8.000 ;
-- TODO: EMP 테이블에서 업무(job)에 'MAN'이 들어가는 직원들 중 급여(salary)가 $10,000 이하이 거나 2008년 이후 입사한
-- 직원의 ID(emp_id), 이름(emp_name), 업무(job), 입사일(hire_date), 급여(salary)를 조회
select emp_id, emp_name, job, hire_date, salary
from emp
where job like '%MAN%'
and (salary <= 10000
or year(hire_date) >= 2008);
- 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,
emp_name,
job,
salary
from emp
order by job asc, salary desc; -- emp_name desc;
-- 부서명을 부서명(dept_name)의 오름차순으로 정렬해 조회하시오.
select dept_name
from emp
order by dept_name; -- desc;
-- null은 가장 작은값(정렬에서).
select dept_name as "부서명"
from emp
order by 1; -- "부서명"
-- TODO: 급여(salary)가 $5,000을 넘는 직원의 ID(emp_id), 이름(emp_name), 급여(salary)를 급여가 높은 순서부터 조회
select emp_id, emp_name, salary
from emp
where salary > 5000
order by salary desc;