Published on

Mysql SQL문법

Authors
  • avatar
    Name
    ywj9811
    Twitter

SQL문을 계속 사용하지만 사용하던 것들만 사용하니 기억이 안나는 내용이 많아 SQL 문법을 모두 정리하고 가도록 하자.

Distinct

컬럼값들의 중복을 제거한 결과 출력

select distinct col from table;
# col의 중복을 제거하고 출력
select distinct col1, col2 from table;
# col1과 col2의 값이 모두 같은 경우만 제거하고 출력

Alias

Select 절에서 사용하는 것으로 as 를 뜻

select col as name from table;
# col이 name으로 출력

concat

간혹 여러 컬럼 값을 합쳐서 가져와야 하는 경우가 있는데, 이때 사용하는 방법

idxtypename
11안중근
21윤봉길
32이순신
43왕건
54반갑수
select (type + '::' + name) as hero_name from table;
# 이 코드는 아래와 같다.
select concat(type, '::', name) as hero_name from table;

결과

hero_name
1::안중근
1::윤봉길
2::이순신
3::왕건
4::반갑수

논리 연산자

  1. NOT : ~가 아니다

    where NOT user_id in (1, 2)
    
  2. AND : A와 B 만족

    where user_id = 1 AND user_name = 'nameA'
    
  3. OR : A혹은 B 둘 중 하나 이상 만족

    where user_id = 1 OR user_name = 'nameA'
    

SQL 연산자

where A between B and C
# B <= A <= C

where A in (1,2,3)
# A = 1 or A = 2 or A = 3

where A like '_ble%'
# A의 값중 2,3,4번째 값이 ble인 모든 값 선택
# _는 1개, %는 무한

escape

SQL에서 ‘%’ , ‘_’와 같이 특수문자를 검색하는 것은 불가능하다.

하지만 검색하고 싶은 경우 escape를 사용하면 된다.

select name from table
where
product_name LIKE '%#_%' ESCAPE '#';

이렇게 escape 문자를 지정한 후에, 특수문자 앞에 escape 문자를 넣어주면 된다.

여기서는 _ 언더바가 들어간 product_name을 검색하는 것이다.

limit

select * from table limit 5;
# 5개만 가져온다.

select * from table limit 4, 10;
# 5번째부터 10개 추출 (0, 1, 2, 3, 4 이렇게 시작하기 때문에 5번째)
# 여기에 order by 를 넣는 등 활용 가능

숫자함수

  • round

    숫자 데이터를 다룰 때 반올림 기능을 가지고 있다.

    select round(a) from table
    # a의 소숫점 없는 값이 나옴
    select round(a, n) from table
    # a의 소수 n번째 자리에서 반올림
    
  • Truncate

    버림 기능을 가지고 있다.

    select truncate(a, n) from table
    # n번째 자리수 버림
    # round와 다르게 반드시 버림 할 자리수 명시해야함
    

조건문

  • IF(조건값 = 비교값, TRUE시, FALSE시)

    # 조건 1개 사용시
    select DATE_FORMAT(NOW(), '%Y%m%d') as "오늘 날짜"
    , IF(DATE_FORMAT(NOW(), '%Y%m%d') = '20230830', 'O', 'X') as "오늘 날짜는 20230830"
    , IF(DATE_FORMAT(NOW(), '%Y%m%d') = '20220830', 'O', 'X') as "오늘 날짜는 20220830";
    
    오늘날짜오늘 날짜는 20230830오늘 날짜는 20220830
    202308030OX
    # 조건 여러개 사용시
    select IF(VAL_A = 'A', VAL_1, '조건1') as "A = 1"
    , IF(VAL_A = 'B', VAL_1, IF(VAL_B = 'B', VAL_2, 'X')) as "B = 2"
    , IF(VAL_A = 'C', VAL_1, IF(VAL_B = 'D', VAL_2, IF(VAL_C = 'C', VAL_3, VAL_4))) as "C = 3"
    FROM (select 'A' as VAL_A,
    'B' as VAL_B,
    'C' as VAL_C,
    'D' as VAL_D,
    '1' as VAL_1,
    '2' as VAL_2,
    '3' as VAL_3,
    '4' as VAL_4
    FROM DUAL
    ) A;
    
    A = 1B = 2C = 3
    123
  • IFNULL(대상값, NULL일 경우 출력값)

    IF와 마찬가지로 사용할 수 있음

    IF와 섞어서 사용할 수 있음

  • CASE 문

    CASE WHEN 조건 THEN 값 WHEN 조건 THEN 값 ELSE 값 END

    select 
    CASE 
    WHEN VAL_A = 'A' THEN VAL_1
    ELSE VAL_4
    END AS "조건 한개"
    ,
    CASE 
    WHEN VAL_A = 'A' AND VAL_B = 'B' THEN CONCAT(VAL_A, VAL_B)
    WHEN VAL_C = 'X' THEN VAL_3
    ELSE VAL_4
    END AS "조건 두개"
    ,
    CASE
    WHEN VAL_A = IS NOT NULL 
    	THEN
    	CASE 
    		WHEN VAL_D = 'D' THEN '조건 ELSE 조건'
    			ELSE ''
    			END
    		WHEN VAL_C = 'C' THEN '조건 계속1'
    		WHEN VAL_C = 'K' THEN '조건 계속2'
    		ELSE '0'
    	END AS "다중조건"
    FROM (select 'A' as VAL_A,
    'B' as VAL_B,
    'C' as VAL_C,
    'D' as VAL_D,
    '1' as VAL_1,
    '2' as VAL_2,
    '3' as VAL_3,
    '4' as VAL_4
    FROM DUAL
    ) A;
    

문자 함수

https://codingspooning.tistory.com/entry/MySQL-문자열-함수

Group by

Mysql에서 GROUP BY는 특정 컬럼 이름을 지정해주면 그 컬럼의 UNIQUE한 값에 따라서 데이터를 그룹 짓고, 중복된 열은 제거된다.

예를 들어 아래와 같이 있을 때

user_idproduct_id
1A
2B
1A
3C
2B
1B

여기서 GROUP BY user_id를 적용하면 "user_id"별로 그룹화된다.

user_idproduct_id
1A
2B
3C

Group BY는 집계 함수와 주로 같이 쓰인다.

IDNAMEQuantity
1Item12
2Item14
3Item23
4Item38

이때

select name, count(name) as count, sum(quantity) as sum from table1
group by name;

이렇게 실행하게 되면

namecountsum
Item127
Item213
Item318

이렇게 나온다.

Having

이는 Group by 절에서 조건을 추가할 때 사용하는 것으로 Group by는 where이 아닌 having으로 조건을 추가한다.

select name, count(name) as count from table1
group by name
having count(name) > 1;

이렇게 하면

namecount
Item12

이렇게 나오게 된다.

날짜 데이터 추출

  • YEAR : 연도 추출
  • MONTH : 월 추출
  • DAY : 일 추출
  • HOUR : 시 추출
  • MINUTE : 분 추출
  • SECOND : 초 추출
YEAR(DATETIME(컬럼명)) BETWEEN '2022' AND '2024'
MONTH(DATETIME(컬럼명)) BETWEEN '09' AND '12'
HOUR(DATETIME(컬럼명)) BETWEEN '01' AND '20'
등등