## 공부정리
과목2 1장 SQL 기본
1) 관계형 데이터베이스 개요
2) DDL (CREATE, ALTER, DROP, RENAME)
3) DML (SELECT, INSERT, UPDATE, DELETE)
#1 관계형 데이터베이스 개요
1 DB : 데이터베이스
- 데이터를 일정한 형태로 저장해 놓은 것
- 계층형 DB : 트리 형태의 자료구조에 데이터 저장(1:N)
- 네트워크형 DB : 오너와 멤버 형태로 데이터 저장(M:N)
- 관계형 DB : 집합 연산과 관계 연산 가능
2 DBMS : 데이터베이스메니지먼트시스템
- 효율적인 데이터 관리 뿐만 아니라 예기치 못한 사건으로 인한 데이터의 손상을 피하고, 필요시 필요한 데이터를 복구하기 위한 강력한 기능의 SW(소프트웨어)
3 DB(데이터베이스)의 발전
- 1960 : 플로우차트 중심의 개발, 파일구조 사용
- 1970 : DB 관리기법이 처음 태동, 계층-망형 DB등장
- 1980 : 관계형 DB 상용화, Oracle, Sybase 등장
- 1990 : 객체 관계형 DB로 발전
4 관계형 데이터베이스 (RDB : Relational Database)
- 파일 시스템 단점 : 동시에 삽입/수정/삭제가 불가능해 데이터 관리가 어렵고 복사본 파일을 만들어 사용할 경우 데이터의 불일치성이 발생
- RDB의 장점 : 정규화를 통해 이상 현상과 중복제거, 데이터 무결성 보장, 데이터 회복/복구 가능, 병행 제어 동시성 관리를 통해 데이터 공유, 데이터 표현 방법 등 체계화
5 SQL 문장들의 종류
- SQL : 관계형 DB에서 데이터 정의, 조작, 제어를 위해 사용하는 언어
명령어의 종류 | 명령어 | 설명 |
데이터 조작어 (DML : Data Manipulation Language) |
SELECT | 데이터베이스에 들어 있는 데이터를 조회하거나 검색하기 위한 명령어를 말하는 것으로 RETRIEVE 라고도 한다. |
INSERT UPDATE DELETE |
데이터베이스의 테이블에 들어 있는 데이터에 변형을 가하는 종류의 명령어들을 말한다. 예를 들어 데이터를 테이블에 새로운 행을 집어넣거나, 원하지 않는 데이터를 삭제하거나 수정하는 것들의 명령어들을 DML이라고 한다. |
|
데이터 정의어 (DDL : Data Definition Language) |
CREATE ALTER DROP RENAME |
테이블과 같은 데이터 구조를 정의하는데 사용되는 명령어들로 그러한 구조를 생성하거나 변경하거나 삭제하거 이름을 바꾸는 데이터 구조와 관련된 명령어들을 DDL이라 한다. |
데이터 제어어 (DCL : Data Control Language) |
GRANT REVOKE |
데이터베이스에 접근하고 객체들을 사용하도록 권한으르 주고 회수하는 명령어를 DCL이라고 부른다. |
트랜잭션 제어어 (TCL : Transaction Control Language) |
COMMIT ROLLBACK |
논리적인 작업의 단위를 묶어서 DML에 의해 조작된 결과를 작업단위(트랜잭션) 별로 제어하는 명령어를 말한다. |
6 테이블
: RDB의 기본 단위, 데이터를 저장하는 객체, 칼럼과 행의 2차원 구조
용어 | 설명 |
테이블 (Table) |
행과 칼럼의 2차원 구조를 가진 데이터의 저자 장소이며, 데이터베이스의 가장 기본적인 개념 |
칼럼/열 (Column) |
2차원 구조를 가진 테이블에서 세로 방향으로 이루어진 하나하나의 특정 속성(더 이상 나눌 수 없는 특성) |
로우/행 (Row) |
2차원 구조를 가진 테이블에서 가로 방향으로 이루어진 연결되어 있는 데이터 |
7 ERD(Entity Relationship Diagram)
- 관계의 의미를 직관적으로 표현할 수 있는 수단
- 구성요소 : 엔터티(Entity), 관계(Relationship), 속성(Attribute) 3가지
- 표기법 : IE(Information Engineering) 표기법, Barker(Case Method) 표기법
#2 DDL (CREATE, ALTER, DROP, RENAME)
1 데이터의 유형
① 숫자 타입
- ANSi / ISO 기준
: Numeric, Decimal, Dec, Small Int, Integer, Int, Big int, Float, Real, Double Precision
- SQL Server / Sybase
: 작은 정수, 정수, 큰 정수, 실수 등 + Money, Small Money
- Oracle
: 숫자형 타입에 대해서 NUmber 한 가지 타입만 지원
- 벤더에서 ANSI / ISO 표준을 사용할 땐 기능을 중심으로 구현, 표준과 다른 용어 사용 허용
② 문자열 유형
- CHAR(고정길이) 와 VARCHAR(가변길이)의 차이
- CHAR 문자열 비교 = 공백을 채워서 비교
- VARCHAR에서 비교 = 맨 처음부터 한 문자씩 비교 (공백도 하나의 문자로 취급)
③ 테이블의 칼럼이 가지고 있는 대표적인 4가지 유형
데이터 유형 | 설명 |
CHARACTER(s) | - 고정 길이 문자열 정보(Oracle, SQL Server 모두 CHAR로 표현) - s는 기본 길이 1바이트, 최대 길이 Oracle : 2,000바이트, SQL : 8,000 바이트 - s만큼 최대 길이를 갖고 고정 길이를 가지고 있으므로 할당된 변수 값의 길이가 s보다 작을 경우에는 그 차이 길이만큼 공간으로 채워진다. |
VARCHAR(s) | - CHARACTER VARYING의 약자로 가변 길이 문자열 정보(Oracle : VARCHAR2로, SQL : VARCHAR로 표현) - s 는 최고 실이 1바이트, 최대 길이 Oracle : 4,000바이트, SQL Server : 8,000 바이트 - s만큼의 최대 길이를 갖지만 가변 길이로 조정이 되기 때문에 할당된 변수값의 바이트만 적용된다.(Limit 개념) |
NUMERIC | - 정수, 실수 등 숫자 정보(Oracle은 NUMBER로, SQL은 10가지 이상의 숫자 타입을 가지고 있음) - Oracle은 처음에 전체 자리 수를 지정하고, 그 다음 소수 부분의 자리 수를 지정한다. 예를들어, 정수 부분이 6자리이고 소수점 부분이 2자리인 경우에는 'NUMBER(8,2)'와 같이 된다. |
DATETIME | - 날짜와 시각 정보(Oracle은 DATE로, SQL은 DATETIME으로 표현) - Oracle은 1초 단위, SQL은 3.33ms(millisecond) 단위로 관리 |
2 CREATE TABLE - 테이블 생성
- 명명 규칙 : 알파벳 -> 숫자 -> '_'(언더바) -> '$'(달러) -> '#'(샵)
- 테이블 생성시 대/소문자 구분은 하지 않는다. => 기본적으로 테이블이나 칼럼명 = 대문자로 표기한다.
- DATETIME 데이터 유형에는 별도로 크기를 지정하지 않는다.
- 문자 데이터 유형은 반드시 가질 수 있는 최대 길이를 표시
- 칼럼과 칼럼의 구분은 콤마로 하되, 마지막 칼럼은 콤마 X
- 칼럼에 대한 제약조건이 있으면 CONSTRAINT 이용하여 추가
CREATE TABLE 테이블 이름
(칼럼명1 DATETYPE [DEFAULT형식],
칼럼명1 DATETYPE [DEFAULT형식],
칼럼명1 DATETYPE [DEFAULT형식]);
CREATE TABLE PLAYER
(PLAYER_ID CHAR(7) NOT NULL, PLAYER_NAME VARCHAR(20) NOT NULL,
TEAM_ID CHAR(3) NOT NULL, E_PLAYER_NAME VARCHAR(40),
NICKNAME VARCHAR(30), JOIN_YYYY CHAR(4), POSITION VARCHAR(10),
BACK_NO TINYINT, NATION VARCHAR(20), BIRTH_DATE DATE, SOLAR CHAR(1),
HEIGHT SMALLINT, WEIGHT SMALLINT,
CONSTRAINT PLAYER_PK PRIMARY KEY(PLAYER_ID),
CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID));
3 제약조건 (CONSTRAINT)
: 데이터 무결성 유지 방법, 사용자가 원하는 조건의 데이터만 유지
- PK(Primary Key) : 한 테이블에 하나만 지정 가능 -> 자동으로 unique 인덱스 생성, Null 입력 불가(기본키 제약 = 고유키 & not null 제약)
- UNIQUE : NULL 가능, 행을 고유하게 식별하기 위한 고유키
- NOT NULL : NULL 값 입력 금지
- CHECK : 데이터 무결성을 유지하기 위한 테이블의 특정 칼럼에 설정하는 제약, 입려 할 수 있는 값의 범위 등을 제한, TRUE or FALSE 논리식을 지정
- FK (Foreign Key) : 참조 무결성 옵션 선택 사능, 여러개 가능
- NULL : 아직 정의되지 않은 값, 데이터 입력하지 못하는 경우 -> 알 수 없는 값, 0과 공백(" ")은 NULL이 아님 -> NULL은 IS NULL, IS NOT NULL로만 비교 가능(<>NULL != NULL 사용 불가)
구분 | 설명 |
PRIMARY KEY (기본키) |
- 테이블에 저장된 행 데이터를 고유하게 식별하기 위한 기본키를 정의한다. 하니의 테이블에 하나의 기본키 제약만 정의할 수 있다. - 기본키 제약을 정의하면 DBMS는 자동으로 UNIQUE 인덱스를 생성하며, 기본키를 구성하는 칼럼에는 NULL을 입력할 수 없다. - 결국, '기본키 제약 = 고유키 제약 & NOT NULL 제약'이 된다. |
UNIQUE KEY (고유키) |
- 테이블에 저장된 행 데이터를 고유하게 식별하기 위한 고유키를 정의한다. 단, NILL은 고유키 제약의 대상이 아니므로, NULL 값을 가진 행이 여러 개가 있더라도 고유키 제약 위반이 되지 않는다. |
FOREIGN KEY (외래키) |
- 관계형 데이터베이스에서 테이블 간의 관계를 정의하기 위해 기본키를 다른 테이블의 외래키로 복사하는 경우 외래키가 생성된다. - 외래키 지정시 참조 무결성 제약 옵션을 선택할 수 있다. |
NOT NULL | - NULL 값의 입력을 금지한다. 디폴트 상태에서는 모든 칼럼에서 NULL을 허가하고 있지만, 이 제약을 지정함으로써 해당 칼럼은 입력 필수가 된다. NOT NULL을 CHECK의 일부분으로 이해 할 수도 있다. |
CHECK | - 입력 할 수 있는 값의 범위 등을 제한한다. CHECK 제약으로는 TRUE or FALSE로 평가할 수 있는 논리식을 지정한다. |
4 생성된 테이블 구조 확인
Oracle : DESCRIBE 테이블명;(간략히 DESC 테이블명;)
SQL : sp_help 'dbo.테이블명'
5 SELECT 문장을 통한 테이블 생성 사례
① CREATE TABLE AS (CTAS)
- CREATE TABLE AS 문장을 사용하는 경우 테이블의 구조를 복사하므로 따로 작성 X
- 기본 테이블 제약조건 중 NOT NULL 제약 조건만 새로운 테이블에 복제됨
- 다른 제약조건(기본키, 고유키, 외래키, CHECK 등) dms qhrtkrk ehlwl dksgdktj rktl wjrdydgodi gksek.
- 계약 조건 추가하기 위해 ALTER TABLE 기능 사용
[Oracle] CREATE TABLE 테이블명B AS SELECT * FROM 테이블명A;
[예제] 선수(PLAYER) 테이블과 같은 내용으로 TEAM_TEMP라는 복사 테이블을 만들어 본다.
Oracle CREATE TABLE TEAM_TEMP AS SELECT TEAM;(1개 행이 영행을 받음)
② SQL 에서는 Select ~ Into ~ 를 활용하여 같은 결과
[SQL] SELECT * INTO 테이블명B FROM 테이블명A;
SQL SELECT * INTO TEAM_TEMP FROM TEAM;(1개 행이 영향을 받음)
6 ALTER TABLE
: 칼럼을 추가/삭제하거나 제약조건을 추가/삭제
ALTER TABLE PLAYER ADD ADDRESS VARCHAR(80);
ALTER TABLE PLAYER DROP COLUMN ADDRESS;
ALTER TABLE TEAM_TEMP ALTER COLUMN ORIG_YYYY VARCHAR(8) NOT NULL;
① ALTER TABLE + ADD COLUMN : 칼럼 추가
② ALTER TABLE + DROP COLUMN : 칼럼 삭제
③ ALTER TABLE + MODIFY : 칼럼 속성 변경
[Oracle] ALTER TABLE 테이블명 MODIFY(칼럼명 데이터유형 DEFAULT NOT NULL);
[SQL] ALTER TABLE 테이블명 ALTER COLUMN 칼럼명 데이터유형 DEFAULT NOT NULL;
7 DROP TABLE
: 테이블 제거
* ALTER TABLE 테이블명 DROP COLUMN 삭제할 칼럼명;
DROP TABLE PLAYER; -> (테이블 정부 삭제, 회복 불가)
ALTER TABLE PLATER DROP COLUMN ADDRESS; -> (테이블의 일부 칼럼 삭제, 회복 불가)
* DROP TABLE 테이블명 [CASCADE CONSTRAINT]; 제약조건명;
- DROP 명령어를 사용하면 테이블의 모든 데이터 및 구조를 삭제
- CASCADE CONSTRAINT 옵션은 해당 테이블과 관계가 있었던 참조되는 제약조건에 대해서도 삭제한다는 것을 의미
- SQL 에서는 CASCADE 옵션이 존재하지 않으며 테이블을 삭제하기 전에 참조하는 FK(FOREIGN KEY)제약 조건 또는 참조하는 테이블을 먼저 삭제
8 TRUNCATE TABLE
: 테이블 비우기
* TRUNCATE TABLE 테이블명 DROP COLUMN 삭제할 칼럼명;
- 테이블 삭제가 아닌 해당 테이블의 모든 행 제거 후 저장공간을 재사용하도록
- 구조 자체 삭제는 DROP COLUMN 삭제할 칼럼명
9 DDL과 DML의 삭제
- DDL은 반드시 AUTO COMMIT이 일어남 -> DROP, TRUNCATE 원상복구 불가
- DML은 사용자가 COMMIT 해야함 -> DELETE 테이블 삭제해도 ROLLBACK으로 복구 가능
10 참조 동작
- Automatic : 자식 삽입 시 부모 테이블에 pk가 없으면 부모 pk 생성 후 자식에 삽입
- Dependent : 자식 삽입 시 부모 테이블에 pk가 존재할 때만 자식 삽입허용
- Cascade : 부모 삭제 시 자식 같이 삭제
- Restrict : 부모 삭제 시 테이블에 pk가 없는 경우에만 부모 삭제 허용
#3 DML (SELECT, INSERT, UPDATE, DELETE)
* DML(Data Manipulation Language) : 입력 / 수정 / 삭제 / 조회
1 DML
- 호스트 프로그램 속에 삽입되어 사용, 데이터 부속어라고도 한다
- Procedural DML (절차적 데이터 조작어) : 초급언어, 사용자가 무슨 데이터를 원하고 어떻게 접근해 처리할 것인지 명세해야한다.
- Nonprocedural DML (비절차적 데이터 조작어) : 고급언, 사용자가 무슨 데이터를 원하는지만 명세하고 어떻게 접근할 것인지는 하지 않는다. 선언적 언어하고도 함.
2 INSERT
: 데이터 입력 방법
INSERT INTO 테이블명 (COLUMN_LIST) VALUES (COLUMN_LIST에 넣을 VALUE_LIST);
INSERT INTO 테이블명 VALUES (전체 COLUMN에 넣을 VALUE_LIST);
PLAYER INSERT INTO PLAYER
(PLAYER_ID, PLAYER_NAME, TEAM_ID, POSITION, HEIGHT, WEIGHT, BACK_NO) -> 칼럼 리스트
VALUES ('2002007', '박지성', 'K07', 'MF', 178, 73, 7); -> 밸류 리스트
- INSERT INTO 테이블명 (칼럼리스트 / 생략 = 전체칼럼)
VALUES (칼럼명 순서에 맞춰 입력할 값 매핑해 작성);
- 데이터가 문자형일 경우 "로 묶어서 입력
3 UPDATE
:정보 수정
UPDATE 테이블명 SET 수정되어야 할 칼럼명 = 수정되기를 원하는 새로운 값;
UPDATE PLAYER SET BACK_NO = 99;
UPDATE PLAYER SET POSITION = 'MF'; -> 문자값인 경우 ' '사용
- UPDATE 테ㅣ블명
SET 칼럼명 = 값 WHERE 조건;
4 합성 연산자
: 문자와 문자를 연결하는 합성(CONCATENATION) 연산자
[Oracle] -> ||
[SQL] -> +
Oracle >>
SELECT PLAYER_NAME || '선수,' || HEIGHT || 'cm,' || WEIGHT || 'kg'체격정보 FROM PLAYER;
Sql >>
SELECT PLAYER_NAME + '선수,' + HEIGHT + 'cm,' + WEIGHT + 'kg'체격정보 FROM PLAYER;
=> 정경량선수 173cm, 65kg 정은익 선수, 176cm 63kg 레오마르선수, 183cm, 77kg 명재용 선수, 173cm, 63kg
'SQL 공부일지' 카테고리의 다른 글
SQL 공부 일지 7일차 230820 (1) | 2023.08.20 |
---|---|
SQL 공부 일지 6일차 230818 (0) | 2023.08.19 |
SQL 공부 일지 4일차 230814 (0) | 2023.08.14 |
SQL 공부 일지 3일차 230812 (0) | 2023.08.12 |
SQL 공부 일지 2일차 230811 (0) | 2023.08.11 |