DB
데이터베이스(영어: database, DB)는 여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합이다. 작성된 목록으로써 여러 응용 시스템들의 통합된 정보들을 저장하여 운영할 수 있는 공용 데이터들의 묶음이다.
DB, RDB, DBMS, RDBMS
- DB → DBMS
- RDB → RDBMS
RDBMS(stands for Relational Database Management System)는 DB를 관리하는 시스템. TOP3 오픈소스 RDBMS는 MySQL, PostgreSQL, SQLite입니다. 오픈소스가 아닌 것에서는 Oracle이 독보적
관계형 데이터베이스의 구성 요소
- TABLE(행, 열), VIEW(데이터를 선택하여 만든 가상의 부분 집합), INDEX(주소), SEQUENCE(시퀀스, 고유번호 자동생성), SYNONYM(시노임, 객체의 별칭) 등의 객체로 구성
- ENTITY, RELATIONE들의 집합
- 튜플(Tuple)은 테이블의 행
- 속성(Attribute)은 HTML로 따지자면 Table Heading 입니다. 여기서는 학번, 이름, 주소, 전화번호가 속성
- 도메인(Domain)은 하나의 속성에서 취할 수 있는 값의 범위를 말한다. 예를 들어 위에서는 신청 과목에서 전체 과목의 범위를 얘기
- 차수(Degree)는 속성의 개수 학생 릴레이션에서는 학번, 이름, 주소, 전화번호이니 총 4개가
- 기수(Cardinality)는 튜플의 개수 위에서는 어트리뷰트를 제외하고 총 5개의 튜플이 존재
키의 개념 및 종류
- 기본키는 메인으로 사용할 키를 말합니다. 고유한(유일한) 주민등록번호나, 계좌번호, 전화번호 등을 기본키로 사용할 수 있습니다. 기본키는 NULL을 사용할 수 없다.
- 후보키는 기본키를 제외하고 고유한 키들을 말한다.
- 외래키는 관계되어 있는 테이블에서 참고하고 있는 키를 얘기한다. 여기서 학생 릴레이션과 수강신청 과목 릴레이션은 서로 학번으로 연결되어 있다.
데이터베이스의 종류
- 계층형 데이터베이스(1:N)
- 망형 데이터베이스(N:M
- 관계형 데이터베이스(단순한 표 형태의 상호 관계, 1:1, 1:N, N:M관계 표현)
- 객체 지향형 데이터베이스
SQL(Structured Query Language)
SQL은 스토리지 언어의 표준, MySQL, MsSQL, Oracle, Postgres 등의 DB를 사용하여 어떤 프로젝트를 한다면 SQL을 다루실 수 있어야 한다.
SQL 명령어의 분류
- 데이터 조작어(DML)
- SELECT
- INSERT
- UPDATE
- DELETE
- 데이터 정의어(DDL)
- CREATE DATABASE
- CREATE TABLE
- CREATE INDEX
- ALTER DATABASE
- ALTER TABLE
- DROP TABLE
- DROP INDEX
- RENAME
- TRUNCATE
- 데이터 제어어(DCL)
- GRANT : 권한 부여
- REVOKE : 권한 제거
- 트랜젝션 제어어(TCL)
- COMMIT
- ROLLBACK
- SAVEPOINT
Data 분석 과정
- 사전에 데이터를 분석해야 하는 이유와 기획
- 1번에서 3번까지의 단계가 전체 과정에 70% ~ 80%를 차지
정형 데이터와 비정형 데이터
- 정형데이터는 RDBMS에서 사용하는 테이블 안에 들어가 있는 형식이 잡혀 있는 데이터를 말한다.
- 비정형 데이터(unstructured data, unstructured information, 비정형 정보), 비구조화 데이터, 비구조적 데이터는 미리 정의된 데이터 모델이 없거나 미리 정의된 방식으로 정리되지 않은 정보를 말한다.(출처 : WIKI)
SELECT Statement
select는 데이터를 조회하거나 산술식, 함수 등을 실행할 때 사용
*(에스터리스크, 별표)는 모든 항목을 다 출력할 때 사용
SELECT * FROM Customers;
여기서 원하는 컬럼만 출력하고 싶을 때에는 아래와 같이 사용
SELECT CustomerName, City FROM Customers;
아래와 같이 대괄호로 묶어줄 수도 있지만, 여기서는 묶어주지 않고 사용
SELECT [Address], [City] FROM Customers;
아래 보이시는 것처럼 일반 수식을 출력할 때에도 Select 구문을 사용
SELECT 1+1;
SELECT DISTINCT Statement
DISTINCT는 중복값을 제거
SELECT DISTINCT Country FROM Customers;
ORDER BY
출력 결과 정렬
- 오름차순 : ASC(기본, 작은 수에서 큰 수로, Ascending)
- 내림차순 : DESC(큰 수에서 작은 수로, Descending)
SELECT * FROM Customers ORDER BY CustomerID DESC;
SELECT * FROM Customers ORDER BY CustomerName ASC;
SELECT *
FROM Customers
ORDER BY CustomerID DESC;
SELECT *
FROM Customers
ORDER BY CustomerID ASC;
AS
별칭을 정한다. 기존 Table의 값은 변하지 않는다.
SELECT CustomerID AS 회원이름
FROM Customers;
SELECT CustomerID AS 회원이름, Country AS 나라
FROM Customers;
SELECT CustomerID 회원이름, CustomerName 이름 FROM Customers;
산술연산
더하고 빼고 나누고 곱하는 것이 가능
SELECT (CustomerID / 3) + 5 FROM Customers;
SELECT (CustomerID / 3) % 2 FROM Customers;
각각 컬럼끼리 연산도 가능
SELECT CustomerID + CustomerID FROM Customers;
해당 값은 0, 나누기를 하면 null로 반환 이어붙이려면 아래 있는 연결 연산자를 사용해야 한다.
SELECT CustomerName + CustomerName FROM Customers;
SELECT ProductName AS 제품이름, Price AS 기존가, Price*0.2 AS 할인된가격, Price*0.8 AS 최종가
FROM Products
연결 연산자
Oracle에서는 ||, MsSQL은 +, MySQL은 공백으로 연결 가능. CONCAT함수는 공통으로 사용 가능
SELECT Country || ' ' || City || ' ' || Address AS 주소 FROM Customers
SELECT ProductName AS 제품이름, Price || '가 ' || (Price*0.2) || '할인되어 ' || (Price*0.8) || '에 판매합니다!' AS 홍보문구
FROM Products;
논리 연산
우선순위는 NOT, AND, OR입니다. True는 1로, False는 0으로, and는 곱으로, or는 덧셈으로 이해하시면 계산이 쉽습니다. 뒤에서 나올 비교 연산자, WHERE 조건 절을 미리 사용. 비교 연산자는 같다(=), 다르다(!=), 크다(>), 작다(<)를 표현하는 연산자
- 기본실습
SELECT 1 OR 0;
SELECT NOT 0;
- SELECT 1 AND 0;
- AND
- SELECT * FROM Customers WHERE CustomerID LIKE '1%' AND City = 'London';
- OR
SELECT * FROM Customers WHERE CustomerID LIKE '1%' AND (City = 'London' OR City = 'Berlin');
- SELECT * FROM Customers WHERE CustomerID LIKE '1%' AND City = 'London' OR City = 'Berlin';
- NOT
SELECT * FROM Customers WHERE CustomerID LIKE '1%' AND (City != 'London' AND City != 'Berlin');
- SELECT * FROM Customers WHERE CustomerID LIKE '1%' AND NOT(City = 'London' OR City = 'Berlin');
- <>같지 않다.(IOS 표준)
- SELECT * FROM Customers WHERE CustomerID LIKE '1%' AND (City <> 'London' AND City <> 'Berlin');
BETWEEN 연산
A AND B : A와 B를 포함한 사이의 값
SELECT CustomerID, CustomerName
FROM Customers
WHERE CustomerID BETWEEN 30 AND 50;
SELECT CustomerID, CustomerName
FROM Customers
WHERE CustomerID >= 30 AND CustomerID <= 50;
IN 연산
IN A : A안에 값과 일치하는 값을 조회
SELECT CustomerID, CustomerName
FROM Customers
WHERE CustomerID IN (10, 20, 30);
LIKE 연산
- LIKE '비교문자'
- 비교 문자와 형태가 일치(%(모든 문자), _(한 글자) 사용)
- 대소문자를 안가림
- %는 와일드카드
만약 데이터가 Paullab, Paultest, Paulcode가 있다면 모두 검색만약 언더바가 3개라면 위 데이터 중 Paullab 만 출력 이런 문자열들은 와일드카드라고 부른다.SELECT CustomerID, CustomerName FROM Customers WHERE CustomerName LIKE 'Paul%';
- SELECT CustomerID, CustomerName FROM Customers WHERE CustomerName LIKE 'Paul___';
- 자주쓰는 예제
SELECT CustomerID, CustomerName FROM Customers WHERE CustomerName LIKE '%Paul%';
SELECT CustomerID, CustomerName FROM Customers WHERE CustomerID LIKE '1%';
- Paul이 들어가는 모든 값
IS NULL
- NULL 값을 갖는 값(0은 값이 있는 것이다.)
SELECT CustomerID, CustomerName
FROM Customers
WHERE CustomerID IS NULL;
bit 단위 논리연산자
차례대로 AND, OR, XOR
SELECT 1 & 0;
SELECT 1 | 0;
SELECT 1 ^ 0;
WHERE
- 조회하려는 데이터에 조건 부여
- 여러 연산자를 결합하여 사용 가능
- 결합 가능한 연산자의 종류 : 비교연산자(=, <, >, !=, >=, <=), SQL연산자(BETWEEN), 논리 연산자(AND, OR) 등
SELECT CustomerID
FROM Customers
WHERE CustomerID > 80;
SELECT *
FROM Customers
WHERE CustomerID > 80 AND Country='France';
SELECT CustomerID, CustomerName
FROM Customers
WHERE CustomerID=30;
SELECT CustomerID, CustomerName
FROM Customers
WHERE CustomerName='Godos Cocina Típica';
INSERT
INSERT INTO Customers (CustomerName, City, Country)
VALUES ('leehojun', 'jejusi', 'korea');
SELECT * FROM Customers;
- 문제 1번
SELECT * FROM Customers WHERE Country='korea' AND City='jejusi';
- 국적이 한국이면서, 제주시에 살고 있는 사람을
- 문제 2번
비어있는 문자열과 NULL값은 서로 다른 값/* SELECT * FROM Customers WHERE PostalCode=''; */ SELECT * FROM Customers WHERE PostalCode IS NULL;
- PostalCode값이 null 값인 사람
Null Values 찾아내기
SELECT *
FROM Customers
WHERE ContactName IS NULL;
is not 구문도 가능
SELECT *
FROM Customers
WHERE ContactName IS NOT NULL;
UPDATE
값을 바꾼다. 이 행위는 되돌릴 수 없으며 where로 여러개를 select하여 바꿀 수 있다.
UPDATE Customers
SET CustomerName='하르방', City='한라산', Country='선계'
WHERE CustomerID = 1;
SELECT * FROM Customers;
DELETE
WHERE 안적으면 다 삭제 된다.. 조심
DELETE FROM Customers WHERE CustomerName='hojun';
SELECT * FROM Customers;
TOP과 LIMIT
최 상단 3개의 행(row)을 보는 방법
SELECT TOP 3 * FROM Customers;
SELECT TOP 10 PERCENT * FROM Customers;
SELECT * FROM Customers
LIMIT 3;
CREATE, DROP
CREATE DATABASE sampledata_db;
CREATE TABLE sampledata_table;
DROP DATABASE sampledata_db;
DROP TABLE sampledata_table;
SHOW, DESC
mysql> SHOW databases; mysql> SHOW tables; mysql> DESC table_name;