데이터 및 C언어/SQL 공부

[SQL] SQL 공부 : SQL문 정리하기 - 기본 난이도(2)

  • -
반응형

 

 

 

 

[SQL] SQL 공부 : SQL문 정리하기 - 기본 난이도(2)

 

 


 

∇ 공부 겸 정리 목표

 

       (1)에서 정리한 내용들.

             

      - SELECT , FROM, LIMIT 

      - WHERE

      - ORDER BY

      - 중복 제거[DISTINCT / GROUP BY/ 서브쿼리

      - 집계 함수 [ SUM, COUNT, AVG 등 ] 

      - GROUP BY [ 데이터 그룹화 ] 

 

 

    #이번 글에서 정리할 내용들,

      - 소수점 처리 [ ROUND / TRUNCATE / CAST, CONVERT ] 

      - SQL 숫자 연산

      - HAVING

      - 조건문[ CASE, IF() ]

      - UNION, UNION ALL

      - INNER JOIN

      - LEFT JOIN, RIGHT JOIN

      -셀프 조인

 

++ AARRR/ RFM 

 


 

 

 

 

 

 

     5. 소수점 처리하기.

             : 소수점을 처리하는 방식에는 6가지 방식이 있습니다.

 

                    5.1 ROUND 함수.

                           : 지정된 소수점 자릿수로 반올림.

 

                                - ROUND( N, 반올림 될 위치)

                                  반올림하고자 하는 숫자를 앞에, 반올림할 위치를 뒤에 적어줍니다.

 

                                - 반올림할 위치에 아무것도 적지 않으면 첫째자리에서 반올림을 하며

                                   1을 적을 경우부터 둘쨰자리에서 반올림을 합니다 [ 컴퓨터는 0부터 시작 ]    

             

                                - 정수를 반올림하고자 하는 경우엔 -1, -2 등으로 적어주면 됩니다.

 

EX


 

                 5.2 TRUNCATE 함수.

                        : 지정된 소수점 자릿수 미만을 잘라냅니다.[ 버림 ]

               

                              ex) TRUNCATE(column_name, 2)는 소수점 둘째 자리까지만 표시하고 나머지는 버립니다.

 

                               - TRUNCATE(N, 버릴 위치)

 

                               - 대부분의 SQL프로그램에서는

                                 ROUND 함수와 다르게 버림을 할 자릿수를 반드시 지정해줘야 합니다!

                         

                                     + 예외1 - My SQL

                                             My SQL에서는 자릿수를 생략 가능하고, 생략하면 기본값으로 0으로 간주하여

                                             정수부분만 남기게 됩니다.(소수점 첫째자리부터 모두 짤)

                                    +예외2 - SQL Server 

                                            : SQL Server에서는 TRUNCATE 함수가 기본적으로 제공되지 않음.

                                                  + 대신, ROUND 함수를 사용!

                                    +예외3 - PostgreSQL 에서도 TRUNCATE 대신 TRUNC 함수를 사용합니다.

                                                    동일하게, 자릿수를 생략하면 0으로 간주하고 정수 부분만 남깁니다.

 

                                 ## 결론적으로,  DB시스템에 따라 TRUNCATE 함수의 동작이 다를 수 있기에

                                       일반적으로 자릿수를 명시해 주는 것이 가장 안전하고 명확합니다.

 

 


 

                    5.3 CEIL(ING) / FLOOR 함수.

                              

                                 ① CEIL(ING) 함수 - 무조건 올림.

 

                                        - 소수점이 있는 숫자의, 소수점 이하를 무조건 올려서 정수로 만드는 역할.

                           

                                        - ROUND와 달리 CEILING은 무조건 정수값으로 출력됩니다.

 

                                        - CEILING(반올림할 대상 숫자)

                                                - 무조건 올림처리를 사용하기 때문에 자릿수 지정이 없습니다.

 

                                          #특징.

                                              - 양수일 때 : 다음 정수로 올림(+1)

                                              - 음수일 때 : 양수 방향으로 올림 

                                              - 이미 정수인 경우 : 그래도 반환

 

 

                                ② FLOOR 함수 - 무조건 버림.

                                           - 소수점이 있는 숫자의, 소수점 이하를 무조건 버려서 정수로 만드는 역할.

 

                                          - CEILING과 마찬가지로 정수값으로 출력

 

                                         - 무조건 내림처리이기 때문에 자릿수 지정이 없습니다.

                                       

                                           #특징.

                                              - 양수일 때 : 현재 정수 부분으로 내림

                                              - 음수일 때 : 다음 작은 정수 ( - 방향)으로 내림. 

                                              - 이미 정수인 경우 : 그래도 반환.

   


                       5.4  CAST / CONVERT 함수.

 

지금은 우선 Mysql를 기준으로 공부를 해보겠습니다.

 

                                 ∇ CAST 함수.

                                     : 데이터를 다른 데이터 유형으로 명시적으로 변활할 때 사용합니다.

                                    - SQL 표준 함수이며, 대부분의 DB 시스템에서 지원합니다.

                                    -  CAST(변환하려는 값 또는 열 AS 변환시킬 데이터 타입).

 

 

 

                       ## cast를 사용하는 것이 더 안정성과 범용성 있음.

 

 

                                ∇ CONVERT 함수.

                                    : 데이터 형식을 변환하는데 사용되며, My SQL에서는 CAST함수와 동일한 결과를 반환합니다.

 

                                            # DB별 CONVERT 함수 사용 차이.[cast와 convert의 차이, "DB 종속성"]

                                                    1. SQL SERVER

                                                          - convert 함수는 가장 광범위하게 사용/ 다양한 스타일 옵션

                                                         

                                                    2. My SQL

                                                          - convert 함수사용 / sql server와는 문법이 다름.

 

                                                    3. Oracle

                                                          - convert함수가 주로 문자셋 변환에 사용

                                                         - 데이터 타입 변환에는 cast를 사용합니다.

 

                                                    4. PostgreSQL

                                                        - convert 함수를 지원하지 않습니다, 대신 cast나 :: 연산자를 사용합니다.

 

                                     지금은 우선 Mysql를 기준으로 공부를 해보겠습니다.

 

 

 


 

  6. 연산 처리.

      [ 기본 산술 연산 / 비교 연산 / 논리 연산/ 문자열 연산 / 날짜 및 시간 ]

 

         6-1. 기본 산술 연산 [ 덧셈(+), 뺄셈(-), 곱셉(*), 나눗셈(/), 나머지(%) ]

             

·  +  ,   -   ,   *  ,   /  : 더하기, 빼기, 곱하기, 나누기 

· DIV : 왼쪽 피연산자를 오른쪽 피연산자로 나눈 후, 소수 부분을 버림.

· % OR MOD : 왼쪽 피연산자를 오른쪽 피연산자로 나눈 후 , 그 나머지를 반환.

 

 

        6-2. 비교 연산 [ 같다(=), 다르다(!= 또는 <> ) , 작다(<), 크다(>), 크거나 같다(>=), 작거나같다(<=)  ]

 

▶ 비교 연산자는 피연산자 사이의 상대적인 크기를 판단하여, 참(True)이면  1을 반환, 거짓(False)이면 0을 반환.

NULL값에 대해서

 

        6-3. 논리 연산 [ AND,  OR , NOT ] & 조건 연산자[ LIKE, IN, BETWEEN, IS NULL]

 

                   ∇논리 연산자    

 

                          √ AND 연산자

                                  : AND 연산자는 두 개 이상의 조건이 모두 참일 때 참을 반환합니다.

                                    여러 조건을 동시에 만족시켜야 할 때 사용합니다.

             

 

   

                            √ OR 연산자

                                 : or 연산자는 두 개 이상의 조건 중 하나라도 참일 때 참을 반환합니다.

                                    하나라도 조건을 만족하면 됩니다.

 

나이가 18세 미만이거나, 전공이 컴퓨터과학인 학생들은 선택.

 

 

                          √ NOT 연산자

                                 : not 연산자는 조건이 거짓일 때 참을 반환합니다. 조건을 부정할 때 사용합니다.

                                   

 

전공이 CS가 아닌 학생들을 선택.

 

 

 

++

 

                          √ 논리연산자 복합 조건.

                               : 여러 논리 연산자를 함께 사용하여 복합 조건을 만들 수 있습니다.

                                 이때 조건의 우선순위를 제어하기 위해 괄호를 사용 가능합니다.

                             - [나이가 18세 초과이고 전공이 cs인 학생들]이거나 성이 smith인 학생들을 선택.!

 

 

              ∇조건 연산자 [ LIKE, IN, BETWEEN, IS NULL]

                   : 특정 조건을 만족하는 데이터를 검색할 때 자주 사용되는 연산자.

 

                       ∇ 조건 연산자 요약.

                             - LIKE : 특정 패턴과 일치하는 문자열을 검색합니다.

                             - IN : 여러 값 중 하나와 일치하는 데이터를 검색합니다.

                             - BETWEEN : 특정 범위 내에 있는 값을 검색합니다.

                             - IS NULL : 값이 NULL인 데이터를 검색합니다.

 

 

                           √ LIKE 연산자.

                                : LIKE 연산자는 특정 패턴과 일치하는 문자열을 검색할 때 사용,

                                  - 주로 와일드카드 문자와 함께 사용됩니다.

 

                                       - '%' : 0 개 이상의 임의의 문자

                                       - '_' 정확히 1개의 임의의 문자.

                                    -> 두 번째 문자가 m이고 ith로 끝나는 성을 가진 학생들을 선택합니다.

 

 

 

                            √ IN 연산자.

                                : 여러 값 중 하나와 일치하는 데이터를 검색할 때 사용합니다.

                                      여러 값을 쉼표로 구분하여 나열합니다.

- 전공이 cs 또는 수학인 학생들을 선택합니다.

 

 

                            √ BETWEEN 연산자.

                                : 특정 범위 내에 있는 값을 검색할 때 사용합니다.

                                     두 값은 포함 범위의 시작과 끝을 나타내며, 두 값을 모두 포함합니다.

 

                                                       - 나이가 18세 이상, 22세 이하인 학생들을 선택.               

 

 

                            √ IS NULL 연산자.

                               : is null 연산자는 열의 값이 NULL인 데이터를 검색할 때 사용합니다.

                         

                                                         - 전공이 지정되지 않은 학생들(전공이 null인 학생들)을 선택.

 

 

 

        6-4. 문자열 연산 [ 연결(CONCAT) , 길이(LENGTH), 대문자 변환(UPPER), 소문자 변환(LOWER) ]

           

 

 

            6-5. 날짜 및 시 연산

        [ 현재 날짜 (CURDATE) ,현재 시간 (CURTIME) , 날짜 더하기 (DATE_ADD),날짜 차이 (DATEDIFF) ]

 

 

 


 

    5. HAVING 함수.

          : GROUP BY와 함께 사용되는 SQL절로,

            그룹화된 결과에 조건을 적용할 때 사용합니다.

 

             - WHERE절과 유사하지만,  

                     WHERE구문은 행 단위로 조건을 적용하고

                   HAVING 구문은 그룹 단위로 조건을 적용한다는 점에서 차이가 있습니다.

 

             -  HAVING절의 위치는 GROUP BY 절 뒤에 와야 합니다.

                   - 사용시에는 GROUP BY와 함께 사용됩니다.

                   - 집계함수(SUM, AVG, COUNT 등) 도 함께 사용 가능합니다.

                   - 그룹화된 결과에 필터를 적용합니다.

 


 

 6. 조건문  [ CASE ,IF() ]

 

              CASE와 IF 두 구문 모두 조건에 따라 다른 결과를 반환하는데 사용되지만,

               사용방법과 복잡성에서 차이가 있습니다.

 

 

            6-1. IF문.

 

                    MySQL에서 IF문은 엑셀의 IF문과 동일한 느낌으로 사용됩니다.

                    IF문은 간단한 조건식에서 사용되며, 

                    다음과 같은 구조를 가집니다.

 

               

 

                                      ## IF 문은 단순한 이진 조건( 참 혹은 거짓)에 적합합니다.

 

 

                                     

 

                                 ## 중첩으로 사용하는 것도 가능합니다.

         ex)

             

기준 테이블

 

 

중첩 if문

 

 

 

 

 

 

 

            

              6-2. IFNULL문.

 

                         - IFNULL()함수는 해당 필드의 값이 NULL을 반활할 때,

                             지정한 값으로 대체하여 출력해줍니다.

 

                        - 이 역시 중첩해서 사용이 가능합니다.

                           

 

 

               6-3. ISNULL문.

                     

 

                           - is_discount 컬럼의 값이 NULL 이라면 0을 출력.

                           - NULL이 아니라면, is_discount의 값을 출력합니다.

 

 

 

                6-4.  CASE WHEN문.

                         

 

                            - WHEN 과 THEN은 무조건 쌍을 이루어서 사용해야 합니다.

                            - WHEN 조건 혹은 THEN은 여러번(중복) 사용할 수 있으며, 

                                         마지막 ELSE문은 모든 조건이 아닐 때 출력되는 값을 지정합니다.

 

                           - SELECT 절, FROM절 혹은 WHERE절에도 들어갈 수 있습니다.

 

CASE문 중복 사용.

 

 

                        ∇ CASE와 IF의 비교.

    

                                 1. 복잡성:

                                          - IF는 단순한 이진 조건(TRUE/FASLE)에 적합.

                                          - CASE는 여러 조건을 처리할 수 있어 더 복잡한 로직을 표현 가능.

 

                                 2. 가독성:

                                         - 여러 조건을 처리해야 할 때 CASE문이 더 가독성이 좋습니다.

                                         - 단순한 조건의 경우, IF가 더 간결할 수 있습니다.

 

             


 

       7. UNION, UNION ALL.

 

               - My SQL에서 UNION과 UNION ALL은 두 개 이상의 조회 결과를 병합하는 경우에 사용합니다.

                          하나로 결합하는 것은 동일하지만, 중요한 차이점도 있습니다.

                          결과를 산출할 때 데이터를 중복하는지 여부입니다.

 

                 7-1.  UNION. [ DISTINCT ]

                       

                           : UNION은 두 개 이상의 SELECT 문의 결과를 결합하며, 중복된 행을 제거하고 정렬.

 

                                √특징.

                                      - 중복 제거 : 결과에서 중복된 행을 자동으로 제거합니다.

                                      - 정렬 : 기본적으로 결과를 정렬.

                                      - 성능 : 중복 제거 기능과 정렬 때문에 UNION ALL보다 처리 시간이 더 걸린다는 단점!

                             

                7-1.  UNION ALL.

 

                       : UNION ALL 은 두개 이상의 SELECT문의 결과를 결합하지만, 중복된 행(데이터)를 제거하지 않습니다.

 

                              √특징.

                                   - 중복 유지 : 모든 행을 그래도 결합하므로 중복된 행이 있으면 그대로 표시.

                                   - 정렬 없음 : 결과를 자동으로 정렬하지 않음.

                                   - 성능면 : 중복 제거나 정렬 과정이 없어서 , UNION보다는 일반적으로 빠름.

 

 

               ∇ EX)

                 

                    이 데이터를 기준으로 UNION과 UNION ALL을 진행해보면,

 

                     - 중복을 제거하는 UNION을 사용하면

 

 

                     - 중복 제거 없이, 병합만 시키는 UNION ALL을 하면 

         

                     결과를 비교해보면

                       # UNION은 중복된 Carol을 한번만 표시하고 결과도 정렬해주지만,

                           UNION ALL은 두번 표시하고 정렬 없이 출력한느 것을 확인 할 수 있습니다.

 

 

                     √ 사용시 고려사항!

                             - 중복 값을 제거해서 깔끔하게 보고 싶을 때는 UNION을 사용하고

                             - 모든 결과가 필요하고 성능이 중요한 경우 UNION ALL을 사용해줍니다.

                                        ++ 대용량 데이터를 다룰 때는 UNION ALL이 더 효율적.!!

                             ++ 결합하는 SELECT문들의 열 수와 데이터 타입이 일치해야 한다는 점도 중요!!

                                    ++ 결과의 열 이름은 첫번째 SELECT문의 것을 따릅니다.

 

 

 

 

 

 

                       

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.