DDL, DML, DCL / DML기초
Database
SQL이란 데이터베이스의 언어임. 관계형 데이터베이스에서 데이터를 조작하고 쿼리하는 표준 언어임. 조금 더 쉽게 이야기한다면 사용자가 필요하고 원하는 것을 RDBMS에게 요청(쿼리)을 하는 걸 이야기함.
RDBMS에는 여러 가지 종류가 있다. SQL은 몇 가지 개념만 완벽하게 이해한다면 오라클은 물론이고, 그 어떤 RDBMS에서도 능숙하게 사용할 수 있다.
각각의 RDBMS (oracle, mysql, mariadb, ms-sql, postgresql, greenplum 등등)가 있지만 그중에 하나의 데이터베이스를 골라 SQL을 공부하면 된다. 그렇게 하나만 제대로 배워두면 나머지는 약간씩 다른 문법이나 사용법을 숙지하면 큰 틀 안에서 SQL을 활용하는 데는 무리가 없다.
이렇게 SQL을 잘 활용하게 되면 요즘 흔히 이야기 하는 BIG DATA 시대에 많은 도움이 된다.
ANSI SQL이란?
- 1986년 SQL-86의 명칭으로 ANSI에 의해 최초로 표준화된 SQL문법을 말하며, ANSI 표준으로 작성된 SQL은 모든 데이터베이스에서 호환된다. 기본적인 데이터 조회 구문은 ANSI SQL을 이용해서 작성이 가능하나, 특정 DBMS에서만 제공하는 함수를 사용하는 경우에는 데이터 조회가 불가능하다.
SQL 명령어 종류
안전모드 해제(Workbench에서만) :
SET SQL_SAFE_UPDATES=0;
- DDL - Data Definition Language (데이터 정의 언어)
- DML - Data Manipulation Language (데이터 조작 언어)
- DCL - Data Control Language (데이터 제어 언어)
DDL - 데이터 정의 언어
CREATE
: 데이터베이스내 개체 (테이블, 인덱스 제약조건, 프로시저, 펑션 등)을 생성 할 때DROP
: 데이터베이스내 개체를 삭제할 때ALTER
: 데이터베이스내 개체의 속성 및 정의를 변경할 때RENAME
: 데이터베이스내 개체의 이름을 변경할 때TRUNCATE
: 테이블 내 모든 데이터를 빠르게 삭제할 때
연습
SQL> show databases;
- 결과 : Ctrl + Enter
- 하나의 실행문 끝은 꼭
;
세미콜론.
SQL> create database mydb; <-mydb라는 DB 생성
SQL> use mydb; <- mydb 안으로 들어가기
SQL> create table my_table(
field1 int,
field2 varchar(50),
field3 date not null
);
SQL> show tables;
SQL> describe my_table;
SQL> alter table my_table add field4 int not null;
SQL> describe my_table;
SQL> alter table my_table rename to my_table2;
SQL> show tables;
SQL> describe my_table2;
SQL> truncate table my_table2;
SQL> drop table my_table2;
SQL> show tables;
SQL> drop database mydb;
SQL> show databases;
DML - 조작
INSERT
: 특정 테이블에 데이터를 신규로 삽입할때UPDATE
: 특정 테이블에 데이터의 전체, 또는 일부를 갱신할때DELETE
: 특정 테이블에 데이터의 전체, 또는 일부를 삭제할때SELECT
: 특정 테이블에 데이터의 전체, 또는 일부를 획득할때- ex. 데이터베이스 이름 : My_DB
- ex. 테이블 이름 : My_T1
ID(INT) | NAME(VARCHAR(30)) | ADDR(VARCHAR(30) NOT NULL) //필드(field)=칼럼(column) |
---|---|---|
1(데이터,data) | 홍길동(데이터,data) | 부산(데이터,data) => 행(row) => 레코드(record) |
2 | 서길동 | 광주 |
3 | 남길동 | 서울 |
4 | 북길동 | 인천 |
방법
SQL> create database My_DB;
SQL> use My_DB;
SQL> create table My_T1(ID int, NAME varchar(30), ADDR varchar(30) not null);
SQL> insert into My_T1 values(1,'홍길동','부산');
SQL> insert into My_T1 values(2,'서길동','광주');
SQL> insert into My_T1 values(3,'남길동','서울');
SQL> insert into My_T1 values(4,'북길동','인천');
SQL> select * from My_T1;
SQL> truncate table My_T1;
SQL> select * from My_T1;
SQL> insert into My_T1(NAME,ADDR,ID) values('홍길동','부산',1);
SQL> insert into My_T1(NAME,ADDR,ID) values('서길동','광주',2);
SQL> insert into My_T1(NAME,ADDR,ID) values('남길동','서울',3);
SQL> insert into My_T1(NAME,ADDR,ID) values('북길동','인천',4);
SQL> select * from My_T1;
SQL> delete from My_T1; --에러코드 1175
SQL> SET SQL_SAFE_UPDATES=0; -- rejects UPDATEs and DELETEs with no restrictions)
SQL> delete from My_T1;
SQL> select * from My_T1;
SQL> insert into My_T1(ADDR) values('부산');
SQL> insert into My_T1(ADDR) values('광주');
SQL> insert into My_T1(ADDR) values('서울');
SQL> insert into My_T1(ADDR) values('인천');
SQL> select * from My_T1;
SQL> delete from My_T1;
SQL> select * from My_T1;
SQL> insert into My_T1(ID,NAME) values(1,'홍길동'); -- 에러
- 이유 : ADDR은 not null 이기 때문.
Ex.01
- 데이터베이스 이름 : My_DB2
- 테이블 이름 : My_T2
ID(INT) | NAME(VARCHAR(30)) | ADDR(VARCHAR(30) NOT NULL) |
---|---|---|
1 | 홍길동 | 부산 |
2 | 서길동 | 광주 |
3 | 남길동 | 서울 |
4 | 북길동 | 인천 |
방법
SQL> update My_T2 set NAME='이순신' where ID=1; (또는 where ADDR='부산')
SQL> select * from My_T2;
SQL> update My_T2 set ADDR='대구' where ID=2; (또는 where NAME='서길동')
SQL> select * from My_T2;
DCL
GRAN
T : 데이터베이스 사용자에게 특정 작업의 수행 권한을 부여할 때REVOKE
: 데이터베이스 사용자에게 부여된 수행 권한을 박탈할 때SET TRANSACTION
: 트랜잭션 모드로 설정할 때BEGIN
: 트랜잭션의 시작을 의미COMMIT
: 트랜잭션을 실행할 때ROLLBACK
: 트랜잭션을 취소할 때SAVEPOINT
: 롤백 지점을 설정할 때LOCK
: 테이블 자원을 점유할 때
Ex. SQL 명령어 종류
- 데이터베이스 이름 : DB01
- 테이블 이름 : T1
ID(INT) | NAME(VARCHAR(30)) | ADDR(VARCHAR(30) NOT NULL) | DATE(date) |
---|---|---|---|
1 | 홍길동 | 부산 | 2011-01-01 |
2 | 서길동 | 서울 | 2033-03-03 |
양산 | |||
6 | 진주 |
방법
create database DB01;
use DB01;
create table T1(ID int NULL, NAME varchar(30) NULL, ADDR VARCHAR(30) NOT NUll, DATE date NULL);
insert into T1 values(1,'홍길동','부산','2011-01-01');
insert into T1 values(3,'남길동','서울','2033-03-03');
insert into T1(ADDR) values('양산');
insert into T1(ID,ADDR) values(6,'진주');
select * from T1;
- 부산-> 광주
update T1 set ADDR='광주' where ID=1;
select * from T1;
- 서울 행 삭제
delete FROM T1 where ID=3;
select * from T1;
DML
- Data Manipulation Language
SET SQL_SAFE_UPDATES=; – 안전모드 해제(Workbench에서만)
- 데이터베이스의 테이블의 데이터를 조작할 때 사용한다.
- 데이터를 조작하는 일련의 과정을
트랜잭션
이라고 한다.
1. USE
- 사용할 데이터베이스를 지정할 때 사용하는 명령어
use sqldb;
2. SHOW
show databases; -- 데이터베이스 종류 확인
show tables; -- 현재 선택된 데이터베이스의 모든 테이블명만 확인
show table status; -- 현재 선택된 데이터베이스의 모든 테이블의 자세한 정보확인
desc buytbl;
desc usertbl;
3. SELECT
SELECT * FROM usertbl; --usertbl 테이블의 모든 컬럼에 대한 데이터를 가져온다.
SELECT userID, name FROM usertbl; --특정 컬럼만 지정하여 데이터를 조회할 수 있다.
- 별칭 (AS)
- 해당 컬럼에 별도의 명칭을 추가한다.
- 별칭 (AS)
- 공백이 추가된다면 쌍따옴표로 감싸줘야 한다.
- 기본적으로 쌍따옴표로 감싸도록 권장된다.
- as는 생략이 가능하다.
SELECT userID "유저 아이디" -- 띄어쓰기를 넣고 싶은 경우 ""로 감싸줄 것
, name as 이름
, birthYear 생년 -- as 생략 가능
, addr as 위치
FROM userTBL;
- 조건
SELECT * FROM usertbl WHERE name = "바비킴";
select name, height from usertbl where birthYear >= 1970 and birthYear <= 1980;
또는
select name, height from usertbl where birthYear between 1970 and 1980;
select name, birthYear from usertbl where birthYear like '197%'; --생년이 197로 시작하는
select name, birthYear from usertbl where birthYear like '%96%'; --생년이 중간에 96이 들어가는
- 정렬
select name, birthYear from usertbl order by birthYear; -- asc 생략가능 (오름차순:default)
select name, birthYear from usertbl order by birthYear desc; (내림차순)
- 중복 제거
select mobile1 from usertbl;
select distinct mobile1 from usertbl;
- 출력 개수 제한
select * from usertbl limit 5; -- 5개까지만 가져오기
4. INSERT
insert into usertbl (userID, name, birthYear, addr, mobile1, mobile2, height, mDate)
values ('YJD', '윤정도', 1995, '부산', 010, 95162427, 182, '1995-07-04');
select * from usertbl;
# AUTO_INCREMENT
- 자동으로 1씩 올라가는 컬럼의 경우 NULL을 넣어주면 알아서 값을 넣어준다.
create table test (
testno int primary key auto_increment,
name varchar(50) not null
);
insert into test values (null, '윤정도');
insert into test values (null, '윤정도1');
insert into test values (null, '윤정도2');
insert into test values (null, '윤정도3');
select * from test;
- 대량의 데이터 삽입
- 컬럼 형식만 맞추면 자신의 테이블이나 다른 테이블의 데이터를 삽입할 수 있다.
- 대량의 데이터 삽입
insert into test select null, name from test;
select * from test;
5. UPDATE
- 데이터를 수정한다.
UPDATE usertbl SET
name = '윤정도킹',
birthYear = 19950,
mobile1 = 522
WHERE name = '윤종신';
select * from usertbl;
6. DELETE
- 데이터를 삭제한다.
delete from test;
select * from test;