jeeyeonLIM / coding_test

Let's practice the coding test!
1 stars 0 forks source link

[MySQL] 문법 총정리 #11

Open jeeyeonLIM opened 4 years ago

jeeyeonLIM commented 4 years ago

목적

목차

jeeyeonLIM commented 4 years ago

date 형식 다루기

MINUS

DATE_SUB(날짜, INTERVAL 2 YEAR)

- 두 날짜간 연산 
```sql
DATEDIFF(날짜2, 날짜1) # 날짜1 < 날짜2 
TIMESTAMPDIFF(WEEK, 날짜1, 날짜2)  #DAY, MONTH, YEAR,... 변환 가능!

https://programmers.co.kr/learn/courses/30/lessons/59411

FROM ANIMAL_INS A
LEFT OUTER JOIN (SELECT ANIMAL_ID, DATETIME FROM ANIMAL_OUTS) AS B ON A.ANIMAL_ID = B.ANIMAL_ID ORDER BY DATEDIFF( B.DATETIME, A.DATETIME) DESC # 날짜 차이 기준으로 내림차순 정렬

![image](https://user-images.githubusercontent.com/45617225/83777035-e4761980-a6c3-11ea-8a3d-4bbb146140d3.png)

### 일부 추출 
- year 만 추출 
- ```date_part('year',concat_ws('-',substr(dt,1,4),substr(dt,5,2),substr(dt,7,2))) as years```
- ```from_timestamp(date_trunc('week',concat_ws('-',substr(dt,1,4),substr(dt,5,2),substr(dt,7,2))),'yyyy-MM-dd' ) as stdt```
   - week 단위로 끊어서 한 주 시작일자만을 남기고 싶을 때 사용
```sql

SELECT A.DATETIME,
    YEAR(A.DATETIME), MONTH(A.DATETIME), DAY(A.DATETIME), 
    HOUR(A.DATETIME), MINUTE(A.DATETIME), SECOND(A.DATETIME)

FROM ANIMAL_INS A   
LEFT OUTER JOIN (SELECT ANIMAL_ID, DATETIME FROM ANIMAL_OUTS) AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY DATEDIFF( B.DATETIME, A.DATETIME) DESC # 날짜 차이 기준으로 내림차순 정렬 

image

형 변환

FROM ANIMAL_INS

![image](https://user-images.githubusercontent.com/45617225/83780888-ba732600-a6c8-11ea-9c91-8e3e2e2754e8.png)

### 비교 
- DATETIME 형태를 DATE_FORMAT 함수 이용해서 '%Y-%m-%d' 형태로 바꿔준 뒤 비교 ~
```sql
SELECT A.ANIMAL_ID, A.DATETIME, B.DATETIME, DATE_FORMAT(A.DATETIME,'%Y-%m-%d'),
    IF(DATE_FORMAT(A.DATETIME,'%Y-%m-%d')<='2016-04-21',1,0)
FROM ANIMAL_INS A
LEFT OUTER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID 
WHERE A.DATETIME > B.DATETIME
jeeyeonLIM commented 4 years ago

RANK 함수

  1. DENSE_RANK() OVER(partition by 변수명, order by)

    • 동순위 같은 RANK, 순위를 차례로 모두 사용해 나타냄
    • Ex) RANK : 1 2 2 3
  2. ROW_NUMBER() OVER(partition by 변수명, order by)

    • 동순위 랜덤 RANK부여, 동순위 내에서는 랜덤으로 순위 부여됨
    • Ex) RANK : 1 2 3 4
    • RANK() OVER (PARTITION BY user_id ORDER BY count(distinct product_id) desc) as rk
    • 유저 id 내에서 가장 많이 구입한 product_id 의 rank 를 생성할 수 있음
    • 주로 중복 허용할 때는 rank(), 중복 허용하지 않을 때는 row_number() 를 사용함.
    • 직관적 설명 참고 ; https://doorbw.tistory.com/221
jeeyeonLIM commented 4 years ago

정규식(string)

from animal_ins order by animal_id

### regexp 사용 시 정규식
- **`^`** : st로 시작하는 row찾기
```sql
SELECT 변수 FROM 테이블 WHERE name REGEXP '^st';
jeeyeonLIM commented 4 years ago

기타 함수

형변환

cast(문자변수 as unsigned) # 문자변수 -> 숫자변환
cast(문자변수 as char) # 숫자변수 -> 문자변환

join ㅡ null

LEAD LAG

SELECT ANIMAL_ID,ANIMAL_TYPE, lag(ANIMAL_ID,1) over(partition by ANIMAL_TYPE)
FROM ANIMAL_INS

image

ROLL UP

CUBE

PARTITION BY