D01-DB 오라클 Select절

jin·2022년 8월 19일
0

Select문

1. Select 정의와 기본 형식

(1) 정의
데이터베이스에 보관되어 있는 데이터 조회
(2) 기본 형식
SELECT [열 이름]
FROM [테이블 이름];

-- [실습 1-1] EMP 테이블 전체 열 조회하기
Select * From emp;
-- [실습 1-2] 열을 쉼표로 구분하여 출력하기
Select ename, empno From emp;

2. 컬럼 중복 제거 DISTINCT

(1) 정의
데이터의 중복을 제거

-- [실습 2-1] 중복없이 부서번호만 출력하기
Select distinct deptno From emp;
-- [실습 2-2] 중복없이 직책과 부서번호 출력하기
Select distinct deptno, job From emp; -- distinct는 한번만

3. 별칭 설정하기 alias

(1) 정의
본래 열 이름 대신 붙이는 이름을 별칭(alias)이라고 한다.

-- [실습 3-1] 별칭을 사용하여 사원의 연간 총 수입 출력하기
Select sal*12+nvl(comm, 0) as allsal From emp;

as는 생략 가능, 컬럼을 소문자로 지정하고 싶으면 컬럼명 as 'test'로 사용

4. 정렬 - Order by

(1) 정의
어떤 기준으로 데이터를 정렬
(2) 기본 형식
SELECT [열 이름]
FROM [테이블 이름]
(그 밖의 절)
ORDER BY [정렬하려는 열 이름][정렬 옵션];
(3) 정렬 옵션을 지정하지 않을 경우 기본값으로 오름차순(ASC)이 설정된다.
(4) 오름차순(ASC, ascending), 내림차순(DESC, descending)

-- [실습 4-1] EMP 테이블의 모든 열을 급여 기준으로 오름차순 정렬하기
Select * From emp
Order by sal asc;
-- [실습 4-2] EMP 테이블의 모든 열을 급여 기준으로 내림차순 정렬하기
Select * From emp
Order by sal desc;
--[실습 4-3] EMP 테이블의 전체 열을 부서 번호(오름차순)와 급여(내림차순)로 정렬하기
Select * From emp
Order by deptno asc, sal desc;

1~4까지의 개념을 토대로 한 문제들

-- [문제 4-1] EMP 테이블에서 사원 번호와 부서 번호만 조회하기
Select empno, ename From emp;
-- [문제 4-2] EMP 테이블의 JOB열 데이터를 중복 없이 출력하기
Select distinct job From emp;
-- [문제 4-3] EMP 테이블의 모든 열을 사원 번호 기준으로 오름차순 정렬하기
Select * From emp
Order by empno asc;
-- [문제 4-4] EMP 테이블의 모든 열을 사원 번호 기준으로 내림차순 정렬하기
Select * From emp
Order by empno desc;
-- [문제 4-5] 다음의 모든 조건을 만족하는 SQL문 작성하기
-- [조건 4-1] 조회할 테이블은 EMP 테이블이며 모든 열을 출력한다.
-- [조건 4-2] 출력되는 열의 별칭은 다음과 같다.
--          EMPNO열      ▶ EMPLOYEE_NO
--          ENAME 열     ▶ EMPLOYEE_NAME
--          MGR열        ▶ MANAGER
--          SAL열        ▶ SALARY
--          COMM열       ▶ COMMISSION
--          DEPTNO열     ▶ DEPARTMENT_NO
-- [조건 4-3] 부서 번호를 기준으로 내림차순으로 정렬하되 부서 번호가 같다면 사원 이름을 기준으로 오름차순 정렬한다.
Select empno as "EMPLOYEE_NO",
	ename AS "EMPLOYEE_NAME",
	mgr AS "MANAGER",
	sal AS "SALARY",
	comm AS "COMMISION",
	deptno AS "DEPTATMENT_NO"
From emp
Order by deptno desc, ename asc;

5. Where절

(1) 정의
많은 데이터 중에서 어떤 조건에 일치하는 행만을 골라내어 조회하는데 사용
(2) 기본 형식
SELECT [조회할 열1 이름], [열2 이름], ..., [열N 이름]
FROM [조회할 테이블 이름]
WHERE [조회할 행을 선별하기 위한 조건식];

-- [실습 1-1] EMP 테이블의 모든 열 출력하기
Select * From emp;    
-- [실습 1-2] 부서 번호가 30인 데이터만 출력하기
Select * From emp
Where deptno = 30;
-- [실습 2-1] 부서번호가 30이고, 직책이 SALESMAN인 회원정보 출력하기
Select * From emp
Where deptno = 30
	and job = 'SALESMAN';
-- [실습 2-2] 부서번호가 30이거나 직책이 CLERK인 회원정보 출력하기
Select * From emp
Where deptno = 30
	and job = 'CLERK';
-- [실습 2-3] 연봉이 36000인 회원정보 출력하기
Select * From emp
Where sal*12 = 36000;
-- [실습 2-4] 급여가 3000이상인 회원정보 출력하기
Select * From emp
Where sal >= 3000;

6. 연산자

(1) 논리 연산자 : AND, OR
(2) 산술 연산자 : +, -, *, /
(3) 비교 연산자 : >, >=, <, <=, 같다(=), 다르다(!=, <>, ^=)
(4) 논리 부정 연산자 : NOT
(5) IN 연산자
1) 정의
특정 열에 해당하는 조건을 여러 개 지정할 때 사용
2) 기본 형식
SELECT [조회할 열1 이름], [열2 이름], ..., [열N 이름]
FROM [조회할 테이블 이름]
WHERE 열 이름 IN (데이터1, 데이터2, ..., 데이터N);
(6) BETWEEN 최소값 AND 최대값 연산자

-- [개념 2-5] (문자)대소 비교 연산자(비교 문자열이 문자 하나일 때)
-- [실습 2-4] 사원 이름의 첫 문자가 F와 같거나 F보다 뒤에 있는 회원정보 출력하기
Select * From emp
Where ename >= 'F';
-- [개념 2-6] (문자)대소 비교 연산자(비교 문자열이 문자 여러 개일 때)
-- [실습 2-6] 사원 이름에 FORZ를 포함한 문자열보다 알파벳 순서로 앞에 있는 회원정보 출력하기
Select * From emp
Where ename >= 'FROZ';
-- [실습 2-7] 급여가 3000이 아닌 회원정보 출력하기
Select * From emp
Where sal != 3000;
-- [실습 2-9] 직책이 MANAGER 이거나 SALESMAN 이거나 CLERK인 사원정보 출력하기
-- [방법 2-9-1]
Select * From emp
Where job in ('MANAGER', 'SALESMAN', 'CLERK');
-- [방법 2-9-2]
Select * From emp
Where job = 'MANAGER'
	or job = 'SALESMAN'
	or job = 'CLERK';  
-- [실습 2-10] 직책이 MANAGER도 아니고 SALESMAN도 아니고 CLERK도 아닌 사원정도 출력하기
-- [방법 2-10-1]
Select * From emp
Where job != 'MANAGER'
	and job != 'SALESMAN'
	and job != 'CLERK';
-- [방법 2-10-1]
Select * From emp
Where job not in ('MANAGER', 'SALESMAN', 'CLERK');
-- [방법 2-11-1]
Select * From emp
Where sal >= 2000 and sal <= 3000;
-- [방법 2-11-2]
Select * From emp
Where sal between 2000 and 3000;
-- [실습 2-12] 사원의 급여가 2000 미만이고 3000 초과하는 사원정보 출력하기
-- [방법 2-12-1]
Select * From emp
Where sal < 2000 or sal > 3000;
-- [방법 2-12-2]
Select * From emp
Where sal not between 2000 and 3000;

7. LIKE 연산자와 와일드 카드(wild card)

-- [실습 3-1] 사원의 이름이 대문자 S로 시작하는 데이터 조회
Select * From emp
Where ename like 'S%';
-- [실습 3-2] 사원 이름의 두 번째 글자가 L인 사원만 출력
Select * From emp
Where ename like '_L%';
-- [실습 3-3] 사원 이름에 AM이 포함되어 있는 사원만 출력
Select * From emp
Where ename like '%AM%';
-- [실습 3-4] 사원 이름에 AM이 포함되어 있지 않은 사원만 출력
Select * From emp
Where ename not like '%AM%';

8. IS NULL 연산자

(1) 정의
특정 열 또는 연산의 결과 값이 NULL인지 여부를 확인하기 위한 연산자
(2) NULL은 산술 또는 비교 연산자와 비교해도 결과 값이 NULL이다.
NULL + 100 = NULL
NULL > 100 = NULL

-- [실습 4-1] 추가수당이 NULL인 사원 출력하기
Select * From emp
Where comm is null;
-- [실습 4-2] 직속 상관이 있는 사원 데이터만 출력하기
-- 직속 상관이 있는 사원은 상급자 사원번호(MGR)가 담겨 있다.
Select * From emp
Where mgr is not null;

5~8까지의 개념 종합 문제

-- [문제 5-1] 사원 번호가 7782인 사원정보만 출력하기
Select * From emp
Where empno = 7782;
-- [문제 5-2] 사원 번호가 7499이고 부서 번호가 30인 사원정보만 출력하기
Select * From emp
Where empno = 7499 and deptno = 30;
-- [문제 5-3] 부서 번호가 20이거나 직업이 SALESMAN인 사원정보만 출력하기
Select * From emp
Where deptno = 20 or job = 'SALESMAN';
-- [문제 5-4] 급여가 2500 이상이고 직업이 ANALYST인 사원정보만 출력하기
Select * From emp
Where sal >= 2500 and job = 'ANALYST';
-- [문제 5-5] 부서 번호가 10, 20번인 사원정보만 출력하기
Select * From emp
Where deptno in (10, 20);
-- [문제 5-6] 사원 이름이 s로 끝나는 사원 데이터를 모두 출력하기
Select * From emp
Where ename like '%S';
-- [문제 5-7] 부서번호가 30번인 사원 중에 직책이 SALESMAN인 사원의
-- 사원번호, 이름, 직책, 급여, 부서번호를 출력하기
Select empno, ename, job, sal, deptno
From emp
Where deptno = 30 and job = 'SALESMAN';
-- [문제 5-8] 20번, 30번 부서에 근무하고 있는 사원 중 급여가 2000 초과인 사원을 출력하시오.
Select * From emp
Where deptno in (20, 30) and sal > 2000;
-- [문제 5-9] 급여가 2000이상 3000이하 범위 이외의 값을 가진 사원정보만 출력하기
Select * From emp
Where sal not between 2000 and 3000;
-- [문제 5-10] 사원 이름에 E가 포함되어 있는 30번 부서의 사원 중
-- 급여가 1000 ~ 2000 사이가 아닌 사원이름, 사원번호, 급여, 부서번호를 출력하기
Select ename, empno, sal, deptno
From emp
Where ename like '%E%'
	and deptno = 30
	and sal not between 1000 and 2000;
-- [문제 5-11] 추가 수당이 존재하지 않고 상급자가 있고 직책이 MANAGER, CLERK인 사원 중에서
-- 사원 이름의 두 번째 글자가 L이 아닌 사원의 정보를 출력하기
Select * From emp
Where comm is null and mgr is not null
	and job in ('MANAGER', 'CLERK')
	and ename not like ('_L%');

9. GROUP BY절과 그룹함수

Group함수

(1) 정의 : 여러 행을 바탕으로 하나의 결과 값을 도출해내기 위해 사용하는 함수
(2) 자주 사용하는 그룹 함수
1) SUM : 합
2) COUNT : 개수
3) MAX : 최대값
4) MIN : 최소값
5) AVG : 평균값

-- [실습 1-1] 모든 사원들의 급여 합계 출력하기
Select sum(sal) From emp;
-- [실습 1-2] 모든 사원들의 추가 수당 합계 구하기
--Select sum(nvl(comm, 0)) From emp;
Select sum(comm) From emp;
-- [개념 1-3] 그룹 함수를 사용한 SELECT절에는 기본적으로
-- 여러 행이 결과로 나올 수 있는 열을 함께 사용할 수 없다.
-- 즉 다음과 같은 SELECT문은 실행되지 못하고 오류가 발생한다. 
-- [실습 1-3] 모든 사원들의 이름과 급여 합계 출력하기 (오류발생 : ORA-00937)
Select ename, sum(sal) From emp;    
-- [개념 2-1] COUNT 함수에 *을 사용하면 SELECT문의 결과 값으로 나온 행의 개수를 반환해 준다.
-- [실습 2-1] EMP 테이블의 개수 출력하기
Select count(*) From emp;
-- [개념 2-2] COUNT 함수와 생략 가능 옵션 DISTINCT 사용하기
-- [실습 2-2] 전체 부서번호의 개수 출력하기(단, 중복 제거)
Select count(distinct  deptno) From emp;
-- [개념 2-3] COUNT함수는 NULL 데이터를 제외하고 개수를 구한다.
-- [실습 2-3] 추가 수당을 받는 사원의 수 출력하기
Select count(comm) From emp;
-- [개념 3-1] MAX 함수 사용하기
-- [실습 3-1] 부서 번호가 10번이 사원들 중 최대 급여 출력하기
Select max(sal) From emp
Where deptno = 10;
-- [개념 3-2] MIN 함수 사용하기
-- [실습 3-2] 부서 번호가 10번인 사원들 중 최소 급여 출력하기
Select min(sal) From emp
Where deptno = 10;
-- [개념 3-3] 오라클 데이터베이스에서는 날짜 및 문자 데이터 역시 크기 비교가 가능하다.
-- [실습 3-3-1] 부서 번호가 20번인 사원들 중 제일 최근 입사일 출력하기
Select max(hiredate) From emp
Where deptno = 20;
-- [실습 3-3-2] 부서 번호가 20번인 사원들 중 입사일이 제일 오래된 입사일 출력하기
Select min(hiredate) From emp
Where deptno = 20;
-- [실습 3-3-3] 사원 이름이 알파벳 순으로 가장 앞글자와 뒷글자 이름 출력하기 
Select min(ename) ,max(ename) From emp;
-- [개념 4-1] AVG 함수 사용하기
-- [실습 4-1] 부서 번호가 30번인 사원들의 평균 급여 출력하기
Select avg(sal) From emp
Where deptno = 30;

Group by

(1) 정의
여러 데이터에서 의미 있는 하나의 결과를
특정 열 값별로 묶어서 출력할 때 데이터를 '그룹화'한다고 표현한다.
예) 각 부서별 평균 급여 출력하기
(2) 기본 형식
SELECT [조회할 열1 이름], [조회할 열2 이름], ..., [열N 이름]
FROM [조회할 테이블 이름]
WHERE [조회할 행을 선별하는 조건식]
GROUP BY [그룹화할 열을 지정(여러개 지정 가능)]
ORDER BY 정렬하려는 열 지정 주의
GROUP BY 절에는 별칭이 인식되지 않는다.

-- [개념 1-1] GROUP BY절 사용하기
-- [실습 1-1] 각 부서별 평균 급여 출력하기
Select deptno, avg(sal) From emp
group by deptno;
-- [개념 1-2] GROUP BY절에 여러개 열을 지정할 수 있다.
-- [실습 1-2] 부서 번호 및 직책별 평균 급여 출력하기
Select deptno, job, avg(sal) From emp
Group by deptno, job
Order by deptno asc, job asc; 
-- [개념 1-3] GROUP BY 절을 사용할 때 
-- 그룹 함수를 사용한 열 또는 GROUP BY 절에 명시한 열만 사용할 수 있다.
-- [실습 1-3] ENAME은 일반 열로 그룹화된 열의 데이터 수와 일치하지 않는다.(오류발생 : ORA-00937)
Select deptno, ename, avg(sal) From emp
Group by deptno;

10. HAVING절

(1) 정의
GROUP BY절을 통해 그룹화된 결과 값의 범위를 제한하는 데 사용한다.
(2) 기본 형식
SELECT [조회할 열1 이름], [조회할 열2 이름], ..., [열N 이름]
FROM [조회할 테이블 이름]
WHERE [조회할 행을 선별하는 조건식]
GROUP BY [그룹화할 열을 지정(여러개 지정 가능)]
HAVING [출력 그룹을 제한하는 조건식]
ORDER BY 정렬하려는 열 지정 주의
WHERE절은 출력 대상 행을 제한하고,
HAVING절은 그룹화된 대상을 출력에서 제한하기 위해 쓰인다.

-- [개념 2-1] GROUP BY절과 HAVING절 사용하기
-- [실습 2-1] 평균 급여가 2000이 넘는 사원의 부서번호, 직책, 평균 급여 출력하기
Select deptno, job, avg(sal) From emp
Group by deptno, job
Having avg(sal) > 2000;
-- [개념 2-2] HAVING절 대신 WHERE절을 잘못 사용했을 경우
-- [실습 2-2] WHERE 절에서는 그룹함수를 통해 조건식을 지정할 수 없다.(오류발생)
Select deptno, job, avg(sal) From emp
Where avg(sal) >= 2000 -- 에러,  그룹함수 조건은 having절에서 사용해야함
Group by deptno, job;
-- [개념 2-3] WHERE절과 HAVING절을 모두 사용한 경우
-- [실습 2-3] 급여가 3000 이하인 사원들 중에 평균 급여가 2000이상인 사원의
--           부서번호, 직책, 평균 급여 출력하기
Select deptno, job, avg(sal) From emp
Where sal <= 3000
Group by deptno, job
Having avg(sal) >= 2000
Order by deptno asc, job asc;

0개의 댓글