기록공간

OracleSQL - SELECT 본문

DataBase/Oracle

OracleSQL - SELECT

입코딩 2020. 10. 4. 16:55
반응형

SELECT문은 테이블이나 뷰 내에 있는 데이터를 검색하기 위해서 사용하는 쿼리문이다. 기본적으로는 다음과 같이 사용한다. 

 

SELECT [찾을 속성 이름]
FROM [테이블 이름]

 

예를들어 다음과 같은 테이블을 생성하고 데이터를 추가했다고 해보자.

 

CREATE TABLE EMP
( EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY
, ENAME VARCHAR2(10)
, JOB VARCHAR2(9)
, MGR NUMBER(4)
, HIREDATE DATE
, SAL NUMBER(7,2)
, COMM NUMBER(7,2)
, DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT
);

--==>> Table EMP이(가) 생성되었습니다.


INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-7-1987','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-7-1987','dd-mm-yyyy'),1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);

--==>> 1 행 이(가) 삽입되었습니다. x 14

여기서 다음과 같이 쿼리문을 작성하면 테이블에 담긴 모든 데이터를 살펴볼 수 있다.

 

SELECT *   <-- '*'를 입력하면 모든 속성의 데이터를 출력한다.
FROM EMP;

여러개의 속성 데이터를 살펴보고 싶다면 다음과 같이 쿼리문을 작성하면 된다.

 

SELECT EMPNO, ENAME, JOB   <-- 보고 싶은 속성값만 입력한다.
FROM EMP;

 

SELECT의 추가적인 쿼리문과 순서

SELECT문은 여러 쿼리문을 추가적으로 선언하여 사용할 수 있다. 사용되는 쿼리문들과 그 쿼리문을 처리하는 순서는 다음과 같다.

 

SELECT [찾을 속성 이름]                        -> 5th
FROM [테이블 이름]                                 -> 1st
WHERE [찾을 데이터에 대한 조건]        -> 2nd
GROUP BY [어떻게 묶을 것인지]           -> 3rd
HAVING [GROUP BY에 대한 조건절]   -> 4th
ORDER BY [어떻게 정렬할 것인지]        -> 6th

 

WHERE

SELECT 쿼리문에 추가적으로 WHERE 조건문을 사용하는 경우 찾고자 하는 데이터만 골라서 찾을 수 있다. EMP 테이블 내에서 'SMITH'라는 이름의 사원에 대한 모든 데이터를 찾는 쿼리문은 다음과 같다.

 

SELECT * 
FROM EMP
WHERE ENAME = 'SMITH';

 

GROUP BY

GROUP BY 문을 추가적으로 사용하는 경우 데이터를 원하는 그룹으로 나눌 수 있다. 나누고자 하는 그룹의 속성명을 SELECT 절과 GROUP BY절 뒤에 추가하면 된다. 예를들어 EMP 테이블 내에 추가된 데이터들의 모든 직업명을 얻고 싶다면 다음과 같이 쿼리문을 작성하면 된다. 

 

SELECT JOB
FROM EMP
GROUP BY JOB;

 

HAVING

HAVING은 GROUP BY 절에서 묶는 것에 대한 조건문의 기능을 하는 쿼리문이다. 때문에 GROUP BY랑 항상 함께 써야 한다. 예를 들어 다음과 같이 EMP 테이블에 존재하는 각 직업을 가진 사람의 수를 구하는 쿼리문이 있다.

 

SELECT JOB, COUNT(JOB)
FROM EMP
GROUP BY JOB;

여기서 직업에 해당되는 사람이 3명이상인 직업만 뽑고 싶다면 다음과 같이 HAVING 을 사용해야 한다.

 

SELECT JOB, COUNT(JOB)
FROM EMP
GROUP BY JOB
HAVING COUNT(JOB) >= 3;

 

ORDER BY

ORDER BY는 가장 마지막에 실행되는 쿼리문으로 출력될 결과 데이터들을 특정 기준에 맞춰 정렬하는 기능을 한다. 예를 들어 사원 이름 순으로 EMP의 모든 데이터를 오름차순 정렬하면 다음과 같다.

 

SELECT *
FROM EMP
ORDER BY ENAME; --> 이름 사전순으로 오름차순 정렬 (만약 DESC를 뒤에 붙이면 내림차순)

 

DISTINCT

DISTINCT는 특정 컬럼에 있는 중복되는 값을 제거하여 검색하는 기능을 제공한다. 사용하는 방법은 다음과 같다.

 

SELECT DISTINCT [ 중복을 제거하고자 하는 컬럼이름, ... ] 
FROM [테이블 이름]
반응형
Comments