본문 바로가기

DB/Oracle

[Oracle] 데이터 조회 : Select

서론

  • 데이터 조회를 위해 사용되는 명령어
  • 가장 많이 사용되는 기본적인 명령어라고 할 수 있음

문법

SELECT [ 컬럼명 혹은 표현식 ] FROM [ 테이블명, 뷰 명 ]
[ WHERE 조건 컬럼명 = 조건 ]
[ GROUP BY 테이블명 ]
[ HAVING 그룹의 조건 ]
[ ORDER BY 정렬 방식 ]

 

SCOTT 계정 실습

SELCT * FROM emp;

 

  • SQL은 대소문자 구분 없이 입력이 가능하나, 내부적으로 대소문자에 의해 서로 다른 SQL로 구분됨

  • 이는 튜닝에서 굉장히 중요한 내용으로, SQL 작성시 대소문자 구분은 필수임
    • 키우드 == 대문자
    • 컬럼 이름 혹은 조건 == 소문자
  • 문장의 마지막은 반드시  ; (세미콜론) 입력

 

컬럼의 조회 : DESC

 

 

  • 테이블에 존재하는 컬럼을 조회하기 위함

  • DESC는 DESCribe의 약자 ( 테이블을 설명하라고 이해하면 편함. )

  • 그런데 왜 DBeaver(DBMS)에서는 안 먹고 터미널에서 먹는지는 모르겠음.

 

테이블 조회

 

 

  • SELECT * FROM tab;

 

표현식 사용한 출력

  • SELECT 구문 뒤에  ' ' (작은 따옴표)로 묶어 사용

---> 굿노트 기준 32페이지부터 추가 진행

 


표현식 사용한 출력

  • 컬럼 이외에 이름을 출력하기 위함
  • select '출력 내용' as "컬럼명" from 테이블명;
  • [ '출력 내용' ]이를 '리터럴(literal) 상수(문자)'라고 칭함
  • 실무에서 많이 사용된다고 함. 이유는????
  • 리터럴 문자 안에 작은 따옴표를 사용할 경우 앞에 작은 따옴표를 하나 더 붙여줘야 함

중복 값 제거하고 출력 :: DISTINCT 명령어 사용

  • SELECT DISTINCT 컬럼명 FROM 테이블명;
  • 오라클 9i 버전까지 정렬을 지원했으나 속도 저하로 지원하지 않음
  • 사용시 주의사항
    • DISTINCT 사용시 한 개의 컬럼에만 적어도 모든 컬럼에 적용됨
    • 이로 성능 저하가 발생할 수 있기에 주의해야 함
    • 이는 반드시 SELECT 키워드 다음에 와야하며, 그렇지 않을 경우 에러 발생

      SELECT DISTINCT detpno, ename FROM emp; ==> 가능
      SELECT deptno, DISTINCT ename FROM emp; ==> 에러 발생

연결 연산자로 컬럼 붙여 출력 :: 연결(합성) 연산자 [Concatenation]

  • 바 기호 두 번 사용 ==> A || B
  • 리터럴 문자를 넣어 사용하는 경우가 많음
  • 연결한 컬럼은 오라클에서 한 개의 컬럼으로 인식함

원하는 조건만 골라내기 :: WHERE 절 사용

SELELT [ Column OR Expression ]
FROM [ Table or View ]
[ WHERE 원하는 조건 ] ; 
  • 문자와 날짜를 조회하고 싶은 경우 반드시 문자와 날짜는 작은 따옴표를 붙여야 함
  • 문자 조회의 경우 대소문자를 구분해 조회해야 함
  • 날짜 조회시 주의사항
    • 윈도용 오라클과 유닉스 계열(리눅스 포함) 오라클은 날짜 표시 형태가 다름
      • 윈도우 : YY/MM/DD
      • 리눅스 : DD-MON-YY
    • 날짜 형태가 달라 윈도우와 유닉스 계열 사이에 데이터를 옮기는 작업시 에러가 발생할 수 있음
    • 리눅스는 날짜에 영문자가 포함되어 있으나 대소문자를 구분 하지 않아도 됨

SQL에서의 기본 산술 연산자

  • 연산자 : +, -, *, /
  • SELECT ename, sal, sal+1000 AS "인상된 연봉" FROM EMP e ;

다양한 연산자 활용 방법

  • 연산자는 다른 사이트에서 검색한 것 참고.
  • 아무튼.. 비교 연산자는 문자, 숫자, 날짜에 사용할 수 있음
  • 그런데! 이해해둬야 하는 것.
    • '날짜가 크다' == '최신 날짜'
    • '더 작은 날짜' == '이전 날짜'
  • Between
    • 특정 구간 값 검색시 BETWEEN 연산자가 아닌 비교 연산자 권장
    • 비교 연산자가 속도측면에서 성능이 더 좋음
  • Like 연산자
    • 함께 사용되는 기호 : %, _
    • % : 글자 수에 제한이 없고 어떤 글자가 와도 무관함
      • 문자, 숫자, 날짜 모두 가능하지만
      • 날짜에 사용할 경우 성능에 나쁜 영향을 줄 가능성이 높음
        • 하지만! 특정 입사월에 입사한 사람을 확인하는 경우에 나쁘지 않을 수 있음
    • _  : 글자 수는 _(Underscore) 하나당 한 글자만 올 수 있으며 어떤 글자가 와도 무관함
    • 위 두 가지 기호가 LIKE 조건 부에서 가장 먼저 나올 경우 성능이 떨어짐
      • 예를 들어...
        WHERE name LIKE '%김%' 혹은 WHERE name LIKE '_김%'
      • 성능이 떨어지는 이유는 인덱스 때문
  • Null 값을 조회할 경우 => is Null OR is not Null
  • 검색 조건이 두 가지인 경우
    • AND
      • 두 조건 동시 만족 필요
    • OR
      • 한 조건만 만족해도 되는 경우
    • 만약 AND와 OR이 같이 있는 경우 AND 수행 후 OR이 수행됨
    • 쉽게 생각하자면...
      AND == 곱하기     OR == 더하기
      --> 사칙연산의 규칙 생각하면 편함
  • 사용자에게 조건 입력 받아 출력하기
    • &(엠퍼센트) 기호 사용
    • SELECT 컬럼 FROM 테이블 WHERE 조건 컬럼 = &변수;
    • DBMS에서는 왜 안 먹고 CMD에서는 먹지??
    • WHERE절 뿐만 아니라 SELECT, FROM에서도 사용 가능

정렬해 출력하기 :: Order By

  • 기본 오름차순
    • 한글: 가, 나, 다, 라, ....
    • 영어: A, B, C, D, ....
    • 숫자: 1, 2, 3, 4, ....
    • 날짜: 예전 날짜에서 최근 날짜로 정렬됨
  • 절대 잊지 말 것. 날짜는 최근 날짜가 더 큼!
  • Order By는 SQL 문장에서 가장 마지막에 작성할 것
  • 정렬 순서
    • 오름차순: ASC
    • 내림차순: DESC
  • 꼭 컬럼이름만 사용하는 것은 아님
    • 숫자로 적을 수 있는데, 이는 컬럼의 순서를 반영한 것임.
    • 왼 -> 오 ==> 1 -> n
  • 사람들을 줄 세우는게 쉽지 않은 현실 세계처럼 Order By를 많이 사용할수록 수행 속도가 많이 늦어짐
    • 그렇기에 실전에서 인덱스를 사용해 정렬하는 경우가 많음 [추가 후 링크 연결 예정]

집합 연산자(Set Operator)

  • 여러 건의 데이터들(집합)을 연산하는 것
  • 연산자 종류
    • UNION : 두 집합 결과를 합쳐 출력. 중복 값 제거하고 정렬함.
    • UNION ALL : 두 집합 결과를 합쳐 출력중복 값 제거 안 하고 정렬 안 함.
    • INTERSECT : 두 집합의 교집합 결과를 출력 및 정렬함.
    • MINUS : 두 집합의 차집합 결과를 출력 및 정렬함. 쿼리 순서 중요.
  • 집합 연산자 사용시 주의사항
    • UNION을 기점으로 위 컬럼과 아래 컬럼의 공백이 존재해서는 안 됨
    • 두 집합의 SELECT 절에 오는 컬럼의 개수가 동일해야 함
    • 두 집합의 SELECT 절에 오는 컬럼의 데이터 형이 동일해야 함
    • 두 집합의 컬럼명이 달라도 상관 없음

▣ 집합 연산자 : UNION / UNION ALL [두 집합의 결과들을 더함]

  • 두 집합을 더해 결과 출력
  • 차이점은 위에서 언급되었듯
    • UNION => 두 결과에서 중복된 값을 제거하고 출력 [정렬 O]
    • UNION ALL => 말 그대로 ALL !! 중복되는 값까지 전부 출력 [정렬 X]
  • 이는 SQL에서 가져올 데이터의 특징에 따라 사용처가 다름
    • [ex] 서울 혹은 경기에서 근무하는 사원을 찾을 경우 UNION 을 쓴다면 중복 데이터는 제거되기에 적절 X
  • 사용시 주의사항
    • 만약 SQL에 검색 조건이 추가되었다고 가정했을 때, 대부분 기존 SQL에 UNION / UNION ALL을 사용해 새로운 SQL을 추가해 사용하는 경우가 있음

      이는 성능에 매우 나쁜 영향을 미침.

      왜냐. 두 쿼리를 만족하는 실행 계획을 만들어야 하는데, 이는 국내 여행과 해외 여행 두 가지 모두의 여행계획을 세우는 것과 마찬가지인 상황이기 때문.

    • 그렇기에 가급적 UNION 보다는 DECODE나 CASE 혹은 다른 방법 사용해 간결하게 작성하는 습관을 들여야 함.

▣ 집합 연산자 : INTERSECT 연산자 사용 [두 집합의 교집합 부분 찾는 집합 연산]

  • 위의 예시는? 경영학과(101)와 수학과(201)를 복수전공하는 사람의 이름을 출력한 것.
  • 오라클은 12c 기준 교집합을 찾기 위해 정렬 해서 찾음.
  • 이 말은 정렬을 동반하기에 속도가 느려진다는 단점이 있음.

▣ 집합 연산자 : MINUS 연산자 사용 [차집합과 유사함]

  • 큰 집합에서 작은 집합을 뺴는 집합 연산자
  • 예제.
    직원의 급여를 인상해주려 한다. 현 급여가 2500 이하인 직원을 대상으로 하려 한다. MINUS를 사용해 출력하라.

  • 주의사항
    • select 문의 순서만 주의하면 됨
    • 위 쿼리에서 바로 아래 쿼리 결과를 빼준다는 것만 기억하면 됨.
  • MINUS 또한 결괏값을 정렬함. 그렇기에 데이터 양이 많을 경우 시간이 오래 걸림.