[MariaDB] (MySQL) 쿼리 문법 정리

최승표·2022년 3월 2일
0

DB

목록 보기
1/1

문제풀러 가기

<ANIMAL_INS>

NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
INTAKE_CONDITIONVARCHAR(N)FALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE



ORDER BY

  • 기본값 오름차순으로 정렬
  • DESC를 칼럼명 뒤에다 붙이면 내림차순
  • 정렬할 기준이 여러 개면 우선순위대로 칼럼명 나열
SELECT [칼럼명] FROM [테이블명] ORDER BY [칼럼명1], [칼럼명2]


# name 오름차순, 같으면 animal_id 내림차순으로 정렬
SELECT name, datetime FROM animal_ins ORDER BY name DESC, animal_id

LIMIT

  • 특정 개수의 행 조회
  • 첫번째 행은 0
# 숫자만큼의 행 조회
SELECT [칼럼명] FROM [테이블명] LIMIT [숫자]
# (a+1)번째 행부터 b개의 행 조회
SELECT [칼럼명] FROM [테이블명] LIMIT [숫자a], [숫자b]


# 동물 보호소에 가장 먼저 들어온 3 동물의 이름
SELECT name FROM animal_ins ORDER BY datetime LIMIT 3

NULL값 처리

[칼럼] IS NULL

  • 칼럼의 값이 NULL인지 아닌지 확인
SELECT [칼럼명] FROM [테이블명] WHERE [칼럼명] IS NULL

IFNULL

  • SELECT문에 많이 사용
  • 해당 칼럼값이 NULL이면 다른 값을 반환
SELECT IFNULL([칼럼명], ["대체할 값"]) FROM [테이블명]

# 이름이 NULL값이면 "No name"으로 표기해서 조회
SELECT animal_type, IFNULL(name, "No name") AS name FROM animal_ins 
ORDER BY animal_id

MAX, MIN, COUNT, SUM, AVG

  • 집계 함수
  • SELECT에 사용
  • HAVING에도 사용
  • WHERE에는 사용X
# SELECT절에만 사용
SELECT MAX([칼럼명]) FROM [테이블명]

# GROUP BY와 같이 사용
SELECT COUNT([칼럼명]) FROM [테이블명]
GROUP BY [칼럼명]
HAVING COUNT([칼럼명]) >= 3


# 가장 최근에 들어온 동물은 언제 들어왔는지 조회
SELECT MAX(datetime) FROM animal_ins

DISTINCT

  • 중복 제거
  • 정렬은 해주지 않음
  • SELECT 절에서 사용
SELECT DISTINCT [칼럼명] FROM [테이블명]


# 보호소 동물의 이름 개수 카운트, 이름이 없으면 집계X, 중복되는 이름은 하나로 친다
SELECT COUNT(DISTINCT name) AS count FROM animal_ins
WHERE name IS NOT NULL

GROUP BY, HAVING

  • 행을 그룹화
  • 집계함수와 같이 많이 쓰임
  • HAVING으로 조건 처리
SELECT [칼럼명] FROM [테이블명]
GROUP BY [칼럼명]
HAVING [집계함수가 쓰인 조건문]


# 두번 이상 쓰인 이름과 해당 이름이 쓰인 횟수 조회, 이름이 없으면 집계x
SELECT name,COUNT(*) count FROM animal_ins
WHERE name IS NOT NULL 
GROUP BY name 
HAVING count > 1 
ORDER BY name

LIKE

  • 조건문에 사용 가능
  • 특정 문자열이 포함되어 있는지 확인
  • %_ 를 사용해서 위치와 길이 판별 가능
SELECT [칼럼명] FROM [테이블명] WHERE [칼럼명] LIKE ["%문자열"]

LIKE "%ab" # ab로 끝나는 문자열
LIKE "ab%" # ab로 시작하는 문자열
LIKE "%ab%" # ab를 포함하는 모든 문자열
LIKE "_a%" # 두번째 자리가 a인 모든 문자열
LIKE "a_%_%" # a로 시작하는 길이가 3인 문자열


# animal_type이 "Dog"가 아니고 name에 "el"이 포함되거나 두번째 글자가 "b"인 것들
SELECT animal_id, name FROM animal_ans 
WHERE animal_type!="Dog" AND (name LIKE "%el%" OR name LIKE "_b%")
ORDER BY name 

IN

  • WHERE 사용 가능
  • OR 연산과 동일한 결과를 여러 값 동시에 확인 가능
  • 조건문에 SELECT절 넣기가 가능
  • NOT을 붙일 수 있음
WHERE [칼럼명] IN (["값"], ["값"])
WHERE [칼럼명] IN ([SELECT])


# 동물 중 이름이 Lucy, Ella, Pickle인 동물의 아이디와 이름
SELECT animal_id, name FROM animal_ins
WHERE name IN ("Lucy", "Ella", "Pickle")

IF

  • SELECT, WHERE의 조건문에 사용 가능
SELECT IF([조건문], ["참일 때 문자열"], ["거짓일 때 문자열"]) FROM [테이블명]


# 만약 sex_upon_intake에 Spayed 문자열이 포함되어 있으면 O, 아니면 X로 결과 생성
SELECT animal_id, name, IF(sex_upon_intake LIKE "%Spayed%", "O", "X") AS 중성화 
FROM animal_ins 

CASE

  • SELECT, WHERE, ORDER BY 사용 가능, 주로 SELECT문에서 사용
  • WHEN THEN 은 한 쌍으로 존재하며 여러 개 중복이 가능
  • ELSE가 존재하면 모든 조건에 해당하지 않는 경우에 반환 값을 설정 가능
  • ELSE가 없고 조건에 맞지 않으면 NULL을 반환
CASE
	WHEN [조건]
    THEN ["문자열"]
    ELSE ["문자열"]
END


# 만약 sex_upon_intake에 "Spayed"나 "Neutered"가 포함되어 있으면 "O", 아니면 "X"
SELECT animal_id, name,
	CASE
    	WHEN sex_upon_intake LIKE "%Spayed%" OR sex_upon_intake LIKE "%Neutered%"
        THEN "O"
        ELSE "X"
    END AS 중성화 
FROM animal_ins 

BETWEEN

  • 조건문에 사용 가능
  • 조건으로 범위를 지정할 때 사용
  • BETWEENAND사이에 들어가는 값은 ~이상 ~이하
SELECT [칼럼명] FROM [테이블명]
WHERE [칼럼명] BETWEEN [(이상)] AND [(이하)]


# animal_id가 1이상 100이하인 것
SELECT animal_id, name FROM animal_ins
WHERE animal_id BETWEEN 1 AND 100

날짜, 시간

  • DATETIME 형식 데이터 YYYY-MM-DD hh:mm:ss
  • DATE, TIME, HOUR, DAY, MONTH 함수로 각각의 정보만 가져오기 가능
# 시간만 조회(hh:mm:ss)
SELECT TIME([칼럼명]) FROM [테이블명]
# 날짜만 조회(YYYY-MM-DD)
SELECT TIME([칼럼명]) FROM [테이블명]

DATE_FORMAT

  • 포맷에 따라서 날짜, 시간의 형식을 정해서 출력이 가능
기호출력기호출력
%Y4자리 년도 (1998)%d일 (01)
%y2자리 년도 (98)%W일주일의 영문 (Sunday)
%M월의 영문 (March)%H24시간 단위 (23)
%m월의 숫자 (03)%h12시간 단위 (11)
%i분 (00~59)%s초 (00~59)
SELECT DATE_FORMAT([DATETIME 데이터 형식 칼럼명], "%Y-%m-%d") FROM [테이블명]

#ex
SELECT DATE_FORMAT(datetime, "%Y %m %d %h:%i:%s") FROM animal_ins

DATEDIFF

  • 두 날짜간의 차이를 일 단위로 반환
  • t1이 t2보다 이전의 날짜라면 0 또는 음수 값이 리턴
DATEDIFF([DATETIME 데이터 형식 칼럼명], [DATETIME 데이터 형식 칼럼명])

# 입양 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회
SELECT a.animal_id, a.name FROM animal_ins a
INNER JOIN animal_outs b
ON a.animal_id = b.animal_id
ORDER BY DATEDIFF(b.datetime, a.datetime) DESC
LIMIT 2

JOIN

  • 여러 테이블을 한 테이블로 합침
  • 위 사진이 JOIN의 집합 관계를 아주 잘 나타냄
SELECT [칼럼명] FROM [a테이블명] [별칭a]
INNER JOIN [b테이블명] [별칭b]
ON [a.id] = [b.id]


# 보호소에 들어올 당시에는 중성화되지 않았지만, 
# 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회
SELECT a.animal_id, a.animal_type, a.name FROM animal_ins a
INNER JOIN animal_outs b
ON a.animal_id = b.animal_id
WHERE a.sex_upon_intake != b.sex_upon_outcome
ORDER BY a.animal_id



References

profile
"계속해서, 될 때까지" AI Engineer

0개의 댓글