■ 요약 구분
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;