Structured Query Language의 줄임말로써, 번역하면 구조적인 Query언어를 의미
SQL은 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다.
관계형 데이터베이스 관리 시스템에서 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리를 위해 고안되었다.
많은 수의 데이터베이스 관련 프로그램들이 SQL을 표준으로 채택하고 있다.
SQL → Syntax Check → Semantic Check → Library Cache Check → Optimization → Raw Source Generation → Execution
직역하면 "질의문" 이라는 뜻
조금더 풀어 쓰자면 저장되어져 있는 정보를 필터하기 위한 질문
명령어 | 내용 |
---|---|
CREATE | 테이블을 생성하는 역할 |
ALTER | 테이블의 구조를 수정하는 역할 |
DROP | 테이블을 삭제하는 역할 |
RENAME | 테이블을 이름을 변경하는 역할 |
TRUNCATE | 테이블을 초기화하는 역할 |
CREATE 규칙
ALTER: 컬럼 변경 문법
명령어 | 내용 |
---|---|
ADD COLUMN | 컬럼을 추가하는 역할 |
DROP COLUMN | 컬럼을 삭제하는 역할 |
MODIFY COLUMN | 컬럼을 수정하는 역할 |
RENAME COLUMN | 컬럼 이름을 변경하는 역할 |
DROP CONSTRAIN | 컬럼을 제약조건을 기반해서 삭제하는 역할 |
명령어 | 내용 |
---|---|
SELECT | 데이터베이스에서 데이터를 검색하는 역할 |
INSERT | 테이블에 데이터를 추가하는 역할 |
UPDATE | 테이블 내에 존재하는 데이터를 수정하는 역할 |
DELETE | 테이블에서 데이터를 삭제하는 역할 |
명령어 | 내용 |
---|---|
GRANT | 권한을 정의할때 사용하는 명령어 |
REVOKE | 권한을 삭제할때 사용하는 명령어 |
트랜잭션의 필요성: 은행 업무를 볼 때, A계좌에서 B계좌로 100만원을 옮기려는데 A계좌에서 돈이 나간 순간 데이터베이스에 오류가나서 B에도 돈이 안들어 오고 A의 계좌 잔액도 0이 되어 버리면 정말 심각한 문제가 발생할 수 있다.
이러한 데이터 유실이라는 무시무시한 상황이 일어나는 것을 막으려면 두 가지 방법을 생각해볼 수 있다.
1 어떤 상황에서든 두 UPDATE문을 모두 완전히 실행하는 것
2 완전히 실행하는 것이 불가능 하다면, 두 UPDATE문을 실행하기 전의 상태,
즉 아무 UPDATE문도 실행하지 않는 상태를 유지할 수 있어야 한다.
게시판을 예로 들어보자. 1) 게시판 사용자는 게시글을 작성하고, 올리기 버튼을 누른다. 2) 그러면 글 올리기가 처리되고 자동으로 다시 게시판에 돌아오게 된다. 3) 게시판에서 자신의 글이 포함된 업데이트된 게시글들을 볼 수 있다.이러한 상황을 데이터베이스 작업으로 옮기면, 사용자가 올리기 버튼을 눌렀을 시, Insert 문을 사용하여 사용자가 입력한 게시글의 데이터를 넣는다.그 후에, 게시판을 구성할 데이터를 다시 Select 하여 최신 정보로 유지한다. 여기서 작업의 단위는 insert문과 select문 둘다 를 합친것이다. 이러한 작업단위를 하나의 트랜잭션이라 한다.
트랜잭션이 시작되면, 해당 트랜잭션의 상태는 활동(Active)상태가 된다. 해당 상태는 설계자가 설계한 대로 연산들이 정상적으로 실행중인 상태를 의미한다.
작업 성공시
2-1. 부분 완료(Partially Committed) : 트랜잭션의 마지막까지 실행되었지만, Commit 연산이 실행되기 직전의 상태
2-2. 완료(Committed) : 트랜잭션이 성공이 종료되어 Commit 연산을 실행한 후의 상태
설계된 트랜잭션대로 명령을 성공적으로 수행하면 그 다음 상태는 부분적 완료(Partially Committed)상태가 된다. 설계된 작업대로 작업이 성공하였다고 하여 무조건 반영하는 것이 아니라, 설계자의 최종 승인(Commit)이 있을 때 까지 실제 데이터베이스에 작업 내용을 반영하지 않고 기다리고 있는 상태이다.설계자가 작업 결과에 대하여 반영을 승인(Commit)한다면 트랜잭션이 성공적으로 종료된다(Committed)
작업 실패시
2-1. 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태.
2-2. 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태.
트랜잭션을 수행하는 중간에 모종의 원인으로 인하여 오류가 발생하여 실행이 중단된 상태를 실패(Failed)상태라고 한다.이때 트랜잭션이 비정상적으로 종료되었으니, 설계되어있는 트랜잭션 내부의 작업을 다시 수행 이전의 상태로 돌리는 (ROLLBACK) 연산을 수행하면 그 상태를 철회(Aborted)라고 한다.
명령어 | 내용 |
---|---|
COMMIT | 모든 작업을 정상적으로 처리하겠다는 명령어 |
ROLLBACK | 모든 작업을 다시 돌려 놓겠다는 명령어 |
SAVEPOINT | Commit 전에 특정 시점까지만 반영하거나 Rollback하겠다는 명령어 |
CREATE DATABASE [데이터베이스 명]
DROP DATABASE [데이터베이스 명]
SHOW DATABASES;
alter user sys identified by 1234; -- sys 계정의 암호를 1234로 변경
create user [계정명] identified by [비밀번호];
create user test identified by 1234;
grant [권한1], [권한2] ... to [계정명];
grant connect, resource, dba to test;
REVOKE [권한1], [권한2..] USER FROM [유저명];
REVOKE [오브젝트권한] ON [유저명].[테이블명] FROM [권한을부여할유저명];
명령어 | 설명 |
---|---|
RESOURCE | 개체 생성, 변경, 제거 권한 |
CONNECT | DB 연결 권한 |
DBA | DB 관리자 권한 |
GRANT CREATE SESSION TO [사용자명]
GRANT CREATE SESSION TO scott;
사용자를 생성 후 세션 권한이 부여되어야 데이터베이스 접속이 가능하다.
세션 권한이 부여되지 않은 상태에서 데이터베이스 접속을 하면 아래와 같은 오류가 발생한다.
ORA-01045: 사용자 SCOTT는 CREATE SESSION 권한을 가지고있지 않음; 로그온이 거절되었습니다
GRANT CREATE TABLE TO scott;
테이블 생성 권한이 부여되면 자신의 스키마(scott)에 테이블 생성 및 삭제가 가능하다.
GRANT CREATE ANY TABLE TO scott;
GRANT DROP ANY TABLE TO scott;
CREATE ANY TABLE 권한을 부여하면 다른 사용자의 스키마에 테이블을 생성할 수 있다. 예를 들어 hr이라는 스키마에 테이블을 생성할 수 있으며, DROP ANY TABLE 권한이 부여되어야 다른 스키마에 생성한 테이블을 삭제할 수 있다.
GRANT UNLIMITED TABLESPACE TO scott;
UNLIMITED TABLESPACE 권한은 모든 테이블스페이스를 제한 없이 사용할 수 있는 권한이다. 일반 사용자가 모든 테이블스페이스를 제한 없이 사용하는 것은 운영 측면에서 좋지 않기 때문에 아래와 같이 사용할 것을 권장한다.
ALTER USER scott QUOTA 10M ON tblspace1;
ALTER USER [사용자명] QUOTA [제한용량] ON [테이블스페이스명]
해당 사용자에 지정된 테이블스페이스에 제한용량 및 권한을 부여할 수 있다.
GRANT CREATE ANY INDEX TO scott;
GRANT DROP ANY INDEX TO scott;
CREATE ANY INDEX, DROP ANY INDEX 권한을 부여하면 인덱스 생성 및 제거를 할 수 있다.
REVOKE CREATE SESSION FROM scott;
REVOKE CREATE TABLE FROM scott;
REVOKE DROP ANY TABLE FROM scott;
REVOKE CREATE ANY TABLE FROM scott;
REVOKE UNLIMITED TABLESPACE FROM scott;
REVOKE CREATE ANY INDEX FROM scott;
REVOKE DROP ANY INDEX FROM scott;
REVOKE [권한 구분] FROM [사용자명]
REVOKE 문을 사용하여 부여된 권한을 회수(제거) 할 수 있다.
SHOW TABLES;
DESC [테이블명];
create table member (
name varchar2(10),
userid varchar2(10),
pwd varchar2(10)
);
select * from [테이블명];
DROP DATABASE
alter table 테이블명 add 추가필드명 데이터타입;
alter table 테이블명 drop column 삭제필드명; (데이터 타입 안써도 된다)
ALTER TABLE 테이블명 RENAME COLUMN 컬럼명 TO 변경컬럼명;
ALTER TABLE 테이블명 MODIFY (컬럼명 변경데이터 타입 OR 제약조건);
ALTER TABLE test MODIFY (job VARCHAR(30));
ALTER TABLE EMP MODIFY (NUMBER DEFAULT 0);
ALTER TABLE EMP MODIFY (ENAME CONSTRAINTS EMP_ENAME_NN NOT NULL);
단, NOT NULL을 제외한 제약조건은 수정 불가하므로 삭제 후 재생성
SELECT 컬럼명 FROM 테이블명
SELECT 컬럼명 FROM 테이블명 WHERE 조건
SELECT * FROM 테이블명 WHERE height between 160 and 165;
SELECT * FROM 테이블명
WHERE addr IN('경기', '전남', '경남');
SELECT * FROM 테이블명
WHERE addr = '경기' AND addr = '전남' AND addr = '경남';
-- mem_name 컬럼 값이 '블'로 시작하는 4글자 글자 데이터 조회
SELECT * FROM 테이블명 WHERE mem_name LIKE '블___';
-- mem_name 컬럼 값이 '블'로 시작하는 모든 데이터 조회
SELECT * FROM 테이블명 WHERE mem_name LIKE '블%';
-- mem_name 컬럼 값에 '블'이 들어가는 모든 데이터 조회
SELECT * FROM 테이블명 WHERE mem_name LIKE '%블%';
_ : 한 글자만 매치
% : 몇 글자든 매치
SELECT 컬럼명 FROM 테이블명 WHERE 조건 ORDER BY 컬럼명 ASC or DESC
SELECT 컬러명 FROM 테이블명 WHERE 조건 ORDER BY 컬럼명 ASC or DESC LIMIT 개수
SELECT DISTINCT addr FROM 테이블명;
SELECT [컬럼명], ....
FROM 테이블명
GROUP BY [그룹할 컬럼명];
-- member 테이블의 모든 데이터 개수를 셈
SELECT COUNT(*)
FROM member;
-- member 테이블의 phone1 컬럼이 NULL인 것을 제외한 모든 데이터 개수를 셈
SELECT COUNT(phone1)
FROM member;
SELECT 컬럼명
FROM 테이블명
GROUP BY 그룹할 컬럼명
HAVING 그룹할 컬럼에 대한 조건;
데이터를 삽입하는 쿼리문
INSERT INTO 테이블명 (칼럼명1, 칼럼명2, 칼럼명3) VALUES (값1, 값2, 값3)
INSERT INTO 테이블명 VALUES (값1, 값2, 값3)
데이터를 수정하는 쿼리문
UPDATE 테이블명 SET 칼럼명 = 변경할 값
UPDATE 테이블명 SET 칼럼명 = 변경할 값 WHERE 조건
UPDATE 테이블명 SET 칼럼명1 = 변경할 값1, 칼럼명2 = 변경할 값2 WHERE 조건
테이블에 데이터를 삭제하는 쿼리문
DELETE FROM 테이블명
DELETE FROM 테이블명 WHERE 조건
참고
https://velog.io/@alicesykim95/DB-DDL-DML-DCL-TCL%EC%9D%B4%EB%9E%80
https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98Transaction-%EC%9D%B4%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC
https://gent.tistory.com/534
https://jy-beak.tistory.com/15