오늘은 MySQL의 문법을 간단히 정리하며 예제를 풀며 궁금했던 것들을 찾아 기록하였다.

SQL은 구조적 질의 언어란 뜻으로 데이터베이스에서 데이터를 관리하거나 조작하기 위해 사용되는 프로그래밍 언어이며 관계형 데이터베이스(RDBMS)에서 데이터를 정의, 조회, 삽입, 갱신, 삭제하는 CRUD가 핵심이다.
*CRUD: CREATE, READ, UPDATE, DELETE의 약자, 거의 모든 데이터베이스 시스템에서 사용된다.
데이터베이스 구조(테이블, 스키마 등)를 정의하거나 변경하는 명령어로 주요 명령어는 다음과 같다.
CREATE: 데이터베이스 객체(테이블, 뷰, 인덱스 등)를 생성
ALTER: 기존 데이터베이스 객체를 수정
DROP: 데이터베이스 객체를 삭제
TRUNCATE: 테이블의 데이터를 모두 삭제하고, 테이블 구조는 유지
*DML(Data Manipulation Language)**은 데이터베이스에서 데이터를조작하는 데 사용되는 명령어로 주요 명령어는 다음과 같다.
INSERT: 데이터 삽입
UPDATE: 데이터 수정
DELETE: 데이터 삭제
REPLACE: 중복 데이터 교체
DCL은 데이터베이스 접근 권한 및 보안 제어 언어로 GRANT, REVOKE 등이 있다. 실습 때 따로 사용해보진 않았지만 DDL, DML과 함께 알아두면 좋을 것 같아 짧게 정리하였다.
NOT NULL: 데이터가 꼭 있어야 함
UNIQUE: 중복값 허용하지 않음
PRIMARY KEY: 테이블에 대한 식별자 역할, NOT NULL + UNIQUE 제약조건의 의미
SELECT * FROM tbl_menu;
-- VIEW 생성
CREATE VIEW hansik AS
SELECT
menu_code, menu_name, menu_price, category_code, orderable_status
FROM
tbl_menu
WHERE
category_code = 4;
-- 생성된 VIEW 조회
SELECT * FROM hansik;
위 예시와 같이 전체가 아닌 원하는 부분만 불러올 수 있어 보기 용이하고 원본 데이터의 보안 유지에 좋다. 데이터 원본이 바뀌면 뷰도 바뀌며 INSERT, UPDATE, DELETE 가 가능하다.
주의점은 테이블 생성 시 pk로 null값을 주면 자동으로 숫자가 올라가는데 반해 뷰는 테이블이 아니고 쿼리이기 때문에 불가능하다. 그래서 pk 컬럼의 값을 지정해 주어야 한다.
복잡한 작업을 하나의 프로시저로 만들어 필요할 때마다 호출할 수 있으며, 코드의 재사용성과 유지보수성을 높여준다. Stored Procedure는 데이터베이스 성능 향상과 보안 강화에 도움이 되며, 클라이언트와 서버 간의 네트워크 트래픽을 감소시킨다.
특정 이벤트에 반응하여 자동 실행, 호출할 수 없고, 명시적 인수 전달이 불가능하다.
복습을 하다보니 누구는 SELECT가 DML이라 말하고 또 누구는 아니라 말하니 'SELECT는 DML에 포함되는가, 아닌가' 하는 의문이 생겼다. 구글에 검색해보니 의견이 분분한 것 같은데 의견들을 종합하여 내가 내린 결론은 '한쪽 발만 담가둔 상태'라 표현하고 싶다. 사실 기능에 대한 이해가 중요하지 포함 관계가 우선시 될 것은 아니라 생각하지만.. 그래도 혹시 나와 같은 궁금증을 가진 이들을 위해 아래 관련 링크를 남겨두었다. 흥미가 생긴다면 한 번 읽어보시길.
참고 자료 1: https://www.quora.com/
참고 자료 2: https://sookiwi.com/
1) INSERT
기존 데이터를 수정하지 않으며 새로운 데이터만 삽입한다. 만약 중복된 값이 있을 경우 기본 키나 유니크 키 제약 위반과 같은 오류가 발생할 수 있다.
2) UPDATE
기존 행(Row)의 값을 수정한다. 특정 조건을 만족하는 데이터가 이미 존재할 경우 사용하며 지정된 조건에 따라 데이터가 수정되고 데이터가 존재하지 않으면 아무 작업도 수행되지 않는다.
3) REPLACE
기존 데이터 삭제 후 삽입하는 방식이라, 삽입 작업 전에 기존 레코드가 제거된다. 이로 인해 트리거나 외래 키 제약 조건이 있을 경우 영향이 있을 수 있다.
오늘 테이블을 생성할 때 engine=innodb; 라는 스토리지 엔진을 사용하였다. 교안에 적힌 설명에 따르면 다음과 같다.
InnoDB: 트랜잭션 기능을 제공해 동시성과 무결성을 높이고 크래시 복구 기능을 지원해 시스템이 예기치 않게 중단되더라도 데이터의 일관성을 보장한다.
MySQL이 제공하는 데이터 베이스 엔진 중의 하나라는 것까진 알겠는데 데이터베이스 엔진이 무엇이고 왜 그 중 InnoDB를 사용하였는지 궁금증이 생겨 조금 더 자세히 알아보기로 했다.
스토리지 엔진이란 데이터를 저장하고 관리하는 방식을 결정하는 시스템으로 데이터베이스를 만들면 그 데이터를 어떻게 저장할지, 어떻게 읽고 쓸지를 담당하는 것이다.
MySQL이 제공하는 스토리지 엔진에는 InnoDB, MyISAM, NDBCluster 등이 있는데 InnoDB는 데이터를 구조화하여 관리하는 엔진으로 트랜잭션, 데이터 무결성이 중요한 경우에 사용되며 현재 대부분의 애플리케이션에서 기본 엔진으로 사용되고 있다. MyISAM은 읽기 위주의 간단한 애플리케이션(기존 프로젝트 유지보수 시)에 사용되며 NDBCluster: 분산 시스템, 실시간 처리, 고가용성이 중요한 경우에 사용한다는 특징이 있다. 아래에 세가지 스토리지 엔진에 대한 비교표를 작성해 보았다.
| 기능 | InnoDB | MyISAM | NDBCluster |
|---|---|---|---|
| 트랜잭션 | 지원 | 미지원 | 지원 |
| 외래 키(Foreign Key) | 지원 | 미지원 | 미지원 |
| 잠금 방식 | 행 수준 잠금 | 테이블 수준 잠금 | 분산 처리 |
| 데이터 무결성 | 우수 | 약함 | 우수 |
| 읽기 성능 | 보통 | 빠름 | 보통 |
| 쓰기 성능 | 느림 | 빠름 | 빠름 |
| 확장성 | 보통 | 낮음 | 우수 |
| 사용 메모리 | 중간높음 | 적음 | 높음 |
| 사용 사례 | 트랜잭션, 복잡한 쿼리 | 읽기 위주 애플리케이션 | 고가용성, 실시간 처리 |
| 실 사용 예시 | 전자상거래 플랫폼 은행 및 금융 시스템 | 블로그/게시판 시스템 데이터 로그 저장소 | 통신사 네트워크 관리 IoT 플랫폼 |
궁금한걸 찾아보다 더 많은 궁금증이 생겨서 하루가 48시간이었으면 좋겠다는 생각이 드는 요즘이다. 세상 모든 지식을 크롤링하듯 머리 속으로 끌어올 수 있으면 얼마나 좋을까,,,ㅎ
InnoDB 참고자료1: https://velog.io/@sweet_sumin
InnoDB 참고자료2: https://bottom-to-top.tistory.com