1. SQL 언어
SQL 개요
- 관계형 데이터베이스의 장점 중의 하나는 사용자들이 쉽게 사용할 수 있는 SQL(Structed Auery Language) 언어를 제공한다는 것이다.
- 사용자는 간단한 SQL문을 사용하여 DBMS에게 작업을 요청한다.
- 기본적인 SQL문들은 표준화되어 있기 때문에 거의 대부분의 DBMS 제품에 동일하게 적용된다.
- SQL 언어는 비절차적 언어이다. 따라서 사용자는 자신이 원하는 바 만을 명시하며, 원하는 바를 DBMS가 어떻게 처리할지는 명시할 필요가 없다. (**C나 Java와 같은 언어들이 절차적 언어이다.)
- SQL은 1974년 IBM 연구소에서 System R 프로젝트를 통해 개발되었고, 1986년 미국 표준기구 ANSI에서 SQL 표준을 제정하였다.
SQL의 두 가지 사용 방식
- 대화식 SQL
: DBMS 회사에서 제공하는 유틸리티 프로그램(예: ORACLE의 SQL*Plus)을 이용하여 사용자가 직접 SQL문을 입력하고 실행결과를 확인하는 방식 - 내장 SQL
: SQL문이 C, Java와 같은 프로그램 안에 포함되어져서 사용되는 방식
실습 테이블
2. SELECT
기본 문법
select <컬럼 이름>
from <테이블 이름>
where <검색 조건> ;
- 예시
select ename, sal
from emp
where empno = 7788;
- 모든 부서의 이름을 보이시오
select dname
from dept;
- 'SALES' 부서는 어느 지역에 있는가
select loc
from dept
where dname='SALES';
- 사원번호가 7369인 사원의 이름, 연봉, 담당 업무를 보이시오
select ename, sal, job
from emp
where empno = 7369;
- 담당업무 목록을 보이시오
- 중복 포함
select job
from emp;
- 중복 제거
select distinct job
from emp;
- 'SCOTT' 사원의 모든 정보를 보이시오
select *
from emp
where ename='SCOTT';
- 담당업무가 SALESMAN인 사원 중에 연봉을 1500보다 많이 받는 사람의 이름과 연봉을 보이시오
select ename, sal
from emp
where job='SALESMAN' and sal>1500;
- 담당업무가 CLERK이거나 연봉을 3000 이하로 받는 사람의 이름과 연봉, 담당업무를 보이시오
select ename, sal, job
from emp
where job='clerk' or sal<=3000;
비교 연산자 =, >, <, <=, >=, <>
- 같지 않다는 의미의 연산자는 <>이다.
- 값의 종류(자료형)에 따른 비교 연산자 적용
- 숫자형 : sal > 5000
- 문자형 : job <> 'clerk'
- 날짜형 : hiredate > '1981-05-01' - Null은 컬럼의 자료형에 상관없이 어디나 저장될 수 있다.
- comm is null
- comm is not null
조건절에 쓸 수 있는 연산자들
- 비교 연산자
- BETWEEN .. AND..
- NOT BETWEEN.. AND..
- IN ( , , )
- NOT IN ( , , )
- LIKE
- %
- _
- IS NULL
- IS NOT NULL
[실습과제1] SQL문 작성하기
3. 기본 함수
COUNT, MAX, MIN, AVG, SUM
IN, BETWEEN.. AND
LIKE
- 전체 사원은 모두 몇 명인가
select count(*) # count()는 튜플의 개수를 세는 것이다.
from emp;
select count(*) as no_of_emp # as는 임시로 컬럼 이름을 바꿔 보여준다
from emp;
- 가장 높은 연봉의 금액은 얼마인가
select max(sal)
from emp;
- 담당업무가 CLERK인 사원들의 연봉 합계를 보이시오
select avg(sal)
from emp
where job='clerk';
- 모든 사원들의 현재 연봉 금액과, 연봉을 10% 올렸을 때 금액을 보이시오
select sal, sal*1.1
from emp;
select sal as before_sal,
sal*1.1 as after_sal
from emp;
- 담당업무가 CLERK, ANALYST, SALESMAN 인 사원들의 이름, 담당업무, 급여를 보이시오
select ename, job, sal
from emp
where job in ('clerk', 'analyst', 'salesman');
- 연봉이 3000에서 4000 사이인 사원의 이름, 연봉을 보이시오
select ename, sal
from emp
where sal between 3000 and 4000;
- 사원 이름이 A로 시작하는 사원들의 이름을 보이시오
select ename
from emp
where ename like 'A%';
- 이름에 IN이 포함된 사원들의 이름을 보이시오
select ename
from emp
where ename like '%IN%';
- 이름의 세 번째 글자가 A인 사원들의 이름을 보이시오
select ename
from emp
where ename like '__A%';
[실습과제2] SQL문 작성하기
4. 정렬, 그룹
GROUP BY / ORDER BY / HAVING
ASC : 오름차순(기본) / DESC : 내림차순
- 사원들의 이름을 알파벳 순 (오름차순)으로 보이시오
select ename
from emp
order by ename;
- 사원들의 이름을 알파벳 역순 (내림차순)으로 보이시오
select ename
from emp
order by ename desc;
- 사원들의 부서 번호와 담당업무를 보이되 먼저 부서 번호로 정렬(오름차순)하고 부서 내에서는 담당업무명을 내림차순으로 정렬하시오 <<정렬 기준이 2개 이상인 경우>>
select deptno, job
from emp
order by deptno, job desc;
- 사원들의 담당업무 목록을 보이시오. (담당업무에는 어떤 것들이 있는지)
select distinct job
from emp;
- 각 담당업무별로 몇 명의 사원이 있는지 보이시오
select job, count(*)
from emp
group by job;
명령어 순서: where.. group by.. order by
- 담당업무와 담당업무별 인원수, 급여 합계를 보이되 PRESIDENT는 제외하시오. (담당업무별 인원수가 많은 순으로 출력하시오)
select job, count(*), sum(sal)
from emp
where job <> 'president'
group by job
order by count(*);
group by 사용 시, select 다음에 올 수 있는 것은
1. group by에 서술된 컬럼 이름
2. count, max, min, avg와 같은 집계 함수이다.
- 다음과 같은 코드는 에러는 없지만 의미 없는 결과를 도출한다.
select job, ename
from emp
group by job;
order by를 group by와 함께 사용하는 경우
ordery by 다음에 올 수 있는 것은 select에 있는 컬럼 이름이다.
- 아래의 코드 역시 에러는 없지만 의미 없는 결과를 도출한다.
select job, count(*), sum(sal)
from emp
group by job
order by hiredate, sal;
- 담당업무와 담당업무별 인원수, 연봉 합계를 보이되 PRESIDENT는 제외하시오. 그리고 급여 합계가 4000 이상인 경우만 보이시오. (담당업무별 인원수가 많은 순으로 출력하시오.)
select job, count(*), sum(sal)
from emp
where job <> 'president'
group by job
having sum(sal) >= 4000
order by count(*) desc;
having은 만들어진 그룹에 적용되는 조건을 지정할 때 사용
where은 각각의 행(row)에 적용되는 조건을 지정할 때 사용
[실습과제3] SQL문 작성하기