[Oracle/SQL] 레코드 검색

yuseon Lim·2021년 5월 11일
0

Oracle SQL

목록 보기
5/5
post-custom-banner

레코드 검색

  • 종류
    • 기본 구조
    • 재명명 연산
    • LIKE 연산자
    • 집합 연산
    • 외부 조인
    • 집계 함수
    • Null 처리
    • 중첩 질의

레코드 검색 기본 구조

형식

select <필드리스트>
from <테이블 리스트>
where <조건>
  • select
    • 질의 결과로 출력할 필드들의 리스트, 관계대수의 추출연산
    • 필드 이름 외에 산술식이나 상수 사용 가능
  • from
    • 질의 실행과정에 필요한 테이블들의 리스트, 관계대수의 카티션 프로덕트
    • 보통 from 절이 시간이 가장 많이 걸림
    • from 절을 많이 쓰기보단 select와 where을 활용하는것이 효율 면에서 대체적으로 좋음
  • where
    • 검색되어야 하는 레코드에 대한 조건, 관계대수의 선택연산
    • 생략 가능

중복 제거

select distinct <필드리스트>
  • select 연산을 하면 기본적으로 중복을 허용함
  • 따라서 distinct키워드로 중복을 배제한다.

모든 필드의 값 추출

select *

from 절 두개 이상의 테이블

  • 별다른 언급 없이 나열하면 자연조인

order by

  • 검색 결과 정렬
  • select문 맨 마지막에 order by 추가
select <필드리스트>
from <테이블 리스트>
where <조건>
order by <필드리스트>
  • 오름차순 기본
  • 여러개의 필드를 나열할 경우 나열된 순서대로 정렬
order by A, B, C
  • 라고 한다면, A 오름차순 정렬 > 같은값에대해 B 오름차순 정렬 > 같은값에 대해 C 오름차순 정렬
  • 정렬 기준의 우선순위
  • 내림차순으로 정렬하려면 desc 명시
order by A desc, B # A 내림차순, B 오름차순
order by A , B desc # A 오름차순, B 내림차순
order by A desc, B desc # A, B 내림차순

재명명 연산

  • 테이블이나 필드에 대해 재명명
    • 실제로 이름이 수정되는것이 아니라
    • 일시적으로 사용
    • 표현을 단순화하거나 동일 이름이 존재할때 사용

형식

테이블 재명명

select s.name, d.dept_name
from student s, department d
where s.dept_id = d.dept_id
  • student 테이블을 s 로,
  • department 테이블을 d로 재명명

필드 재명명

select name 이름, position 직위, 2012-year_emp 재직연수
from professor

LIKE 연산자

형식

where <필드이름> like <문자열패턴>
  • 문자열 패턴
    • _ : 한 개의 문자 의미
    • %: 여러 개의 문자 의미

예시

  • 991212-2@@@@@@ 같은 주민번호에서 여자만 검색하려면?
where resident_id like '%-2'

집합 연산

  • union : 합집합
  • intersect : 교집합
  • minus : 차집합

형식

<select1> <집합연산자> <select2>

조건

  • 필드의 개수와 데이터타입이 서로 같이야 함

Union

select name from student
union
select name from professor
  • 중복되는 값은 제거된다.
  • 중복을 제거하지 않으려면 union all 연산자를 사용

Intersect

select name from student
intersect
select name from professor

Minus

select name from student
intersect
select name from professor

내부 조인

SELECT
FROM A INNER JOIN B
ON 조건

외부 조인

  • 외부 조인을 사용하는 이유?
    • 데이터를 누락 없이 조회하기 위해서

왼쪽 외부 조인

  • 연산자의 왼쪽에 위치한 테이블의 각 레코드에 대해서 오른쪽 테이블에 조인 조건에 부합하는 레코드가 없을 경우에도 검색 결과에 포함

  • 아래 두 방식에 대한 연산 결과는 같다.

  • ANSI 방식

select title, credit, year, semester
from course left outer join class
using (course_id) # course.course_id = class.course_id
  • 오라클 방식
select title, credit, year, semester
from course, class
where course.course_id = class.course_id (+)

오른쪽 외부 조인

  • 연산자의 오른쪾에 위치한 테이블의 각 레코드에 대해서 왼쪽 테이블에 조인 조건에 부합하는 레코드가 없을 경우에도 검색 결과에 포함

  • 아래 두 방식에 대한 연산 결과는 같다.

  • ANSI 방식

select title, credit, year, semester
from course right outer join class
using (course_id) # course.course_id = class.course_id
  • 오라클 방식
select title, credit, year, semester
from course, class
where course.course_id (+) = class.course_id

완전 외부 조인

  • 양쪽 테이블에서 서로 일치하는 레코드가 없을 경우, 해당 레코드들도 결과 테이블에 포함시키며 나머지 필드에 대해서 모두 Null 삽입
select title, credit, year, semester
from course full outer join class
using (course_id) # course.course_id = class.course_id

집계 함수

  • 통계연산 기능 제공
  • 종류
    • count : 데이터의 개수
    • sum : 데이터의 합
    • avg : 데이터 평균 값
    • max : 데이터의 최대 값
    • min : 데이터의 최소 값
  • SELECT절과 HAVING절 뒤에서만 사용 가능
  • sum, avg는 숫자형 데이터 타입을 갖는 필드에서만 적용

COUNT

count(distinct <필드이름>)
  • 해당 필드에 값이 몇 개인지 출력
  • distinct : 서로 구별되는 값의 개수가 필요한 경우에만 사용
  • NULL은 계산에서 제외
  • <필드이름> 에 *가 올 경우 총 레코드의 개수를 계산
  • student 테이블에서 2학년 학생이 몇 명인지 출력
select count(*)
from student
where year=2;

image

SUM

sum(<필드이름>)
  • student 테이블에서 year의 총 합(의미는 없지만 연습 차원에서)

image

AVG

avg(<필드이름>)
  • student 테이블에서 year의 평균

image

MIN, MAX

max(<필드이름>)
min(<필드이름>)

GROUP BY

group by <필드리스트>
  • select 절과 집계함수는 함께 사용할 수 없다.

    • select ename, max(sal)
    • 을 했을 경우, max(sal)의 값만 검색되지 이것이 속해있는 레코드가 무엇인지, 알수없다.

    • 따라서 GROUP BY 와 집계함수로 그룹별 집계함수 적용!

  • select 문에서 where절 다음에 쓴다.

  • 그룹에 대한 조건은 HAVING 절에 작성

작성 순서는,

where > group by > having > order by 이다.

NULL 처리

형식

<필드이름> is null
<필드이름> is not null

NULL인 레코드는 True? False?

  • 오라클에서 NULL은 U, Unknown으로 처리
  • T는1, F는0 이라면 U는 0.35~0.5 정도로 취급
  • 결론적으로 U를 F로 취급한다.

중첩 질의

  • SQL문 안에 SQL문을 작성.
  • 앞서 소개한 from 절에 카티션 프로덕트를 하는 방법보다 효율 좋음.
  • from절이 처리해야하는 데이터가 많아질수록 효율이 떨어지기 때문.
  • 종류
    • in, not in
    • some(any), all
    • exists, not exists

IN, NOT IN

select <필드이름>
from <필드리스트>
where A in # or not in
			(
            select A
            from ...작성);

SOME, ALL

  • some
    • 하나라도 만족하는
  • all
    • 모두 만족하는

image

EXISTS, NOT EXIST

  • 최소한 하나 이상의 레코드가 존재 하는지 안하는지
select <필드이름>
from <필드리스트>
where A exist # dor not exist
			(
            select A
            from ...작성);

참고자료

profile
🔥https://devyuseon.github.io/ 로 이사중 입니다!!!!!🔥
post-custom-banner

0개의 댓글