본문 바로가기

SQL & DB

DB) SQL 기초 (DBMS , DCL , DDL , DML , TCL)

목차
DBMS
DCL(GRANT / REVOKE )
DDL(CREATE / ALTER / DROP / RENAME / TRUNCATE)
DML(INSERT, SELECT, UPDATE, DELETE)
TCL(COMMIT, ROLLBACK)

 

🧩DataBase

  • 데이터를 영구적으로 저장 할 수 있는 저장소 이다.
  • Data Base를 이용하면 서로 다른 시스템 간에 데이터를 공유 할 수 있다.
  • 데이터베이스는 여러 테이블을 저장하는 장소 개념

 

 

🧩DBMS (Data Base Management System)

  • Data Base 를 관리하는 시스템을 DBMS라고 한다.
  • 많은 종류의 DBMS 들이 존재한다.
  • Data Base Model 은 Relational 과 NO-SQL 로 크게 구분 된다.
  • Model 은 관계형 데이터 베이스(Relational Data Base) 이다.

 

 

🧩DCL (Data Control Language) : 데이터 제어어

  • 데이터 사용권한이나 유저를 다루는 언어
  • 데이터베이스에 접근하고 객체들을 사용하도록 권한을 주고 회수하는 명령어들
  • 데이터의 보안, 무결성, 회복 정의에 사용유저생성
  • Root 는 모든 권한을 가지고 있다.
  • Root 를 통해 사용자 의 명령어 실행 및 접근 권한을 조정 할 수 있다.
  • GRANT / REVOKE / COMMIT / ROLLBACK

유저생성 :  접근 IP 대역을 설정

CREATE USER [유저이름]@[접근가능한 IP주소] IDENTIFIED BY [비밀번호]
-- web_user는 모든 ip에서 접근 가능하고, 비밀번호는 pass로 만들어라
CREATE user 'web_user'@'%'IDENTIFIED by'pass';

-- dba_user 는 192.168 로 시작하는 ip에서 접근 가능하고, 비밀번호는 pass로 만들어라.
-- 특정 IP 대역만 접근 가능하게 할 경우
CREATE  user 'dba_user'@'192.168.%' IDENTIFIED by 'pass';

-- user002 는 192.168.38.70 ip 에서만 접근 가능하고, 비밀번호는 pass3 로 만들어라.
CREATE  user 'user002'@'192.168.38.70'IDENTIFIED by'pass3';

 

+) 그외 유저삭제, 확인, 변경

/*비밀번호 변경*/
-- SET PASSWORD FOR [사용자] = PASSWORD[패스워드];
-- 'user002'@'192.168.38.70'의 비밀번호를 pass 로 바꿔보자
set password for 'user002'@'192.168.38.70' = password('pass');


/*user의 모든 테이블 보기*/
-- 유저 권한은 user 확인에서 가능하다. 
-- 유저생성확인
SELECT * from mysql.user;

/*user 삭제*/
-- DROP USER[유저이름]@[ip]
drop user'dba_user'@'192.168.%';
drop user'user002'@'192.168.38.70';

 

 

GRANT : 사용자에게 작업에 대한 권한을 부여 

GRANT[권한종류]ON[데이터베이스테이블]TO[유저명]
-- 데이터를 INSERT(추가), UPDATE(수정), SELECT(조회), DELETE(삭제)
-- ALL PRIVILEGES : GRANT OPTION 을 제외한 모든 권한 부여
-- GRANT OPTION : 권한을 주는 권한

-- dba_user 에게 모든 데이터베이스의 모든 테이블의 데이터를 볼 수 있는 권한을 준다.
grant select on *.* to 'dba_user'@'192.168.%';
-- user002 에게 모든 데이터베이스의 모든 테이블에 데이터를 보고, 추가하고, 수정하고, 삭제할 수 있는 권한을 준다.
grant select,insert,update,delete on *.* to'user002'@'192.168.38.70';
-- web_user 에게 모든 데이터베이스에 모든 테이블의 데이터를 뭐든지 할 수 있는(권한 주는거 제외) 권한을 준다. 
-- IP가 %인 경우는 생략 가능
grant all privileges on *.* to 'web_user'@'%';

 

 

REVOKE :사용자에게 작업에 대한 권한을 회수, 박탈

REVOKE [권한] ON  [데이터베이스,테이블] FROM [유저명]
-- 'user002'@'192.168.38.70'에게 insert,update,delete 권한을 회수하기
REVOKE insert,update,delete on *.* FROM 'user002'@'192.168.38.70';

 

 

🧩DDL (Data Define Language) : 데이터정의어

  • 데이터베이스 구조 정의, 테이블 등을 생성하는 언어(명령어)
  • 데이터베이스의 전체 골격 구성하는 역할
  • 데이터베이스의 구조를 정의, 제거, 변경
  • 외부스키마 정의하거나 데이터베이스의 논리적, 물리적 구조 정의하고 제약조건 규정
  • CREATE / ALTER / DROP / RENAME / TRUNCATE 

CREATE :  데이터베이스, 테이블 생성

1) 데이터 베이스 생성

CREATE DATABASE [데이터 베이스 이름]
CREATE database mydb;

-- 데이터 베이스 목록 보기
show databases;

-- 데이터 베이스 사용
-- USE [데이터베이스 이름]
use mydb;

 

2) 테이블 생성

CREATE TABLE [테이블]([컬럼명][데이터타입](크기),)
/* 데이터타입 종류 (자주 쓰는 일부)
 * 1) 문자 타입
 * 고정형 - 한번정해진 크기가 변하지 않는 것 (2글자로 선언 했으나 1글자로 오면 남은 한자리는 공백 처리 됨)
 * char(바이트수)
 * 가변형 - 정해진 크기보다 적게 들어오면 알아서 줄여준다.
 * varchar(바이트수)
 * text : 65,535 byte
 * longtext : 4,294,967,295 byte
 * 
 * 2) 숫자 타입 - int, long, float, double
 * 
 * 3) boolean
 * 
 * 4) 날짜 타입
 * DATE		: 0000-00-00
 * DATETIME	: 0000-00-00 00:00:00
 * TIMESTAMP: DATETIME 과 같지만 time Zone에 따라 시간이 변경 된다. 
 * */

-- test_table 테이블 생성
CREATE TABLE test_table (
    user_name VARCHAR(50),
    age INT(3),
    mobile VARCHAR(13),
    reg_date DATE
);

-- employees 테이블 생성
CREATE table employees(
	emp_no int(3),
	first_name varchar(8),
	last_name varchar(2),
	email varchar(50),
	mobile varchar(13),
	salary int(8),
	reg_date date
);

 

++) 혹시나 DATE쪽에서 오류나게되면... (버전낮아서 오류났음)

-- sql버전 낮아서 날짜 트리거
-- test_table
CREATE TRIGGER test_table_OnInsert BEFORE INSERT ON test_table FOR EACH ROW SET NEW.reg_date = CURRENT_DATE;

-- employees
CREATE TRIGGER employees_OnInsert BEFORE INSERT ON employees FOR EACH ROW SET NEW.reg_date = CURRENT_DATE;
-- test_table 확인
desc test_table;

-- employees 확인
desc employees;

-- 테이블 확인
show tables;

 

 

ALTER : 기존테이블의 컬럼 추가, 삭제, 데이터타입 변경 (*구조변경시 기존데이터에 영향을 줄 수 있다.)

1) 컬럼 이름 변경

ALTER TABLE[테이블명] RENAME COLUMN [변경전이름] TO[변경후이름]
-- CREATE로 생성한 녀석은 DROP로 삭제하고 ALTER로 수정한다.
-- 테이블 수정(컬럼에 대한 수정)
ALTER TABLE employees RENAME COLUMN last_name TO family_name;

 

++) 혹시나 오류나게되면... (낮은버전에서 오류날경우)

-- 버전낮아서 이름변경 이걸로해야함...
ALTER TABLE employees CHANGE last_name family_name VARCHAR(2);

 

2) 컬럼 추가

ALTER TABLE [테이블명] ADD ([컬럼명][데이터타입](크기))
ALTER TABLE employees ADD (depart_no varchar(10));
ALTER TABLE employees ADD (commision varchar(10)); -- commision 문자열 10바이트
ALTER TABLE employees ADD (etc varchar(100)); -- etc 문자열 100 바이트

 

3)컬럼 속성 변경

ALTER TABLE [테이블명] MODIFY COLUMN [컬럼명][데이터타입](크기)
ALTER TABLE employees MODIFY COLUMN commision float(4,2); 
-- float(전체자릿수, 소숫점자릿수) -> 00.00

 

4)컬럼 삭제

ALTER TABLE [테이블명] DROP COLUMN [컬럼명]
-- etc 삭제해보기
ALTER TABLE employees DROP COLUMN etc;

 

 

DROP : 테이블을 삭제, 데이터베이스를 삭제하는 명령어

1) 데이터베이스 삭제 : 데이터베이스는 함부로 삭제 XX!

DROP DATABASE [데이터 베이스 이름]
DROP DATABASE mydb;

 

2) 테이블 삭제

DROP TABLE [테이블]
-- employees 테이블 삭제
drop table employees;

-- test_table 테이블 삭제
drop table test_table;

 

 

🧩DML (Data Manipulation Language) : 데이터 제어어 

  • 데이터를 다루는 언어
  • 정의된 데이터베이스에 입력된 레코드를 조회, 수정, 삭제하는 등의 역할을 한다.
  • INSERT, SELECT, UPDATE, DELETE, UPSERT
  • key 의 중복 여부에 따라 INSERT 또는 UPDATE 할 수 있는 UPSERT 문

INSERT : 데이테베이스에 레코드 삽입

INSERT INTO [테이블명](컬럼명,...)VALUES(컬럼명에 넣을값,...)
-- 붙여쓰기..
INSERT INTO employees(emp_no,first_name,family_name,email,mobile,salary,depart_no,commision)
VALUES(111,'지훈','김','zer0box@naver.com','01012341234',99999999,'dev01',90);

-- 알아보기쉽게 띄어쓰기 
insert INTO employees (
	emp_no,
	first_name,
	family_name,
	email,
	mobile,
	salary
) VALUES (
	112,
	'태근',
	'김',
	'email@naver.com',
	'01020343054',
	99999999
);

 

 

DELETE : 데이터 삭제

DELETE FROM [테이블명]
-- employees 테이블 데이터 삭제 
delete from employees;

-- commision 이 null 인 값을 지워보자
delete from employees where commision is null;

 

 

UPDATE  : 데이터 수정

UPDATE [테이블명] SET [컬럼] = [값] WHERE [조건]
-- depart_no가 dev005인 row에 대해서 commision을 30으로 변경
UPDATE employees SET  commision = 30 where depart_no = 'dev005';

 

SELECT : 데이터조회

1) 특정 컬럼 조회

SELECT [조회할 컬럼] FROM [테이블명]
-- employees 테이블 데이터 전체조회
SELECT * FROM employees;

-- employees 테이블에서 first_name, family_name, mobile 조회
SELECT first_name,family_name,mobile from employees;

-- 산술 표현
-- 숫자로 된 컬럼에 대해서는 계산해서 보여 줄 수 있다.(실제로 계산되는건 아님)
SELECT first_name, family_name, salary/10000 as 급여 FROM employees;
-- 컬럼명을 임시로 변경해서 보여 줄 수도 있다. (as 사용)

-- 보여주는 순서 변경 가능
SELECT family_name, first_name, salary/10000 as 급여 FROM employees;

-- 문자열을 합칠 수도 있다.
SELECT concat(family_name, first_name) as 이름, 
	concat(TRUNCATE(salary/10000,0),'만원') as 급여 
FROM employees;

-- 이 모든건 실제 데이터를 가공해서 보여줄 뿐이지 조작 되진 않는다.

 

2) 특정 조건의 데이터를 조회

SELECT [조회할 컬럼] FROM [테이블] WHERE [조건]
-- employees 테이블에서 family_name이 김씨인 사람의 데이터 조회
SELECT * FROM employees WHERE family_name ='김';

-- employees 테이블에서 급여가 300만원 이상인 사람의 first_name,salary 조회
SELECT first_name,salary FROM employees WHERE salary > 3000000;

-- family_name = '김' && salary > 2000000
-- family_name = '김' and salary > 2000000
-- salary >= 1000000 && salary <= 3000000
SELECT concat(family_name,first_name),salary FROM employees where salary >= 1000000 and salary <= 3000000;

-- || or
-- family_name = '김' || salary = 2000000
SELECT concat(family_name,first_name),salary FROM employees WHERE family_name = '김' or salary = 2000000;

-- BETWEEN AND (특정값 사이를 구할 때 사용)
-- AND 조건을 이용 해서 salary 가 50만원 보다 크거나 같고, 400만원 보다 작거나 같은 사람의 first_name, family_name,salary를 구하시오.
-- 부등호가 특수문자로 인식되는 경우가 있어서 피하고자 할 떄 종종 사용된다.
SELECT first_name,family_name,salary FROM employees WHERE salary BETWEEN 500000 AND 4000000;

 

3) 중복 제거

SELECT DISTINCT [출력할 컬럼] FROM [테이블]
SELECT DISTINCT family_name,salary FROM employees WHERE salary = 2000000;
-- distinct는 하나의 컬럼만 사용 할 때 가장 정확한 효과가 나타난다.
SELECT DISTINCT family_name,first_name FROM employees WHERE salary = 2000000;

 

4) IN : OR과 같다.

-- family_name이 '김' 또는 '이' 또는 '박' 인 사람의 모든 정보를 가져와라 
SELECT * FROM employees WHERE family_name = '김' or family_name = '이' or family_name = '박';
-- OR로 비교하는 컬럼이 모두 같은 경우 사용한다.(속도도 훨씬 빠르다!)
SELECT * FROM employees WHERE family_name IN ('김', '이', '박');

 

5) IS NULL || IS NOT NULL

-- 사용전.. null값이 없어서 만들어줌
-- commision이 10인 녀석을 찾아 null로 만들어라.
UPDATE employees SET commision = NULL WHERE commision = 10;

-- 사용해보기
SELECT * FROM employees where commision is null;
SELECT * FROM employees where commision is not null;

 

6) LIKE : 일부 비슷한 문자열 검색, 검색기능시 많이 사용 / 남발할 경우 속도저하

WHERE [컬럼명] LIKE '%[문자열]%'
-- ze% : ze로 시작하지만 뒤에는 아무거나 와도된다.	-> ze로 시작하는....
SELECT * FROM employees WHERE email LIKE 'ze%';	
-- %com : 앞에 아무거나 와도 되지만 뒤는 com 으로 끝나야 한다.	-> com으로 끝나는...
SELECT * FROM employees WHERE email LIKE '%com';	
-- %se% : se 앞뒤로 아무거나 와도 된다.	-> se를 포함하는...
SELECT * FROM employees WHERE email LIKE '%se%';
-- %s%e% : s 와 e 사이에 아무거나 와도 된다.	-> s 또는 e를 포함하는...
SELECT * FROM employees WHERE email LIKE '%s%e%';

 

7) ORDER BY (정렬) : 특정컬럼을 기준으로 정렬 / 오름차순 : ASC(△), 내림차순:DESC(▽)

SELECT * FROM [테이블명] ORDER BY [컬럼명] [ASC|DESC]
SELECT * FROM  employees ORDER BY salary DESC; 
SELECT * FROM  employees ORDER BY family_name ASC;
SELECT * FROM  employees ORDER BY family_name; -- ASC : 생략이 가능하다.

-- 김씨중에서 급여가 높은 순으로 정렬하시오.
SELECT * FROM employees WHERE family_name = '김' ORDER BY salary DESC;
-- 연봉이 높은 순으로 정렬 하세요.
SELECT family_name, first_name, salary*12 as annual_salary FROM employees ORDER BY salary DESC; 
-- 다중정렬 (1차정렬 후 동률의 데이터에서 2차정렬을 진행)
SELECT * FROM employees ORDER BY family_name, salary DESC;

 

8) GROUP BY : 데이터를 특정컬럼을 기준으로 묶어서 가져오는 경우 사용 (통계)

  • 조회되는 컬럼들은 묶어주는 기준 컬럼이거나 집계되는 컬럼이어야한다.
 SELECT [컬럼1], [컬럼2]... FROM [테이블이름] GROUP BY [묶어줄 컬럼]
-- employees 테이블에서 부서(depart_no)별로 급여(salary) 합산 요청
SELECT depart_no, sum(salary) FROM employees GROUP BY depart_no;

-- 그룹의 기준이 되는 컬럼과, 집계 컬럼 외에 다른 컬럼이 들어간다면?
-- 나오긴하지만 그 의미를 알 수 없다 -> 각 그룹의 가장 첫값을 보여준다.
-- 다른 DB에서는 이 경우 에러를 발생 시킬수도 있다.
SELECT depart_no, sum(salary),family_name FROM employees GROUP BY depart_no;

-- 부서별 급여 평균 - AVG(column)
SELECT depart_no, TRUNCATE(AVG(salary),0) as sal_avg FROM employees GROUP BY depart_no;

 

8-1) HAVING :GROUP BY에서 WHERE처럼 조건을 주고 싶을 때 사용

 

  • HAVING 은 별칭을 사용하면 안된다. (total 대신 sum(salary) 써야 한다. ) => 마리아에서는 허용 해주지만 몇몇 디비에서는 에러가 발생한다.
-- 급여 합계가 500만원 이상인 부서들을 합계 급여가 높은 순으로 정렬 하세요. 
SELECT depart_no, sum(salary) as total FROM employees GROUP BY depart_no HAVING sum(salary) > 5000000 ORDER BY total DESC;

 

 

🧩 TCL (Transaction Control Language) : 트랜잭션별로 제어하는 명령어

  • data Base 에서 사용되는 쪼갤 수 없는 업무처리의 단위이다.
  • All or Nothing, 하나의 작업 내부의 과정이 잘못되면 전부 취소 되어야 한다.
  • commit 과 rollback은 데이터(DML)에 한정된다.
  • DCL, DDL 은 되돌릴 수 없다.

COMMIT : 트랜잭션의 작업을 저장 / 현재 상태를 저장

COMMIT;
-- 1) AUTO COMMIT 여부
SELECT @@AUTOCOMMIT; -- 1: 설정, 0: 미설정

-- 설정 | 미설정
SET AUTOCOMMIT = 1; -- 오토커밋 설정 ON
SET AUTOCOMMIT = 0; -- 오토커밋 설정 OFF

 

ROLLBACK : 트랜잭션의 작업을 취소, 원상태로 복구 / commit하지 않은 내용에 대해서 되돌릴 수 있다.

ROLLBACK;