KT 에이블스쿨 67일차(1)

박기범·2023년 5월 8일
0

에이블스쿨

목록 보기
74/95

또 황금같은 3일의 연휴가 끝나고 이론 수업이 돌아왔습니다.



SQL

SQL은 Structured Query Language의 약자로 구조화된 쿼리문입니다. 데이터베이스에서 데이터를 조회하거나 조작을 할 때 사용되는 구문입니다.

관계형DB을 조작할 때 사용하고 NoSQL과는 다릅니다.



MYSQL 문법

이번 수업에서 사용한 IDE는 MySQL이였습니다.

데이터베이스는 서버 -> 데이터베이스 -> 스키마 -> 테이블 순으로 4계층을 이루고 있지만 MySQL은 데이터베이스 = 스키마로 봅니다.

▶ [SQL문 유형]

DDL : Data Definition Language (선언문)
CREATE, ALTER, DROP
DML : Data Manipulation Language (조작문)
SELECT, INSERT, UPDATE, DELETE
DCL : Data Control Language (제어문)
GRANT, REVOKE, DENY

▶ MYSQL 문법

MYSQL 문법을 작성하고 실행시키는 방법은 Ctrl + 엔터를 누르면 실행이 됩니다. 단, 전체가 실행이 되므로 ;을 작성해서 해당 쿼리문만 진행되도록 주의해야됩니다. 아니면 위에 번개 모양이 있는데 실행시키고자하는 쿼리문을 선택하고 번개모양 아이콘을 누르면 해당 행만 진행이 됩니다.

▶ MYSQL_데이터베이스 생성하기

    CREATE DATABASE MyDB;

해당 코드를 실행하면 MyDB라는 이름을 가진 데이터베이스(스키마)가 생성됩니다.

▶ MYSQL_DB연결


    USE MyDB;

해당 코드를 사용하여 MyDB에 연결하여 제어가 가능합니다.

▶ MYSQL_현재 사용하고 있는 DATABASE 보기

    SELECT DATABASE();

해당 코드를 통해 현재 연결된 DB를 알 수 있습니다.

▶ MYSQL_테이블 만들기

    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은 결측치를 허용하지 않는 것을 의미합니다.(값이 꼭 삽입되어야합니다.)

▶ MYSQL_데이터 추가

    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라는 데이터가 추가됩니다.

▶ MYSQL_테이블 확인

	SELECT * FROM friend;

이렇게 테이블에 있는 데이터를 확인할 수 있습니다.

▶ SQL문 기초


  • 문자열 출력
	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뒤에 컬럼명을 주면 해당 컬럼들에 대한 정보만 출력해서 보여줍니다.

  • WHERE 절
    WHERE 절에 지정한 조건에 맞는 일부 행만 조회합니다.
    꼭 필요한 행만 조회하도록 정확한 조건을 지정해야 합니다.
    SELECT *
    FROM 테이블명
    WHERE 조건문;

기본 형태는 위와 같습니다. 예시는 아래와 같습니다.

SELECT *
FROM employee
WHERE emp_id = 'S0001';

employee 테이블에서 emp_id컬럼 값이 S0001인 데이터만 조회해서 보여줍니다.

WHERE절의 특징으로 열 이름이 잘못 지정되면 에러가 발생하고 조건을 잘못 설정하면 에러가 발생하거나 원하지 않은 값을 조회할 수 있으므로 항상 조건에 신경을 써야합니다.

  • 비교 연산자: =, >, <, >=, <=, <>, !=
    크기를 비교할 때 사용하고 대부분 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가 아닌 데이터들을 조회해서 보여줍니다.

  • LIKE 연산자
    문자열 데이터는 숫자나 날짜와 달리 다양한 조건의 검색이 요구됨에 따라 LIKE 연산자를 사용하면 유용합니다.
    예를들어 LIKE '%김%' 을 사용하면 글자수에 상관없이 데이터 사이에 김이라는 단어가 있으면 해당 데이터를 모두 조회해서 보여줍니다.
    LIKE '_김_'을 사용해주면 _은 하나의 글자를 뜻하므로 3글자의 데이터중에 가운데 글자가 김인 데이터만 조회해서 출력해줍니다.
	SELECT *
	FROM employee
	WHERE emp_name LIKE '김%';

위 코드를 보면 employee 데이터베이스에서 emp_name컬럼 값중에 김 씨인 사람들에 대한 데이터를 조회해주는 쿼리문 입니다.

  • 논리 연산자: AND, OR, NOT
    마찬가지로 WHERE절에 주로 사용되며 여러 개의 조건을 연결해주는 연산자 입니다.
    만약 연결해줄 연산이 많다면 괄호를 사용해서 조건을 명확히 식별해주도록 해야합니다.
	SELECT *
	FROM employee
	WHERE gender = 'M' AND dept_id = 'SYS';

해당 조건을 보게되면 성별컬럼이 M인 값이고 dept_id컬럼값이 SYS인 데이터만 조회해서 보여주는 쿼리문입니다.

  • 범위 조건(BETWEEN)과 리스트 조건(IN)
    마찬가지로 WHERE절에 주로 사용되며 반복되는 조건을 간단하게 만들어줍니다.
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의 데이터를 조회해서 보여줍니다.

  • NULL 값은 0도 아니고 공백도 아닌 알 수 없는 값(Unknown Value)
	SELECT *
	FROM employee
	WHERE retire_date = NULL;

해당 코드를 사용하게 되면 retire_date컬럼 값이 NULL인 데이터만 조회해서 출력해줍니다.

  • IFNULL 함수 사용 전
    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()

  • COALESCE() 함수 사용
	SELECT emp_name, emp_id, COALESCE(eng_name, '') AS 'nick_name', gender, dept_id, hire_date
	FROM employee
	WHERE retire_date IS NULL;

IFNULL과 같은 결과가 조회됩니다.

  • 데이터 결합
    CONCAT 함수를 사용해 데이터를 결합합니다.
    결합되는 값에 NULL 값이 포함되면 결합 결과가 NULL이 됩니다.
	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이면 공백으로 처리해서 조회해줍니다.

  • 데이터 정렬
    ORDER BY절을 사용해서 데이터를 오름차순 혹은 내림차순으로 출력해줍니다. ASC 옵션을 사용하면 오름차순 DESC를 사용하면 내림차순으로 조회해줍니다. 만약 옵션 값이 생략되었다면 디폴트 값은 ASC입니다. 만약 정렬 기준이 여러개라면 , 로 구분 지어줍니다.
	SELECT *
	FROM employee
	WHERE retire_date IS NULL
	ORDER BY dept_id ASC, emp_name DESC;

해당 코드를 보게되면 dept_id컬럼에 대해서 먼저 오름차순을 하고 같은 값의 dept_id에 대해서는 emp_name을 기준으로 내림차순 정렬을 해줍니다.

  • CASE 문
    쿼리문 안에서 조건에 따라 다른 값으로 표기하여 조회해줍니다.
    -- 성별: 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 값이 아니면 그냥 공백으로 처리해줍니다.

  • 집계 함수: SUM, AVG, MAX, MIN, COUNT
    집게함수는 특정컬럼의 데이터 합 혹은 데이터 갯수를 구해줍니다.
    또한 데이터의 값이 NULL이면 해당 데이터 값은 무시합니다.

합, 평균값, 최댓값, 최솟값, 개수를 구함
합과 평균값은 숫자에 대해서만 구할 수 있음
최댓값, 최솟값, 개수는 문자와 날짜에 대해서 사용 가능
날짜의 최솟값 = 가장 빠른(오래된) 날짜
날짜의 최댓값 = 가장 최근 날짜
행 수를 구할 때는 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에 대해 배웠습니다. 데이터를 관리하는 것은 정말 재밌는거 같습니다.




※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.

profile
개발자가 되기 위한 한걸음

0개의 댓글