Learn & Record

[코리아IT아카데미] SQL 문법 MariaDB (ORDER BY, 데이터베이스 백업, DISTINCT, ALL, LIMIT, OFFSET FETCH) 본문

Dev/SQL

[코리아IT아카데미] SQL 문법 MariaDB (ORDER BY, 데이터베이스 백업, DISTINCT, ALL, LIMIT, OFFSET FETCH)

Walker_ 2024. 2. 2. 12:22

 

1. ORDER BY

 - SELECT 명령에 별 지정이 없을 경우, 출력 순서 DBMS별로 디폴트 순서를 따름

 - 출력할 때, ORDER BY 절로 정렬 순서를 지정하면 DBMS가 달라도 원하는대로 정렬 가능

 - ( 기본형식 ORDER BY 필드 [ ASC | DESC ] ) : 오름차순 일 경우 ASC, 내림차순 일 경우 DESC

 - 순서를 생략하면 디폴트인 오름차순 으로 적용되므로 키워드 ASC는 보통 생략

 - 키워드 값이 똑같을 경우, 프라이머리 키 기준으로 정렬됨

 - 두 개 이상의 기준 필드 지정가능. 첫번째 기준이 같으면, 두번째 기준 비교하여 정렬 순서 결정

 - 칼럼을 정수로 입력이 가능하다

 - 모든 필드는 정렬 기준으로 사용가능. 정렬 기준 필드를 꼭 같이 출력할 필요는 없음.

 - 테이블에 존재하지 않은 계산값도 정렬 기준으로 사용할 수 있음

 - 레코드 조건을 지정하는 WHERE 절과 출력 순서를 지정하는 ORDER BY 절을 동시에 사용 가능

 - (ORDER BY 절은 WHERE 절보다 뒤 쪽에 있어야 함)

SELECT * FROM tcity ORDER BY popu ASC;
SELECT * FROM tcity ORDER BY popu DESC;

SELECT region, NAME, AREA, popu FROM tcity ORDER BY region, NAME DESC; # 앞에 기준은 ASC로 설정
SELECT region, NAME, AREA, popu FROM tcity ORDER BY region ASC, NAME DESC;
SELECT region, NAME, AREA, popu FROM tcity ORDER BY AREA ASC, NAME DESC;

SELECT * FROM tcity ORDER BY AREA;
SELECT * FROM tcity ORDER BY 2; # 위 쿼리와 같은 의미

SELECT NAME FROM tcity ORDER BY popu;

SELECT NAME, popu * 10000/AREA FROM tcity ORDER BY popu * 10000 / AREA;
SELECT NAME, popu * 10000/AREA AS tmp FROM tcity ORDER BY tmp;

SELECT * FROM tcity WHERE region = '경기' ORDER BY AREA;

 

2. 연습문제

1. 직원 목록을 월급이 적은 사람부터 순서대로 출력하되 월급이 같다면 성취도가 높은 사람을 먼저 출력하라
2. 영업부 직원을 먼저 입사한 순서대로 정렬하라

SELECT NAME FROM tstaff ORDER BY salary, score DESC;
SELECT NAME, depart, joindate FROM tstaff WHERE depart = '영업부' ORDER BY joindate;

 

3. 데이터 베이스 백업

 - 데이터베이스 우클릭 > 데이터베이스를 SQL로 내보내기 > 생성 체크 > 파일명 + 저장공간 설정 > 내보내기

 

4. DISTINCT / ALL

 - 중복된 값을 제거할 때 DISTINT 키워드를 붙임

 - 중복값을 합쳐 한 번만 출력, 중복 제거를 하다 보면 순서가 달라짐. 중복 제거하고 정렬도 하고 싶으면 ORDER BY 붙임

 - DISTINCT의 반대 키워드는 ALL 이며 중복 제거 없이 모든 레코드 출력 (ALL은 디폴라서 굳이 지정할 필요는 없음)

SELECT region FROM tcity;
SELECT DISTINCT region FROM tcity;
SELECT DISTINCT region FROM tcity ORDER BY region;

SELECT ALL depart FROM tstaff;

 

5. 연습문제 2

2020년 이후 신입 사원을 받은 적이 있는 부서 목록을 조사하라

SELECT DISTINCT depart FROM tstaff WHERE joindate >= '20200101';
SELECT DISTINCT depart FROM tstaff WHERE joindate >= '2020-01-01';

 

6. LIMIT

 - LIMIT 구문으로 행수를 제한

 - 기본형식 : SELECT ... LIMIT [건너뛸 개수], 총개수

SELECT * FROM tcity ORDER BY AREA DESC LIMIT 4;
SELECT * FROM tcity ORDER BY AREA DESC LIMIT 0,4;

SELECT * FROM tcity ORDER BY AREA DESC LIMIT 2,3; # 앞쪽 2개는 건너뛰고 이후 3개 행 출력
SELECT * FROM tcity ORDER BY AREA DESC LIMIT 3 OFFSET 2;

 

7. OFFSET FETCH

 - SQL 표준이 새로 OFFSET FETCH 문법을 만듬

 - 별도의 구문이 아니라 ORDER BY의 옵션

 - 기본형식 : ORDER BY [기준필드] OFFSET [건너뛸행수] ROWS FETCH NEXT [출력할 행수] ROWS ONLY

SELECT * FROM tcity ORDER BY AREA DESC OFFSET 0 ROWS fetch NEXT 4 ROWS ONLY;
SELECT * FROM tcity ORDER BY AREA DESC LIMIT 0,4;

SELECT * FROM tcity ORDER BY AREA DESC OFFSET 2 ROWS fetch NEXT 3 ROWS ONLY;
SELECT * FROM tcity ORDER BY AREA DESC LIMIT 2,3;

SELECT * FROM tcity WHERE metro = 'n' ORDER BY AREA OFFSET 2 ROWS fetch NEXT 3 ROWS ONLY;
SELECT * FROM tcity WHERE metro = 'n' ORDER BY AREA DESC LIMIT 2,3;

 

8. 연습문제 3

1. 월급 12번째에서 16번째 직원구하고, 월급이 같으면 이름을 내림차순으로 정렬

SELECT NAME FROM tstaff ORDER BY salary, name OFFSET 11 ROWS fetch NEXT 5 ROWS ONLY;
SELECT * FROM tstaff ORDER BY salary, NAME LIMIT 11,5;

 

9. 연습문제 4

1. 고객 테이블에서 고객이름, 등급, 나이를 검색하되, 나이를 기준으로 내림차순 정렬해보자.
2. 주문 테이블에서 수량이 10개 이상인 주문의주문고객, 주문제품, 수량, 주문일자를 검색해보자.
단, 주문 제품을 기준으로 오름차순 정렬하고,동일 제품은 수량을 기준으로 내림차순 정렬해보자.

SELECT `고객이름`, `등급`, `나이` FROM `고객` ORDER BY `나이` DESC;
SELECT `주문고객`, `주문제품`, `수량`, `주문일자` FROM `주문` WHERE 10 <=  `수량` ORDER BY `주문제품`, `수량` DESC;