또 황금같은 3일의 연휴가 끝나고 이론 수업이 돌아왔습니다.
SQL은 Structured Query Language의 약자로 구조화된 쿼리문입니다. 데이터베이스에서 데이터를 조회하거나 조작을 할 때 사용되는 구문입니다.
관계형DB을 조작할 때 사용하고 NoSQL과는 다릅니다.
이번 수업에서 사용한 IDE는 MySQL이였습니다.
데이터베이스는 서버 -> 데이터베이스 -> 스키마 -> 테이블 순으로 4계층을 이루고 있지만 MySQL은 데이터베이스 = 스키마로 봅니다.
DDL : Data Definition Language (선언문)
CREATE, ALTER, DROP
DML : Data Manipulation Language (조작문)
SELECT, INSERT, UPDATE, DELETE
DCL : Data Control Language (제어문)
GRANT, REVOKE, DENY
MYSQL 문법을 작성하고 실행시키는 방법은 Ctrl + 엔터를 누르면 실행이 됩니다. 단, 전체가 실행이 되므로 ;을 작성해서 해당 쿼리문만 진행되도록 주의해야됩니다. 아니면 위에 번개 모양이 있는데 실행시키고자하는 쿼리문을 선택하고 번개모양 아이콘을 누르면 해당 행만 진행이 됩니다.
CREATE DATABASE MyDB;
해당 코드를 실행하면 MyDB라는 이름을 가진 데이터베이스(스키마)가 생성됩니다.
USE MyDB;
해당 코드를 사용하여 MyDB에 연결하여 제어가 가능합니다.
SELECT DATABASE();
해당 코드를 통해 현재 연결된 DB를 알 수 있습니다.
CREATE TABLE friend (
name varchar(20) not null,
email varchar(60) not null,
phone varchar(20) not null,
birth_date date null,
money int null
);
varchar는 문자형이라고 정의하는 것이고 괄호안에 숫자로 길이를 정해줍니다. not null은 결측치를 허용하지 않는 것을 의미합니다.(값이 꼭 삽입되어야합니다.)
INSERT INTO friend VALUES('홍길동', 'hong@aivle.com', '010-1234-5678', '2020-01-01', 1000);
해당 문구를 사용하여 name 컬럼에는 홍길동, email 컬럼에는 hong@aivle.com, phone 컬럼에는 010-1234-5678 birth_date 컬럼에는 2020-01-01, money 컬럼에는 1000라는 데이터가 추가됩니다.
SELECT * FROM friend;
이렇게 테이블에 있는 데이터를 확인할 수 있습니다.
SELECT 'Hello SQL World';
SELECT 'Hello SQL World' AS Start;
AS를 사용하면 별칭을 줄 수 있습니다.
SELECT 10 + 20 AS Result;
SELECT CURDATE() AS Today;
SET @Today = CURDATE();
SELECT @Today;
SELECT * FROM 테이블명;
테이블명에 해당하는 테이블의 모든 컬럼(*)에 대해서 데이터를 출력해서 보여줍니다.
SELECT 컬럼명1, 컬럼명2, 컬럼명3, 컬럼명4
FROM 테이블명;
SELECT뒤에 컬럼명을 주면 해당 컬럼들에 대한 정보만 출력해서 보여줍니다.
SELECT *
FROM 테이블명
WHERE 조건문;
기본 형태는 위와 같습니다. 예시는 아래와 같습니다.
SELECT *
FROM employee
WHERE emp_id = 'S0001';
employee 테이블에서 emp_id컬럼 값이 S0001인 데이터만 조회해서 보여줍니다.
WHERE절의 특징으로 열 이름이 잘못 지정되면 에러가 발생하고 조건을 잘못 설정하면 에러가 발생하거나 원하지 않은 값을 조회할 수 있으므로 항상 조건에 신경을 써야합니다.
SELECT *
FROM employee
WHERE salary > 7000;
위 예시를 보게되면 WHERE절에 비교 연산자로 >가 사용되었습니다. 해석하자면 salary컬럼의 값이 7000이상인 데이터를 조회해서 보여줍니다.
SELECT *
FROM employee
WHERE hire_date < '2015-03-01';
마찬가지로 비교연산자가 사용되었지만 해당 데이터는 숫자가 아니라 날짜형 데이터임에도 사용이 가능합니다. 해당 코드를 실행하면 2015년 3월 이전의 hire_date에 대한 컬럼 값들을 보여줍니다.
SELECT *
FROM employee
WHERE dept_id != 'SYS';
문자에 대해서도 dept_id 컬럼이 SYS가 아닌 데이터들을 조회해서 보여줍니다.
SELECT *
FROM employee
WHERE emp_name LIKE '김%';
위 코드를 보면 employee 데이터베이스에서 emp_name컬럼 값중에 김 씨인 사람들에 대한 데이터를 조회해주는 쿼리문 입니다.
SELECT *
FROM employee
WHERE gender = 'M' AND dept_id = 'SYS';
해당 조건을 보게되면 성별컬럼이 M인 값이고 dept_id컬럼값이 SYS인 데이터만 조회해서 보여주는 쿼리문입니다.
SELECT *
FROM employee
WHERE dept_id IN ('SYS', 'MKT', 'GEN');
IN을 사용해주면 괄호안에 있는 값들에 해당하는 데이터를 조회해서 보여줍니다. 위 예시 코드를 보게되면 employee라는 데이터베이스에서 dept_id 컬럼의 값이 SYS, MKT, GEN인 값들을 조회해서 보여줍니다.
SELECT *
FROM employee
WHERE hire_date BETWEEN '2016-01-01' AND '2016-12-31';
Between도 마찬가지러 2016-01-01 ~ 2016-12-31의 데이터를 조회해서 보여줍니다.
SELECT *
FROM employee
WHERE retire_date = NULL;
해당 코드를 사용하게 되면 retire_date컬럼 값이 NULL인 데이터만 조회해서 출력해줍니다.
SELECT emp_name, emp_id, IFNULL(eng_name, ''), gender, dept_id, hire_date, phone
FROM employee
WHERE retire_date IS NULL;
해당 코드를 사용하면 eng_naem 컬럼의 값이 null인 데이터가 공백('')으로 조회되어 결과 값으로 보여줍니다.
DBMS마다 다른 NULL 처리 함수가 다릅니다.
-- MySQL: IFNULL()
-- MSSQL: ISNULL()
-- ORACLE: NVL()
SELECT emp_name, emp_id, COALESCE(eng_name, '') AS 'nick_name', gender, dept_id, hire_date
FROM employee
WHERE retire_date IS NULL;
IFNULL과 같은 결과가 조회됩니다.
SELECT CONCAT(emp_name, '(', salary, ')') AS emp_name, dept_id, gender, hire_date, email
FROM employee
WHERE retire_date IS NULL;
해당 코드를 보게되면 emp_name의 컬럼과 salary컬럼을 합쳐서 조회하는데 형태는 emp_name(salary)의 형태로 조회가 됩니다.
만약 null값이 있으면 해당 데이터가 null로 보이기 때문에 null값 처리를 아래와 같이 진행해야합니다.
SELECT CONCAT(emp_name, IFNULL(CONCAT('(', eng_name, ')'), '')) AS emp_name, dept_id, gender,
hire_date, email
FROM employee
WHERE retire_date IS NULL;
해당 코드를 보게 되면 emp_name(eng_name) 형태로 조회를 해주는데 만약 eng_name이 NULL이면 공백으로 처리해서 조회해줍니다.
SELECT *
FROM employee
WHERE retire_date IS NULL
ORDER BY dept_id ASC, emp_name DESC;
해당 코드를 보게되면 dept_id컬럼에 대해서 먼저 오름차순을 하고 같은 값의 dept_id에 대해서는 emp_name을 기준으로 내림차순 정렬을 해줍니다.
-- 성별: M, F --> 남자, 여자
SELECT emp_name, emp_id,
CASE WHEN gender = 'M' THEN '남자'
WHEN gender = 'F' THEN '여자'
ELSE '' END AS gender
FROM employee;
해당 코드를 보게 되면 그냥 gender컬럼에 대해 조회를 하게 되면 M, F로 조회가 되는데 만약 gender의 값이 M이면 남자 F면 여자로 바꾸어 조회해줍니다 또한 ELSE문을 통해 만약 M. F 값이 아니면 그냥 공백으로 처리해줍니다.
합, 평균값, 최댓값, 최솟값, 개수를 구함
합과 평균값은 숫자에 대해서만 구할 수 있음
최댓값, 최솟값, 개수는 문자와 날짜에 대해서 사용 가능
날짜의 최솟값 = 가장 빠른(오래된) 날짜
날짜의 최댓값 = 가장 최근 날짜
행 수를 구할 때는 COUNT(*)를 사용함
SELECT MAX(salary) AS max_salary,
MIN(salary) AS min_salary
FROM employee
WHERE retire_date IS NULL;
해당 코드를 사용하게 되면 reture_date 값이 NULL인 데이터중에서 salary 컬럼 중 가장 큰 데이터 값과 가장 작은 데이터 값들을 조회해줍니다.
DISTINCT는 중복은 제거하고 집계함수의 결과를 알려줍니다.
SELECT COUNT(DISTINCT salary) AS cnt_salary
FROM employee
WHERE retire_date IS NULL;
해당 코드를 사용하면 retire_date 컬럼 값이 NULL인 값들 중에서 salary 값이 중복되는 값은 하나로 취급하고 급여의 갯수를 알려줍니다. 예를들어 1000, 2000, 2000, 1000, 3000이라면 DISTINCT에 의해 3이 출력됩니다.(총 데이터는 5개 입니다.)
오늘은 MySQL에 대해 배웠습니다. 데이터를 관리하는 것은 정말 재밌는거 같습니다.
※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.