[Oracle] 쿼리문 동작 순서 및 간단한 예제

수경·2023년 9월 3일
0


select 컬럼리스트 | 5. 컬럼 지정(보고 싶은 열만 가져오기) > Projection
from 테이블 | 1. 테이블 지정
where 조건 | 2. 조건 지정(레코드에 대한 조건 - 개인조건) > Selection
group by 기준 | 3. (레코드)그룹을 나눈다.
having 조건 | 4. 조건 지정(그룹에 대한 조건 - 그룹조건 >> 집계함수에 대해 조건)
order by 정렬기준 | 6. 순서(정렬)

1. select

  • 데이터 조회
  • 조회하고 싶은 컬럼만 뽑아온다.
  • '*' : 모든 컬럼
  • 순서 상관없이 테이블 구조대로 출력된다.
select * from tblcomedian; 
select first, last, gender, height, weight, nick from tblcomedian;

2. from

  • 어떤 테이블로부터 데이터를 가져와라
-- tblcomedian 테이블에서 모든 컬럼을 조회
select * from tblcomedian; 

3. where

  • 조건 지정(보고 싶은 행만 가져오기) > Selection
  • 레코드(행)을 검색한다.
-- 1. 몸무게가 60kg 이상이고, 키가 170cm 미만인 사람을 조회하시오.
SELECT *
FROM TBLCOMEDIAN
WHERE weight>=60 AND height<170;

-- 2. 몸무게가 70kg 이하인 여자만 조회하시오
SELECT *
FROM TBLCOMEDIAN
WHERE weight<=70 AND GENDER ='f';

1) between

  • 컬럼명 between 최솟값 and 최댓값
  • 범위 조건문
  • 가독성 향상을 위해 사용
    최솟값, 최댓값 포함
-- and 사용
SELECT * FROM TBLINSA 
WHERE BASICPAY >= 1000000 AND BASICPAY <= 1200000;

-- BETWEEN 사용
SELECT * FROM TBLINSA 
WHERE BASICPAY BETWEEN 1000000 AND 1200000;

-- 문자열도 비교 가능
SELECT * FROM EMPLOYEES 
WHERE FIRST_NAME BETWEEN 'J' AND 'L';

2) in

  • 컬럼명 in (값, 값, 값...)
  • 열거형 조건
--개발부 + 총무부 직원 조회
-- or 사용
SELECT * FROM TBLINSA 
WHERE BUSEO = '개발부' OR BUSEO = '총무부';
-- in 사용
SELECT * FROM TBLINSA 
WHERE BUSEO IN ('개발부', '총무부');

3) like

  • 컬럼명 like '패턴 문자열'
  • 정규 표현식의 초간단 버전
  • 패턴 문자열 구성 요소
    1. _: 임의의 문자 1개(.)
    2. %: 임의의 문자 N개 0~무한대(.*)
-- 김oo 조회
SELECT * FROM TBLINSA WHERE name LIKE '김__';
SELECT * FROM TBLINSA WHERE name LIKE '_길_';

SELECT * FROM TBLINSA WHERE name LIKE '김%';	-- 김으로 시작하는 모든 문자
SELECT * FROM TBLINSA WHERE name LIKE '%길%';	-- 길이 포함된 모든 문자

4) null

  • 컬럼명 is null
  • 컬럼값(셀)이 비어있는 상태
  • null 상수 제공
  • 대부분의 언어는 null은 연산의 대상이 될 수 없다.('****')
-- 인구수가 기재된 나라
SELECT * FROM TBLCOUNTRY WHERE POPULATION IS NOT NULL;	-- 더 많이 사용함
SELECT * FROM TBLCOUNTRY WHERE NOT POPULATION IS NULL;

-- 도서관 > 대여 테이블(컬럼 : 대여날짜, 반납날짜)
-- 아직 반납을 안한 사람은?
SELECT * FROM 도서대여 WHERE 반납날짜 IS NULL ;
-- 반납이 완료된 사람은?
SELECT * FROM 도서대여 WHERE 반납날짜 IS NOT NULL ;

4. group by

  • 그룹별 통계값을 구한다.
  • group by 사용시 : select 컬럼리스트에 일반 컬럼 사용 불가
  • select 컬럼리스트에 집계함수와 group by 컬럼만 가능하다.
SELECT 
	buseo, 
	count(*) AS 부서별인원수,
	round(avg(basicpay)) AS 부서별평균급여,
	sum(basicpay) AS 부서별지급액,
	max(basicpay) AS 부서내최고급여,
	min(basicpay) AS 부서내최저급여
FROM tblinsa
GROUP BY buseo;

-- 다중 그룹
SELECT
	buseo, jikwi,
	count(*)
FROM tblinsa
GROUP BY buseo, jikwi
ORDER BY buseo, jikwi;

-- tblInsa. 남/여자 직원수
SELECT
	substr(ssn, 8, 1),
	decode(substr(ssn, 8, 1), '1', '남자', '2', '여자') AS 성별,
	count(*)
FROM tblinsa
GROUP BY substr(ssn, 8, 1);

5. having

  • 조건 지정(그룹에 대한 조건)
  • 그룹조건 : 집계함수에 대해 조건

WHERE 절 조건

SELECT							--4. 각 그룹별 집계함수 실행
	buseo,
	round(avg(basicpay))
FROM tblinsa					--1. 60명의 데이터를 가져온다.
WHERE basicpay >= 1500000		--2. 60명을 대상으로 조건을 검사한다.
GROUP BY buseo;					--3. 2번을 통과한 사람들(27명) 대상으로 그룹을 짓는다.

HAVING 절 조건

SELECT										--4. 그룹화된 부서와, 부서별 급여 평균
	buseo,
	round(avg(basicpay))
FROM tblinsa								--1. 60명의 데이터를 가져온다.
GROUP BY buseo								--2. 부서를 기준으로 그룹화한다. 
HAVING round(avg(basicpay)) >= 1500000;		--3. 집합에 대한 조건 > 집게 함수 조건
-- 부서 인원수가 10명이 넘는 부서
SELECT
	buseo, count(*)
FROM tblinsa
GROUP BY buseo
HAVING count(*) >= 10;

-- 부서 과장/부장(where) 인원수가 3명이 넘는(having) 결과
SELECT
	buseo, count(*)
FROM tblinsa
WHERE jikwi IN ('과장','부장')
GROUP BY buseo
HAVING count(*)>=3;

6. order by

  • 원본 테이블 정렬하는 것이 아닌 결과 테이블을 정렬하는 것
  • order by 컬럼명 [ASC|DESC]
-- 1차 정렬
SELECT *
FROM TBLINSA
ORDER BY BUSEO ASC ; 

-- 2차 정렬
SELECT *
FROM TBLINSA
ORDER BY BUSEO ASC , JIKWI DESC ; 

-- 3차 정렬
SELECT *
FROM TBLINSA
ORDER BY BUSEO ASC , JIKWI DESC, BASICPAY DESC ; 

-- 컬럼리스트의 컬럼 순서 > 유지보수에 취약하므로 비권장함
SELECT name, buseo, jikwi
FROM TBLINSA
ORDER BY 2;		-->> 1 : name, 2 : buseo, 3 : jikwi

-- 가공된 값의 정렬
SELECT name, jikwi
FROM TBLINSA 
ORDER BY CASE 
		WHEN JIKWI = '사원' THEN 1
		WHEN JIKWI = '대리' THEN 2
		WHEN JIKWI = '과장' THEN 3
		WHEN JIKWI = '부장' THEN 4
	END DESC ;
    
-- 가공된 값의 정렬 - alias 사용    
SELECT name, jikwi,
	CASE 
		WHEN JIKWI = '사원' THEN 1
		WHEN JIKWI = '대리' THEN 2
		WHEN JIKWI = '과장' THEN 3
		WHEN JIKWI = '부장' THEN 4
	END AS rank
FROM TBLINSA 
ORDER BY rank DESC ;
profile
웹백엔드개발자를 꿈꾸는

0개의 댓글