DDL
데이터베이스를 정의하는 언어로 데이터를 생성하거나 수정, 삭제 등 전체 골격을 결정하는 언어
CREATE
데이터베이스, 테이블 등을 생성하는 역할
ALTER
테이블을 수정하는 역할
DROP
데이터베이스, 테이블을 삭제하는 역할
TRUNCATE
테이블을 초기화 시키는 역할
DML
정의된 데이터베이스에 입력된 레코드를 조회, 수정, 삭제 하는 언어
⇒ 테이블에 있는 행과 열을 조작하는 언어
데이터베이스 사용자가 SQL을 통하여 저장된 데이터를 처리하는데 사용하는 언어
1.SELECT
데이터를 조회하는 역할
2.UPDATE
데이터를 삽입하는 역할
3.DELETE
데이터를 삭제하는 역할
DCL ( DATA CONTROL LANGUAGE )
데이터베이스에 접근 하거나 객체에 권한을 주는 언어
⇒데이터를 제어하는 언어
GRANT
특정 데이터베이스 사용자에게 작업에 대한 권한을 부여
REVOKE
특정 데이터베이스 사용자에게 작업에 대한 권한 박탈, 회수
TCL ( TRANSACTION CONTROL LANGUAGE )
트랜잭션을 제어하는 언어
COMMIT
트랜잭션 처리가 정상적으로 종료되어 트랜잭션이 수행한 변경 내용을 데이터베이스에 반영하는 연산
ROLLBACK
트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관선이 깨졌을떄, 트랜잭션이 행한 모든 변경 작업을 취소하고 이전 상태로 돌리는 연산
자원, 잠금(LOCK)을 모두 반환한다.
SAVEPOINT
SAVEPOINT는 현재의 트랜잭션을 작게 분할하는 명령어 입니다.
저장된 SAVEPOINT는 ROLLBACK TO SAVEPOINT문을 사용하여 지정한 곳까지 ROLLBACK 할 수 있습니다.
여러개의 SQL문을 수반하는 트랜잭션의 경우, 사용자가 트랜잭션 중간 단계에서 SAVEPOINT를 지정할 수 있습니다.
SAVEPOINT 유의사항
SAVEPOINT 후 COMMIT연산을 하게 된다면, COMMIT 연산 이전에 만든 SAVEPOINT들은 모두 사라지게 됩니다.
SAVEPOINT는 여러개 생성할 수 있습니다.
PK(Primary Key)와 FK(Foreign Key)는
테이블의 필수 요소로써 모든 테이블은 이들 둘 중 하나 이상을 반드시 포함하고 있다.
PK( PRIMARY KEY )
CREATE TABLE 테이블(
CONSTRAINT 제약조건이름 PRIMARY KEY (컬럼)
);
CREATE TABLE 테이블(
컬럼 데이터타입 CONSTRAINT 제약조건이름 PRIMARY KEY,
FK ( FOREIGN KEY )
CREATE TABLE 테이블(
CONSTRAINT 제약조건이름 FOREIGN KEY (컬럼)
REFERENCES 참조할테이블 (참조할컬럼)
[ON DELETE CASCADE | ON DELETE SET NULL]
);
CREATE TABLE 테이블(
컬럼 데이터타입 CONSTRAINT 제약조건이름 FOREIGN KEY
REFERENCES 참조할테이블 (참조할컬럼)
[ON DELETE CASCADE | ON DELETE SET NULL]
IN
연산자는 조건의 범위를 지정하는 데 사용된다. 값은 콤마(,)로 구분하여 괄호 내에 묶으며, 이 값 중에서 하나 이상과 일치하면 조건에 맞는 것으로 평가된다.
NOT 연산자의 사용
IS NULL
날짜 + 숫자 N → 해당 날짜에 N일자를 더한 날짜
날짜 - 숫자 N → 해당 날짜에 N일자를 뺸 날짜
날짜 + N/24 → 해당 날짜에 N시간을 더한 날짜
날짜 - 날짜 → 두 날짜 간의 차이 (일수)
TO_CHAR : 날짜나 숫자를 문자형으로 변환
→TO_CHAR(날짜, 출력형식) , TO_CHAR(숫자, 출력형식)
TO_DATE : 데이터를 날짜형으로 변환
→ TO_DATE (문자, 변환형식)
TO_ NUMBER : 데이터를 숫자로 해석MBER : 데이터를 숫자로 해석
IF
함수와 IS NULL
조건으로도 가능하다.해당 Column 값을 조건식을 통해 True, False를 판단하여 조건에 맞게 Column값을 변환할 때 사용하는 함수이다.
CASE
WHEN 조건식1 THEN 식1
WHEN 조건식2 THEN 식2
...
ELSE 조건에 맞는경우가 없는 경우 실행할 식
END
COALESCE
는 지정한 표현식들 중에 NULL이 아닌 첫 번째 값을 반환한다.모든 DBMS에서 사용가능
표현식은 여러 항목 지정이 가능하고, 처음으로 만나는 NULL이 아닌 값을 출력한다.표현식이 모두 NULL일 경우엔 결과도 NULL 반환
LIMIT A,B → A번 인덱스 쿼리부터 B개만큼 출력하겠다는 의미
EX) LIMIT 3,3 : 3번 인덱스 컬럼부터 3개만 SELECT 한다.
ROLLUP 함수는 소그룹 간의 소계를 계산한다.
ROLLUP은 GROUP BY의 확장 형태로 사용하기 쉬운데, GROUP BY에 있는 항목들을 오른쪽에서 왼쪽순으로 그룹으로 묶어 집계를 낸다.
GROUP BY a, b, c, d 로 묶은 뒤 ROLLUP 을 적용시켜 주면
⇒ (a, b, c, d) / (a, b, c) / (a, b) / (a) / () 이런식으로 그룹을 만들어가며 집계를 낸다
SELECT store, item, SUM(cnt) AS all_cnt, SUM(cost) AS all_cost
FROM sql_test_a
GROUP BY store, item WITH ROLLUP
SELECT store, item, SUM(cnt) AS all_cnt, SUM(cost) AS all_cost
FROM sql_test_a
GROUP BY ROLLUP (store, item)
JOIN을 이용한 조인 방법
SELECT USER_ID
FROM USER_ID AS 'U' JOIN DEPT_ID AS 'D'
ON U.USER_ID = D.USER_ID
WHERE을 이용한 조인 방법
SELECT USER_ID
FROM USER_ID AS 'U' , DEPT_ID AS 'D'
WHERE U.USER_ID= D.USER_ID
creat table, insert, delete , update,
select , from, where , having 에서 모두 가능하다select , from, where , having 에서 모두 가능하다
서브쿼리란 다른 쿼리 내부에 포함되어 있는 SELETE 문을 의미한다.
서브쿼리를 포함하고 있는 쿼리를 외부 쿼리(outer query) 또는 메인 쿼리라고 부르며 서브쿼리는 내부 쿼리(inner query)라고도 부른다.
서브쿼리는 비교 연산자 오른쪽에 존재 해야한다.
종류
중첩 서브 쿼리 → where 문제 작성하는 서브쿼리
인라인 뷰 → from 문에 작성하는 서브쿼리, 동적으로 생성된 테이블로 사용가능 , 저장 x
스칼라 서브쿼리 → select문제 작성하는 서브쿼리
주의사항
서브쿼리는 반드시 ()로 감싸야한다.
서브 쿼리는 단일 행 또는 다중 행 비교 연산자와 함께 사용된다.
서브쿼리에는 order by를 사용하지 못한다.
→서브쿼리와 조인이 가능한데 어떤것이 더 권장 사항인가 ? → case by case (보통 조인이 빠르다)
인라인 뷰-Top N
모든 사원의 사번, 이름 급여를 출력
사원 정보를 급여순으로 정렬
한 페이지당 5명이 출력
현제페이지가 3페이지라고 가정 → 급여 순 11등~15등가지 출력
인라인 뷰 -LImt 활용(MySQL)
스칼라 서브쿼리
select 절에 있는 서브쿼리
한 개의 행만 반환
TCL ( TRANSACTION CONTROL LANGUAGE )
트랜잭션을 제어하는 언어
COMMIT
트랜잭션 처리가 정상적으로 종료되어 트랜잭션이 수행한 변경 내용을 데이터베이스에 반영하는 연산
ROLLBACK
트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관선이 깨졌을떄, 트랜잭션이 행한 모든 변경 작업을 취소하고 이전 상태로 돌리는 연산
자원, 잠금(LOCK)을 모두 반환한다.
SAVEPOINT
SAVEPOINT는 현재의 트랜잭션을 작게 분할하는 명령어 입니다.
저장된 SAVEPOINT는 ROLLBACK TO SAVEPOINT문을 사용하여 지정한 곳까지 ROLLBACK 할 수 있습니다.
여러개의 SQL문을 수반하는 트랜잭션의 경우, 사용자가 트랜잭션 중간 단계에서 SAVEPOINT를 지정할 수 있습니다.
SAVEPOINT 유의사항
SAVEPOINT 후 COMMIT연산을 하게 된다면, COMMIT 연산 이전에 만든 SAVEPOINT들은 모두 사라지게 됩니다.
SAVEPOINT는 여러개 생성할 수 있습니다.
⇒ 워크벤치를 껏다가 키면 뷰를 다시 만드는 쿼리가 실행되고 검색하는 sql 실행
⇒ 뷰를 access 하게 되면 간접적으로 테이블을 access하게 됨
⇒ 선택된 컬럼 정보만 참고 가능
Create [or replace] view 뷰 이름
as sub-query
예시
Create view v_emp
As
Select empid,ename, sal
from emp
where deptid=20;
인덱스는 WHERE 절에서 효과가 있다
인덱스는 테이블의 동작 속도를 높여주는 자료 구조입니다.
인덱스로 데이터의 위치를 빠르게 찾아주는 역할을 합니다.
테이블 컬럼의 빠른 검색을 위해 사용하는 독립된 객체
⇒ 카디널리티가 높을 수록 인덱스 설정에 좋은 컬럼입니다.
= 한 컬럼이 갖고 있는 값의 중복 정도가 낮을 수록 좋습니다.
PK의 경우 이미 index가 생성 되어 있다.
수동 index
create index 구문으로 인덱스 생성ndex 구문으로 인덱스 생성
자동 index → PK, unique → 자동생성
ERD는 개념 데이터 모델링 단계에서 작성하는 다이어그램
→ 개체(Entity), 속성(Attribute) , 관계(Relationship)로 구성된 ER Diagram으로 표현
실체(Entity) : 관리하고자 하는 정보의 실체
둥근 사각형으로 작성
Entity 이름은 단수형이고 유일하며 대문자로 크게 표기 할 것. ( )안에 동의어 표기 가능.
모든 Entity는 하나 이상의 식별자 (UID : Unique Identifier)을 가져야한다.
UID가 없다면 Entity가 아님
속성(Attribute) : Entity를 구성하고 있는 구성 요소
Attribute 이름은 소문자로 작게 표기할 것.
Entity 이름과 Attribute 이름이 같으면 안됨.
"#" 은 UID. "*"는 필수(Mandatory). "o"는 선택(Optional) Attribute를 의미
자신의 Attribute가 아니면서 Relation을 위해 자신의 Attribute로 표시해서는 안된다.
관계(Relationship) : Entity간의 관계
두 Entity 사이에 선을 긋고 관계 명칭을 기록한다.
선택 사항을 표시한다.
점선은 선택 (may be) 을 의미 (부서입장에서는 사원을 배치받을 수도 있고, 안받을 수도 있기 때문에)
실선은 필수 (must be) 를 의미 (사원입장에서는 반드시 부서에 배치되어야 하기 때문)
관계 형태를 표시한다.
새 발 모양은 하나 이상 (one or more) 을 의미 (사원 여러명이 한 부서에 속할 수 있기때문)
단 선은 단 하나 (one and only one) 를 의미 (한명의 사원은 한 부서에만 소속될 수 있다.)
함수적 종속성
애트리뷰트 데이터들의 의미와 애트리뷰트들 간의 상호 관계로부터 유도되는 제약조건의 일종.
X 와 Y 를 임의의 애트리뷰트 집합이라고 할 때, X 의 값이 Y 의 값을 유일하게(unique) 결정한다면 "X는 Y 를 함수적으로 결정한다."라고 한다.
정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다.
Table 의 개수= DTO의 개수
database에 있는 정보를 사용 할 수 있도록 지원하는 언어
모든 DBMS에서 사용 가능
대소문자 구별 X → 단, 데이터의 대소문자는 구분
안에 %가 들어 있으면 \%로 확인
CASE
CASE exp1 WHEN exp2 THEN exp3 (if문)
ABS(숫자) → 절대값
CEILING(숫자) → 값보다 큰 정수 중 가장 작은수 ( 올림 )
FLOOR(숫자) → 값보다 작은 정수중 가장 큰 수 ( 버림 )
ROUND(숫자) → 반 올림
TRUNCATE(숫자) → 숫자를 기준으로 버림
POW , POWER(X,Y) → X의 Y승
MOD(분자 , 분모) → 분자를 분모로 나눈 나머지
GREATEST → max
LEAST → min
문자관련 함수
CONCAT(문자열1, 문자열2,문자열3) → 문자열들을 결합
INSERT(문자열,시작위치 길이 , 새로운 문자열 → 시작위치부터 길이만큼 새로운 문자열로 대치
REPLACE (문자열, 기존문자열 , 바뀔문자열) → 문자열 중 기존 문자열을 바뀔 문자열로 변경
INSTR( 문자열, 찾는 문자열 ) → 문자열 중 찾는 문자열의 위치 값을 리턴
MID('문자열, 시작 위치, 개수 ) → 문자열 중 시작위치부터 개수만큼 리턴)
SUBSTRING(문자열 , 시작위치 , 개수) → 문자열 중 시작위치부터 개수만큼 리턴
LTRIM → 공백제거(왼쪽)
RTRIM → 공백제거 (오른쪽)
TRIM → 공백제거 (양쪽)
LEFT ('문자열', 개수)→ 문자열 중 왼쪽에서 개수만큼 추출
RIGHT(문자열, 개수)→ 문자열 중 오른쪽에서 개수만큼 추출
REVERSE(문자열) → 문자열을 반대로 나열
날짜 관련 함수
DATE_FORMAT(날짜, '형식') → 날짜를 형식에 맞게 리턴형식') → 날짜를 형식에 맞게 리턴
그룹(aggregate) 함수
COUNT (필드명) → NULL 값이 아닌 레코드 수를 리턴
SUM
AVG
MAX
MIN
둘 이상의 테이블에서 데이터가 필요한 경우 테이블 조인이 필요
일반적으로 조인 조건을 포함하는 where 절을 작성해야한다.
조인 조건은 일반적으로 각 테이블의 pk및 fk로 구성됩니다.
종류
INNER JOIN ,
OUTER JOIN ( left, right)
join 조건의 명시에 따른 구분
NATURAL JOIN
CROSS JOIN(FULL JOIN)
주의
조인의 처리는 어느 테이블을 먼저 읽을지를 결정하는것이 중요(작업량이 달라진다)
INNER JOIN : 어느 테이블을 읽어도 결과가 달라 지지 않는다. 옵티마이저가 최선의 순서를 맞춰줌NER JOIN : 어느 테이블을 읽어도 결과가 달라 지지 않는다. 옵티마이저가 최선의 순서를 맞춰줌
OUTER JOIN : 반드시 OUTER가 되는 테이블을 먼저 읽어야하므로 옵티마이저가 조인 순서를 선택 할 수 없다
Inner join → 기본적인 조인
natural join →알아서 조인할것을 찾아준다. natural join은 공통 column이 하나일때 사용하는것을 권장
outer join →
creat table, insert, delete , update,
select , from, where , having 에서 모두 가능하다select , from, where , having 에서 모두 가능하다
서브쿼리란 다른 쿼리 내부에 포함되어 있는 SELETE 문을 의미한다.
서브쿼리를 포함하고 있는 쿼리를 외부 쿼리(outer query) 또는 메인 쿼리라고 부르며 서브쿼리는 내부 쿼리(inner query)라고도 부른다.
서브쿼리는 비교 연산자 오른쪽에 존재 해야한다.
종류
중첩 서브 쿼리 → where 문제 작성하는 서브쿼리
인라인 뷰 → from 문에 작성하는 서브쿼리, 동적으로 생성된 테이블로 사용가능 , 저장 x
스칼라 서브쿼리 → select문제 작성하는 서브쿼리
주의사항
서브쿼리는 반드시 ()로 감싸야한다.
서브 쿼리는 단일 행 또는 다중 행 비교 연산자와 함께 사용된다.
서브쿼리에는 order by를 사용하지 못한다.
→서브쿼리와 조인이 가능한데 어떤것이 더 권장 사항인가 ? → case by case (보통 조인이 빠르다)
인라인 뷰-Top N
모든 사원의 사번, 이름 급여를 출력
사원 정보를 급여순으로 정렬
한 페이지당 5명이 출력
현제페이지가 3페이지라고 가정 → 급여 순 11등~15등가지 출력
인라인 뷰 -LImt 활용(MySQL)
스칼라 서브쿼리
select 절에 있는 서브쿼리
한 개의 행만 반환
이름(name) → like 래미안
코드(code) → equals a123
매매가(price) → equals 1억
? 를 사용하는 치환 변수는 값에다가만 쓸수 잇다 → column 명은 불가능
→ 질답형 게시판엔 질문은 하나지만, 답변은 여러개가 등록될 수 있는데 질문 테이블과 답변 테이블을 따로 구성하고 게시글ID로 연결해주는게 맞나요?
모델링이라는 것은 우리 주변에 있는 사람, 사물, 개념 등 다양한 현상을 발생시키는 것들을 일정한 표기법에 의해 나타내는 것을 이야기 한다.
엔티티 어트리뷰트 릴레이셔쉽을 포함 해야한다.
명사형
모델의 관리 대상
사람과 물건 , 장소 같은 실체가 있는 것이나 개념을 엔티티로 선택
시스템 구축 단계까지 진행되면 파일이나 데이터베이스의 테이블로 구현
ER 다이어그램에서는 사각형으로 표현
개체(Entity): 사람, 사물, 장소, 개념, 사건과 같이 유무형의 정보를 가지고 있는 독립적인 실체
데이터베이스에서 주로 다루는 개체: 낱개로 구성된 것으로 각각 데이터 값을 가지며 데이터 값이 변하는 것
비슷한 속성의 개체 타입을 구성하며 개체 집합으로 묶임
entity 찾는법
영속적으로 존재하는것
새로 식별이 가능한 데이터 요소를 가짐
엔티티는 반드시 attribute를 가져야함
속성 또는 열
저장할 필요가 있는 실체에 관한 정보
개체의 성질, 분류, 수량 , 상태 , 특성 등을 나타내는 세부사항
유형
기초속성 - 원래 갖고 있는 속성으로 현업에서 기본적으로 사용되는 속성
추출속성 - 기초 속성으로부터 계산(가공)에 의해 얻어질 수 있는 속성
설계속성 - 실제로 존재하지 않으나 시스템의 효율성을 도모하기 위해 설계자가 임의로 부여하는 속성
기본키 (primary Key)
개체에서 각 인스턴스를 유일하게 식별하는데 가장 적합한 key
기본키 설정 시 고려할 사항으로 해당 실체를 대표할 수 있을것, 업무적 활용도가 높을것
정의
두 엔티티간의 업무적인 연관성 혹은 사실
relationship 분석
각 엔티티 간에 특정한 존재여부 결정
현재의 관계 뿐만 아니라 장래에 사용될 경우도 고려
E-R 다이어그램으로 관계를 설정하는 순서
관계가 있는 두 실체를 실선으로 연결하고 관계를 부여
관계차수를 표현
차수성 (cardinality) - 한 실체의 하나의 인스턴스가 다른 실체의 몇 개 의 인스턴스와 관련될 수 있는가를 정의
선택성( optinality ) : 선택적인지 반드시 인지를 표시
3. 선택성을 표시
개념적 데이터베이스 모델링 관계에서 정의된 ER-diagram을 mapping Rule을 적용하여 관계형 데이터베이스 이론에 입각한 스키마를 설계하는 단계와 이를 이용하여 필요하다면 정규화 하는 단계로 구성
기본키 (primary key)
후보키 중에서 선택한 주 키
널의 값을 가질 수 없다( not NULL)
동일한 값이 중복해서 저장될 수 없다 (UNIQUE)
Mapping RULE
개념적 데이터베이스 모델에서 도출된 개체 타입과 관계 타입의 테이블 정의
개념 논리
단순 엔티티 → 테이블
속성 → 컬럼
식별자 → 기본키
관계 → 참조키 , 테이블\
1:N 관계 타입의 변환
N인 쪽의 테이블에 1의 데이터를 넣어서 참조한다.
물리적인 저장 공간을 가지지 않음
하나 이상의 테이블로부터 만들어 짐
워크벤치를 껏다가 키면 뷰를 다시 만드는 쿼리가 실행되고 검색하는 sql 실행
뷰를 access 하게 되면 간접적으로 테이블을 access하게 됨
선택된 컬럼 정보만 참고 가능
문법
Create [or replace] view 뷰 이름
as sub-query
예시
Create view v_emp
As
Select empid,ename, sal
from emp
where deptid=20;
테이블 컬럼의 빠른 검색을 위해 사용하는 독립된 객체
PK의 경우 이미 index가 생성 되어 있다.
수동 index
create index 구문으로 인덱스 생성ndex 구문으로 인덱스 생성
자동 index → PK, unique → 자동생성