1월 11일 (수) - 모각소 1주차
정의 : 열(속성), 행(레코드, 튜플)으로 이루어진 정보를 저장하는 테이블
주요 기능 : 테이블 Join
SHOW DATABASES;
USE 데이터베이스_이름;
CREATE 데이터베이스_이름;
DROP DATABASE 데이터베이스_이름;
CREATE TABLE 테이블_이름(
Field명 DataType(데이터 자리수) 조건;
Field명 DataType(데이터 자리수) 조건;
Field명 DataType(데이터 자리수) 조건;
PRIMARY KEY(Field명)
);
CREATE TABLE topic(
id INT(11) NOT NULL AUTO_INCREMENT;
title VARCHAR(100) NOT NULL;
description TEXT NULL;
created DATETIME NOT NULL;
author VARCHAR(15) NULL;
profile VARCHAR(200) NULL;
PRIMARY KEY(id)
);
DESCRIBE 테이블_이름;
DESC 테이블_이름;
DROP TABLE 테이블_이름;
ALTER TABLE 테이블_이름 ADD 필드_이름 필드_타입;
ALTER TABLE Reservation ADD Phone INT;
ALTER TABLE 테이블_이름 DROP 필드_이름;
ALTER TABLE Reservation DROP RoomNum;
(INT → DATE, CHAR→INT 이런 경우)
ALTER TABLE 테이블_이름 MODIFY COLUMN 필드_이름 필드_타입;
ALTER TABLE Reservation MODIFY COLUMN ReserveDate VARCHAR(20);
SELECT * FROM 테이블_이름;
SELECT * FROM 테이블_이름 **WHERE field="내용"**;
SELECT * FROM Customers WHERE country='KR';
SELECT * FROM Customers WHERE id='asd111';
SELECT **COUNT(*)** FROM 테이블명 WHERE 필드명='내용';
// 해당 필드에서 값이 '내용'인 레코드 개수
SELECT * FROM 테이블이름 WHERE 필드명 **LIKE '%문자열%'**;
// 문자열 포함된 레코드 조회
SELECT * FROM 테이블이름 WHERE 필드명 **IN (A, B)**;
// 괄호 내의 일치하는 값이 있다면 조회
SELECT * FROM Costomers ORDER BY age;
// 오름차순 정렬 (Default)
SELECT * FROM Costomers ORDER BY age DESC;
// 내림차순 정렬
SELECT DISTINCT 필드명 FROM 테이블이름; // 해당 필드 기준으로 중복된 레코드제거
// Info 데이터베이스의 Users 테이블에서 userName이 'A'로 시작하는 레코드들의 userId, userName 필드 조회
SELECT userId, userName FROM Info.Users WHERE userName LIKE'A%';
// Customers 테이블에서 age가 25인 레코드의 개수 조회
SELECT COUNT(*) FROM Customers Where age='25';
INSERT INTO 테이블_이름(필드1, 필드2) VALUES(필드1, 필드2);
INSERT INTO Dest_테이블_이름 SELECT * FROM Source_테이블_이름;
INSERT INTO Dest_테이블_이름(필드1, 필드2, 필드3)
SELECT 필드1, 필드2, 필드4 FROM Source_테이블_이름;
// Customers 테이블에 userName은 John, age는 25인 레코드와 userName은 coco, age는 27인 레코드 추가
INSERT INTO Customers(userName, age) VALUES ('John', 25), ('coco', 27);
UPDATE 테이블_이름 SET 필드1=값1, 필드2=값2 WHERE 조건;
// Reservation 테이블에서 Name 필드 값이 '홍길동'인
// 모든 레코드의 RoomNum의 값을 2002로 변경
UPDATE Reservation SET RoomNum=2002 WHERE Name='홍길동';
DELETE FROM 테이블_이름 WHERE 조건;
// Reservation 테이블에서 Name 필드 값이 '홍길동'인 모든 레코드를 삭제
DELETE FROM Reservation WHERE Name='홍길동';
SELECT * FROM A LEFT JOIN B ON A.key = B.key;
SELECT * FROM A
LEFT JOIN B ON A.key = B.key
WHERE B.key IS NULL;
SELECT * FROM A RIGHT JOIN B ON A.key = B.key
SELECT * FROM A
RIGHT JOIN B ON A.key = B.key
WHERE A.key IS NULL
SELECT * FROM A
INNER JOIN B ON A.key = B.key
SELECT * FROM A
FULL OUTER JOIN B ON A.key = B.key
SELECT * FROM A
FULL OUTER JOIN B ON A.key = B.key
WHERE A.key IS NULL **OR** B.key IS NULL
→ NULL값 제외
// birthYear, birthMonth, birthday 값이 동일한 행 제외
SELECT **DISTINCT birthYear, birthMonth, birthday**
FROM Players
ORDER BY birthYear;
// COUNT 연산 후에 DISTINCT 연산 실행
SELECT DISTINCT COUNT(birthday)
FROM Players;
// birthday 값 중복 행 제외한 후에 COUNT 연산
SELECT COUNT(DISTINCT birthday)
FROM Players;
// sample 테이블에서 name으로 묶어서 name을 조회
SELECT name FROM sample GROUP BY name;
// name 값을 기준으로 그룹화되므로 DISTINCT와 같음
// ERROR
SELECT name, age, grade FROM sample GROUP BY name;
// 정상
SELECT name, SUM(age), AVG(grade) FROM sample GROUP BY name;
// emp 테이블에서 deptno 값이 20 또는 30인 행의 job값과 sal의 합계를
// job을 기준으로 sal의 합계가 5000 초과인 행 조회
SELECT job, SUM(sal) AS sum_sal, AVG(sal) AS avg_sal
FROM emp
WHERE deptno IN (20, 30)
GROUP BY job HAVING SUM(sal) > 5000 AND AVG(sal) > 2000
// HAVING절에서 AND, OR 연산자를 사용하여 여러 조건을 부여할 수 있음
// sample 테이블에서 a의 최솟값을 가진 행을 삭제
DELETE FROM sample
WHERE a=(SELECT MIN(a) FROM sample);
// 위와 같은 결과
// 서브쿼리를 변수로 사용할 수 있음
va = (SELECT MIN(a) FROM sample);
DELETE FROM sample WHERE a = va;
// a 값을 모두 최댓값으로 수정
UPDATE sample SET a = (SELECT MAX(a) FROM sample);
// sample1과 sample2의 행의 갯수를 sample에 넣는다
INSERT INTO sample VALUES(
(SELECT COUNT(*) FROM sample1),
(SELECT COUNT(*) FROM sample2)
);
// sample2에 no열의 값과 같은 행이 있으면
// sample1 테이블의 a값을 '있음'으로 갱신
UPDATE sample1 SET a = '있음'
WHERE EXISTS (
SELECT * FROM sample2 WHERE no2 = no
);
UPDATE sample1 SET a = '있음'
WHERE EXISTS (
SELECT * FROM sample2 WHERE sample2.no2 = sample1.no
);
DB의 구조와 제약조건에 관한 명세를 기술한 것
: 중복을 최소화하기 위해 데이터를 분해하는 작업
성능 향상을 위해 중복을 통합하는 기법
무결성 보존을 위해 적당한 정규화를 진행해야 함
X→Y : 릴레이션 R에서 X값을 알면 Y를 알 수 있고, X 값에 의해 Y 값이 달라질 때
작업 중 문제가 발생 → 변경사항을 취소하고 트랜잭션 종류
이전 Commit까지 복구
장점 : 데이터 무결성 보장