내일배움캠프/TIL

SQL 문법 정리

cork-7 2024. 12. 6. 23:33

<aside> 💡

FROM: 데이터베이스에서 데이터를 가져올 테이블을 지정합니다. 이 단계에서 조인(Join)도 수행됩니다. WHERE: FROM 절에서 선택된 데이터에 대해 조건을 적용하여 필터링합니다. 이 단계에서 조건에 맞지 않는 행은 제외됩니다. GROUP BY: WHERE 절에서 필터링된 결과를 그룹화합니다. 동일한 값의 행들이 하나의 그룹으로 묶입니다. HAVING: GROUP BY로 생성된 그룹에 대해 조건을 적용합니다. 이 절은 집계 함수와 함께 사용되며, 그룹화된 결과에 대한 필터링을 수행합니다. SELECT: 최종적으로 선택할 열을 지정합니다. 이 단계에서 집계 함수도 적용됩니다. ORDER BY: 결과 집합을 정렬합니다. 이 절은 결과를 특정 열에 따라 오름차순 또는 내림차순으로 정렬합니다

</aside>

<aside> 💡

SQL절 작동 순서

  • FROM>WHERE>GROUP BY>HAVING>SELECT>ORDER BY

SQL절 작성 순서

  • SELECT>FROM>WHERE>GROUP BY>HAVING>ORDER BY </aside>

기본 함수

SELECT 컬럼
FROM 테이블
    • : 모든 컬럼을 가져와준다는 의미
  • WHERE : 특정 테이터의 조건을 필터링 할때 사용
  • 같음,큼,작음의 조건비교연산자 의미 예시
    = 같다 age = 21
    gender=’female’    
    <> 같지 않다(다르다) age<>
    > 크다 age>
    >= 크거나 같다 age>=
    < 작다 age<
    <= 작거나 같다 age<=
  • 다양한 조건
    • BETWEEN : A와 B 사이
      • 기본 문법: beween a and b
      • 예시: 나이가 30에서 40 사이
      WHERE age between 30 and 40
      
    • IN : ‘포함’하는 조건
      • 기본 문법 : in (A, B, C)
      • 예시: 나이가 10,27,43 세인 경우
      age in (10, 27, 43
      
      • 예시: 음식 종류가 한식, 일식 일 경우
      cuisine_type in ('Korean', 'Japanese')
      
    • LIKE : 완전히 똑같진 않지만 비슷한 조건
      • 특정한 문자로 시작하는 경우
        • 기본문법 : like ‘시작문자%’
        • 예시 : ‘김’으로 시작하는 이름
      • 특정한 문자를 포함하는 경우
        • 기본문법: like ’%포함문자%’
        • 예시 : 식당이름에 ‘Next’를 포함하는 경우
      • 특정한 문자로 끝나는 경우
        • 기본문법 : like ‘%끝나는 문자’
        • 예시 : ‘임’으로 끝나는 이름
  • WHERE 절에 여러 조건 적용하기
    • 논리연산 종류
    논리연산자 의미 예시
논리연산자 의미  예시
AND 그리고 age>20 and gender=’female’ →나이가 20세 이상이고, 여성
OR 또는 age>20 or gender=’female’ →나이가 20세 이상이거나, 여성
NOT 아닌 not gender=’female’ →여성이 아닌

집계 함수

  • 기본 연산, 합계와 평균
    • 함수종류
      • 합계 : SUM(컬럼)
      • 평균 : AVG(컬럼)
    • 예시
      • [코드스니펫] 합계와 평균
      SELECT sum(food_preparation_time) as total_food_preparation_time,
             avg(delivery_time) avg_food_delivery_time
      FROM food_orders
      
  • 전체 데이터의 갯수
    • 함수 종류
      • 데이터 갯수 : COUNT(컬럼) // 컬렴명 대신 1 혹은 * 사용가능
      • 중복없이 하고 싶은 경우 : COUNT(DISTINCT 컬럼)
    • 사용예시
      • [코드스니펫]
      • SELECT count(1) count_of_orders, count(distnct customer_id) as count_of_customers FROM food_orders
  • 데이터의 범위, 최솟값 최댓값 구하기
    • 함수종류
      • 최솟값 : MIN(컬럼)
      • 최댓값 : MAX(컬럼)
    • 사용예시
    • [코드스니펫]
    • SELECT min(price) min_price, max(price) max_price FROM food_orders
  • GROUP BY
    • 여러 Query없이 컬럼을 지정해 함수로 연산가능
      • 일반적으로 sum,avg,max,min 등의 집계 함수를 사용할 때 사용
    • 기본구조
    • SELECT 컬럼, sum FROM GROUP BY 컬럼
    • 사용예시
    • SELECT cuisine_type, sum(price) sum_of_price FROM food_orders GROUP BY cuisine_type
  • ORDER BY
    • 출력값들의 순서를 원하는 컬럼을 기준으로 하여 내림차순이든 올림차순이든 지정하는 코드?
      • 오름차순 : 숫자가 점점 커지는 정렬
      • 내림차순 : 숫자가 점점 작아지는 정렬
      • 기본적으로 오름차순이며 내림차순으로 작성시 [order by 컬럼 desc]
    • 기본구조
      • 기본적으로 from 뒤에 작성하며 group by뒤에 작성한다
      SELECT 컬럼,
             sum
      FROM 
      GROUP BY 카테고리 컬럼
      ORDER BY 정렬컬럼
      
      • 사용 예시
      • select cuisine_type, sum(price) sum_of_price from food_orders group by cuisine_type order by sum(price)
  • HAVING
    • 그룹핑한 뒤 조건별로 출력하고 싶을 때 사용where과 having의 역할 적인 차이는 없다.
    • </aside>
    • <aside> 💡

변형 함수

  • replace
    • 특정 문자를 다른 것으로 바꾸는 함수
    replace(바꿀 컬럼, 현재 값, 바꿀 값)
    
    select addr "원래 주소",
           replace(addr, '문곡리', '문가리') "바뀐 주소"
    from food_orders
    where addr like '%문곡리%'
    
  • substring
    • 문자의 특정부분만 조회하는 함수
    substr(조회 할 컬럼, 시작 위치, 글자 수)
    
    select addr "원래 주소",
           substr(addr, 1, 2) "시도"
    from food_orders
    where addr like '%서울특별시%'
    
  • concat
    • 여러문자를 합치는 함수
    concat(붙이고 싶은 값1, 붙이고 싶은 값2,......)
    
    select restaurant_name "원래 이름",   
           addr "원래 주소",
           concat('[', substring(addr, 1, 2), '] ', restaurant_name) "바뀐 이름"
    from food_orders
    where addr like '%서울%'
    
    • 붙일 수 있는 문자 종류(’ ‘붙여서 입력)
      • 컬럼
      • 한글
      • 영어
      • 숫자
      • 기타 특수 문자

조건 함수

  • IF
    select restaurant_name,
           cuisine_type "원래 음식 타입",
           if(cuisine_type='Korean', '한식', '기타') "음식 타입"
    from food_orders
    
  • if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)
  • case
    • 조건별로 적용값을 지정할 때 사용
    case when 조건1 then 값(수식)1
         when 조건2 then 값(수식)2
         else 값(수식)3
    end
    
    select restaurant_name,
           cuisine_type AS "원래 음식 타입",
           case when (cuisine_type='Korean') then '한식'
           else '기타'
           end as " 음식 타입"
    from food_orders
    

다중 연산(Subquery)

  • Subquery가 필요한 경우
    • 여러번의 연산을 수행해야 할 때→ 수수료를 부과할 수 있는 시간을 구하고 → 구해진 시간에 주문 금액별로 가중치를 주고 → 가중치를 적용한 결과로 최종 예상 배달비를 계산할 때
    • </aside>
    • <aside> 💡
    • 조건문에 연산 결과를 사용해야 할 때→ 음식 타입별 평균 음식 주문금액 따라 음식비 상/중/하 를 나누고 싶을 때
    • </aside>
    • <aside> 💡
    • 조건에 Query결과를 사용하고 싶을 때→ 음식 타입별 평균 음식 주문금액 따라 음식비 상/중/하를 나누고 싶을 때
    • </aside>
    • <aside> 💡
  • Subquery의 기본 구조
    • 서브쿼리와 함께 사용하는 연산자
      • IN, NOT IN
      • EXISTS
      • ANY
      • ALL
  • 장 단점
    • 장점
      • 편리성 : SQL 구문 안에서 유연하게 또 다른 SQL문을 만들어 활용 할수 있어 코딩 시 편리함을 준다
    • 단점
      • 추가적인 연산 비용 발생 : 서브쿼리에 접글할 때마다 SELECT구문에 접근하여 데이터를 만들어 연산비용 증가
      • 최적화 문제 : 서브쿼리엔 메타정보(인덱스, 명시적인 제약)가 담겨있지 않아, 내부적으로 복잡한 연산이나 큰 서브쿼리는 성능문제 발생
      • 복잡한 쿼리 : 내용이 복잡해지면 가독성 하락

기타 함수

  • TOP
  • UNION
  • INSERT
  • UPDATE
  • DELETE
  • SET
  • DO
  • LIMIT
    • limit 시작, 개수
    • limit 뒤에 하나의 숫자만 입력 시 처음부터 N개 까지의 데이터만 조회
    • limit과 offset조합으로도 출력 개수 제한 가능
    • SELECT * FROM Account LIMIT 3, 2; -- 3번째 데이터부터 2개만 조회 LIMIT 2 OFFSET 3; -- 위와 동일
  • IS NOT NULL : 키워드를 이용해 특정 컬럼의 값이 null이 아닌지를 비교
  • IS NULL : 키워드를 통해 특정 컬럼의 값이 null 값인지를 비교
  • JOIN

'내일배움캠프 > TIL' 카테고리의 다른 글

[Java]_연산자  (0) 2024.12.18
[java]_변수와 타입  (0) 2024.12.16
[내일배움캠프]_사전캠 SQL 5일차  (0) 2024.11.26
[내일배움캠프]_사전캠 SQL 4일차  (0) 2024.11.25
[내일배움캠프]_사전캠 SQL 3일차  (0) 2024.11.22