ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL 첫걸음 CH03. 정렬과 연산
    Sql 2023. 3. 14. 10:43

    1 _ 정렬 ORDER BY

    어떤 조건으로 열들을 정렬 할지 정할 수 있다.
    SELECT 열명 FROM 테이블명 WHRER 조건식 ORDER BY 열명 (DESC or ASC)
    DESC : 내림차순
    ASC : 오름차순

     - 내림인지 오름인지 정하지 않았다면 기본적으로 오름차순으로 지정된다 ( 작은 수가 위에 )

     

    숫자형 자료의 경우 오름, 내림차순은 숫자를 기준으로 한다.

    년도 : 1000년 < 2000년 시간이 흐를수록 커진다

    문자열 : 문자열들은 사전식 순서에 의해 결정된다.

     -> 문자열 자료 칸에 숫자가 입력된 경우 이는 숫자가 아니라 문자이므로 오름차순 했을 때 다음과 같은 결과가 나온다

     - a열의 경우 문자열이기 때문에 숫자를 넣어도 사전식 순서에 따라 10 , 11 보다 2가 더 크다.

     

     


    2 _ 복수열을 지정해 정렬하기'

     - ORDER BY 이후에 열명을 여러개 적는다

    SELECT 열명 FROM 테이블명 WHRER 조건식 ORDER BY 열명1 [ASC | DEC], 열명2 [ASC | DEC]

     - 이 때 order by 이후에 오는 열의 순서에 따라 정렬의 기준이 달라진다.

    먼저 정렬한 열이 정렬이 끝나면 그 다음 열의 정렬을 시작하는 방식이다.

     


    3 _ 결과 행 제한하기 LIMIT

     

    1) LIMIT

    LIMIT 구
    SELECT 열명 FROM 테이블명 LIMIT 행수 [OFFSET 시작행]
    
    SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명 LIMIT 행수

     ** LIMIT은 표준 SQL이 아니다. MySQL과 PostgreSQL에서 사용할 수 있는 문법이다.


    2) OFFSET

    : Pagination 을 만들 떄 처럼 많은 데이터들을 필요한 만큼 끊어서 나열하는데 필요하다.

    OFFSET 지정
    SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 위치

     - OFFSET을 3 줬기 때문에 no가 4부터 시작한다.

    만약 OFFSET이 0이라면, OFFSET을 주지 않은 것이므로 no가 1 부터 시작한다.

     


    4 _ 수치연산

     : 일반적인 수학 연산과 같다. * / % 를 우선순위로 계산하고, + - 를 후순위로 계산한다.

     

    1) SELECT 구로 연산하기

    SELECT 식1, 식2, ... FROM 테이블명

     - price * quantity 는 별명을 붙일 수도 있다.

     ** 별명을 붙일 때 As가 필수는 아니다 

    price * quantity amount 로 써도 같은 결과가 나올 것이다.

    다만 별명을 한글로 지정할 때는 꼭 " " 을 쓰도록 하자.

     

    *** mySql에서 더블쿼트 " " 로 둘러싸면 명령구문을 분석할 때 데이터베이스 객체의 이름이라고 간주한다

    한편, 싱글쿼트 ' ' 로 둘러싸면 만자열 상수로 취급한다.

    더블쿼트로 둘러싼다면 SELECT같이 명령어일지라도 객체로서 사용할 수 있다.

     


    2) WHERE 구로 연산하기

     - 이 때, where amount >= 2000; 으로하면 인식을 못 하므로 주의하자.

    기본적으로 데이터 베이스는 SELECT문 보다 WHERE 문이 먼저 실행된다.

    때문에, WHERE문을 실행했을 때 price * quantity는 amount로 별명이 붙여지지 않은 상태다.

     

    ** SQL에서 NULL에는 어떤 연산을 해줘도 NULL로 유지된다 ( NULL 은 0으로 취급되지 않는다 )

     


    3) ORDER BY 구에서 연산하기

     - ORDER BY 구에서는 별명을 사용할 수 있다.

    서버의 내부 처리 순서는 다음과 같다

    WHERE 구 -> SELECT 구 -> ORDER BY 구

     

     

    ** SELECT SQL 문법 작성 순서

    1. SELECT 열명
    2. FROM 테이블명
    3. WHERE 조건식
    4. GROUP BY 그룹화할 열명
    5. HAVING 그룹하고 난 후의 조건식
    6. ORDER BY 정렬하고자 하는 열명

    ** SELECT SQL 쿼리 실행 순서 (DBMS 내부 처리)

    1. FROM
    2. WHERE
    3. GROUP BY
    4. HAVING
    5. SELECT
    6. ORDER BY

     


    4) 함수

    함수명 (인수1, 인수2, ...)

     

     - ROUND 함수

     : 소수점을 반올림 해주는 함수

    ROUND(반올림할값 , 반올림할 소수점 자리수)
    ex) SELECT amount, ROUND(amount,1) FROM sample341;
    
    -> amount 열의 값을 소수점 2째 자리에서 반올림

     ** 소수점 첫 째 자리 : 0,  소수점 둘 째 자리 : 1

    round(amount, -2) : 10의자리에서 반올림

     


    5) 문자열 연산

    + || CONCAT SUBSTRING TRIM CHARACTER_LENGTH

     

    문자열 결합 연산자

    +  -> SQL server

    ||  -> Oracle, DB2, PostgreSQL

    CONCAT  -> MySQL

     

    CONCAT 함수

     : 2개의 열을 합쳐서 1개로 만든다 이 때 결과물은 문자열로 저장된다.

     

     - 문자열 결합 예제 ( CONCAT )

     

     

    - concat을 이용해서 quantity와 unit을 결합했다.

     

     

    SUBTRING 함수

     : 문자열의 일부분을 계산해서 반환해준다.  ( 날짜 데이터에서 필요한 부분만 빼오는데 사용할 수도 있다)

    SUBSTRING( '문자열' , 시작숫자선택, 글자수 선택)
    ex) SUBSTRING('20230314' , 5, 2 )  ->  '03'   ( 날짜 중 월을 가져왔다 )

     - 문자열 결합 예제 ( SUBSTRING )

     

    TRIM 함수

     : 문자열의 앞 뒤에 존재하는 스페이스를 제거해준다

    ex) TRIM('abc                      ')  -> 'abc'

     

     

    CHARACTER_LENGTH 함수

     : 문자열의 길이를 출력한다.

     

     - CHARACTER_LENGTH() 예제


    6) 날짜 연산

     

    날짜를 확인하는 함수 current_date , current_timestamp , current_time

    테이블을 생성할 때는 다음과 같이 쓴다

    create table a{

        d date,

        t time,

        dt datetime

    }

     

    날짜를 조절해서 출력할 수 있는 date_format( 날짜열 , "%y/%m/%d")

     

     - 날짜의 덧셈과 뺄셈

     : 날짜형 데이터는 기간형 수치데이터와 덧셈 및 뺄셈을 할 수 있다.

    ex) 특정 일로부터 1일 후를 계산하고싶다면, a + 1 DAY

    1일 전이라면, a - 1 DAY

     

     - select current_date + inerval 1 day 로도 사용한다.

     

    날짜형 데이터 간의 뺄셈

     : 덧셈도 가능하지만 자주 사용되지 않기 때문에 큰 의미가 없다.

    두 날짜 사이에 차이가 얼마나 발생하는지 계산할 수 있다.
    
    Oracle
    '2023-01-01' - '2023-02-03'
    
    MySQL
    DATEDIFF('2023-01-01', '2023-02-03')

     

     


    7) CASE 문으로 데이터 변환하기

     : 회원가입 기능을 만들 때 라디오기능으로부터 값을 받아올 수 있다. 이 때 숫자값을 받아왔다면

    이를 유의미한 데이터로 변환해야한다.

     

    CASE문
    CASE WHEN 조건식1 THEN 식1
    	[ WHEN 조건식2 THEN 식2 ...]
    	[ELSE 식3]
    END

     

     - CASE 문 예제 ( 성별 )

     - else를 생략할 경우 null로 들어가기 때문에 가급적 else를 생략하지 말자.

    다음과 같이 a를 case 옆에 먼저 선언하고 조건문을 작성해도 문제가 없다.

     

    ** NULL 값의 경우

    null + 값을 입력하면 null이 나온다. 이를 해결하기 위해선

     - ifnull( NULL이 있는 열, 널을 변환하고 싶은 값 ) 함수를 이용하면 null의 값을 지정해서 계산할 수 있다.

    sal+comm 의 결과로 null이 나오고, sal+ifnull(comm,0)의 결과로 sal + 0 값이 나온다.

     

     

Designed by Tistory.