CREATE SCHEMA 스키마명 AUTHORIZATION 사용자_id
CREATE SCHEMA college AUTHORIZATION Minseol;
CREATE DOMAIN 도메인명 [AS] 데이터_타입
[DEFAULT 기본값]
[CONSTRAINT 제약조건명 CHECK (범위값)];
CREATE DOMAIN SEX CHAR(1)
DEFAULT '남'
CONSTRAINT VALID-SEX CHECK(VALUE IN ('남', '여');
테이블을 정으하는 명령문
표기 형식
CREATE TABLE 테이블명
(속성명 데이터_타입 [DEFAULT 기본값][NOT NULL], ...
[, PRIMARY KEY(기본키_속성명, ...)]
[, UNIQUE(대체키_속성명, ...)],
[. FOREIGN KEY(외래키_속성명, ...)]
REFERENCES 참조테이블(기본키_속성명, ...)]
[ON DELETE 옵션]
[ON UPDATE 옵션]
[, CONSTRAINT 제약조건명][CHECK (조건식)]);
CREATE TABLE student
(name VARCHAR(15) NOT NULL,
s_num CHAR(6),
major CHAR(5),
sex SEX,
birth DATE,
PRIMARY KEY(s_num),
FOREIGN KEY(major) REFERENCES department(dCode)
ON DELETE SET NULL
ON UPDATE CASCADE,
CONSTRAINT BIRTH-REGULATION
CHECK(birth >= '1980-01-01'));
CREATE VIEW 뷰명[(속성명[, 속성명, ...])]
AS SELECT문;
CREATE VIEW ansan_customer(name, phone)
AS SELECT name, phone
FROM customer
WHERE address = '안산시';
인덱스를 정의하는 명령문
표기 형식
CREATE [UNIQUE] INDEX 인덱스명
ON 테이블명(속성명 [ASC | DESC] [, 속성명 [ASC | DESC]])
[CLUSTER];
CREATE UNIQUE INDEX c_no_idx
ON customer(c_no DESC);
ALTER TABLE 테이블명 ADD 속성명 데이터_타입 [DEFAULT '기본값'];
ALTER TABLE 테이브명 ALTER 속성명 [SET DEFAULT '기본값'];
ALTER TABLE 테이블명 DROP COLUMN 속성명 [CASCADE];
ALTER TABLE student ADD grade VARCHAR(3);
ALTER TABLE student ALTER s_num VARCHAR(10) NOT NULL;
스키마, 도메인, 기본 테이블, 뷰 테이블, 인덱스, 제약 조건 등을 제거하는 명령문
표기 형식
DROP SCHEMA 스키마명 [CASCADE | RESTRICT];
DROP DOMAIN 도메인명 [CASCADE | RESTRICT];
DROP TABLE 테이블명 [CASCADE | RESTRICT];
DROP VIEW 뷰명 [CASCADE | RESTRICT];
DROP INDEX 인덱스명 [CASCADE | RESTRICT];
DROP CONSTRINT 제약조건명;
DROP TABLE student CASCADE;
GRANT 사용자등급 TO 사용자_ID_리스트 [IDENTIFIED BY 암호];
REVOKE 사용자등급 FROM 사용자_ID_리스트;
GRANT RESOURCE TO NABI; // 사용자등급은 DBA, RESOURCE, CONNECT로 나뉨
GRANT 권한_리스트 ON 개체 TO 사용자 [WITH GRANT OPTION];
REVOKE [GRANT OPTION FOR] 권한_리스트 ON 개체 FROM 사용자 [CASCADE];
GRANT ALL ON 고객 TO NABI WITH GRANT OPTION;
REVOKE GRANT OPTION FOR UPDATE ON 고객 FROM STAR;
INSERT INTO 테이블명([속성명1, 속성명2, ...])
VALUES (데이터1, 데이터2, ...);
INSERT INTO 사원(이름, 부서) VALUES ('홍승현', '인터넷');
INSERT INTO 편집부원(이름, 생일, 주소, 기본급)
SELECT 이름, 생일, 주소, 기본급
FROM 사원
WHERE 부서 = '편집';
DELETE
FROM 테이블명
[WHERE 조건];
UPDATE 테이블명
SET 속성명 = 데이터[, 속성명=데이터, ...]
[WHERE 조건];
SELECT [PREDICATE] [테이블명.]속성명 [AS 별칭], ...
[, 그룹함수(속성명) [AS 별칭]]
[, Window함수 OVER (PARTITION BY 속성명1, 속성명2, ...
ORDER BY 속성명3, 속성명4, ...)]
FROM 테이블명, ...
[WHERE 조건]
[GROUP BY 속성명 [ASC | DESC]];
COUNT(속성명)
SUM(속성명)
AVG(속성명)
MAX(속성명)
MIN(속성명)
STDDEV(속성명)
VARIANCE(속성명)
ROLLUP(속성명, 속성명, ...)
CUBE(속성명, 속성명, ...)
SELECT 상여내역, 상여금
ROW_NUMBER() OVER (PARTITION BY 상여내역 ORDER BY 상여금 DESC) AS NO
FROM 상여금;
SELECT 상여내역, 상여금
RANK() OVER (PARTITION BY 상여내역 ORDER BY 상여금 DESC) AS 상여금순위
FROM 상여금;
SELECT 부서, AVG(상여금) AS 평균
FROM 상여금
GROUP BY 부서;
SELECT 부서, COUNT(*) AS 사원수
FROM 상여금
WHERE 상여금 >= 100
GROUP BY 부서
HAVING COUNT(*) >= 2;
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1, 테이블명2, ...
WHERE 테이블명1.속성명 = 테이블명2.속성명;
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1 NATURAL JOIN 테이블명2;
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1 JOIN 테이블명2 USING(속성명);
JOIN 조건에 '=' 조건이 아닌 나머지 비교 연산자, 즉 >, <, <>, >=, <=- 연산자를 사용하는 JOIN 방법이다.
표기 형식
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1, 테이블명2, ...
WHERE (NON-EQUI JOIN 조건);
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1 LEFT OUTER JOIN 테이블명2
ON 테이블명1.속성명 = 테이블명2.속성명;
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1, 테이블명2
WHERE 테이블명1.속성명 = 테이블명2.속성명(+);
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1 RIGHT OUTER JOIN 테이블명2
ON 테이블명1.속성명 = 테이블명2.속성명;
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1, 테이블명2
WHERE 테이블명1.속성명(+) = 테이블명2.속성명;
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1 FULL OUTER JOIN 테이블명2
ON 테이블명1.속성명 = 테이블명2.속성명;
DECLARE
BEGIN
CONTROL
SQL
EXCEPTION
TRANSACTION
END
CREATE PROCEDURE 명령어를 사용
표기 형식
CREATE [OR REPLACE] PROCEDURE 프로시저명(파라미터)
[지역변수 선언]
BEGIN
프로시저 BODY;
END;
- 예시
```sql
CREATE OR REPLACE PROCEDURE emp_change_s(i_사원번호 IN INT)
IS
BEGIN
UPDATE 급여 SET 지급방식 = 'S' WHERE 사원번호 = i_사원번호;
EXCEPTION
WHEN PROGRAM_ERROR THEN
ROLLBACK;
COMMIT;
END;
EXECUTE 프로시저명;
EXEC 프로시저명;
CALL 프로시저명;
DROP PROCEDURE 프로시저명;
DECLARE
EVENT
BEGIN
CONTROL
SQL
EXCEPTION
END
CREATE [OR REPLACE] TRIGGER 트리거명 [동작시기 옵션][동작 옵션] ON 테이블명
REFERENCING [NEW | OLD] AS 테이블명
FOR EACH ROW
[WHEN 조건식]
BEGIN
트리거 BODY;
END;
CREATE TRIGGER 학년정보_tri BEFORE INSERT ON 학생
REFERENCING NEW AS new_table
FOR EACH ROW
WHEN (new_table.학년 IS NULL)
BEGIN
:new_table.학년 := '신입생';
END;
DROP TRIGGER 트리거명;
DECLARE
BEGIN
CONTROL
SQL
EXCEPTION
RETURN
END
CREATE [OR REPLACE] FUNCTION 사용자 정의 함수명(파라미터)
[지역변수 선언]
BEGIN
사용자 정의 함수 BODY;
RETURN 반환값;
END;
CREATE FUNCTION Get_S_성별(i_성별코드 IN INT)
RETURN VARCHAR2
IS
BEGIN
IF i_성별코드 = 1 THEN
RETURN '남자';
ELSE
RETURN '여자';
END IF;
END;
SELECT 사용자 정의 함수명 FROM 테이블명;
INSERT INTO 테이블명(속성명) VALUES (사용자 정의 함수명);
DELETE FROM 테이블명 WHERE 속성명 = 사용자 정의 함수명;
UPDATE 테이블명 SET 속성명 = 사용자 정의 함수명;
DROP FUNCTION 사용자 정의 함수명;
IF 조건 THEN
실행할 문장1;
ELSE
실행할 문장2;
END IF;
DECLARE
x INT := 10;
BEGIN
IF x > 10 THEN
DBMS_OUTPUT.PUT_LINE('true');
ELSE
DBMS_OUTPUT.PUT_LINE('false');
END IF;
END;
LOOP
실행할 문장;
EXIT WHEN 조건:
END LOOP;
DECLARE
i INT := 0;
i_sum INT := 0;
BEGIN
LOOP
i := i + 1;
i_sum := i_sum + i;
EXIT WHEN i >= 10;
END LOOP;
END;
CURSOR 커서명(매개변수1, 매개변수2, ... )
IS
SELECT문;
OPEN 커서명(매개변수1, 매개변수2, ...);
FETCH 커서명 INTO 변수1, 변수2 ...;
CLOSE 커서명;
DECLARE
p_name employee.name%TYPE;
CURSOR cur_name(ff INT)
IS
SELECT name FROM employee WHERE id >= ff;
BEGIN
OPEN cur_name(20);
LOOP
FETCH cur_name INTO p_name;
EXIT WHEN cur_name%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(p_name);
END LOOP;
CLOSE cur_name;
END;
DDL, DML, DCL이 포함되어 있는 SQL과 TCL을 테스트하는 것
DDL로 작성된 개체는 DESCRIBE 명령어를 이용하여 속성, 자료형, 옵션들을 확인할 수 있다.
DESC [개체명]
디버깅을 통해 기능의 적합성 여부를 검증하고, 실행을 통해 결과를 확인하는 테스트를 수행
SHOW 명령어를 통해 오류 내용을 확인하고 문제를 수정
형식: SHOW ERRORS;
ORM을 구현하기 위한 여러 기능들을 제공하는 소프트웨어
Java: JPA, Hibernate, EclipseLink, DataNucleus, Ebean
C++: ODB, QxOrm
Python: Django, SQLAlchemy, Storm
.NET: NHibernate, DatabaseObjects, Dapper
PHP: Doctrine, Propel, RedBean