개발자식

[SQL] 문법 정리 본문

Data/SQL

[SQL] 문법 정리

밍츠 2022. 9. 8. 02:11

sql 구문 순서

  • SELECT 컬럼명 - (5)
  • FROM 테이블명 - (1)
  • WHERE 테이블 조건 - (2)
  • GROUP BY 컬럼명 - (3)
  • HAVING 그룹 조건 - (4)
  • ORDER BY 컬럼명 - (6)
  • LIMIT 시작위치(offset), 반환 개수 - (7)
  1. FROM : SQL 구문이 들어오면 테이블을 먼저 확인한다.
  2. WHERE : 테이블에서 주어진 조건에 맞는 데이터들을 추출한다.
  3. GROUP BY : 공통적인 데이터들기리 묶어 그룹을 만든다
  4. HAVING : 공통적인 데이터들이 묶여진 그룹 중, 주어진 조건에 맞는 그룹들을 추출한다.
  5. SELECT : 최종적으로 추출된 데이터들을 조회한다.
  6. ORDER BY : 추출된 데이터들을 정렬한다.
  7. LIMIT : 추출된 데이터들에서 몇 개의 행을 반환할 것인지 제한한다. 

* SELECT 다음으로 오는 구문은 ORDER BY 뿐이므로, SELECT에서 만들어지는 Alias는 ORDER BY 구문에서만 사용 가능하다.

* LIMIT의 시작 위치는 0부터 시작하므로 LIMIT 2,3 이면 세번 째 행부터 3개의 행을 반환한다.

 

 

WHERE절

- 기본적인 연산자로 대소를 비교할 때 사용되는 >, <, >=, <= 와 같은 것들이 있으며, 같음을 나타내는 = 와 서로 다름을 나타내는 != 또는 <>이 있다.

- 여러개의 조건을 함께 사용해야 하는 경우 논리 연산자를 사용한다.

  • AND : 좌변도 참이고 우변도 참이면 그 조건에 해당하는 행(row)을 가져온다.
  • OR : 좌변 또는 우변이 참이면 그에 해당하는 행(row)를 가져온다.
  • NOT : 참이 아닐때 그에 해당하는 행(row)을 가져온다.
  연산자 사용 예
비교 =, <>, >, <, >=, <= price < 20000
범위 BETWEEN price BETWEEN 2000 AND 4000
집합 IN, NOT IN name IN ("철수", "영희")
패턴 LIKE name LIKE ='%길동%'
NULL IS NULL, IS NOT NULL price IS NULL
복합 조건 AND, OR, NOT (price < 10000) AND (name LIKE ='%길동%')

 

집계함수

- 집계함수는 값들의 집합을 계산해서 하나의 값을 리턴하는 함수이다.

- COUNT(*)를 제외하고, 집계함수는 NULL 값을 무시한다.

- WHERE절에서 바로 집계함수를 사용할 수 없다. GROUP BY를 하고 HAVING절에 집계함수를 쓰거나 WHERE절에 서브쿼리에서 집계함수를 사용할 수 있다.

- GROUP BY를 사용할 경우, ORDER BY에서 집계함수를 이용하여 정렬할 수 있다.

 

ex) 

잘못된 사용
   
   SELECT math_score
   FROM scores
   WHERE english_score = MIN(english_score)
올바른 사용
   
   SELECT math_score
   FROM scores
   WHERE english_score = (SELECT MIN(english_score) FROM scores)

 

집계함수 종류

1. COUNT

- 특정 열의 행의 개수를 세는 함수

- COUNT(*): 테이블에 존재하는 행의 개수가 반환되고

- COUNT(열이름): 특정 열에 대해서 개수를 세면 해당 열이 NULL이 아닌 행의 개수를 반환한다.

- COUNT(DISTINCT 열이름): 열에서 중복을 제외한 값의 개수를 반환한다.

 

2. MIN, MAX

- 최솟값, 최대값 구하는 함수

- 숫자 외에도 문자, 문자열에도 사전 순으로 가장 앞선, 느린 데이터가 반환된다.

- MIN(열이름): 열에서 최솟값

- MAX(열이름): 열에서 최댓값

 

3. AVG/SUM

- 숫자인 값에 대해서만 연산 가능

- NULL은 무시하고 계산된다. NULL을 0으로 계산하고 싶으면 변경해줘야 한다.

- AVG(열이름): 열의 평균

- SUM(열이름): 열의 합

 

 

Where과 Having의 차이

Where

- 항상 from 뒤에 위치하고 조건에는 다양한 비교 연산자들이 사용되어 구체적인 조건을 줄 수 있다.

 

Having

- 항상 group by 뒤에 위치하고 where 조건절과 마찬가지로 조건에는 다양한 비교연산자들이 사용되어 구체적인 조건을 줄 수 있다.

 

차이점

- where은 기본적인 조건절로서 우선적으로 모든 필드를 조건에 둘 수 있지만 having은 group by 된 이후 특정한 필드로 그룹화 되어진 새로운 테이블에 조건을 줄 수 있다.

- where절에서는 집계함수를 쓸 수 없고, having 절에서는 쓸 수 있다.

  • having 절은 그룹을 필터링하는 데 사용된다.
  • where 절은 행을 필터링 하는 데 사용된다.

-> 결론 : where 절은 그룹화 또는 집계가 발생하기 전에 필터링, having 절은 그룹화 또는 집계가 발생한 후 필터링

 

 

ORDER BY절

- ORDER BY절 뒤에 우선순위가 있는 열을 순서대로 적는다.

- ASC : 오름차순, DESC : 내림차순 (ASC가 디폴트)

- 여러 열을 다른 정렬 방식으로 적용할 수 있다.

ex) ORDER BY NAME ASC ,DATETIME DESC

 

 

SELECT절

- DISTINCT 키워드를 사용하여 컬럼명이 중복되지 않은 레코드만 반환할 수 있다.

  • SELECT DISTINCT 컬럼명 
  • SELECT COUNT(DISTINCT 컬럼명)

 

 

IFNULL

- 해당 컬럼의 값이 NULL을 반환할 때, 다른 값으로 출력할 수 있도록 하는 함수이다.

SELECT IFNULL(Column명, "Null일 경우 대체 값") FROM 테이블명; 

 

 

JOIN

- JOIN을 사용하면 두 개의 테이블을 엮어서 원하는 데이터를 추출할 수 있다.

  • INNER JOIN : 내부 조인 -> 교집합
  • LEFT/RIGHT JOIN -> 부분 집합
  • OUTER JOIN : 외부 조인 -> 합집합

EX)

ID ENAME
1 KIM
2 JUNG
3 CHOI
ID KNAME
1
2
4
5

1. INNER JOIN:

SELECT A.ID, A.ENAME, A.KNAME
FROM A INNER JOIN B
ON A.ID = B.ID
ID ENAME KNAME
1 KIM
2 JUNG

 

2. LEFT JOIN

SELECT A.ID, A.ENAME, A.KNAME
FROM A LEFT JOIN B
ON A.ID = B.ID
ID ENAME KNAME
1 KIM
2 JUNG
3 CHOI NULL

 

대소문자

- UPPER(문자열 or 열 이름) : 데이터 값을 대문자로 변환

- LOWER(문자열 or 열 이름) : 데이터 값을 소문자로 변환

SELECT ANIMAL_ID,NAME
FROM ANIMAL_INS
WHERE lower(NAME) LIKE '%el%' 
ORDER BY NAME

-> NAME에 'el'이 들어가는 동물 찾는 조건

 

 

DATETIME

SELECT ANIMAL_ID,NAME,DATE_FORMAT(DATETIME,'%Y-%m-%d') AS "날짜"
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

- DATETIME '2014-08-08 04:20:00'와 같은 형식에서 2014-08-08와 같은 형태로 변환해서 출력

- 연산 기호, 대소 비교 사용 가능

- 대소문자 의미 다르기 때문에 주의해서 사용

ex) %Y: 1999, %y: 99

관련 문제: 

https://school.programmers.co.kr/learn/courses/30/lessons/131120

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

NULL 데이터 조회

- fileds IS NULL, fields IS NOT NULL로 조회

- fields = NULL 아님!

SELECT * 
FROM TargetTable
WHERE TargetField IS NOT NULL

 

Comments