SQL

SQL 쿼리 문법

retill28 2024. 8. 1. 17:23

데이터베이스 활용 쿼리 

모든 쿼리의 작성 순서는 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 데이터베이스 활용 예제 

 

world 구조

 

  1. city 테이블에서 총 도시 수 알아내기 - COUNT 
    SELECT COUNT(*) FROM city;


  2. city 테이블에서 CountryCode 가 'KOR'인 도시 수 구하기 - DISTINCT
    SELECT COUNT(*) FROM city WHERE CountryCode = 'KOR';


  3. 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;


  4. country 테이블에서 Continent별 총 SurfaceAreadhk 구하기 - GROUP BY 
    SELECT * FROM country LIMIT 1; --컬럼확인
    SELECT Continent, SUM(SurfaceArea) 
    FROM country GROUP BY Continent;


  5. 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;
  6. 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 데이터베이스 활용 예제 

 

  1. film 테이블에서 총 영화 수 알아내기 - COUNT 
    USE Sakila;
    
    SELECT * FROM film LIMIT 1;
    SELECT COUNT(*) FROM film;


  2. film 테이블에서 영화 등급종류 알아내기 -  DISTINCT, GROUP BY
    #DISTINCT
    SELECT DISTINCT rating FROM film;
    
    #GROUP BY
    SELECT rating FROM film GROUP BY rating;


  3. rental 테이블에서 inventory_id 가 367인 행 전부 출력 - WHERE
    SELECT * FROM rental 
    WHERE inventory_id = 367;


  4. film 테이블에서 rating별 영화갯수, 평균 렌탈 비용 구하기 - GROUP BY 
    SELECT * FROM film LIMIT 1;
    SELECT rating, COUNT(*), AVG(rental_rate)
    FROM film
    GROUP BY rating;


  5. 4번의 결과를 높은 순으로 출력 - ORDER BY
    SELECT rating, COUNT(*), AVG(rental_rate)
    FROM film 
    GROUP BY rating
    ORDER BY AVG(rental_rate) DESC;


  6. film 테이블에서 rating별 영화 길이가 80분 이상인 영화의 갯수 구하기 - GROUP BY, WHERE 
    SELECT * FROM film LIMIT 1;
    SELECT rating, COUNT(*) 
    FROM film
    #WHERE length >=130 
    GROUP BY rating;



 

 

 

 

'SQL' 카테고리의 다른 글

SQL 서브쿼리  (0) 2024.08.08
SQL 명령어 2  (0) 2024.08.08
SQL 함수  (0) 2024.08.01
SQL 명령어의 종류  (1) 2024.08.01
SQL BASIC  (0) 2024.08.01