티스토리 뷰

반응형

오라클11g : 03. SELECT문으로 특정 데이터를 추출하기

쿼리문은 대소문자 구분을 안합니다!


데이터를 조회하기 위한 SELECT

데이터베이스로부터 정보를 검색할 수 있는 select 명령어

SELECT [DISTINCT] {*, column[Alias], . . .}
FROM 테이블명;
--DEPT 테이블의 모든 내용 출력
SELECT * FROM DEPT;

--EMP 테이블의 모든 내용 출력
select * from EMP;

칼럼 이름을 명시해서 특정 칼럼만 보기

--DEPT 테이블에서 부서번호(DEPTNO)와 부서명(DNAME)만 출력
select DEPTNO, DNAME from DEPT;

--EMP 테이블에서 사원의 이름(ENAME)과 급여(SAL)와 입사일자(HIREDATE)만 출력
select ENAME, SAL, HIREDATE from EMP;

칼럼 이름에 별칭 지정하기

칼럼을 기술한 바로 뒤에 AS라는 키워드를 쓴 후 별칭을 기술
별칭에 공백문자, $, _, # 등 특수 문자를 표현하고 싶거나 대소문자를 구별하고 싶으면 ""을 사용한다.
AS를 생략하고 ""를 사용하여 별칭부여가 가능하다.

--DEPT 테이블에서 부서번호를 DepartmentNo로, 부서명을 DepartmentName으로 별칭 지정
select DEPTNO as DepartmentNo,
       DNAME as DepartmentName
from DEPT;

--위의 결과를 "" 사용해서 별칭부여하기
select DEPTNO "Department No",
       DNAME "Department Name"
FROM DEPT;

--위의 결과를 한글로 별칭 부여하기
SELECT DEPTNO 부서번호,
       DNAME 부서명
FROM DEPT;

중복된 데이터를 한번씩만 출력하게 하는 DISTINCT

--중복된 데이터를 한번씩만 출력하게 하는 DISTINCT
select distinct JOB
from EMP;

--EMP 테이블에서 소속 부서번호를 출력하되, 중복되지 않고 한번씩 출력하기
select distinct DEPTNO
from EMP;

WHERE 조건과 비교 연산자

SELECT [DISTINCT] {*, column[Alias], . . .}
FROM 테이블명
WHERE 조건들;

 

비교 연산자

연산자 의미
= 같다.
> 보다 크다.
< 보다 작다.
>= 보다 크거나 같다.
<= 보다 작거나 같다.
<>, !=. ^= 같지 않다.
--EMP 테이블에서 전체 사원이 대상
SELECT EMPNO, ENAME, SAL
FROM EMP;

--급여를 3000 이상 받는 사원을 대상
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL>=3000;

--급여를 3000미만 받는 사원을 대상
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL<3000;

--EMP 테이블 중에서 부서번호(DEPTNO)가 10번인 사원에 관한 모든 정보 출력
SELECT * 
FROM EMP 
WHERE DEPTNO=10; 

--EMP 테이블 중에서 급여가 2000미만이 되는 사원의 사번,이름,급여 출력
SELECT EMPNO,ENAME,SAL 
FROM EMP 
WHERE SAL<2000;

문자 데이터 조회

문자 데이터는 반드시 단일 따옴표(' ') 안에 표시한다.
대소문자를 구분한다.

--EMP에서 이름이 'SCOTT'인 사원의 사원번호,사원이름,급여 출력
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE ENAME='SCOTT';

--EMP에서 이름이 'MILLER'인 사원의 사원번호,사원이름,직급 출력
SELECT EMPNO, ENAME,JOB
FROM EMP
WHERE ENAME='MILLER';

날짜 데이터 조회

날짜 데이터는 반드시 단일 따옴표(' ')안에 표시한다.
년/월/일 형식으로 기술한다.

--EMP 1982년 이후에 입사한 사원의 사원이름과 고용날짜 출력
SELECT ENAME,HIREDATE
FROM EMP
WHERE HIREDATE>='1982/01/01';

논리 연산자

AND 연산자

여러 조건을 모두 만족해야 할 경우 AND 연산자 사용

--EMP에서 부서번호가 10번이고 직급이 MANAGER인 사원의 이름,부서번호,직급 출력
SELECT ENAME, DEPTNO, JOB
FROM EMP
WHERE DEPTNO='10' AND JOB='MANAGER';

--급여가 1000에서 3000사이에 있는 사원
SELECT * 
FROM EMP
WHERE SAL>=1000 AND SAL<=3000;

OR 연산자

두 가지 조건 중에서 한 가지만 만족하더라도 검색할 수 있도록 하기 위해 OR 연산자 사용

--부서 번호가 10번이거나 직급이 MANAGER인 사원의 이름,부서번호,직급 출력
SELECT ENAME, DEPTNO, JOB
FROM EMP
WHERE DEPTNO='10' OR JOB='MANAGER';

--사원번호가 7844이거나 7654이거나 7521인 사원의 이름과 급여
SELECT ENAME,SAL
FROM EMP
WHERE EMPNO=7844 OR EMPNO=7654 OR EMPNO=7521;

NOT 연산자

반대되는 논리값 구한다.

--부서 번호가 10번이 아닌 사원
SELECT ENAME, DEPTNO, JOB
FROM EMP
WHERE NOT DEPTNO='10';

--직급이 MANAGER가 아닌 사원
SELECT ENAME, DEPTNO, JOB
FROM EMP
WHERE NOT JOB='MANAGER';

BETWEEN AND 연산자

특정 범위 내에 속하는 데이터를 알아보려고 할 때 사용함 

column_name BETWEEN A AND B
--급여가 1000에서 3000사이에 있는 사원
SELECT ENAME, DEPTNO, JOB
FROM EMP
WHERE SAL BETWEEN 1000 AND 3000;

--급여가 1500과 2500 사이인 사원의 사번, 이름, 급여 출력
SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE SAL BETWEEN 1500 AND 2500;

IN 연산자

동일한 칼럼이 여러 개의 값 중에 하나인지를 살펴보기 위해서 간단하게 표현할 수 있는 in연산자 사용.

column_name IN(A, B, C)
--IN 연산자를 통해 사용하기
SELECT ENAME,SAL
FROM EMP
WHERE EMPNO IN (7844, 7654, 7521);

--커미션이 300이거나 500이거나 1400 중의 하나인 사원의 이름,급여,커미션 출력
SELECT ENAME,SAL,COMM
FROM EMP
WHERE COMM IN (300, 500, 1400);

LIKE 연산자

검색하고자 하는 값을 정확히 모를 경우 와일드카드와 함께 사용하여 원하는 내용을 검색하는 연산자

column_name LIKE pattern

와일드카드 의미
% 문자가 없거나 하나 이상의 문자가 어떤 값이 오든 상관없다.
_ 하나의 문자가 어떤 값이 오든 상관없다.

 

와일드카드(%) 사용하기

%는 검색하고자 하는 값을 정확히 모를 경우 사용한다 %는 몇 개의 문자가 오든 상관없다는 의미

--K로 시작하는 사원의사원번호,이름
SELECT EMPNO,ENAME
FROM EMP
WHERE ENAME LIKE 'K%'

--이름 중에 K를 포함하는 사원
SELECT EMPNO,ENAME
FROM EMP
WHERE ENAME LIKE '%K%';

--이름이 K로 끝나는 사원
SELECT EMPNO,ENAME
FROM EMP
WHERE ENAME LIKE '%K';

--이름에 A를 포함하지 않은 사원의 사번, 이름 출력
SELECT EMPNO,ENAME
FROM EMP
WHERE NOT ENAME LIKE '%A%';

와일드카드(_) 사용하기

_는 한 문자를 대신해서 사용한 것

조건 설명
LIKE _A AA, BA, CA 자료가 두 글자이되, 두번째 글자가 'A'인 자료
LIKE _A% AAA, BAA, CA213S 자료의 두번째 글자가 'A'이되, 그 뒤는 무엇이든 상관없는 자료
LIKE A__ AAA, ABC, AFE A로 시작하고, 세글자이고, 뒤에 두 글자는 무엇이든 상관없는 자료
LIKE _a__ AaBE, Ba1y 4글자로 구성되어야만 하되, 두번째 글자는 반드시 소문자 a여야 하는 자료
--이름의 두번째 글자가 A인 사원
SELECT EMPNO,ENAME
FROM EMP
WHERE ENAME LIKE '_A%';

NULL을 위한 연산자

오라클에서는 칼럼에 NULL값이 저장되는 것을 허용함.
NULL은 미확정, 알 수 없는(unknown) 값을 의미함. 0(Zero)도 빈 공간도 아닌 어떤 값이 존재하기는 하지만 어떤 값인지를 알아낼 수 없는 것을 의미한다.
NULL은 연산, 할당, 비교가 불가능하다.

예) 100 + NULL = NULL

--커미션을 받지 않는 사원에 대한 검색 : NULL이 저장된 경우 =로 판단할 수 없음
SELECT ENAME,COMM,JOB
FROM EMP
WHERE COMM=NULL;

 

IS NULL과 IS NOT NULL

연산자 의미 비고
IS NULL NULL이면 만족 NULL은 값이 아니므로 = 또는 != 으로 비교할 수 없음
IS NOT NULL NULL이 아니면 만족
--커미션을 받지 않는 사원 
SELECT ENAME,COMM,JOB
FROM EMP
WHERE COMM IS NULL;

--커미션을 받는 사원
SELECT ENAME,COMM,JOB
FROM EMP
WHERE COMM IS NOT NULL;

--자신의 직속상관이 없는 사원의 이름,직급,직속상관 사번 출력
SELECT ENAME,JOB,MGR
FROM EMP
WHERE MGR IS NULL;

정렬을 위한 ORDER BY 절

ORDER BY절은 로우(행)을 정렬하는데 사용하며 쿼리문 맨 뒤에 기술해야 함.
정렬의 기준이 되는 칼럼 이름 또는 SELECT 절에서 명시된 별칭을 사용할 수 있음

  ASC(오름차순) DESC(내림차순)
숫자 작은 값부터 정렬 큰 값부터 정렬
문자 사전 순서로 정렬 사전 반대 순서로 정렬
날짜 빠른 날짜 순서로 정렬 늦은 날짜 순서로 정렬
NULL 가장 마지막에 나옴 가장 먼저 나옴
--사원번호,이름 출력하되 사번을 기준으로 오름차순 정렬
SELECT EMPNO,ENAME
FROM EMP
ORDER BY EMPNO ASC;

--사원번호,이름 출력하되 사번을 기준으로 내림차순 정렬
SELECT EMPNO,ENAME
FROM EMP
ORDER BY EMPNO DESC;

--사원의 사번, 이름, 급여를 급여가 높은 순으로 출력
SELECT EMPNO,ENAME, SAL
FROM EMP
ORDER BY SAL DESC;

--입사일이 가장 최근인 사원 순으로 사번,이름,입사일 출력
SELECT EMPNO,ENAME,HIREDATE
FROM EMP
ORDER BY HIREDATE DESC;

 



<문제>

--patient 테이블은 id (문자 5), name(문자 10), gender(문자 1), phone(문자 20) 속성을 가진다.
--1) patient 테이블에 다음 내용을 입력하는 SQL문장을 쓰시오.
--id: hong, name: 김하나, gender: f, phone : 010-500-7000
--2) patient 테이블에서 id가 'hong' 인 레코드의 name을 '이수미' 로 수정하는 SQL 문장을 쓰시오.
--3) patient 테이블에서 id가 'hong' 인 레코드를 삭제하는 SQL 문장을 쓰시오.
--4) patient 테이블에서 id가 'hong' 이고 gender가 ‘f'인 레코드를 조회하는 SQL 문장을 쓰시오.

create table patient(
    id		VARCHAR2(5) NOT NULL PRIMARY KEY,
    name	VARCHAR2(10) NOT NULL,
    gender	VARCHAR2(1) NOT NULL,
    phone	VARCHAR2(20) NOT NULL
);

문제1) 
insert into patient values('hong', '김하나', 'f', '010-500-7000');

문제2)
update patient
set name = '이수미'
where id = 'hong';

문제3)
delete from patient
where id = 'hong';

문제4)
select * from patient
where id = 'hong' and gender = 'f';

- 삭제 : delete from patient만 쓰면 테이블 전부 다 삭제됨!! where를 꼭 줘야 함

반응형

'DBMS > Oracle' 카테고리의 다른 글

D+27 [14. 서브 쿼리]  (0) 2022.08.30
D+27 [13. 조인]  (0) 2022.08.30
D+27 [07. 그룹 함수]  (0) 2022.08.30
D+26 [06. SQL 함수 예제]  (0) 2022.08.30
D+26 [06.SQL 함수]  (0) 2022.08.29
댓글