ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2023-12-18
    스파르타/TIL(Today I Learned) 2023. 12. 18. 20:55

    (엑셀보다 쉽고 빠른 SQL강의를 듣고서 정리하며 복습)

    SQL이란?

    SQL 은 데이터베이스와 대화를 하기 위한 언어

    데이터베이스에게도 ‘A를 주겠니?’ 라고 이야기할 때 사용하는 언어

    SQL 이란 언어를 이용하여 데이터베이스에 요청을 하는 질의를 ‘Query’ ,

    데이터베이스에 요청을 할 때 Query 작성이라는 말을 사용

    데이터베이스 & 테이블 & 컬럼

    데이터 베이스

    데이터가 저장되어있는 큰 폴더라고 생각 (일종의 set라고 생각됨)이 폴더를 열어보면 안에 적게는 한 개부터 많게는 여러 개의 테이블이 있음

     

    테이블

    row(행), column(열)row(행)

    column(열)

    이 중 한 개를 자세히 확대해본다면

     

    컬럼

    이 중 세로 성분을 행이라고 하며 ‘열’ 또는 ‘필드’라고도함

    SELECT / FROM 문

    어느 테이블에서 데이터를 가져올까’ 를 SQL로 Query를 작성할 때 가장 먼저 생각

    SELECT : 데이터를 가져오는 기본 명령어로, 데이터를 조회하는 모든 Query 에 사용됨

    FROM : 데이터를 가져올 테이블을 특정해주는 문법

    • : 전부를 뜻하는 의미로 select * 경우 모든 컬럼을 가져와 준다는 의미

    컬럼에 별명 붙이기 (이름)

    - 방법1 : 컬럼1 as 별명1
    - 방법2 : 컬럼2 별명2
    
    • 별명 지을 때 유의사항구분 영문, 언더바 특수문자, 한글
      방법 별명만 적음 “별명” 으로, 큰 따옴표 안에 적어줌
      예시 ord_no “ord no”
      ”주문번호”    

    조건에 맞는 데이터만 필요할 때, SQL 로 필터링하기 (WHERE 이란)

    전체 데이터 중 원하는 데이터만 필터링

    select *
    from 테이블
    where 필터링 조건 (eg. 20살 이상)
    

    필터링을 할 때 유용한 표현 알아보기 (비교연산, BETWEEN, IN, LIKE)

    • 비교연산자의 종류비교연산자 의미 예시
      = 같다 age=21
          gender=’female’
      <> 같지 않다 (다르다) age<>21
          gender<>’female’
      > 크다 age>21
      >= 크거나 같다 age>=21
      < 작다 age<21
      <= 작거나 같다 age<=21
    • 다양한 조건의 종류 (BETWEEN, IN, LIKE)
      • BETWEEM : A 와 B 사이 : between a and b
      • IN : ‘포함’ 하는 조건 주기 : in (A, B, C) (구체적으로 특정 몇개를 포함하는 것)
      • LIKE : 완전히 똑같지는 않지만, 비슷한 값을 조건으로 주기 (특정문자를 전체문자에서 포함하는 글자)
        • : like ‘시작문자**%’ / like%포함문자%’ / like%**시작문자’
        • 대,소문자 구분 애매

    필터링 조건으로 여러개를 적용해야 할 때 (논리연산)

    여러 개의 필터링 조건을 한 번에 적용하는 방법

    • 논리연산의 종류

    논리연산자 의미 예시

    AND 그리고 age>20 and gender=’female’
        → 나이가 20세 이상이고, 여성
    OR 또는 age>20 or gender=’female’
        → 나이가 20세 이상이거나, 여성
    NOT 아닌 not gender=’female’
        → 여성이 아닌

    데이터 조회와 엑셀 함수 적용을 한 번에 끝내기 (SUM, AVG, COUNT, MIN, MAX)

    • 숫자 연산 종류연산자 설명 
      + 더하기
      - 빼기
      * 곱하기
      / 나누기
    • 합계와 평균 구하기
      • 합계 : SUM(컬럼)
      • 평균 : AVG(컬럼)
    • 전체 데이터의 갯수 구하기
      • 데이터 갯수 : COUNT(컬럼) * 컬럼명 대신 1 혹은 * 사용 가능
      • 몇개의 값을 가지고 있는지 구할 때 : DISTINCT (몇 가지의 종류의 값을 가지고 있냐는 의미가 이해에 더 좋을듯)
    • 데이터의 범위, 최솟값과 최댓값 구하기
      • 최솟값 : MIN(컬럼)
      • 최댓값 : MAX(컬럼)

    범주별 연산을 한 번에 끝내기 (GROUP BY)

    카테고리별로 숫자 연산특정한 행끼리의 데이터를 처리(합, 평균, 순위 등등)말 그대로 쉽게 결과를 정렬해 줌

    • 오름차순 : 숫자가 점점 커지는 순서로 정렬
    • 내림차순 : 숫자가 점점 작아지는 순서로 정렬
    • 종류종류 구문 예시
      오름차순 생략 order by sum(price)
      내림차순 desc order by sum(price) desc

    SQL 구조 마스터 - WHERE, GROUP BY, ORDER BY 로 완성되는 SQL 구조

    SQL 문장의 구조 순서의 순서를 지켜야 한다 (현재 배운 내용을 기준으론 select부분이 여러 조건문 등이 들어가면서 많이 길어질 경우 헷갈리거나 까먹을 수 있지만 근본적으로 이 구조의 순서는 변하지 않음)

    • select from where group by order by
    • select 카테고리컬럼(원하는컬럼 아무거나), sum(계산 컬럼), from group by 카테고리컬럼(원하는컬럼 아무거나) order by 정렬을 원하는 컬럼 (카테고리컬럼(원하는컬럼 아무거나), sum(계산 컬럼) 둘 다 가능)
    • Query 결과를 정렬하여 업무에 바로 사용하기 (ORDER BY)
    • select 카테고리컬럼(원하는컬럼 아무거나), sum(계산 컬럼), from group by 카테고리컬럼(원하는컬럼 아무거나)

    +함수명은 컬럼명과 다르게 대소문자상관X

    +group, order의 기준 여러 개 둘 수 있음

    +group, order의 컬럼은 이름을 적어도 되고, 그 컬럼의 위치를 적어도 됨(1번째부터 1,2,3..)

    +order의 경우 기준을 제일 처음 컬럼으로 꼭 하지 않아도 되나, 한글 별명으로 할 경우 부분적으로만 정렬되는 버그가 나는 듯함(체감상 그럴 수도 있으니 만약 쓰게 되는 일이 있다면 확인 필요/ 다시 확인해보니 오류는 안 일어나지만 정렬이 자체가 아예 안 되는 것 같기도 함)

     

    업무 필요한 문자 포맷이 다를 때, SQL 로 가공하기 (REPLACE, SUBSTRING, CONCAT)

    • 특정 문자를 다른 문자로 바꾸기(단, 출력 값만 바꿔서 출력하지 원본 데이터를 수정하여 저장하지는 않음)
    • replace(바꿀 컬럼, 현재 값, 바꿀 값)
    • 원하는 문자만 남기기
      substr(조회 할 컬럼, 시작 위치, 글자 수)
      
    • substring (또는 substr)
    • 여러 컬럼의 문자를 합치기
      concat(붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, .....)
      
      붙일 수 있는 문자의 종류 : 컬럼, 한글, 영어, 숫자, 특수 문자
    • 여러 컬럼의 값을 하나로 합칠 수 있는 기능

    조건에 따라 포맷을 다르게 변경해야 한다면 (IF, CASE)

    • 조건에 따라 다른 방법을 적용하고 싶을 때 - If 문
    if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)
    
    • 조건을 여러가지 지정하고 싶을 때 - Case 문
    • case when 조건1 then 값(수식)1 when 조건2 then 값(수식)2 else 값(수식)3 end

    +보통 select문 내에서 if나 case를 사용하는데 select에서 컬럼으로써 출력되는 것이므로 별명을 꼭 정해주는 것이 좋다(영어로 된 이름 추천) , 만약 이름을 정하지 않을경우 if~등의 줄이 그대로 컬럼명으로 들어감 , 영어로 된 이름을 추천하는 이유는 sub쿼리등을 쓸 때 한글로 이름을 지어줄 경우 바깥 select문에서 못 인식하는 듯 보였기 때문이다.

     

     

    +데일리 루틴의 SQL문제

    01 이름이 있는 동물의 아이디

    문제 설명

    ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

    NAMETYPENULLABLE
    ANIMAL_ID VARCHAR(N) FALSE
    ANIMAL_TYPE VARCHAR(N) FALSE
    DATETIME DATETIME FALSE
    INTAKE_CONDITION VARCHAR(N) FALSE
    NAME VARCHAR(N) TRUE
    SEX_UPON_INTAKE VARCHAR(N) FALSE

    동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

    예시

    예를 들어 ANIMAL_INS 테이블이 다음과 같다면

    ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
    A434523 Cat 2015-11-20 14:18:00 Normal NULL Spayed Female
    A562649 Dog 2014-03-20 18:06:00 Sick NULL Spayed Female
    A524634 Dog 2015-01-02 18:54:00 Normal *Belle Intact Female
    A465637 Dog 2017-06-04 08:17:00 Injured *Commander Neutered Male

    이름이 있는 동물의 ID는 A524634와 A465637입니다. 따라서 SQL을 실행하면 다음과 같이 출력되어야 합니다.

    ANIMAL_ID
    A465637
    A524634

    (코드)

    SELECT ANIMAL_ID
    from ANIMAL_INS
    where NAME is not null
    order by 1

     

    ID를 출력하는데 Name이 있는 즉 NUll이 아닌 것만 필터링해서 출력한 뒤 오름차순해주면 되는 간단한 문제이다

    '스파르타 > TIL(Today I Learned)' 카테고리의 다른 글

    2023-12-23  (0) 2023.12.23
    2023-12-22  (0) 2023.12.22
    2023-12-21  (0) 2023.12.21
    2023-12-20  (0) 2023.12.21
    2023-12-19  (0) 2023.12.20
Designed by Tistory.