데이터베이스/Oracle SQL

[Oracle SQL] 정렬, 집합 연산(ORDER BY, UNION, UNION ALL, INTERSECT, MINUS)과 SQL연산자(BETWEEN, IN, IS NULL, LIKE)

ReBugs 2023. 11. 20.

본 게시글은 이수안컴퓨터연구소의 데이터베이스 유튜브 동영상을 개인적으로 정리하는 글입니다. 


ORDER BY

  • ORDER BY 키워드를 이용해 결과 테이블 내용을 사용자가 원하는 순서로 출력
  • ORDER BY 키워드와 함께 정렬 기준이 되는 속성과 정렬 방식을 지정
  • 오름차순(기본): ASC / 내림차순: DESC
  • 널 값은 오름차순에서는 맨 마지막에 출력되고, 내림차순에서는 맨 먼저 출력됨
  • 여러 기준에 따라 정렬하려면 정렬 기준이 되는 속성을 차례대로 제시
--employees 테이블에서 first_name, last_name를 출력하되, first_name를 기준으로 오름차순으로 정렬
SELECT first_name, last_name FROM employees ORDER BY first_name;

 

--employees 테이블에서 first_name, last_name를 출력하되, first_name를 기준으로 내림차순으로 정렬
SELECT first_name, last_name FROM employees ORDER BY first_name DESC;

 

--departments 테이블에서 department_name를 오름차순으로 출력
SELECT department_name FROM departments ORDER BY department_name;

 

--departments 테이블에서 department_name를 내림차순으로 출력
SELECT department_name FROM departments ORDER BY department_name DESC;

 

--locations 테이블에서 country_id, city를 country_id를 기준으로 오름차순으로 출력하되 동일 항목에 대해선 city를 기준으로 오름차순 정렬
SELECT country_id, city FROM locations ORDER BY country_id, city;

 

--departments 테이블에서 location_id, department_name를 location_id를 기준으로 내림차순으로 출력하되 동일 항목에 대해선 department_name를 기준으로 오름차순 정렬
SELECT location_id, department_name FROM departments ORDER BY location_id DESC, department_name;

 

SQL 연산자

BETWEEN 연산자

• 두 값의 범위에 해당하는 데이터만 출력할 때 사용되는 확장 연산자

--employees테이블에서 employee_id가 120이상 130이하인 모든 컬럼을 출력
SELECT * FROM employees WHERE employee_id BETWEEN 120 AND 130;

 

--employees테이블에서 salary가 10000이상 12000이하인 모든 컬럼을 출력
SELECT * FROM employees WHERE salary BETWEEN 10000 AND 12000;

 

IN 연산자

• 여러 개의 데이터 값을 지정하여 일치하는 데이터만 출력할 때 사용

--employees테이블에서 first_name이 'Steven', 'John', 'Peter'인 모든 컬럼을 출력
SELECT * FROM employees WHERE first_name IN ('Steven', 'John', 'Peter');

 

--counturies테이블에서 country_id가 'US', 'IL', 'SG' 인 모든 컬럼을 출력
SELECT * FROM countries WHERE country_id IN ('US', 'IL', 'SG');

 

--locations 테이블에서 city가 'Sao Paulo', 'London', 'Southlake'가 아닌 모든 컬럼을 출력
SELECT * FROM locations WHERE city NOT IN ('Sao Paulo', 'London', 'Southlake');

 

IS NULL 연산자

• 특정 속성의 값이 NULL 값인지를 비교하여 데이터 조회

--locations 테이블에서 state_province이 null인 모든 컬럼을 출력
SELECT * FROM locations WHERE state_province IS NULL;

 

--employees 테이블에서 commission_pct이 null이 아닌 모든 컬럼을 출력
SELECT * FROM employees WHERE commission_pct IS NOT NULL;

 

 

LIKE 연산자

• 문자열 속성에서 부분적으로 일치하는 것만 출력할 때 사용

기호 설명
% 0개 이상의 문자 (문자의 내용과 개수는 상관 없음)
_ 1개의 문자 (문자의 내용은 상관 없음)
기호 설명
LIKE ‘data%’  data로 시작하는 문자열 (길이 상관 없이 data로 시작)
LIKE ‘%data’ data로 끝나는 문자열 (길이 상관 없이 data로 끝남)
LIKE ‘%data%’ data가 포함된 문자열 (길이 상관 없이 data가 포함)
LIKE ‘data____’ data로 시작하는 8자리 문자열
LIKE ‘____data’  data로 끝나는 8자리 문자열
--locations테이블에서 city가 South로 시작하는 모든 컬럼을 출력
SELECT * FROM locations WHERE city LIKE 'South%';

 

--locations테이블에서 street_address가 St로 끝나는 모든 컬럼을 출력
SELECT * FROM locations WHERE street_address LIKE '%St';

 

--locations테이블에서 city가 South로 시작하고 총 9글자인 모든 컬럼을 출력
SELECT * FROM locations WHERE city LIKE 'South____';

 

 

집합 연산자

•  연산자 앞뒤의 값을 비교하여 데이터 조회

연산자 설명
UNION 합집합 (중복 제외)
UNION ALL 합집합 (중복 포함)
MINUS 차집합
INTERSECT 교집합
--employees테이블에서 department_id가 60인 집합과 employees테이블에서 department_id가 100인 집합의 합집합에서 employee_id, first_name, department_id 컬럼을 출력
SELECT employee_id, first_name, department_id FROM employees WHERE department_id = 60
UNION
SELECT employee_id, first_name, department_id FROM employees WHERE department_id = 100;

 

--employees테이블에서 employees테이블에서 employee_id가 160 이하인 집합과 employee_id가 140이상인 집합의 합집합 중에 employee_id, first_name 컬럼을 출력
SELECT employee_id, first_name FROM employees WHERE employee_id <= 160
UNION
SELECT employee_id, first_name FROM employees WHERE employee_id >= 140;

 

--employees테이블에서 employees테이블에서 employee_id가 160 이하인 집합과 employee_id가 140이상인 집합의 합집합(중복 포함) 중에 employee_id, first_name 컬럼을 출력
SELECT employee_id, first_name FROM employees WHERE employee_id <= 160
UNION ALL
SELECT employee_id, first_name FROM employees WHERE employee_id >= 140;

 

--employees테이블에서 employees테이블에서 employee_id가 160 이하인 집합과 employee_id가 140이상인 집합의 차집합 중에 employee_id, first_name 컬럼을 출력
SELECT employee_id, first_name FROM employees WHERE employee_id <= 160
MINUS
SELECT employee_id, first_name FROM employees WHERE employee_id >= 140;

 

--employees테이블에서 employees테이블에서 employee_id가 160 이하인 집합과 employee_id가 140이상인 집합의 교집합 중에 employee_id, first_name 컬럼을 출력
SELECT employee_id, first_name FROM employees WHERE employee_id <= 160
INTERSECT
SELECT employee_id, first_name FROM employees WHERE employee_id >= 140;

 

 

연습 문제

--jobs 테이블에서 job_title 기준으로 정렬하여 직업 조회
SELECT job_title FROM jobs ORDER BY job_title;

 

--countres 테이블에서 country_name 기준으로 내림차순으로 정렬
SELECT country_name FROM countries ORDER BY country_name DESC;

 

--employees 테이블에서 salary가 10000에서 12000 사이인 직원 조회
SELECT * FROM employees WHERE salary BETWEEN 10000 AND 12000;

 

--employees 테이블에서 job_id가 IT_PROG와 ST_MAN인 직원 조회
SELECT * FROM employees WHERE job_id IN('IT_PROG','ST_MAN');

 

--employees 테이블에서 manager_id가 NULL인 직원 조회
SELECT * FROM employees WHERE manager_id IS NULL;

 

--departments 테이블에서 manager_id가 NULL이 아닌 부서 조회
SELECT * FROM departments WHERE manager_id IS NOT NULL;

 

--employees 테이블에서 job_id가 'AD'로 시작하는 직원 조회
SELECT * FROM employees WHERE job_id LIKE 'AD%';

 

--employees 테이블에서 first_name에서 'ni'를 포함하는 직원 조회
SELECT * FROM employees WHERE first_name LIKE '%ni%';

 

--locations 테이블에서 location_id, street_address, city 에 대해 location_id가 3000 이하인 데이터와 2000 이상인 데이터를 합집합(중복포함)
SELECT location_id, street_address, city FROM locations WHERE location_id <= 3000
UNION ALL
SELECT location_id, street_address, city FROM locations WHERE location_id >= 2000;

 

--locations 테이블에서 location_id, street_address, city 에 대해 location_id가 3000 이하인 데이터와 2000 이상인 데이터를 차집합
SELECT location_id, street_address, city FROM locations WHERE location_id <= 3000
MINUS
SELECT location_id, street_address, city FROM locations WHERE location_id >= 2000;

 

--locations 테이블에서 location_id, street_address, city 에 대해 location_id가 3000 이하인 데이터와 2000 이상인 데이터를 교집합
SELECT location_id, street_address, city FROM locations WHERE location_id <= 3000
INTERSECT
SELECT location_id, street_address, city FROM locations WHERE location_id >= 2000;

댓글