1. ORDER BY
🐰 SELECT 명령에 필드 지정이 없을 경우 레코드의 출력 순서는 DBMS의 디폴트 순서를 따름.
🐰 관계형 DB에서 레코드의 물리적 순서는 큰 의미가 없고, 대신 출력할 때 ORDER BY 절로 정렬 순서를 원하는대로 지정.
// 기본형식
ORDER BY 필드 [ASC | DESC]
🐰 ORDER BY 다음에 정렬 기준 필드를 적고 오름차순일 경우 ASC 키워드를, 내림차순일경우 DESC 키워드를 지정.
🐰 순서를 생략하면 디폴트인 오름차순으로 적용되므로 키워드 ASC는 보통 생략.
SELECT * FROM tCity ORDER BY popu;
SELECT * FROM tCity ORDER BY popu ASC;
🔖 인구수를 기준으로 정렬하여 인구가 작은 도시부터 출력.
SELECT * FROM tCity ORDER BY popu DESC;
🔖 DESC를 붙이면 내림차순으로 정렬해서 인구가 많은 도시부터 출력.
🐰 두 개 이상의 기준 필드를 지정하는 경우 ➡️ 첫 번째 기준 필드의 값이 같으면, 두 번째 기준 필드를 비교하여 정렬 순서를 결정.
SELECT region, name, area, popu FROM tCity ORDER BY region, name DESC;
SELECT region, name, area, popu FROM tCity ORDER BY region ASC, name DESC;
🔖 지역별로 정렬하되 같은 지역에 속한 도시끼리는 이름의 내림 차순으로 정렬.
🔖 ORDER BY 뒤에 기준 필드를 콤마로 구분하여 나열하되 각 기준별로 오름차순과 내림차순을 따로 지정 가능.
🔖 region은 순서를 지정하지 않았으므로 디폴트인 ASC가적용. 1차 정렬 기준인 지역이 같으면 2차 기준인 이름순으로 정렬하되 이때는 DESC 내림차순으로 정렬.
SELECT region, name, area, popu FROM tCity ORDER BY area ASC, name DESC;
🔖 area가 동일한 값이 없으므로 두 번째 정렬 기준인 name은 효력을 발휘하지 않음.
🐰 ORDER BY 기준은 보통 필드명으로 하지만 순서값으로도 지정 가능. 필드 순서 값은 테이블 생성시에 등록한 순서.
🐰 tCity의 경우 name이 1번, area가 2번, popu가 3번
SELECT * FROM tCity ORDER BY area;
SELECT * FROM tCity ORDER BY 2;
🔖 면적순으로 정렬하려면 area를 기준으로 하는 대신 2번 필드 기준으로 해도 결과는 같음
🐰 테이블에 존재하지 않은 계산값도 정렬 기준으로 사용할 수 있음.
SELECT name, popu * 10000 / area FROM tCity ORDER BY popu * 10000 / area;
SELECT name, popu * 10000 / area AS tmp FROM tCity ORDER BY tmp;
🔖 인구수와 면적으로 계산한 인구밀도의 오름차순으로 도시를 정렬.
🔖 정렬 기준을 꼭 같이 출력할 필요는 없지만 제대로 정렬했는지 확인하기 위해 인구밀도를 같이 출력
🐰 레코드의 조건을 지정하는 WHERE 절과 출력 순서를 지정하는 ORDER BY 절을 동시에 사용 가능.
SELECT * FROM tCity WHERE region = '경기' ORDER BY area;
🔖 경기도에 있는 도시만 골라 면적별로 정렬.
이때 ORDER BY 절은 WHERE 절보다 뒤쪽에 있어야 함.
2. DISTINCT
🐰 중복된 값을 제거할 때 DISTINCT 키워드를 붙인다.
ex. 도시 테이블에서 region 필드만 읽어 도시가 속한 지역의 목록을 조사하고 싶은 경우 SELECT region FROM tCity; 로 작성
➡️ 하지만 이런 경우 같은 도시가 여럿 있는 경우 중복해서 출력
➡️ 단순히 어떤 지역이 있는지만 조사한다면 굳이 중복된 값을 반복해서 출력할 필요가 없음
➡️ DISTINCT 키워드를 사용하여 중복된 값 제거.
SELECT DISTINCT region FROM tCity;
SELECT DISTINCT region FROM tCity ORDER BY region;
🔖 DISTINCT 키워드로 중복 제거를 하다 보면 순서가 달라짐.
🔖 만약 중복도 제거하고 정렬도 하고 싶으면 ORDER BY절을 붙임.
🐰 DISTINCT의 반대 키워드는 ALL 이며 중복 제거 없이 모든 레코드를 출력.
🐰 ALL이 디폴트라서 굳이 지정할 필요는 없음.
SELECT ALL depart FROM tStaff;
3. LIMIT
// 기본 형식
SELECT .... LIMIT [건너뛸 개수], 총개수
🐰 LIMIT 구문으로 행수를 제한.
🐰 건너뛸 개수를 생략하면 0으로 적용하여 첫 행 부터 출력
SELECT * FROM tCity ORDER BY area DESC LIMIT 4;
SELECT * FROM tCity ORDER BY area DESC LIMIT 0, 4;
🔖 면적이 넓은 상위 4개 도시를 구하는 구문.
SELECT * FROM tCity ORDER BY area DESC LIMIT 2, 3;
SELECT * FROM tCity ORDER BY area DESC LIMIT 3 OFFSET 2;
🔖 앞쪽 2개는 건너뛰고 이후 3개의 행을 구함.
🔖 앞쪽 몇 개를 건너뛴 후 일정 개수 만큼 보여주는 이 구문은 게시물을 페이지 단위로 끊어서 출력할 때 실용적.
4. OFFSET FETCH
🐰 테이블의 일부 레코드만 조회하는 작업은 빈도가 높고 실용적이지만 DBMS 별로 사용하는 문법이 다름.
➡️ SQL 표준이 새로 OFFSET FETCH 문법을 만듦.
➡️ 일부분을 특정하려면 순서를 지정해야 되서 ORDER BY 문이 반드시 있어야 함.
➡️ 그래서 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;
🔖 면적 순으로 상위 4개의 도시를 출력. 면적을 내림차순을 정렬 후 4개의 행만 읽음.
➡️ OFFSET을 지정하면 앞쪽 일부를 건너뛸 수 있음.
SELECT * FROM tCity ORDER BY areabDESC OFFSET 2 ROWS FETCH NEXT 3 ROWS ONLY;
SELECT * FROM tCity ORDER BY area DESC LIMIT 2, 3;
🔖 상위 2개를 건너 뛰고 다음 순서인 3, 4, 5위 3개의 도시를 조사.
🐰 WHERE 구문과 함께 사용하여 필터링을 먼저 하고 그 일부 레코드만 출력할 수 있음.
SELECT * FROM tCity WHERE metro = 'n' ORDER BY area DESC OFFSET 2 ROWS FETCH NEXT 3 ROWS ONLY;
SELECT * FROM tCity WHERE metro = 'n' ORDER BY area DESC LIMIT 2, 3;
🔖 광역시는 제외하고 순위를 매겨 3등에서 5등까지 출력.
[ 내용 출처 : IT 학원 강의 ]
'Database > MySQL' 카테고리의 다른 글
[MySQL] GROUP BY, HAVING (0) | 2024.02.23 |
---|---|
[MySQL] 집계 함수 (aggregate function) (0) | 2024.02.23 |
[MySQL] SELECT문 | WHERE, NULL, 논리연산자, LIKE, BETWEEN, IN (0) | 2024.02.23 |
[MySQL] SELECT문 | 기본형식, 필드목록, 별명, 계산값출력 (0) | 2024.02.23 |
데이터베이스 개념 (1) | 2024.02.12 |