1.1. 시작하기전에
구조화된 어떠한 일련의 Data를 Database라고 합니다.
이 문서는 이러한 Database를 다루기 위해서 특별하게 고안된 언어인 SQL(Structured Query Language, 구조적 질의 언어)에 대하여 가장 기초적인 부분을 간단히 요약하는 형태가 될겁니다.
여기서는 MySQL 을 기준으로 내용을 정리하였습니다.
MySQL은? - 오라클의 무료(부분유료) 오픈소스 RDBMS(관계형 데이터 베이스 시스템)
이 문서는 이러한 Database를 다루기 위해서 특별하게 고안된 언어인 SQL(Structured Query Language, 구조적 질의 언어)에 대하여 가장 기초적인 부분을 간단히 요약하는 형태가 될겁니다.
여기서는 MySQL 을 기준으로 내용을 정리하였습니다.
MySQL은? - 오라클의 무료(부분유료) 오픈소스 RDBMS(관계형 데이터 베이스 시스템)
- http://www.mysql.com
- Sun MicroSystems가 MySQL 인수
- 오라클이 Sun MicroSystems 같이 인수
- 비슷한 MariaDB도 있음 (https://mariadb.org/)
- MySQL과 동일한 소스 코드를 기반으로 하며, GPL v2 라이선스입니다.
- 오라클 소유의 현재 불확실한 MySQL의 라이선스 상태에 반발하여 만들어졌습니다.
1.2. Database 용어정리
- DB (Database)
구조화된 방식으로 저장된 일련의 Data들의 집합
- DBMS (Database Management System)
Data를 추가/변경/삭제/검색/트랜잭션(Transaction)등을 효과적으로 관리해주는 Software package들
데이터를 저장하고 유지보수(수정, 삭제, 추가)하고 이를 검색하는 시스템
CRUD(Create, Retrieve, Update, Delete)
- RDBMS (Relational Database Management System)
관계형(Relational) 데이터베이스 시스템
테이블(Table based)기반의 DBMS
- 트랜젝션 (Transaction)
Data의 무결성을 보장하기 위하여 필요한 일련의 작업들을 하나의 기본작업단위로 처리하는 것
- 테이블 (Table)
특정한 주제를 기반으로 Data를 저장할수 있는 구조적으로 만든것
- 스키마 (Schema)
Data의 구조를 정의하기 위한 논리구조
- 레코드(Record) 또는 행(Row)
하나의 논리적 Data단위
- 컬럼(Column) 또는 필드(Field)
Row(행)를 구성하는 항목
- 도메인값 (Domain Value)
각 컬럼(Column)에서 나올 수 있는 후보값
- SQL쿼리 (SQL Query)
관계형 DBMS를 사용하는 전용 질의언어
- 기본키 (Primary Key, PK)
테이블(Table)에서 하나의 레코드(Record)를 지정할 수 있는 하나 이상의 컬럼집합
- 외래키 (Foreign Key, FK)
어떤 테이블(Table)의 기본키가 다른 테이블(Table)의 컬럼(Column)에 들어 있을 경우
1.3. SQL의 종류
1.3.1. DML (Data Manipulation Language)
- 테이블(Table)의 Data를 CRUD(Create, Retrieve, Update, Delete) 하는 기능
- 예) INSERT, SELECT, UPDATE, DELETE
- INSERT
INSERT INTO <Table-name>(<Column-name>[, ...]) VALUES (<값>[, ...]);
- SELECT
SELECT <Column-name>[, ...] FROM <Table-name> WHERE <조건절>;
- UPDATE
UPDATE <Table-name> SET <Column-name>=<값>[, ...] WHERE <조건절>;
- DELETE
DELETE FROM <Table-name> WHERE <조건절>;
1.3.2. DDL (Data Definition Language)
- DB, 테이블(Table)의 스키마(Schema)를 정의(Define), 수정(Modify)하는 기능
- 테이블(Table)의 생성, 컬럼(Column) 추가, 타입변경, 각종 제약조건 지정, 수정 등
- 예) CREATE, DROP, ALTER
1.3.3. DCL (Data Control Language)
- DB(Database)나 테이블(Table)의 접근권한이나 CRUD(Create, Retrieve, Update, Delete) 권한을 정의하는 기능
- 특정 사용자에게 테이블(Table)의 조회권한 허가/금지 등
- 예) GRANT, REVOKE
1.4. 기초 명령
특별히 명령에 대소문자를 구분하지는 않으나 Data 내용을 지칭하는 부분은 대소문자를 구분합니다.
- Database들의 목록 확인
SHOW DATABASES;
- 지정한 Database를 사용함을 지정
USE <Database-name>;
- Table들의 목록 확인
SHOW [FULL] TABLES [{FROM | IN} <Database-name>] [LIKE '<pattern>' | WHERE <expression>];
- 지정한 Table의 구조를 확인
DESCRIBE <Table-name> [<Column-name> | <Wild>]; 또는 SHOW CREATE TABLE <Table-name>;
- 지정한 Table의 내용을 확인
SELECT * FROM <Table-name>;
1.5. 간단한 상황에 따른 SQL구문정리
- Database 선택
USE <Database name>;
- 지정한 사용자에 대한 접속 가능한 Host 목록을 확인
SELECT Host FROM mysql.user WHERE user='<Username>';
- Database로의 접근가능한 사용자 생성
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON <Database name>.* TO <Username>@localhost identified by '<Password>';
- Database에 기존사용자의 사용권한 부여
GRANT ALL ON <Database name>.* TO <username>;
- 모든 IP로부터 접속 가능한 사용자 생성
INSERT INTO mysql.user (host,user,password) VALUES ('%','<Username>',password('<Password>')); GRANT ALL PRIVILEGES ON *.* TO '<Username>'@'%'; FLUSH PRIVILEGES; // 기타: insert into db (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv) values ('%','{DataBase Name}','{User ID}', 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y' );
- 특정 IP대역으로부터 접속 가능한 사용자 생성 ( 예: 111.222.* )
INSERT INTO mysql.user (host,user,password) VALUES ('111.222.%','<Username>',password('<Password>')); GRANT ALL PRIVILEGES ON *.* TO '<Username>'@'111.222.%'; FLUSH PRIVILEGES;
- Database 만들기
CREATE DATABASE [IF NOT EXIST] <Database name>;
- Database 삭제
DROP DATABASE [IF EXISTS] <Database name>;
- Database 선택
USE <Database name>;
- Table with Schema 만들기
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] <Table name> (<정의>) [<OPTION>];
- Table 삭제
DROP [TEMPORARY] TABLE [IF EXISTS] <Table name> [,<Table name> ...] [RESTRICT | CASCADE];
- 하나의 Table에서 특정 Field목록 또는 모두 가져오기
SELECT <Field name>[,<...>] FROM <Table name>; SELECT * FROM <Table name>;
- 특정 Field들을 (오름차순 기준으로) 정렬하여 가져오기
SELECT <Field name>[,<...>] FROM <Table name> ORDER BY <Field name>[,<...>]; SELECT <Field name>[,<...>] FROM <Table name> ORDER BY <Field name>[,<...>] ASC; SELECT <Field name>[,<...>] FROM <Table name> ORDER BY <Field name>[,<...>] ASCENDING;
- 특정 Field들을 (내림차순 기준으로) 정렬하여 가져오기
SELECT <Field name>[,<...>] FROM <Table name> ORDER BY <Field name>[,<...>] DESC; SELECT <Field name>[,<...>] FROM <Table name> ORDER BY <Field name>[,<...>] DESCENDING;
- 특정 조건에 맞는 Field목록 가져오기 (=,<>,!=,<,<=,!<,>,>=,!>,BETWEEN,IS NULL)
SELECT <Field name>[,<...>] FROM <Table name> WHERE <FieldName>=<Value>; SELECT <Field name>[,<...>] FROM <Table name> WHERE NOT <FieldName>=<Value>; SELECT <Field name>[,<...>] FROM <Table name> WHERE <FieldName>=<Value> [AND <FieldName>=<Value>]; SELECT <Field name>[,<...>] FROM <Table name> WHERE <FieldName>=<Value> [OR <FieldName>=<Value>]; SELECT <Field name>[,<...>] FROM <Table name> WHERE <FieldName> IN ('<Value>'[,<...>]); SELECT <Field name>[,<...>] FROM <Table name> WHERE <FieldName> BETWEEN <Value> AND <Value>; SELECT <Field name>[,<...>] FROM <Table name> WHERE <FieldName> IS NULL; SELECT <Field name>[,<...>] FROM <Table name> WHERE <FieldName> LIKE '<WildValue>';
1.6. 참고자료
- http://www.mysql.com/
- https://mariadb.org/
- "오라클로 배우는 데이터베이스 개론과 실습 - 2판" - (도서정보 관련링크)