SQL

[이론]SQL 문법별 개념정리(SELEC, WHERE, ORDER BY, GROUP BY, HAVING...)

노력하는 백곰 2024. 8. 6. 06:15

■ 요약 구분

1. SQL(Structured Query Language) 이란?

- SQL은 DB(Database)에서 데이터를 다루기 위한 언어(즉, RDBMS를 조작하기 위한 언어)

- 원하는 정보 찾기, 새로운 정보를 DB에 최신화(입력, 수정), 특정 정보 제거, 현황에 대한 리포트나 통계에 사용

 

 

2. 테이블(Table)과 컬럼(Column)이란?

①테이블
- DB의 핵심 구성 요소로써 행(Row)과 열(Column)을 가진 표와 유사한 형태로 데이터 저장
- 각 테이블을 특정 주제나 개념에 대한 정보를 모아 놓은 상태
 →예시, 고객 테이블은 고객 관련 정보, 주문 테이블은 주문 관련 정보들을 저장

②컬럼
- 테이블 내, 컬럼은 '필드(Field)' 혹은 '속성(Attribute)'이라 불리며, 테이블에서 관리하려는 각각의 정보 유형을 의미
 →예시, 고객 테이블의 경우, 고객ID, 이름, 이메일 주소, 전화번호 등의 컬럼 보유

 

 

3. SQL 쿼리 순서

□ 작성 순서
SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY - LIMIT


□ 실행 순서
FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY - LIMIT

 

※ 용어 구분

- 키워드(keyword) : 개별적인 SQL 요소(예시, DISTINCT)
- 절(clause) : SQL의 한 부분(예시, SELECT DISTINCT)
- 문(statement) : 2개 이상의 절이 결합된 문장(예시, SELECT DISTINCT depto FROM emp)

 →SELECT문은 데이터를 조회하는 구문
 →SELECT문은 SELECT절과 FORM절로 구성

 

 

4. SQL 문법 상세 설명

■ USE : 스키마 선택
- USE절을 사용하여 SQL에 사용할 스키마 지정

- 스키마(Schema)란, 데이터베이스의 구조와 제약조건에 관한 전반적인 명세를 기술한 내용

# USE 스키마명
USE school_db

 

 

■ SELECT : 조회할 데이터/컬럼 지정

- SELECT절과 FROM절 사이에 ' * '을 사용할 경우, 테이블의 모든 컬럼을 조회

 

 

■ FROM : 조회할 데이터/컬럼의 출처 테이블을 지정
- 기본적으로 테이블 이름은 스키마명, 테이블명 순으로 표현(단, USE절은 데이터베이스를 지정해주었다면 테이블명만 표현)

#SELECT 컬럼명 FROM 테이블명
SELECT student_id, name 
FROM student


#동일한 명령어를 수행하는 SQL쿼리
SELECT * FROM school_db.student
SELECT * FROM student

 

 

■ WHERE : 특정 조건에 맞는 레코드를 필터링
- WHERE절을 사용해 틀정 조건에 해당하는 데이터만 조회
- 관계연산자, 논리연산자 사용 가능

#student 테이블에서 student_number 컬럼 값이 5이상인 데이터 조회
SELECT * 
FROM student
WHERE student_number >= 5

 

○ 논리연산자 : AND, OR 

- 여러 조건을 추가하고 싶을 때 사용하는 키워드

- AND가 OR보다 우선적으로 연산

- &&, || 모두 사용 가능(MySQL)

SELECT TRUE OR FALSE AND FALSE     # 결과 : 1
SELECT (TRUE OR FALSE) AND FALSE   # 결과 : 0

 

BETWEEN : 특정 범위를 설절하는 키워드

#student 테이블에서 student_height 컬럼 값이 160이상이고 165이하인 데이터 조회
SELECT * 
FROM student 
WHERE student_height between 160 and 165

 

 

IN() : 여러 값 매칭

- IN() 연산자를 이용하여 특정 값이 포함되어 있는지 여부 조회

- IN() 연산자는 동등비교 '='를 여러번 수행하는 효과(즉, 인덱스를 최적으로 활용 가능)

#addr 컬럼값이 경기, 전남, 경남인 데이터 조회
SELECT * 
FROM student 
WHERE addr_location IN('경기', '전남', '경남')

SELECT * 
FROM student
WHERE addr_location = '경기' OR addr_location = '전남' OR addr_location = '경남'

 

LIKE : 문자열의 일부 글자 검색

- 문자열의 일부 글자 검색

 →_ : 한 글자만 매치

 →% : 몇 글자든 매치

#student_name 컬럼값이 '블'로 시작하는 4글자 글자 데이터 조회
SELECT * 
FROM student 
WHERE student_name LIKE '블___'

#student_name 컬럼값이 '블'로 시작하는 모든 데이터 조회
SELECT * 
FROM student 
WHERE student_name LIKE '블%'

#student_name 컬럼값에 '블'이 들어가는 모든 데이터 조회
SELECT * 
FROM student 
WHERE student_name LIKE '%블%'

 

○ 서브 쿼리(Sub Query) : 내부 쿼리의 결과를 기반으로 데이터를 조작할 때 사용하는 다른 쿼리 내 포함되는 쿼리

- 향후 상세 설명예정

 

 

■ ORDER BY : 결과를 특정 컬럼을 기준으로 정렬

- ORDER BY절은 데이터를 정렬

 →ASC : 오른차순(DEFAULT), DESC : 내림차순

 →,(콤마)를 사용하여 여러 정렬 조건 지정 가능

- WHERE절 다음 순서에 사용

#graduate_date 값을 기준으로 정렬(DEFAULT ASC)
SELECT * 
FROM student
ORDER BY graduate_date
    
    
#student_height 컬럼값이 165 이상인 데이터를 조회
#student_height 값을 내림차순 & graduate_date값을 오름차순 정렬
SELECT * 
FROM student
WHERE graduate_date >= 164
ORDER BY student_height DESC, graduate_date

 

 

■ LIMIT : 출력 결과 수를 제한

- LIMIT절은 '시작', '개수' 입력 가능

- LIMIT절 뒤에 하나의 숫자만 입력할 경우, 처음부터 N개까지 데이터를 조회

- LIMIT절과 OFFSET키워드 조합으로 출력 개수 제한 조회

#student 테이블의 모든 컬럼의 상위 3건만 조회
SELECT * 
FROM student
LIMIT 3

#student 테이블의 3번째 데이터부터 2건만 조회
SELECT * 
FROM student
LIMIT 2 OFFSET 3

 

DISTINCT : 중복된 결과를 제거

- DISTINCT키워드를 컬럼 이름 앞에 붙이면 중복된 값을 1개만 출력

#student 컬럼의 모든 값의 중복 데이터를 제거하여 조회
SELECT DISTINCT addr_location
FROM student

 

 

■ GROUP BY : 결과를 특정 컬럼으로 그룹화

- 특정 컬럼을 지정하여 같은 데이터끼리 그룹화해주는 기능

- 여러 컬럼을 지정 가능

- 집계함수와 함께 사용

#student_id로 데이터를 그룹화 / 그룹핑된 데이터에서 student_id, amout합계 조회

SELECT student_id, SUM(amount) AS "합계"
FROM buy
GROUP BY student_id
ORDER BY student_id

 

집계함수(Aggregate Function)

- 집계함수 안에서 사칙연산 표현 가능

- 종류 : 

 →SUM() : 컬럼의 합계 반환

 →AVG() : 컬럼의 평균 반환

 →MIN() : 컬럼의 최소값 반환

 →MAX() : 컬럼의 최대값 반환

 →COUNT() : 행의 개수 반환

#집계함수 안에서 연산 가능
SELECT student_id, SUM(amount*price) AS "총 금액"
FROM buy
GROUP BY student_id
ORDER BY student_id

#student 테이블의 모든 데이터 개수(NULL값 포함하여 카운트)
SELECT COUNT(*) 
FROM student
    
#student 테이블의 phone1 컬럼의 모든 데이터 개수(NULL값 제외하여 카운트)
SELECT COUNT(phone1) 
FROM student

 

 

■  HAVING : GROUP BY로 그룹화된 결과에 추가적인 필터링(조건) 적용

- GROUP BY절을 통해 그룹화된 데이터에 대해 조건을 설정하여 필터링

- GROUP BY절 다음 순서에 사용  

#student_id을 기준으로 그룹화 / 그룹핑된 데이터 기준 amount*price값의 합계가 1,000 이상인 그룹만 조회
#그룹핑 조건과 동일하게 amount*price값의 합계를 조회(단, "총 금액"형태로 조회)
SELECT SUM(amount*price) AS "총 금액"
FROM buy
GROUP BY student_id
HAVING SUM(amount*price) >= 1000;