SQL 문법 & 사용법_심화

star_pooh·2024년 11월 8일
0

TIL

목록 보기
11/39
post-thumbnail

문자열 가공하기

  • REPLACE : 특정 문자를 다른 문자로 변경
  • SUBSTRING(SUBSTR) : 특정 부분만 추출
  • CONCAT : 문자끼리 연결
SELECT
	REPLACE(대상 컬럼, 현재 값, 변경 값),
    SUBSTR(대상 컬럼, 시작 위치, 길이), --시작 위치부터 정해진 길이까지만 추출
    SUBSTR(대상 컬럼, 시작 위치), -- 시작 위치부터 끝까지 추출
    CONCAT(연결하고 싶은 값1, 연결하고 싶은 값2, 연결하고 싶은 값3, ...)
FROM 테이블명
SELECT
	REPLACE(game_title, '롤토체스', 'TFT'),
    SUBSTR(addr, 1, 2), --주소 컬럼의 1번째 위치부터 2글자 추출
    CONCAT('[', SUBSTR(addr, 1, 2), ']') --명령어 내부에서 다른 명령어 호출 가능
FROM users

조건에 따라 조회하기

  • IF : 조건의 참, 거짓에 따라 결과 적용
  • CASE : 여러가지 조건 지정 가능
SELECT
	IF(조건, 참인 경우, 거짓인 경우),
    CASE WHEN 조건1 THEN1
         WHEN 조건2 THEN2
         WHEN 조건3 THEN3
         ELSE4
    END
FROM 테이블명
SELECT
	IF(country = 'Korea', '한국', '기타'),
    CASE WHEN contry = 'Korea' THEN '한국'
         ELSE '기타'
    END
FROM users

서브쿼리(Subquery)

  • Subquery : 쿼리 안에 작성되는 쿼리로서 여러 번의 연산을 수행하거나 메인 쿼리에서 사용할 데이터를 추출하기 위해 사용
SELECT
	컬럼1,
    별칭 컬럼
FROM
	--FROM절 서브쿼리
	(	
    	SELECT
        	컬럼1,
            컬럼2 별칭 컬럼
        FROM 테이블명
    ) 서브쿼리 별칭 --FROM에서 사용할 경우 별칭이 필수
-----------------------------------------------------------------
SELECT
	컬럼1,
    컬럼2,
FROM 테이블1
--WHERE절 서브쿼리
WHERE 컬럼1 = (SELECT 컬럼3 FROM 테이블2)
SELECT
	order_id,
    restaurant_name,
    --2. 추출한 초과시간으로 배달 지연 여부를 판단
    IF(over_time > 0, 'Late', 'On-time')
FROM
	--1. 음식 준비 시간에서 25분을 뺀 값을 초과시간으로 추출
	(
    	SELECT
        	order_id,
            restaurant_name,
            (food_preparation_time - 25) over_time
        FROM food_orders
    ) a

조인(Join)

  • Join : 공통 컬럼을 기준으로 서로 다른 테이블에 있는 데이터를 추출하거나 연산하기 위해 사용
    • INNER JOIN : 공통 컬럼만 조회
    • LEFT JOIN : 공통 컬럼과 왼쪽 테이블의 모든 데이터 조회(오른쪽 테이블에 일치하는 데이터가 없다면 NULL로 표시)
    • RIGHT JOIN : 공통 컬럼과 오른쪽 테이블의 모든 데이터 조회(왼쪽 테이블에 일치하는 데이터가 없다면 NULL로 표시)
--INNER JOIN
SELECT
	a.컬럼1
    b.컬럼2
FROM 테이블1 a
INNER JOIN 테이블2 b
ON a.공통 컬럼 = b.공통 컬럼
-----------------------------------------------------------------
--LEFT JOIN
SELECT
	a.컬럼1
    b.컬럼2
FROM 테이블1 a
LEFT JOIN 테이블2 b
ON a.공통 컬럼 = b.공통 컬럼
-----------------------------------------------------------------
--RIGHT JOIN
SELECT
	a.컬럼1
    b.컬럼2
FROM 테이블1 a
RIGHT JOIN 테이블2 b
ON a.공통 컬럼 = b.공통 컬럼
SELECT
	a.order_id,
    a.customer_id,
    a.restaurant_name,
    a.price,
    b.name,
    b.age,
    b.gender
FROM food_orders a 
INNER JOIN customers b
ON a.customer_id = b.customer_id
--공통 컬럼만 조회
-----------------------------------------------------------------
SELECT
	a.order_id,
    a.customer_id,
    a.restaurant_name,
    a.price,
    b.name,
    b.age,
    b.gender
FROM food_orders a 
LEFT JOIN customers b
ON a.customer_id = b.customer_id
--JOIN을 기준으로 왼쪽에 있는 food_orders의 데이터는 모두 조회
-----------------------------------------------------------------
SELECT
	a.order_id,
    a.customer_id,
    a.restaurant_name,
    a.price,
    b.name,
    b.age,
    b.gender
FROM food_orders a 
RIGTH JOIN customers b
ON a.customer_id = b.customer_id
--JOIN을 기준으로 오른쪽에 있는 customers의 데이터는 모두 조회

사용할 수 없는 데이터 / NULL 데이터 처리하기

  • 사용할 수 없는 값 제외하기
    IF : 비교연산자<>를 사용
    IS NOT NULL : WHERE절에서 사용
SELECT
	restaurant_name,
	AVG(IF(rating <> 'Not given', rating, NULL))
FROM food_orders
GROUP BY restaurant_name
SELECT a.order_id,
       a.customer_id,
       b.age,
       b.gender
FROM food_orders a 
LEFT JOIN customers b 
ON a.customer_id = b.customer_id
WHERE b.customer_id IS NOT NULL
  • NULL값 대체하기
    COALESCE : NULL값이 존재할 때 다른 값으로 대체
SELECT
	COALESCE(컬럼명, 대체값)
FROM 테이블명
SELECT
	a.order_id,
    a.customer_id,
    b.name,
    COALESCE(b.age, 20) --b.age의 NULL값을 20으로 대체
FROM food_orders a 
LEFT JOIN customers b
ON a.customer_id = b.customer_id
WHERE b.age IS NULL

0개의 댓글

관련 채용 정보