데이터베이스 활용 쿼리
모든 쿼리의 작성 순서는 SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY 순이다.
하지만 실행 순서는 FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY 순이다.
SELECT |
값을 가져올 컬럼을 선택 | |
AS | 별명을 지정, 컬럼 이름에 부가 설명을 하거나 불필요한 내용을 제거할 때 사용. 실제 컬럼 이름은 변하지 않고, 해당 쿼리 내에서만 유효 |
|
RANK | 데이터에 순위를 매기기 항상 ORDER BY와 함께 사용한다. 정렬된 순서에 순위를 붙인 새로운 컬럼을 보여주나 실제 데이터에 영향은 없다. 공동 순서가 있으면 다음순서로 건너뛴다. SELECT FROM [컬럼이름], …, RANK() OVER (ORDER BY [컬럼이름]) # 결과 : 1 2 2 4 5 ... |
|
DENSE_RANK | 데이터에 순위를 매기기 항상 ORDER BY와 함께 사용한다. 공동 순위가 있어도 다음 순위를 뛰어넘지 않는다. SELECT FROM [컬럼이름], …, DENSE_RANK() OVER (ORDER BY [컬럼이름]) # 결과 : 1 2 2 3 4 |
|
ROW_NUMBER | 데이터에 순위를 매기기 항상 ORDER BY와 함께 사용한다. 공동 순위를 무시한다. SELECT FROM [컬럼이름], …, ROW_NUMBER() OVER (ORDER BY [컬럼이름]) # 결과 1 2 3 4 5 |
|
DISTINCT | 중복된 데이터가 있으면 같은 값을 한번만 가져옴. 컬럼내의 어떤 값이 있는지 확인할 때 사용 pandas의 unnique() 같은 역할, SELECT 절에 위치한다. |
|
FROM | 데이터를 가져올 테이블을 선택 | |
WHERE | 가져올 데이터의 조건을 지정한다. 조건식이 참이 되는 로우를 선택한다. 비교 연산자(<.>,=), 논리 연산자(NOT, AND, OR) 등를 사용한다. (참/거짓 = 1/0) |
|
BETWEEN | 범위를 선택할 경우 : BETWEEN A AND B A이상 B이하의 값 |
|
IN | 목록 내 포합되는 데이터를 선택하는 경우: IN (A,B,...,C) 데이터값이 A 이거나 B이거나 ... C이거나 |
|
LIKE | 와일드카드를 사용하여 조회할 문자열의 형식을 지정할 수 있다. % : 0개 이상의 문자 / _ : 1개의 문자. |
|
IS NULL / IS NOT NULL |
컬럼이 NULL인 / NULL이 아닌 로우만 | |
GROUP BY | 컬럼에서 동일한 값을 가지는 로우를 그룹화한다. 엑셀의 피벗과 유사하다. GROUP BY를 사용한 쿼리의 SELECT 절에는 GROUP BY 대상 컬럼과 그룹 함수만 사용가능 |
|
ORDER BY | 출력하는 로우들을 정렬한다. 기본 정렬을 오름차순, 내림차순으로 바꾸고 싶다면 마지막에 DESC를 붙인다. ORDER BY 뒤에 복수개의 컬럼을 넣으면 여러 컬럼으로 정렬이 가능하다. |
|
HAVING | 가져올 데이터 그룹에 조건을 지정해주는 키워드 "해당 그룹의 어떤 속성이 / 계산 결과가 ~인" 이라는 뜻 조건이 참이 되는 그룹만 출력해서 보여준다. |
|
LIMIT | 가져올 데이터의 갯수를 지정. 해당 테이블의 컬럼명들을 확인할 때 사용 |
* world 데이터베이스 활용 예제
- city 테이블에서 총 도시 수 알아내기 - COUNT
SELECT COUNT(*) FROM city;
- city 테이블에서 CountryCode 가 'KOR'인 도시 수 구하기 - DISTINCT
SELECT COUNT(*) FROM city WHERE CountryCode = 'KOR';
- city 테이블에서 Population의 총합, 최대값, 최소값, 평균값 구하기 - SUM, AVG, MAX, MIN
SELECT SUM(Population) FROM city; SELECT MAX(Population) FROM city; SELECT MIN(Population) FROM city; SELECT AVG(Population) FROM city; # 혹은 SELECT SUM(Population), AVG(Population), MAX(Population), MIN(Population) FROM city;
- country 테이블에서 Continent별 총 SurfaceAreadhk 구하기 - GROUP BY
SELECT * FROM country LIMIT 1; --컬럼확인 SELECT Continent, SUM(SurfaceArea) FROM country GROUP BY Continent;
- country 테이블에서 Region별 IndepYear가 1900 이상인 국가를 평균 GNP가 낮은 순으로 5개 출력 - ORDER BY
SELECT AVG(GNP) FROM country WHERE IndepYear >=1900 GROUP BY Region ORDER BY AVG(GNP) ASC LIMIT 5;
- 5번의 결과에서, 평균 GNP 칼럼명을 AvgGNP로 출력 - AS
SELECT Region, AVG(GNP) AS AvgGNP FROM country WHERE IndepYear >=1900 GROUP BY Region ORDER BY AVG(GNP) ASC LIMIT 5; #혹은 SELECT Region, AVG(GNP) AvgGNP FROM country WHERE IndepYear >=1900 GROUP BY Region ORDER BY AVG(GNP) ASC LIMIT 5;
* sakila 데이터베이스 활용 예제
- film 테이블에서 총 영화 수 알아내기 - COUNT
USE Sakila; SELECT * FROM film LIMIT 1; SELECT COUNT(*) FROM film;
- film 테이블에서 영화 등급종류 알아내기 - DISTINCT, GROUP BY
#DISTINCT SELECT DISTINCT rating FROM film; #GROUP BY SELECT rating FROM film GROUP BY rating;
- rental 테이블에서 inventory_id 가 367인 행 전부 출력 - WHERE
SELECT * FROM rental WHERE inventory_id = 367;
- film 테이블에서 rating별 영화갯수, 평균 렌탈 비용 구하기 - GROUP BY
SELECT * FROM film LIMIT 1; SELECT rating, COUNT(*), AVG(rental_rate) FROM film GROUP BY rating;
- 4번의 결과를 높은 순으로 출력 - ORDER BY
SELECT rating, COUNT(*), AVG(rental_rate) FROM film GROUP BY rating ORDER BY AVG(rental_rate) DESC;
- film 테이블에서 rating별 영화 길이가 80분 이상인 영화의 갯수 구하기 - GROUP BY, WHERE
SELECT * FROM film LIMIT 1; SELECT rating, COUNT(*) FROM film #WHERE length >=130 GROUP BY rating;