제 5절. WHERE절

1. WHERE 조건절 개요

WHERE 절에는 2개 이상의 테이블에 대한 JOIN 조건을 기술하거나, 결과를 제한하기 위한 조건을 기술한다.

SELECT 칼럼명
FROM 테이블명
WHERE 조건식;

2. 연산자의 종류

  • 비교연산자 : = (같다) <>, ^=, != (같지 않다), >, >=, <, <=

  • SQL 연산자 : BETWEEN A AND B, IN(list), IS NULL, LIKE '비교문자열'

  • 논리 연산자 : AND, OR, NOT

  • 부정 비교 연산자 : NOT 칼럼명 = (와 같지 않다), NOT 칼럼명 > (보다 크지 않다)

연산자의 우선순위

  1. 괄호 ()
  2. 부정 연산자 (not)
  3. 비교 연산자 ( <, >, BETWEEN, IN (list)
  4. 논리 연산자 AND OR

3. 비교 연산자

비교 연산자 오른쪽에 문자열을 사용할 경우, 따옴표로 묶어서 처리해야 한다.

SELECT PLAYER_NAME 선수이름
FROM PLAYER
WHERE TEAM_ID = 'K02'

WHERE TEAM_ID = K02 와 같이 쓰면 에러가 난다.
CHAR, VARCHAR 데이터유형일 때 주의해야 한다.

문자 유형마다 '비교'연산이 다르다.

기본적으로 서로 다른 문자가 나올 때 까지 비교한다.

  • CHAR 끼리 비교 : 길이가 다르면 짧은 쪽에 공백을 추가하여 길이를 같게 한 후 비교.
  • 한 쪽이 VARCAHR 인 경우 비교 : 길이가 다르다면, 길이가 긴 쪽을 크다고 판단. 길이가 같고 다른 것이 없다면 같다고 판단.
  • 문자를 상수와 비교 : 상수 쪽을 변수 쪽의 타입으로 바꾸고 비교

4. SQL 연산자

예약어로 된 연산자로서 모든 데이터 타입에 대한 연산이 가능하다.

  • BETWEEN a AND b : a와 b 를 포함하는 범위인지 비교
  • IN (list) : (list) 에 하나라도 속해 있다면 참이다.
  • LIKE '비교문자열' : %와 _을 사용한 와일드카드로 비교문자열을 만든다
  • IS NULL : NULL 값인지 비교한다. NULL 값과 비교하면 FALSE를 리턴한다.
NULL 값의 비교
  • NULL 값은 비교 할 수 없으므로 비교 연산자를 쓰면 FALSE를 리턴한다.
  • 수치 연산자와 연산해도 NULL 값을 리턴한다.
  • NULL 값의 비교연산은 반드시 IS NULL, IS NOT NULL 문구로 연산한다.
와일드 카드의 종류
  • % : 0개 이상의 어떤 문자
  • _ : 1개인 단일 문자
728x90

'프로그래밍 > SQLD' 카테고리의 다른 글

SQL 기본 6 : GROUP BY, HAVING  (0) 2020.05.27
SQL 기본 5 : 함수  (0) 2020.05.27
SQL 기본 3 : TCL  (0) 2020.05.27
SQL 기본 2 : DML  (0) 2020.05.27
SQL 기본 1 : RDB 개요, DDL  (0) 2020.05.27

제 4절. TCL (Transaction Control Language)

1. 트랜잭션 개요

트랜잭션이란?

데이터베이스의 논리적 연산단위이다.
분할할 수 없는 최소 단위의 데이터베이스 조작이다.
최소 단위 이므로 ALL or NOTHING 의 개념이다.

트랜잭션 명령

  • COMMIT : 연산이 올바르게 반영된 데이터를 데이터베이스에 반영시킨다.
  • ROLLBACK : 트랜잭션 이전의 상태로 되돌린다.

트랜잭션의 특성

  • 원자성 : 트랜잭션의 연산이 모두 실행되거나 아니면 전혀 실행되지 않은 상태로 남아야한다. ALL or NOTHING
  • 일관성 : 데이터베이스 내용이 정상적이라면 트랜잭션이 실행된 이후에도 데이터베이스의 내용은 정상이어야 한다.
  • 고립성 : 트랜잭션이 실행되는 도중 다른 트랜잭션의 영향을 받지 않는다.
  • 지속성 : 트랜잭션이 성공적으로 수행되면, 그 결과는 데이터베이스에 영구적으로 저장된다.

트랜잭션의 특성을 충족시키기 위해 데이터베이스는 다양한 레벨의 잠금기능(LOCKING)을 제공한다.
잠금이 걸린 데이터는 잠금을 수행한 트랜잭션만이 해제할 수 있다.

2. COMMIT

트랜잭션을 완료하는 명령어.

  • COMMIT 이전
    DML로 데이터를 변경하는 것은 단지 메모리 버퍼에만 영향을 준것이므로 데이터 변경 이전의 상태로 복구할 수 있다.
    변경한 행은 잠금(LOCKING)되어서 다른 사용자가 변경할 수 없다.

  • COMMIT 이후
    데이터에 대한 변경 사항이 데이터베이스에 반영된다.
    이전 데이터는 영원히 잃어버리게 된다.
    모든 사용자가 결과를 볼 수 있다.

cf) ORACLE의 경우 DML 실행 시 COMMIT을 수행해줘야 DB에 반영된다.
반면, SQL SERVER는 기본적으로 모두 AUTO COMMIT이다.

데이터베이스를 정상적으로 접속 종료하면, 자동으로 트랜잭션이 커밋된다.

3. ROLLBACK

COMMIT 이전에 DML로 변경한 사항을 취소한다.
롤백을 하면 변경 사항이 취소되면서 조작한 행에 대한 잠금이 풀리고 다른 사용자들이 데이터를 변경할 수 있게 된다.

cf) SQL SERVER는 기본으로 AUTO COMMIT되므로, 롤백을 하려면 명시적으로 트랜잭션을 선언해야 한다.

COMMIT과 ROLLBACK의 효과

  • 데이터 무결성 보장
  • 논리적으로 연관된 작업을 그룹핑하여 처리 가능

4. SAVEPOINT

저장점을 정의하면 현 시점을 기준으로 특정시점(SAVEPOINT)까지 트랜잭션의 일부만 롤백할 수 있다.

SAVEPOINT SVP1;

ROLLBACK TO SVP1;

SQL SERVER의 경우, SAVE TRANSACTION 을 사용하여 동일한 기능을 수행한다.

SAVE TRANSACTION SVTR1;

ROLLBACK TRANSACTION SVTR1;

INSERT작업, SAVEPOINT1, UPDATE작업, SAVEPOINT2, DELETE, 현 시점 순으로 작업했을때,
SAVEPOINT1로 돌아간 후에, SAVEPOINT2로 (미래 방향으로) 돌릴 수는 없다.

왜냐하면 SAVEPOINT1으로 실행한 시점에는 SAVEPOINT2 저장점이 존재하지 않기 때문이다.

728x90

'프로그래밍 > SQLD' 카테고리의 다른 글

SQL 기본 5 : 함수  (0) 2020.05.27
SQL 기본 4 : WHERE 절  (0) 2020.05.27
SQL 기본 2 : DML  (0) 2020.05.27
SQL 기본 1 : RDB 개요, DDL  (0) 2020.05.27
Toad TNS file 검증 에러  (0) 2020.02.21

제 3절 DML (Data Manipulation Language)

테이블의 자료들을 입력, 수정, 삭제, 조회 하는 DML 사용 방법을 정리한다.

 

1. INSERT

두 가지 방법이 있다. 한 번에 한 건만 입력 된다.

INSERT INTO 테이블명 (COLUMN1, COLUMN2, COLUMN3) VALUES (DATA1, DATA2, DATA3);
INSERT INTO 테이블명 VALUES (DATA1, DATA2, DATA3);

첫 번째 유형은 작성한 칼럼 순서에 맞게 뒤에 값들 순서도 맞춰준다. (테이블 칼럼 순서에 맞출 필요 없다)
두 번째 유형은 테이블 칼럼 순서에 맞게 써야 하며 빠짐 없이 모든 칼럼에 대해 값을 넣어야 한다.

 

2. UPDATE

UPDATE 테이블명 
SET 칼럼명 = 새로운값;

UPDATE PLAYER
SET BACK_NO = 99
WHERE ID = 'MF2';

조건절 WHERE를 명시하지 않으면 모든 행에 대해 수정된다.

 

3. DELETE

조건절 WHERE를 명시하지 않으면 모든 행이 삭제된다.

DELETE [FROM] 테이블명 
WHERE 조건절;

DDL의 경우 명령어 입력과 동시에 AUTO COMMIT 되어어 테이블에 영향을 미친다.
DML의 경우, 테이블을 메모리 버퍼에 올려두고 작업한다. 그래서 DML 명령 후에 COMMIT 명령어 실행으로 TRANSACTION을 종료해야 테이블에 반영된다.

데이터를 삭제할 때 DELETE 명령은 삭제된 데이터를 로그로 저장한다.
이에 반해 TRUNCATE TABLE의 경우 로그 저장을 안하므로 ROLLBACK이 불가능하다.

 

4. SELECT

SELECT ALL/DISTINCT 칼럼명, 칼럼명, 칼럼명 ... 
FROM 테이블명;

ALL: 디폴트 옵션. 중복된 데이터도 모두 출력한다.
DISTINCT : 중복된 데이터는 1건으로 처리해서 출력한다.

SELECT PLAYER_ID, PLAYER_NAME, POSITION, HEIGHT
FROM PLAYER;

 

WILDCARD 사용하기

아스트리크(*) 를 사용하여 해당 테이블의 모든 칼럼을 조회할 수 있다.
SELECT * FROM 테이블명;

ALIAS 부여하기 (별명 붙이기)

칼럼명 바로 뒤에 적는다.
칼럼명 바로 뒤에 AS 키워드를 사용하여 별명을 붙여도 된다.
띄어쓰기를 포함한 경우에는 별명을 ""로 감싸준다.

SELECT PLAYER_NAME AS 선수명, HEIGHT AS 키
FROM PLYAER;

 

5. 산술 연산자와 합성 연산자

산술 연산자

NUMBER 와 DATE 자료형에 적용된다.
사칙연산이 가능하다.
괄호를 이용하여 우선순위 적용이 가능하다.

SELECT PLAYER_NAME 이름, ROUND(WEIHGT/(HEIGHT/100), 2) "BMI 비만지수"
FROM PLAYER;

합성 연산자 (CONCATENATION)

문자와 문자를 연결한다.

  • ORACLE 의 경우 || , SQL SERVER 의 경우 + 표시로 연결한다.
  • CONCAT(STRING1 , STRING2) 함수를 사용할 수 있다.
  • 문자 표현식의 결과로 새로운 칼럼을 생성한다.

아래 예시는 3개의 컬럼의 데이터들을 이어붙여서 '체격정보'라는 새로운 칼럼을 생성한다.

SELECT PLAYER_NAME ||'선수' || HEIGHT || 'cm' || WHEIGHT || 'kg' 체격정보
FROM PLAYER;
728x90

'프로그래밍 > SQLD' 카테고리의 다른 글

SQL 기본 4 : WHERE 절  (0) 2020.05.27
SQL 기본 3 : TCL  (0) 2020.05.27
SQL 기본 1 : RDB 개요, DDL  (0) 2020.05.27
Toad TNS file 검증 에러  (0) 2020.02.21
실습 환경 만들기 - Toad 설치  (0) 2020.02.21

제 1절 관계형 데이터베이스 개요

1. 데이터베이스

관계형 데이터베이스

정규화를 통한 합리적인 테이블 모델링을 통해 이상(anomaly)현상을 제거하고 데이터 중복을 피할 수 있으며, 동시성 관리, 병행 제어를 통해 많은 사용자들이 동시에 데이터를 공유 및 조작할 수 있는 기능을 제공한다.

2. SQL (Structured Query Language)

관계형 데이터베이스에서 데이터 정의, 조작, 제어를 하기 위해 사용하는 언어다.
ANSI/ISO 를 통해 표준화 되고 있다.

SQL 명령의 종류

DML (데이터 조작어)

SELECT (== retrieve), INSERT, UPDATE, DELETE

DDL (데이터 정의어)

CREATE, ALTER, DROP, RENAME

DCL (데이터 제어어)

GRANT, REVOKE
권한을 주거나 회수한다

TCL (트랜젝션 제어어)

COMMIT, ROLLBACK

3. Table

테이블은 데이터를 저장하는 객체(OBJECT)로서 관계형 데이터베이스의 기본 단위이다.
관계형 데이터베이스는 모든 데이터를 칼럼과 행의 2차원 구조로 나타낸다.
칼럼은 특정 속성을 나타낸다.
칼럼과 행이 겹치는 하나의 공간을 필드라고 한다.

정규화 : 테이블을 분할하여 데이터의 정합성을 확보하고, 불필요한 중복을 줄이는 프로세스
기본키(PRIMARY KEY) : 테이블의 각 행들을 식별할 수 있는 한 개 이상의 칼럼
외래키(FOREIGN KEY) : 다른 테이블의 기본키로 사용되고 있는 관계를 연결하는 칼럼

4. ERD (Entity Relationship Diagram)

ERD 의 구성요소는 엔터티, 관계 속성 3가지 이다.

제 2절 DDL (Data Definition Language)

1. 데이터 유형

character(s)

s 만큼의 고정 길이 문자열 정보
기본 1byte 최대 2000byte

varchar(s)

가변 길이 문자열 정보

char 와 varchar의 '비교 방법'
char는 비교할 때 공백을 채워서 비교한다. 
varchar 공백이 다르면 다른 문자로 판단한다. 공백도 하나의 문자로 취급한다. 

numeric

정수, 실수 등 숫자 정보
처음에 전체 자리수, 뒤에 소수 부분 자리 수를 지정한다
전체 8자리이고 소수 부분2자리 라면 number(8, 2)

date

날짜와 시각 정보

2. CREATE TABLE

구문 형식

CREATE TABLE 테이블명(
    PLAYER DATATYPE [DEFAULT 형식] NOT NULL,
    TEAM DATATYPE [DEFAULT 형식] NOT NULL,
    STADIUM_ID CHAR(3) NOT NULL,
    CONSTRAINT PALYER_PK PRIMARY KEY (PLAYER),
    CONSTRAINT TEAM_FK FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID)
);

주의사항

테이블 명은 다른 테이블의 이름과 중복되지 않아야 한다.
한 테이블 내에서는 칼럼명이 중복되게 지정될 수 없다.
칼럼 뒤에 데이터유형은 반드시 지정해야 한다.
벤더에서 사전에 정의한 예약어(Reserved word)는 쓸 수 없다.
A-Z, a-z, 0-9, '_', '$', '#' 문자만 허용한다.

칼럼에 대한 제약조건이 있으면 CONSTARINT 를 이용하여 추가할 수 있다.
DATETIME 데이터 유형에는 별도로 크기를 지정하지 않는다.
제약조건은 칼럼의 데이터 유형 뒤에 작성하는 칼럼 LEVEL 정의 방식이 있고, CONSTRAINT 로 테이블 LEVEL 정의 방식이 있다. 기능은 동일 하다.

제약조건의 종류

  • PRIMARY KEY (기본키)
    행 데이터를 고유하게 식별하기 위한 기본키를 정의한다.
    하나의 테이블에 하나의 기본키 제약만 정의할 수 있다.
    ( PK = NOT NULL + UNIQUE KEY )

  • UNIQUE KEY (고유키)
    행 데이터를 고유하게 식별하기 위한 고유키를 정의한다.
    단, NULL은 고유키의 제약 대상이 아니다. (NULL 여러개 가능)

  • NOT NULL
    NULL 값 입력을 금지한다.

  • CHECK
    입력할 수 있는 값의 '범위'를 제한한다.
    제약으로는 TRUE or FALSE 로 평가할 수 있는 '논리식'을 지정한다.

  • FOREIGN KEY
    테이블 간의 관계를 정의하기 위해 기본키를 다른 테이블의 외래키로 복사하는 경우에 외래키가 생성된다.

SELECT 문장을 통한 테이블 생성

CTAS (create table ~ as select ~)
기존 테이블을 이용하여 테이블을 생성하면 데이터유형을 재정의 안 해도 된다는 장점이 있다.
단, 주의할 점은 기존 테이블의 제약조건 중에 NOT NULL만 새로운 복제 테이블에 적용이 된다. 나머지 PK, FK 등의 다른 제약 조건은 없어진다. ALTER TABLE로 제약조건 추가하는 작업이 필요하다.

3. ALTER TABLE

ADD COLUMN

ALTER TABLE 테이블이름 
ADD 칼럼이름 DATATYPE;

주의 할 점은 추가할 칼럼의 위치를 지정할 수 없다는 것이다.

ALTER TABLE TEAM
ADD ADDRESS VARCHAR(20);

DROP COLUMN

ALTER TABLE 테이블이름
DROP COLUMN 삭제할 칼럼이름;

주의 할 점은 한 번 삭제된 칼럼은 복구가 불가능하다.

ALTER TABLE TEAM
DROP COLUMN ADDRESS;

MODIFY COLUMN

칼럼의 제약조건, 디폴트값, 데이터유형을 변경할 수 있다.

ALTER TABLE 테이블이름
MODIFY (칼럼이름1 데이터유형 [DEFAULT 값] [NOT NULL],
        칼럼이름2 데이터유형);
  • 해당 칼럼이 NULL값만 가지고 있거나 테이블에 아무 행 도 없으면 칼럼의 폭을 줄일 수 있다.
  • 해당 칼럼의 크기를 늘릴 수는 있지만 줄이지는 못한다. (기존 데이터가 훼손될 수 있기 때문이다.)
  • 해당 칼럼의 DEFAULT값을 변경 할 수 있지만, 변경 작업 이후 발생한 행에만 영향을 미친다.
  • 해당 칼럼에 NULL 값이 없는 경우에만 NOT NULL 제약조건을 추가할 수 있다.

RENAME COLUMN

칼럼명을 변경해야 하는 경우에 RENAME COLUMN 문구를 사용한다.

ALTER TABLE 테이블이름
RENAME COLUMN 변경해야 할 칼럼 TO 새 칼럼이름;

ALTER TABLE TEAM
RENAME COLUMN ADDREEE TO ADDRESS;

DROP CONSTRAINT

제약조건을 삭제하는 명령어.

ALTER TABLE 테이블이름
DROP CONSTARINT 제약조건이름;

ADD CONSTRAINT

제약조건을 추가하는 명령어.

ALTER TABLE 테이블이름 
ADD CONSTRAINT 제약조건명 제약조건 (칼럼명);

ALTER TABLE PLAYER
ADD CONSTRAINT TEAM_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID);

4. RENAME TABLE

RENAME으로 테이블이름을 변경할 수 있다
RENAME 테이블이름 TO 새 테이블이름

5. DROP TABLE

테이블의 구조 및 데이터 전부를 삭제한다.

DROP TABLE 테이블이름 [CASCADE CONSTRAINT];

CASCADE CONSTRAINT : 삭제 할 테이블과 관계 있는 제약조건까지 전부 삭제하는 옵션

6. TRUNCATE TABLE

테이블의 모든 행들을 삭제하고 재사용하기 위한 명령.
테이블 구조 자체가 삭제되는 것은 아니다.

TRUNCATE TABLE 테이블이름;

DELETE 보다 시스템 부하가 적다.
단, TRUNCATE TABLE의 경우 정상적인 복구가 불가능하므로 주의하여 사용해야 한다.

728x90

'프로그래밍 > SQLD' 카테고리의 다른 글

SQL 기본 3 : TCL  (0) 2020.05.27
SQL 기본 2 : DML  (0) 2020.05.27
Toad TNS file 검증 에러  (0) 2020.02.21
실습 환경 만들기 - Toad 설치  (0) 2020.02.21
실습 환경 만들기 - Oracle XE 설치  (0) 2020.02.21

오늘 한 일 

 

정렬 쪽 알고리즘 문제를 풀었다. 

 

SQL 전문가 가이드북을 읽고 문제를 풀고 있다. 문체가 딱딱해서 정말 읽기 힘들다.

시험은 5월 31일 일요일이다. 

 

끝까지 화이팅하자!! 

728x90

'일상 > Today I Learn(TIL)' 카테고리의 다른 글

2020-06-01 TIL  (0) 2020.06.01
2020-05-27 TIL  (0) 2020.05.27
2020-05-20 TIL  (0) 2020.05.20
2020-05-18 TIL  (0) 2020.05.18
2020-05-11 TIL  (0) 2020.05.11

오늘 한 일 

 

선택정렬, 퀵정렬을 다시 봤다. 

 

SQL 기본, 활용 핵심위주로 다시 봤고 문제집에 있는 문제를 풀었다. 

5월 31일 토요일 SQLD 자격증 시험이 코앞이다. 

화이팅!

 

내일 할 일 

 

목요일에는 SQLD 가이드북을 다시 볼 계획이다. 

금요일 부터는 복원된 기출문제를 풀 예정이다. (sqldp 네이버 카페 월야루님)

728x90

'일상 > Today I Learn(TIL)' 카테고리의 다른 글

2020-05-27 TIL  (0) 2020.05.27
2020-05-25 TIL  (0) 2020.05.25
2020-05-18 TIL  (0) 2020.05.18
2020-05-11 TIL  (0) 2020.05.11
2020-05-04 TIL  (2) 2020.05.04

오늘 한 일 

 

SQLD 자격증 시험 D-13 이다. 어느덧 성큼 시험일이 다가와버렸다. 

데이터 모델링 파트 용어 정리를 해보고 문제를 풀어봤다. 

 

당분간 SQLD 자격증 시험 준비에 집중할 계획이다. (5월 31일 오전 10시 시험!)

 

 

C++알고리즘 문제 30번 문제 (3의 개수 세기)를 풀어봤다.

혼자 고민했을 때는 3이 1개인 숫자의 개수, 3이 2개인 숫자의 개수 ... 이런 식으로 세면 될것 같았다.

고민하다가 선생님의 설명을 들었는데 선생님은 일의 자리에 3이 올 때, 십의 자리에 3이 올 때 이런 식으로 풀었다. 

'아.. 뭔가 비슷했는데?' 싶었지만 조금 달랐다. ㅎㅎ 

저렇게 하니까 코딩할 구조가 나왔다. 

 

어려웠지만 그래도 재미있었다.  

 

 

프로그래머스에서 백엔드 신입 개발자 채용 공고를 둘러봤다. 

 

공통적으로 보이는 요구사항은 다음과 같았다. 

전산 기초가 있으신 분(운영체제, 자료구조, 알고리즘, 네트워크), 

JAVA 또는 Python 능숙자, Git 활용한 협업 경험,  RESTful API 서버 등을 개발해 본 경력이 주로 요구됬다. 

또 웹 프로토콜에 대한 이해, 객체지향 프로그래밍의 이해가 필요했다. 

 

 

728x90

'일상 > Today I Learn(TIL)' 카테고리의 다른 글

2020-05-25 TIL  (0) 2020.05.25
2020-05-20 TIL  (0) 2020.05.20
2020-05-11 TIL  (0) 2020.05.11
2020-05-04 TIL  (2) 2020.05.04
2020-05-03 TIL  (0) 2020.05.03

+ Recent posts