SQL 개념 및 문법
1. Database(DB) 기본
여러사람이 공유하여 사용할목적으로 체계화하여 통합, 관리하는 데이터의 집합
[1] RDBMS (Relational Database Management System)
데이터베이스는 체계화된 데이터의 모임(데이터베이스를 관리하는 시스템)
- 파일 단위의 저장도 가능=> 하지만, 데이터를 얼마나 "빠르고 효율적으로 그리고 중복없이" 찾을수 있는지가 관건
RDBMS(Relational Database Management System)
- 관계형 데이터베이스 관리시스템
- 관계를 표현하기 위해서 2차원 표(table) 활용
[2] 기본용어
스키마
- DB의 자료의 구조와 제약조건을 기술한것
테이블
- 열과 행을 사용해 조작된 데이터들의 집합
열(column)/필드
- 특정 종류의 데이터를 기록
행(row)/레코드
- 특정 값(데이터)
PK(Primary Key, 기본키)
- 각 행의 고유값으로 저장된 레코드를 고유하게 식별할 수 있는 값
2. SQL
[1] 개념
RDBMS에서 데이터를 관리 및 조작하기 위해 설계된 프로그래밍 언어
자료의 검색 및 관리, 데이터베이스 스키마 생성과 수정, 데이터 베이스 접근 관리
[2] SQL 기본정의
DDL(Date Difinition Language) - 데이터 정의 언어
- RDBMS의 구조를 정의하기 위한 명령어
- CREATE, DROP(테이블 삭제), ALTER(테이블 수정), TRUNCATE(테이블 초기화)
DML(Date Manipulation Language) - 데이터 조작언어
- 데이터를 저장, 수정, 삭제, 조회하기 위한 언어
DCL(Date Control Language) - 데이터 제어언어
- 데이터베이스 사용자의 권한 제어를 위해 사용되는 언어
3. SQL문법
[1] 기본문법
테이블 생성
CREATE TABLE 테이블 이름 (
컬럼명1 DATATYPE [DEFAULT 형식],
컬럼명2 DATATYPE [DEFAULT 형식],
컬럼명3 DATATYPE [DEFAULT 형식]
);
모든 테이블 레코드 조회(SELECT)
-- USER란 이름의 테이블 조회
SELECT * FROM USER;
-- 조건 WHERE을 이용한 조회
SELECT * FROM USER
WHERE id = 100;
테이블의 레코드 생성(INSERT)
-- USER 테이블 column에 맞게 값을 적어준다. 모든 레코드의 value 값을 적어줘야함
INSERT INTO USER ('first_name', 'last_name', 'age', 'country', 'phone', 'balance')
VALUES ('금재', '이', 20, '경기', '031-123-1324', 10000);
테이블의 레코드 수정(UPDATE)
-- USER테이블의 id = 100인 레코드의 last_name을 '최'로 수정
UPDATE USER
SET last_name='최'
WHERE id = 100;
테이블의 레코드 삭제(DELETE)
-- id = 49인 레코드를 삭제
DELETE FROM USER
WHERE id = 49;
[2] 조건에 따른 문법
조건이 있는 조회를 할경우 WHERE을 활용!!!!!
나이가 20인 사람의 first_name
SELECT first_name FROM USER
WHERE age = 20;
나이가 30살 이상인 사람의 인원 수
SELECT COUNT(*) FROM USER
WHERE age >= 30;
나이가 50 이상이면서 성이 김씨인 사람의 인원 수
SELECT COUNT(*) FROM USER
WHERE age >= 50 AND last_name = '김';
column인 phone이 02로 시작하는 사람의 수
-- LIKE는 정확한값이 아니라 패턴을 확인하여 일치하는것 불러오는역할
SELECT COUNT(*) FROM USER
WHERE phone LIKE '02-%';
column인 country가 경기도이면서 last_name이 이씨인 first_name
SELECT first_name FROM USER
WHERE country='경기도' AND last_name='이';
[3] 정렬 및 LIMIT, OFFSET
ASC(Asecending) or DESC(descending)로 정렬을 할때는 ORDER BY을 활용
나이가 많은 사람 10명(내림차순,역순)
SELECT * FROM USER
ORDER BY age DESC
LIMIT 10;
잔액이 적은 사람 10명 (오름차순)
SELECT * FROM USER
ORDER BY balance ASC
LIMIT 10;
성, 이름 내림차순 순으로 5번째 있는 사람
SELECT * FROM USER
ORDER BY last_name DESC, first_name DESC
LIMIT 1 OFFSET 4;
-- LIMIT 1 : 맨 위를 기준으로 1개
-- OFFSET 4 : 위에서 4개가 사라짐
[4] 기타문법
AVG(평균), MAX(최대), SUM(합)
평균(AVG)
SELECT AVG(age) FROM USER;
김씨의 평균 나이(AVG)
SELECT AVG(age) FROM USER
WHERE last_name = '김';
balance가 가장 높은 값(MAX)
SELECT MAX(balance) FROM USER;
balance의 총액(SUM)
SELECT SUM(balance) FROM USER;
[5] Group by
GROUP BY절은 데이터를 그룹으로 나눌 수 있다
지역별 인원 수
SELECT country, COUNT(country) FROM USER
GROUP BY country;
country | COUNT(country)
강원도 | 14
경기도 | 9
경상남도 | 9
경상북도 | 15
전라남도 | 10
전라북도 | 11
제주특별자치도 | 9
충청남도 | 9
충청북도 | 14
-- country를 기준으로 그룹을 나눔
지역별 인원이 10명이상 조회
SELECT country, COUNT(country) FROM USER
GROUP BY country; -- country별로 그룹을 나눔
HAVING COUNT(country) >= 10 -- HAVING 으로 조건
ORDER BY COUNT(country) DESC; -- 지역인원을 기준으로 내림차순으로 정렬
country | COUNT(country)
경상북도 | 15
강원도 | 14
충청북도 | 14
전라북도 | 11
전라남도 | 10
WHERE절과 HAVING절의 차이
1. WHERE
select * from 테이블명 where 조건절
위와 같이 where 조건절을 사용합니다.
항상 from 뒤에 위치하고 다양한 비교연산자들로 구체적인 조건을 줄수 있습니다.
2. HAVING
select * from 테이블명 group by 필드명 having 조건절
위와 같이 having 조건절을 사용합니다.
항상 group by뒤에 위치하고 다양한 비교연산자들로 구체적인 조건을 줄 수 있습니다.
차이점
둘의 차이점은 where은 우선적으로 모든 필드를 조건에 둘수 있지만, having은 group by가 된이후 특정 필드를 그룹화되어진 새로운 구조에 조건을 줄 수 있습니다.
위 지역별 인원이 10명이상 조회
을 보면 우선적으로 country에 의해 GROUP BY 된 이후 HAVING으로 조건을 준걸 볼수 있습니다.
[6] CASE
-- 해당 컬럼에 조건에 따라 결과를 출력하고 컬럼명을 B로 할당
SELECT A, CASE
WHEN 조건식1 THEN 결과1
WHEN 조건식2 THEN 결과2
WHEN 조건식n THEN 결과n
ELSE 결과
END AS B
FROM 테이블명