서론
- 데이터 조회를 위해 사용되는 명령어
- 가장 많이 사용되는 기본적인 명령어라고 할 수 있음
문법
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 == 더하기
--> 사칙연산의 규칙 생각하면 편함
- AND
- 사용자에게 조건 입력 받아 출력하기
- &(엠퍼센트) 기호 사용
- 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 혹은 다른 방법 사용해 간결하게 작성하는 습관을 들여야 함.
- 만약 SQL에 검색 조건이 추가되었다고 가정했을 때, 대부분 기존 SQL에 UNION / UNION ALL을 사용해 새로운 SQL을 추가해 사용하는 경우가 있음
▣ 집합 연산자 : INTERSECT 연산자 사용 [두 집합의 교집합 부분 찾는 집합 연산]
- 위의 예시는? 경영학과(101)와 수학과(201)를 복수전공하는 사람의 이름을 출력한 것.
- 오라클은 12c 기준 교집합을 찾기 위해 정렬 해서 찾음.
- 이 말은 정렬을 동반하기에 속도가 느려진다는 단점이 있음.
▣ 집합 연산자 : MINUS 연산자 사용 [차집합과 유사함]
- 큰 집합에서 작은 집합을 뺴는 집합 연산자
- 예제.
직원의 급여를 인상해주려 한다. 현 급여가 2500 이하인 직원을 대상으로 하려 한다. MINUS를 사용해 출력하라.
- 주의사항
- select 문의 순서만 주의하면 됨
- 위 쿼리에서 바로 아래 쿼리 결과를 빼준다는 것만 기억하면 됨.
- MINUS 또한 결괏값을 정렬함. 그렇기에 데이터 양이 많을 경우 시간이 오래 걸림.
'DB > Oracle' 카테고리의 다른 글
Scott 계정 SQL 파일 (0) | 2021.07.15 |
---|---|
Oracle 계정 생성 및 사용자 확인 (0) | 2021.07.15 |
[DBeaver] 오라클(Oracle) DBeaver 연결하기 (0) | 2021.07.10 |
오라클 HR 계정 활성화 및 계정 생성 (0) | 2021.07.10 |
[도커(Docker)] Oracle, DBMS (DBeaver) 설치하기 (Mac) - 스크랩 (0) | 2021.07.09 |