Hi yoahn 개발블로그

#2 SELECT (1) 명령을 이용하여 데이터 조회하기 본문

데이터베이스/Oracle

#2 SELECT (1) 명령을 이용하여 데이터 조회하기

hi._.0seon 2020. 3. 20. 22:55
반응형

- 데이터베이스에 데이터가 저장되는 단위는 테이블

 

1. 모든 칼럼 조회하기

- SELECT * FROM emp;

 

2. 참고

 * DESC 테이블명;

테이블 구성을 보여줌

속성명, 기본키, 데이터 타입

 

 * 해당 사용자가 만든 모든 테이블 조회하기

SELECT * FROM tab;

- 오라클에 예약되어있는 tab 테이블 -> 해당 사용자가 만든 모든 테이블에 대한 정보를 가지고 있는 테이블

 

* 데이터 조회시 출력형식 조절하는 명령어

- 데이터가 숫자일 경우

COL empno FOR 9999

: empno라는 숫자를 다루는 칼럼의 경우 숫자 4자리(9999)까지 들어가게 설정

 

- 데이터가 문자인 경우

COL ename FOR a8

: ename이란 칼럼의 길이를 8바이트까지 들어가게 설정

 

- 한 화면에 출력 가능한 줄 길이 설정 (가로 설정)

SET LINE 200

: 한 화면을 가로로 200바이트 까지 되게

 

- 한 페이지에 출력 가능한 줄 수 설정

SET PAGES 50

한 페이지에 50줄까지 출력

 

3. SELECT 명령에 표현식을 사용하여 출력

: 테이블에는 존재하지 않지만 표현식을 사용하여 컬럼이 추가된 것처럼 표현

SELECT name, 'good morning!' "Good Morning" from professor;

 

- '작은따옴표': 추가되는 컬럼에 들어갈 값('리터럴')

- "큰 따옴표": 추가되는 "컬럼의 이름"

-> 리터럴은 근본적으로 테이블에 존재하지 않는 것

 

실행하면 리터럴이 그대로 출력됨, 리터럴에 컬럼명을 부여하는 건 큰 따옴표로 지정

 

- 표현식 안에 홑따옴표 있는 경우

q'[ 표현식 ]'    : Q와 작은따옴표, 대괄호를 이용

' it''s deptno '    : 작은따옴표를 두개 붙여서 사용

 

4. 컬럼의 별칭

- 컬럼 as 별칭

- 컬럼 "alias' alias"    //큰따옴표로 둘러싸야 함

- 컬럼 alias

**별칭 지정시 작은 따옴표 사용하면 안됨

5. distinct

- 중복 제거

- 동일한 행이 여러개인 경우를 중복으로 계산

- select 키워드 바로 다음에 한번만 사용

1
2
3
SELECT DISTINCT job, ename
from emp
OREDER BY 1,2;
 

-> 나열된 속성 전체가 중복되는 것만 제거

**

1. 비용이 큼 (모든 컬럼에 적용됨 -> 성능 저하 발생 가능)

2. 정렬 안됨 -> 별도의 정렬 작업이 필요

 

 

6. 연결연산자   ||

select ename || ' ''s job is ' || job "Name and Job" from emp;

Name and Job
------------------------------
SMITH 's job is CLERK
ALLEN 's job is SALESMAN
WARD 's job is SALESMAN
JONES 's job is MANAGER
MARTIN 's job is SALESMAN
BLAKE 's job is MANAGER
CLARK 's job is MANAGER
KING 's job is PRESIDENT
TURNER 's job is SALESMAN
JAMES 's job is CLERK
FORD 's job is ANALYST
MILLER 's job is CLERK

ename + 리터럴 + job 이 연결되어 하나의 컬럼인 것 처럼 출력

select ename || job from emp;

/*실행 결과*/

ENAME||JOB
-------------------
SMITHCLERK
ALLENSALESMAN
WARDSALESMAN
JONESMANAGER
MARTINSALESMAN
BLAKEMANAGER
CLARKMANAGER
KINGPRESIDENT
TURNERSALESMAN
JAMESCLERK
FORDANALYST
MILLERCLERK

7. WHERE

: 원하는 조건만 골라내기

- 조건값(문자열, DATE의 경우 작은 따옴표 사용)

SELECT [Column or Expression]

FROM [Table or View]

WHERE 원하는 조건;

SELECT empno, ename
FROM emp
WHERE empno = 7900;

----------------------------------------

SELECT empno, ename, sal
FROM emp
WHERE ename >= 'W';

=> ascii 코드 값으로 첫글자부터 비교

 

8. 비교 연산자

-> 숫자나 문자 모두 사용 가능

 

= : 같은 조건을 검색 (==)

!=, <>: 같지 않은 조건 검색

>, < : 비교 대상에서 크거나 작은 조건을 검색

<=, >=

 

BETWEEN a AND b : a와 b사이에 있는 범위 값을 모두 검색

 

IN(a,b,c) : IN 왼쪽의 비교 대상이 a | b | c 인 조건을 가진 행을 검색

 

LIKE : 특정 패턴을 가지고 있는 조건을 검색

 

IS NULLIS NOT NULL : NULL인지 여부를 판단하는 것

 

a AND b, a OR b, NOT a

 

*************************************

문자는 홑 따옴표 써야하고 대소문자를 구분

SELECT empno, ename, sal
FROM emp
WHERE ename = 'Ssmith';

*************************************

 

기본 산술연산자 사용하기

SELECT ename, sal, sal+100
FROM emp
WHERE deptno=10;

ENAME             SAL    SAL+100
---------- ---------- ----------
CLARK            2450       2550
KINGS            5000       5100
MILE             1300       1400

 

**리눅스용 오라클과 윈도우용 오라클의 날짜 형태가 다르다.

- 리눅스

일월연

17-DEC-80

 

- 윈도우

연월일

80/12/17

8.1. BETWEEN 연산자

WHERE sal BETWEEN 2000 AND 3000;

* 작은 값을 앞에, 큰 값을 뒤에 씀

* 두 값을 모두 포함하는 결과를 출력

* 속도가 느리므로 비교 연산자를 쓰는 것이 빠르다.

- 문자나 날짜도 조회 가능

    > 작은따옴표로 값 표시

SELECT empno, ename, sal
FROM emp
WHERE sal BETWEEN 2000 AND 3000;

-> sal 값이 2000이상, 3000이하인 직원들의 사원번호, 이름, 급여가 출력됨

SELECT ename FROM emp
WHERE ename BETWEEN 'JAMES' AND 'MARTIN'
ORDER BY ename;

-> 문자는 작은 따옴표로 감싸기

 

8.2 IN(a,b,c)

: a 이거나 b 이거나 c 인 조건을 검색

 

- 속도가 매우 빠름

- 숫자, 문자, 날짜도 조건이 될 수 있다

 

8.3 LIKE 연산자로 비슷한 것들 모두 찾기

% : 모든 글자, (== * ) 0개를 포함하여 글자 수 제한 없이 어떤 글자가 와도 상관없다.

_  : 임의의 한 글자를 나타냄

select empno, ename, hiredate
from emp
where hiredate LIKE '%80';

'%80'

=> 모든 행을 full scan하게 됨  => DBMS에 큰 부하가 걸림

-> 동시에 실행되는 다른 쿼리들도 느려짐

 

8.4 연산자 우선순위

and

or

- and가 먼저 연산됨

 

검색 조건이 두개 이상일 경우 조회하는 데에 사용

 where hiredate > '82/01/01' and sal >=1300;

 

8.5 IS NULL / IS NOT NULL

: 값이 무엇인지 모를 경우 is null / is not null 연산자를 활용

 

NULL 값은 특정 값으로 검색이 불가능

WHERE comm = NULL; ->으로도 검색 불가

 

comm 이 널인 행들을 조회하기 위해서는 

where comm is null; 을 이용해서 널 값을 조회

9. 사용자에게 조건을 입력 받아서 조건에 맞는 값 출력하기

where empno = &empno;

>empno 의 값을 입력하십시오: 

구 1: ...

신 1: ...

-> 부가 정보 뜨지 않게 하는 설정

SET verify OFF

 

10. ORDER BY - 정렬하기

- ASC : 오름차순(ascending), default 값

- DESC: 내림차순(descending)

 

order by deptno asc, sal desc;

* 숫자로 위치값 지정하기

- ORDER BY 2, 1;

위에서 나열한 컬럼 중 두번째 컬럼 기준으로 오름차순으로 정렬, 동일하면 첫번째 컬럼 기준으로 오름차순 정렬

 

날짜: 예전 날짜부터 최근 날짜 순으로 정렬

 

************************

order by == 정렬

정렬 복잡도 높은 편 -> 데이터가 많을 수록 오래 걸림

-> order by를 많이 쓸 수록 SQL 수행 속도가 많이 느려짐

[ 인덱스를 사용하면 정렬과 속도를 동시에 잡을 수 있다 ]

 

11. 집합 명령

* 제약조건 *

- 두 집합의 SELECT 절에 오는 칼럼의 개수가 동일해야 한다.

                                                 (개수가 다르면 err)

- 두 집합의 SELECT 절에 오는 칼럼의 데이터 형이 동일해야 한다.

                                                 (data 타입이 다르면 err)

- 두 집합의 칼럼명은 달라도 상관 없음

        -> 첫번째 테이블의 컬럼명으로 합쳐짐

 

# UNION

- 합집합

- 중복 제거, 정렬함

 

# UNION ALL

- 중복 유지, 정렬 안함

- 두 집합의 결과를 합쳐서 출력

 

*************** UNION / UNION ALL 은 실행계획을 복잡하게 만들기 때문에 위험 *********

(DBMS에 부담 큰 연산)

# INTERSECT

- 교집합

- 정렬

 

# MINUS

- 두 집합의 차집합 결과를 출력, 정렬

- 쿼리 순서에 따라 다른 결과 (쿼리 순서 중요)

- 큰 결과를 가진 SELECT 문장을 먼저 쓰고 MINUS 뒤에 작은 결과를 가진 SELECT 문장을 써야 한다.

 

 

 

 

반응형
Comments