SQL
Structured Query Language
데이터베이스와 대화하기 위해 특별히 디자인된 언어
1. SELECT
- 보고싶은 데이터 coloumn를 뽑아낼 때 사용
SELECT * // 테이블의 모든 컬럼
FROM order_list // 주문 리스트 전체 테이블 확인하기
2. ORDER BY
SELECT *
FROM ORDER_LIST
ORDER BY amount // 금액에 따라 정렬
ORDER BY amount desc // 내림차순
ORDER BY amount, quantity // 여러 항목을 넣을수도 있음
3. GROUP BY / COUNT
- group by : 그룹화 하여 데이터 조회
- count : 특정 테이블에 들어있는 데이터 전체 개수
- group by는 중복 제거를 할 때에도 자주 사용
SELECT order_status, count(*)
FROM order_list
GROUP BY order_status
// 주문 상태별로 데이터 개수를 파악
4. WHERE / AND / OR
- where : 테이블의 모든 데이터가 아닌 일부 데이터만 보고자 할 때 사용
- and : 조건을 동시에 만족
- or : 조건을 하나라도 만족
SELECT *
FROM order_list
WHERE status='결제완료'
// status가 '결제완료'인 데이터만 추출
SELECT *
FROM order_list
WHERE status='결제완료'
AND quantity=2
// status가 '결제완료'이고 quantity가 2인 데이터 추출
5. CASE WHEN / ELSE
- case when : 데이터의 값이 특정 조건일 때 새로운 값을 지정
- 데이터를 범주화 하거나, 읽기 쉽게 바꿔주는 역할을 함
- else : 기타 표현 내용
SELECT name, score
,CASE WHEN score <= 60 THEN "C등급"
WHEN score <= 80 THEN "B등급"
// 첫번째 조건에서 60 이하가 걸러졌기 때문에
// B 등급은 60 초과 80 이하가 됨
WHEN score <= 100 THEN "A등급"
ELSE "점수 오류"
END
FROM score_list
6. LIKE / NOT LIKE
- like : 특정 단어가 포함되는 조건
- not like : 특정 단어가 포함되지 않는 조건
- % <= 단어 앞뒤로 붙였을 때 어떤 것이든 상관없다는 뜻
SELECT *
FROM student_list
WHERE name LIKE '%지원%'
// name에 지원 이라는 글자가 포함된 것 뽑기
// % <= 지원 앞뒤로 어떤 것이든 상관없다는 뜻
WHERE name LIKE '%지원'
// "김지원"은 나오지만, "지원지"과 같은 단어는 안나옴
7. sub query
- sub query를 사용하면 내가 가공한 쿼리를 재사용 할 수 있음
SELECT *
// 소괄호 시작 부터 서브 쿼리
FROM (
SELECT dong,COUNT(*) cnt
FROM apt_list
GROUP BY dong
// dong별로 데이터 개수를 count한 테이블을 만들고
) a
WHERE cnt>100
// 서브 쿼리에서 만들어진 동별 데이터개수 테이블 에서, 데이터개수가 100개 이상인 것들만 추출
8. HAVING
- HAVING 절은 SQL에서 그룹화된 데이터에 대해 필터링 조건을 적용할 때 사용
- 일반적으로 GROUP BY 절과 함께 사용
- WHERE 절과의 차이점:
- WHERE 절은 데이터가 그룹화되기 전에 개별 행에 대해 조건을 적용
- HAVING 절은 데이터가 그룹화된 후, 집계 함수(예: COUNT, SUM, AVG 등)를 사용한 결과에 조건을 적용
SELECT REGION, PRODUCT, SUM(QUANTITY) AS TOTAL_QUANTITY -- 각 지역 및 제품별로 총 판매 수량을 계산합니다.
FROM SALES -- 데이터를 SALES 테이블에서 가져옵니다
GROUP BY REGION, PRODUCT -- REGION과 PRODUCT를 기준으로 데이터를 그룹화
HAVING SUM(QUANTITY) > 20; -- 그룹화된 결과에서 총 판매 수량이 20을 초과하는 그룹만 필터링하여 출력
실전 예시
https://school.programmers.co.kr/learn/courses/30/lessons/131536
-- 코드를 입력하세요
SELECT USER_ID, PRODUCT_ID -- 회원 ID와 상품 ID를 선택합니다.
FROM ONLINE_SALE -- 데이터를 ONLINE_SALE 테이블에서 가져옵니다.
GROUP BY USER_ID, PRODUCT_ID -- 회원 ID와 상품 ID를 기준으로 데이터를 그룹화합니다.
HAVING COUNT(*) > 1 -- 그룹화된 결과에서 동일한 상품을 2번 이상 구매한 경우만 필터링
ORDER BY USER_ID ASC, PRODUCT_ID DESC -- 회원 ID를 기준으로 오름차순 정렬, 상품 ID를 기준으로 내림차순 정렬
9. 가장 최신 정보 조회 및 하나만 뽑기
2013-10-14 15:38:00 형식의 DATETIME을 ORDER BY 해도 시간 순서로 정렬되네
-- 코드를 입력하세요
SELECT DATETIME AS 시간
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1
실전
문제
CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요. 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE 로 지정해주세요.
-- 코드를 입력하세요
SELECT ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE // DAILY_FEE의 AVG의 소수점 반올림하고 이것을 AVERAGE_FEE 컬럼명으로 지정
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE='SUV' // 차 종류가 SUV인것만
-- 코드를 입력하세요
SELECT COUNT(DISTINCT NAME) AS count -- DISTINCT 키워드를 사용하여 중복을 제거한 후 COUNT 함수를 사용
FROM ANIMAL_INS
WHERE NAME IS NOT NULL -- 조건문
문제
FOOD_PRODUCT 테이블에서 가격이 제일 비싼 식품의 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 조회하는 SQL문을 작성해주세요.
-- 코드를 입력하세요
SELECT *
FROM FOOD_PRODUCT
ORDER BY PRICE DESC
LIMIT 1
다른 방식
-- 코드를 입력하세요
SELECT *
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT)
- CONCAT: CONCAT 함수는 SQL에서 문자열을 결합(연결)할 때 사용하는 함수
- 여러 개의 문자열을 하나의 문자열로 합쳐서 반환
예시
1. 기본 사용
SELECT CONCAT('Hello, ', 'World!') AS greeting;
결과: Hello, World!
2. 테이블 데이터와 연결
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM employees;
이 쿼리는 employees 테이블에서 first_name과 last_name 열의 값을 결합하여, 각 직원의 전체 이름을 반환합니다.
FISH_INFO 테이블에서 잡은 물고기 중 가장 큰 물고기의 길이를 'cm' 를 붙여 출력하는 SQL 문을 작성해주세요.
이 때 컬럼명은 'MAX_LENGTH' 로 지정해주세요.
-- 코드를 작성해주세요
SELECT CONCAT(MAX(LENGTH), 'cm') AS MAX_LENGTH
FROM FISH_INFO