개요
RDBMS에서 주로 사용하는 조회문과 관련한 기본 문법을 다룹니다.
⚙ 테이블의 구조 보기
DESC dept;
결과
이름 널? 유형
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
👀 테이블 조회
SQL을 하면서 가장 많이 사용하는 절이다. SELECT는 일정한 기준 순서가 있다.
이 순서를 지키면서 작성하도록 하자.
SELECT 컬럼명
FROM 테이블명
WHERE 조건식
GROUP BY 컬럼명
ORDER BY 컬럼명1 [ASC|DESC], 컬럼명2 [ASC|DESC], 컬럼명3 [ASC|DESC] ...
테이블 조회 전체 조회하기*(Asterisk)
-- tab 테이블에 있는 모든 속성 조회
-- (row,record,tuple) 전부 가져옴
SELECT * FROM emp;
결과
7369 SMITH CLERK 7902 80/12/17 800 20
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
7566 JONES MANAGER 7839 81/04/02 2975 20
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7782 CLARK MANAGER 7839 81/06/09 2450 10
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7839 KING PRESIDENT 81/11/17 5000 10
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7876 ADAMS CLERK 7788 87/05/23 1100 20
7900 JAMES CLERK 7698 81/12/03 950 30
7902 FORD ANALYST 7566 81/12/03 3000 20
7934 MILLER CLERK 7782 82/01/23 1300 10
테이블 조회 중복은 제외하고 가져오기
DISTINCT로 중복을 제외하고 레코드를 가져올 수 있다.
-- 중복되는 것이 있는 경우 제외해서 선택할 수 있다.
-- DISTINCT 키워드 사용할 것
-- 실제 테이블에는 영향이 가지않는다.
SELECT DISTINCT job
from emp;
JOB
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST
테이블 조회 속성의 이름을 다시 정의해주기
테이블을 조회하다 보면 값을 다시 또 계산해줘야 하는 경우가 있다. 월급에서 12를 곱해서 연봉을 구하거나 하는 식이다. 월급 속성의 속성 명이 sal이고 sal * 12 로 연산을 했으면 속성은 sal * 12로 표시되어 읽기가 불편하다.
이럴 때 ALIAS 키워드로 별칭을 지어줄 수 있다.
AS를 써주어 사용한다.
SELECT ename, sal, sal * 12 AS "연봉"
FROM emp;
결과
ENAME SAL 연봉
SMITH 800 9600
ALLEN 1600 19200
WARD 1250 15000
JONES 2975 35700
MARTIN 1250 15000
BLAKE 2850 34200
CLARK 2450 29400
SCOTT 3000 36000
KING 5000 60000
TURNER 1500 18000
ADAMS 1100 13200
JAMES 950 11400
FORD 3000 36000
MILLER 1300 15600
테이블 조회 정렬하여 조회하기
그냥 SELECT * FROM 테이블 명으로 모든 테이블을 가져오는 경우 적절한 출력 기준이 없다. 데이터의 입력 순서대로 출력 된다고 하지만 그마저도 확실한 것은 아니다. 그래서 데이터를 조회할 때 정렬하여 조회하는 경우가 많다.
ORDER BY 기준속성1 [ASC,DESC], 기준속성2 [ASC,DESC]
ASC : 오름차순(생략 가능) DESC : 내림차순
--SELECT 속성명1,속성명2,속성명n...
--FROM 테이블명...
-- ORDER BY 정렬기준속성1 [ASC,DESC], 정렬기준속성2 [ASC,DESC]를 사용하여 정렬할 수 있다.
-- [ASC,DESC]
-- ASC : 오름차순
--
SELECT ename,sal
FROM emp
ORDER BY sal;
결과
ENAME SAL
SMITH 800
JAMES 950
ADAMS 1100
WARD 1250
MARTIN 1250
MILLER 1300
TURNER 1500
ALLEN 1600
CLARK 2450
BLAKE 2850
JONES 2975
SCOTT 3000
FORD 3000
KING 5000
테이블 조회 정렬하여 조회하기 (정렬 기준 2개)
정렬 기준을 2가지로 하여 작성할 수 있다.
deptno 부서 번호 → 월급
부서를 기준으로 먼저 정렬되고 월급을 기준으로 오름차순으로 출력한다.
-- 정렬 기준 2개를 작성할 수 있다.
SELECT empno,ename,job,deptno
FROM emp
ORDER BY deptno ASC, sal ASC;
결과
EMPNO ENAME JOB DEPTNO
7934 MILLER CLERK 10
7782 CLARK MANAGER 10
7839 KING PRESIDENT 10
7369 SMITH CLERK 20
7876 ADAMS CLERK 20
7566 JONES MANAGER 20
7788 SCOTT ANALYST 20
7902 FORD ANALYST 20
7900 JAMES CLERK 30
7654 MARTIN SALESMAN 30
7521 WARD SALESMAN 30
7844 TURNER SALESMAN 30
7499 ALLEN SALESMAN 30
7698 BLAKE MANAGER 30
테이블 조회 SELECT 절에 없는 컬럼으로 정렬
SELECT 절에 없는 컬럼, 즉 출력했을 때 보이지는 않지만 테이블에는 있는 속성으로도 정렬할 수 있다. 현재 oracle 예시 테이블에는 사번, 이름, 하는 일, 관리자, 입사일, 부서 번호 등이 있지만 부서 번호를 SELECT로 출력하지 않지만 SELECT로 다른 열을 정렬하여 테이블을 조회할 수 있다.
SELECT empno,ename,hiredate
FROM emp
ORDER BY deptno,ename;
결과
EMPNO ENAME HIREDATE
7782 CLARK 81/06/09
7839 KING 81/11/17
7934 MILLER 82/01/23
7876 ADAMS 87/05/23
7902 FORD 81/12/03
7566 JONES 81/04/02
7788 SCOTT 87/04/19
7369 SMITH 80/12/17
7499 ALLEN 81/02/20
7698 BLAKE 81/05/01
7900 JAMES 81/12/03
7654 MARTIN 81/09/28
7844 TURNER 81/09/08
7521 WARD 81/02/22
테이블 조회 조건을 정하여 제한하여 가져오기
조건을 걸어서 원하는 조건의 레코드만 조회할 수 있다.
SELECT 속성명
FROM 테이블명
WHERE 컬럼명 연산자 값 조건식 (TRUE,FALSE)
양식
SELECT 속성명
FROM 테이블명
WHERE 컬럼명 연산자 값 조건식 (TRUE,FALSE)
ORDER BY 속성명 [ASC,DESC]
부서 번호가 10인 레코드를 이름순으로 정렬하여 조회하기
SELECT empno,ename,job,mgr,deptno
FROM emp
WHERE deptno = 10
ORDER BY ename;
결과
EMPNO ENAME JOB MGR DEPTNO
7782 CLARK MANAGER 7839 10
7839 KING PRESIDENT 10
7934 MILLER CLERK 7782 10
테이블 조회 조건을 정하여 제한하여 가져오기 (조건 2개)
[OR,AND]를 통해서 2가지 이상의 조건을 작성할 수 있다.
코드 구조
SELECT 속성명
FROM 테이블명
WHERE 컬럼명 연산자 값 조건식 (TRUE,FALSE) [OR,AND]를 통해서 2가지 이상의 조건을 작성할 수 있다.
ORDER BY 속성명 [ASC,DESC]
연봉이 3000이상이고 부서 명이 20인 사람을 이름 순으로 정렬하여 가져오기
SELECT empno,ename,job,mgr,sal,deptno
FROM emp
WHERE sal >= 3000 AND deptno = 20
ORDER BY ename;
결과
EMPNO ENAME JOB MGR SAL DEPTNO
7902 FORD ANALYST 7566 3000 20
7788 SCOTT ANALYST 7566 3000 20
👿 ORACLE 문자열 관련 처리 메커니즘
1️⃣ **테이블에 들어있는 문자열**의 **대소문자 구분**을 철저히 한다.
2️⃣ 조건식이나 문자열 관련된 처리는 SINGLE QUOTATION MARK로 한다. ['SMITH']
📆 ORACLE 날짜 관련 처리 메커니즘
1️⃣ **테이블에 들어있는 날짜형식**을 철저히 지켜야 한다.
2️⃣ 조건식이나 날짜와 관련된 처리는 SINGLE QUOTATION MARK로 한다. ['SMITH']
테이블 조회 조건을 정하여 제한하여 가져오기 문자열형식
emp 테이블에는 SMITH라는 데이터가 이름으로 들어가 있다. 그래서 SELECT로 SMITH라는 이름을 가진 사원을 조회하려고한다.
SELECT *
FROM emp
WHERE ename = 'SMITH';
결과
EMPNO ENAME HIREDATE SAL DEPTNO
7369 SMITH 80/12/17 800 20
테이블 조회 조건을 정하여 제한하여 가져오기 날짜 형식
1980년 12월 17일에 입사한 사람을 조회하려고 한다.
방식 1
-- 날짜와 관련된 처리도 ' 홑따옴표로 해야한다.
SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE hiredate = '80/12/17'; -- '19801217'
방식 2
-- 날짜와 관련된 처리도 ' 홑따옴표로 해야한다.
SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE hiredate = '19801217';
출력
EMPNO ENAME HIREDATE SAL DEPTNO
7369 SMITH 80/12/17 800 20
상기 내용과 같이 날짜 형식을 지켜주면 된다.
테이블 조회 조건식 문자열의 대소 비교
emp 테이블에 BLAKE 라는 이름을 가진 사원이 있다.
안쓸거 같긴 한데 정리는 해두려고 적었다.
BLAKE는 BLA로 비교했을때 까지는 조회가 되었다.
--문자열 대소비교 가능 이름이 F보다 큰 사원
SELECT *
FROM emp
WHERE ename >= 'BLAL'
ORDER BY ename;
결과
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7782 CLARK MANAGER 7839 81/06/09 2450 10
7902 FORD ANALYST 7566 81/12/03 3000 20
7900 JAMES CLERK 7698 81/12/03 950 30
7566 JONES MANAGER 7839 81/04/02 2975 20
7839 KING PRESIDENT 81/11/17 5000 10
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7934 MILLER CLERK 7782 82/01/23 1300 10
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7369 SMITH CLERK 7902 80/12/17 800 20
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
테이블 조회 BETWEEN 연산자
expression [NOT] BETWEEN low AND high
BETWEEN연산자는 두가지 의 값을 비교하는 곳에 사용된다. ≥ ≤와 동일한 결과가 검색 되지만 특수한 경우가 아니라면 BETWEEN연산자를 사용할 것을 권장한다.
The low and high specify the lower and upper values of the range to test. The low and high values can be literals or expressions.
low와 high에 해당하는 값은 값이나 식이 올 수 있다.
테이블 조회 LIKE 활용한 와일드카드 패턴
expression [NOT] LIKE pattern [ESCAPE escape_characters]
expression : 열이름이나 식이 들어간다.
pattern : 찾을 문자열에 대한 패턴이나 식이들어간다 패턴에는 와일드 카드 문자가 포함된다 .
와일드 카드 문자는 다음과 같다.
% : 0개 이상의 문자 매칭
_ : 단일 문자 매칭 ,문자 1개 매칭
- % (percent) matches any string of zero or more characters.
- _ (underscore) matches any single character.
테이블 조회 [% 활용] 특정문자로 시작하는 이름 찾기
The following example uses the % wildcard to find the phones of contacts whose last names start with 'M':
사원 테이블에는 MARTIN, MILLER가 있다고 하자.
‘M’으로 시작하는 이름을 찾고 싶을 때 활용하는 방법은 다음과 같다.
SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE ename LIKE 'M%';
결과
EMPNO ENAME HIREDATE SAL DEPTNO
7654 MARTIN 81/09/28 1250 30
7934 MILLER 82/01/23 1300 10
테이블 조회 [% 활용] 특정문자로 끝나는 이름 찾기
사원 테이블에는 TURNER, MILLER, 등 ER로 이름이 끝나는 사람이 2명 있다.
‘ER’로 끝나는 이름을 찾고 싶을 때 활용하는 방법은 다음과 같다.
SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE ename LIKE'%ER';
결과
EMPNO ENAME HIREDATE SAL DEPTNO
7844 TURNER 81/09/08 1500 30
7934 MILLER 82/01/23 1300 10
테이블 조회 [% 활용] 특정문자가 포함된 이름 찾기
사원 테이블에는 SMITH,MARTIN,SCOTT,TURNER등 이름에 T가 포함된 사람이 4명이 있다.
특정 글자가 포함된 이름을 찾고 싶을 때의 방법은 다음과 같다.
SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE ename LIKE'%T%';
결과
EMPNO ENAME HIREDATE SAL DEPTNO
7369 SMITH 80/12/17 800 20
7654 MARTIN 81/09/28 1250 30
7788 SCOTT 87/04/19 3000 20
7844 TURNER 81/09/08 1500 30
테이블 조회 [ _ 활용] 특정 문자가 포함된 이름 찾기
이름이 두글자인 사원을 찾고싶다고 가정하자
_를 두번 사용해주면 된다.
SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE ename LIKE'__';
결과
EMPNO ENAME HIREDATE SAL DEPTNO
결과가 나타나지않음
테이블 조회 [ _ 활용] 특정 문자가 포함된 이름 찾기
_는 보통 글자수랑 관련하여 사용한다. 2글자인 이름, 4글자인 이름 등
뒤에서 A+두글자로 이름이 끝나는 사원을 찾고싶다고 가정하자
%A__를 사용해주면 된다.
SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE ename LIKE '%A__';
결과
EMPNO ENAME HIREDATE SAL DEPTNO
7521 WARD 81/02/22 1250 30
7698 BLAKE 81/05/01 2850 30
7782 CLARK 81/06/09 2450 10
7876 ADAMS 87/05/23 1100 20
테이블 조회 [NULL 조회]
이때 까지 정리한 연산자로는 NULL값을 조회할 수 가 없었다.
comm(커미션)이 0원인 사원을 조회하려면 NULL값으로 판단을 해주어야해서 NULL조회도 필요하다는 생각이 들었다.
테이블 조회 [NULL인 값 조회 하기]
SELECT empno,ename,hiredate,sal,deptno,comm
FROM emp
WHERE comm IS NULL;
결과
EMPNO ENAME HIREDATE SAL DEPTNO
7369 SMITH 80/12/17 800 20
7566 JONES 81/04/02 2975 20
7698 BLAKE 81/05/01 2850 30
7782 CLARK 81/06/09 2450 10
7788 SCOTT 87/04/19 3000 20
7839 KING 81/11/17 5000 10
7876 ADAMS 87/05/23 1100 20
7900 JAMES 81/12/03 950 30
7902 FORD 81/12/03 3000 20
7934 MILLER 82/01/23 1300 10
테이블 조회 [NULL이 아닌 값 조회 하기]
SELECT empno,ename,hiredate,sal,deptno,comm
FROM emp
WHERE comm IS NOT NULL;
결과
EMPNO ENAME HIREDATE SAL DEPTNO
7499 ALLEN 81/02/20 1600 30 300
7521 WARD 81/02/22 1250 30 500
7654 MARTIN 81/09/28 1250 30 1400
7844 TURNER 81/09/08 1500 30 0
테이블 조회 [집합 연산자]
쿼리문 컬럼의 타입과 갯수가 동일해야 한다. 꼭 이름이 같은 필요는 없다.
테이블 조회 [합집합 UNION]
- UNION : 중복을 제거한다.[데이터 베이스는 중복을 싫어하기 때문에 이걸 많이 사용할 듯]
- UNION ALL : 중복을 제거하지 않는다.
부서번호가 10이거나 20인 데이터들을 조회하시오. 단 UNION을 사용하여 조회하시오.
SELECT empno, ename,sal,deptno
FROM emp
WHERE deptno = 10
UNION
SELECT empno,ename,sal,deptno
FROM emp
WHERE deptno = 20;
결과
EMPNO ENAME SAL DEPTNO
7369 SMITH 800 20
7566 JONES 2975 20
7782 CLARK 2450 10
7788 SCOTT 3000 20
7839 KING 5000 10
7876 ADAMS 1100 20
7902 FORD 3000 20
7934 MILLER 1300 10
테이블 조회 [차집합 MINUS]
A-B = (A U B) - B
SELECT empno,ename,sal,deptno
FROM emp
MINUS
SELECT empno,ename,sal,deptno
FROM emp
WHERE deptno = 10
ORDER BY deptno, ename;
결과
EMPNO ENAME HIREDATE SAL DEPTNO
7876 ADAMS 1100 20
7902 FORD 3000 20
7566 JONES 2975 20
7788 SCOTT 3000 20
7369 SMITH 800 20
7499 ALLEN 1600 30
7698 BLAKE 2850 30
7900 JAMES 950 30
7654 MARTIN 1250 30
7844 TURNER 1500 30
7521 WARD 1250 30
테이블 조회 [교집합 INTERSECTION] INTERSECT키워드
양쪽 모두에서 포함된 행을 검색
INTERSECT
전체사원 테이블에서 deptno가 10인 사원을 가져오고 싶을 때 교집합도 활용할 수 있다.
원래라면 그냥 WHERE deptno = 10 으로해도 되지만 문법을 익힌다는 차원에서 한번 작성해보았다.
SELECT empno,ename,sal,deptno
FROM emp
INTERSECT
SELECT empno,ename,sal,deptno
FROM emp
WHERE deptno = 10
ORDER BY deptno, ename;
결과
EMPNO ENAME SAL DEPTNO
7782 CLARK 2450 10
7839 KING 5000 10
7934 MILLER 1300 10
'DataBase' 카테고리의 다른 글
| [Oracle] Oracle 문자열 관련 함수 정리 (0) | 2025.11.11 |
|---|