본문으로 바로가기

SELECT 문 / WHERE 절

category ORACLE 2019. 11. 14. 16:33

SELECT문


  • 테이블에 입력된 데이터 내용을 검색하고 싶을때 SELECT 문을 사용한다.
  • 불러온 table의 순서는 보장할 수 없다.
  • 원하는 row를 선택해서 불러 올 수 있다.
  • 반환되는 데이터의 종류에 따라서 3가지 처리 기능이 있다.

    (1) Selection 기능 : SELECT문요청시 테이블의 행(record)이 반환되는 기능

    (2) Projection 기능 : SELECT문 요청시 테이블의 열(column)이 반환되는 기능

    (3) Join 기능 : 여러 테이블에 공통적으로 존재하는 column을 사용하여 한꺼번에 서로다른 테이블에 저장된 데이터를 가져오는 기능
  • SELECT문의 결과도 하나의 TABLE이다.

 

실행 순서


5. SELECT : column 명

1. FROM : table 명

2. WHERE : 조건절. TRUE인 값만 출력한다. EX)비교 연산자

3. GROUP BY : column명

4. HAVING : 조건절

6. ORDER BY : coulmn명 [ASC|DESC] - 오름차순 또는 내림 차순

 

column 보기

// 모든 column 보기
SELECT * FROM 테이블명;

//특정 column 보기
SELECT column명1, column명2,... FROM 테이블명

 

산술연산자 사용

  • 산술연산자 : 더하기(+), 빼기(-), 나누기(/), 곱하기(*)
  • *, /연산자가 +, - 연산자보다 우선순위이다. 
    곱하기 보다 더하기를 먼저 연산하기 위해서는 괄호를 사용해준다.
 SELECT sal, sal*1.1 FROM emp WHERE DEPTNO=10;

 

별칭사용(Alias)

  • SELECT문의 결과가 출력될 때 column의 이름과 연산식이 column에 대한 헤딩으로 출력됨
    column명 자체가 변경되는 것은 아님
    (SELECT 문, WHERE절, INNER JOIN에 별칭 사용 가능)
  • AS는 생략가능하다.
  • 공백문자 또는 특수문자($, _, #)를 사용하기 위해서는 반드시 " "로 감싸주어야한다.
  • column명에 alias를 지정해 주었다면 column명 대신 alias를 사용할 수 있다.
    (단, ALIAS를 지정해 준 후 참조시에 실행순서를 반드시 확인해야한다.)
//employees 테이블의 last_name, salary, salary*12를 별칭을 사용하여 출력하는 문장
SELECT last_name as 이름, salary 월급, salary*12 as "연 봉" FROM employees;

//column명에 alias를 지정해 주었다면 column명 대신 alias를 사용할 수 있다.
  1  SELECT DEPTNO, ROUND(AVG(SAL)) avg_sal
  2  FROM EMP
  3  WHERE SAL>=2000
  4  GROUP BY DEPTNO
  5  ORDER BY avg_sal DESC

 

NULL

  • 데이터가 없는 경우 NULL값을 갖는다고 한다.
  • NULL은 값 자체가 없는 것이기 때문에 연산하거나 비교할 수 없다.
    만약 연산자를 사용했다면 항상 NULL값이 반환된다.

 

연결연산자 ( | | )

  • 문자열을 연결해서 하나의 데이터로 리턴한다.
  • 기존의 컬럼에 다른 컬럼값을 연결하거나 새로운 값을 추가할때 사용된다.
//문법
SELECT 컬럼명||컬럼명
FROM 테이블명;

//예시
SELECT ename||'의 직업은'||job||'입니다.' FROM emp;

 

DISTINCT

  • SELECT문 바로 뒤에 DISTINCT 키워드를 사용하면 중복되는 ROW를 제거 해주고, 오름차순으로 정렬한다.
  • DISTINCT 키워드 뒤에 여러개의 컬럼을 설정할 수 있다.
    이때는 모든 컬럼들이 DISTINCT의 영향을 받게 된다.
//문법
SELECT DISTINCT 컬럼명
FROM 테이블명;

 

 

WHERE 절 


  • ROW를 추려낼때 사용
  • 특정 조건에 일치하는 데이터를 조회하는 경우에 사용
  • FROM절 바로 다음에 사용됨.
SELECT column명 
FROM 테이블명 
WHERE 조건식;

 

연산자 우선 순위

연산자 우선 순위 설명
1 괄호( )
2 NOT 연산자
3 비교 연산자
4 AND 연산자
5 OR 연산자

 

비교연산자

연산자 설명
= 같다
!= , <> , ^= 같지 않다
> 보다 크다
>= 보다 크거나 같다
< 보다 작다
<= 보다 작거나 같다
//employees테이블에서 월급이 10000이상인 사원의 사원번호, 이름, 직업을 출력하세요\
SELECT '사원번호', '이름', '직업' 
FROM employees 
WHERE '월급'>=10000;

 

논리 연산자( AND / OR / NOT)

연산자 설명
AND

두 가지 조건을 모두 만족하는 데이터를 검색 

SELECT ename,sal FROM emp WHERE deptno=10 AND sal>=30;

OR

두 가지 조건 중에서 한가지만 만족하더라도 검색한다.

SELECT empno, deptno FROM emp WHERE job='SALESMAN' OR job='MANAGER';

NOT

지정된 조건이 아닌 데이터를 검색한다.

SELECT * FROM employees WHERE NOT employee_id=100;

 

IN 연산자

  • 하나의 값이 아닌 목록에 지정된 여러 개의 값을 한꺼번에 비교할 때 사용하는 연산자
  • 내부적으로 OR연산자로 실행된다.
WHERE 컬럼명 IN(값1,값2,...);

//OR 연산자 사용
SELECT deptno, ename, empno FROM emp WHERE deptno=10 OR deptno=20;

//IN 연산자 사용
SELECT deptno, ename, empno FROM emp WHERE deptno IN(10,20);

 

ANY 연산자

  • 조건을 비교할때 어느 하나라도 맞으면 true
WHERE 컬럼명 ANY(조건);

//OR 연산자를 이용한 데이터 검색
SELECT EMPNO, SAL FROM EMP WHERE SAL>1000 OR SAL>2000 OR SAL>3000;

//ANY 연산자를 이용한 데이터 검색
SELECT EMPNO, SAL FROM EMP WHERE SAL>ANY(1000,2000,3000);

 

ALL 연산자

  • 조건을 비교할때 조건이 모두 맞으면 true
WHERE 컬럼명 비교연산자 ALL(조건);

//AND 연산자로 작성
SELECT empno,sal FROM emp WHERE sal>1000 AND sal>2000 AND sal>3000;

//ALL 연산자로 작성
SELECT empno,sal FROM emp WHERE sal>ALL(1000,2000,3000);

 

BETWEEN a AND b

  • 특정한 두 값 사이의 범위 검색을 할 때 사용하는 연산자
  • a 이상 b 이하
WHERE 컬럼명 BETWEEN 값1 AND 값2;

//급여가 1000 과 2000 사이인 사원들의 사원번호,이름,급여를 출력하세요.
 
// AND 연산자와 비교 연산자로 검색하기
SELECT empno,ename,sal FROM emp WHERE sal>=1000 AND sal<=2000;

//BETWEEN a AND B 연산자로 출력하기
SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 1000 AND 2000;

 

IS NULL

  • NULL값을 가지고 있는 데이터를 검색할 때 사용하는 연산자
  • NULL값은 값이 없는 것을 의미하는 식별자이기 때문에 동등 연산자(=)로는 원하는 결과 값을 얻을 수 없다.
//커미션이 NULL 인 사원의 사원이름과 커미션을 출력해보세요
 SELECT ename,comm FROM emp WHERE comm IS NULL;

 

IS NOT NULL

  • NULL값이 아닌 데이터를 출력하는 경우
//커미션이 NULL 이 아닌 사원의 사원이름과 커미션을 출력해보세요
SELECT ename, comm FROM emp WHERE comm IS NOT NULL;

 

EXISTS

  • 검색한 데이터가 존재하면 TRUE값이 전달되고 데이터가 출력된다.
// 사원이름이 'FORD' 인 사원이 존재하면 사원의 이름과  커미션을 출력하기
SELECT ename,comm
FROM emp
WHERE EXISTS(SELECT ename 
		FROM emp 
             WHERE ename='FORD');

 

LIKE ( _ , %)  중요!

  • 문자열비교
  • 문자열 전체가 아닌 임의의 문자만 일치 하더라도 데이터 검색이 가능하게 해준다
  • 패턴값 위치에는 검색할 문자와 와일드카드(wild card) 문자를 조합하여 설정
//문법
WHERE 컬럼명 LIKE 패턴값

//사원이름이 'J' 로 시작하는 사원의 사원이름과 부서번호를 출력하기
 SELECT ename, deptno
 FROM emp
 WHERE ename LIKE 'J%'
 
 //사원이름에 'J' 가 포함된는 사원의 이름과 부서번호를 출력하기
 SELECT ename, deptno
 FROM emp
 WHERE ename LIKE '%J%';
 
 //사원이름의 두번째 글자가 'A' 인 사원의 이름,급여,입사일을 출력하기
 SELECT ename, sal, hiredate
 FROM emp
 WHERE ename LIKE '_A%';

 

 

 

ORDER BY절


  • 모든 데이터 타입(NUMBER, VARCHAR, DATE)을 오름차순과 내림차순으로 정렬할 수 있다.
  • ORDER BY절 다음에 정렬방식을 지정하지 않으면, default값은 오름차순이다. 
  • ORDER BY절 뒤에는 컬럼 alias 및 SELECT의 컬럼 순서값을 사용할 수 있다.

 

 

수치데이터 정렬


  • ASC : 오름차순 정렬 예)1~5/ㄱ,ㄴ,ㄷ/오래된 날짜~ 최근날짜
  • DESC : 내림차순 정렬 예)5~1 /ㄷ,ㄴ,ㄱ/최근날짜~오래된날짜
  • NULL 값은 가장 큰 값으로 처리된다.
SELECT column명1, column명2,...
FROM 테이블명
WHERE 조건식
ORDER BY column명 ASC|DESC;

다중데이터 정렬

 

첫번째 분류된 것을 기준으로 그룹화 하고 그 그룹 내에서 두번째 정렬기준으로 재정렬한다.

SELECTE job,sal FROM emp ORDER BY job ASC, sal DESC;

 

NULL값 정렬

  • NULL값은 가장 큰 값으로 처리한다.

 

 

 

 

 

 

 

 

문제.

emp 테이블에서 직업이 salesman인 사람들의 이름, 직업, 급여를 높은 급여순으로 출력해보세요.

select ename,job,sal from emp where job='SALESMAN' order by sal desc;

 

문제

emp테이블에서 입사일이 81/02/20인 사람들의 직원번호, 직원이름을 찾아보세요.

select empno,ename from emp where hiredate='81/02/20';

 

 

문제

emp 테이블에서 ename테이블명을 '사원 이름'으로 변경해보세요.

SELECT ename "사원 이름" FROM EMP;

 

문제 

EMP테이블에서 '사원 이름'을 다시 'ENAME'으로 변경해보세요

SELECT ename ENAME FROM emp;

 

문제.

emp 테이블에서 부서번호가 10번인 사원들의 급여를 출력하되 10%인상된 금액도 같이 출력해보세요.

SQL> SELECT sal, sal*1.1 "인상된 급여" from emp where deptno=10;

 

'ORACLE' 카테고리의 다른 글

DML / TCL  (0) 2019.11.15
DDL 명령어 / TABLE 객체 / ROWID / ROWNUM  (0) 2019.11.15
Data Base  (0) 2019.11.14
명령프롬프트 명령어  (0) 2019.11.14
Oracle 권한 부여 / 계정 만들기 / 재접속 / oracle에서 빠져나오기  (0) 2019.11.13