데이터베이스의 필요성
In-Memory
데이터를 완전 보호할 수 없으며, 프로그램이 OFF 상태면 데이터를 받아 올 수 없다.
데이터 수명이 프로그래밍 수명에 의존한다.
(JavaScript의 경우 변수 등에 저장한 데이터가 프로그램의 실행에 의존!)
File I/O
데이터 필요 시점마다 전체 파일을 읽어야 해서 크기가 클수록 비효율적이다.
(+ 파일 손상이나 여러 파일을 동시에 다룰 때에도)
관계형 데이터베이스에서는 하나의 CSV 파일이나 엑셀 시트를 한 개의 테이블로 저장할 수 있다.
한 번에 여러 개의 테이블을 가질 수 있기 때문에 SQL을 활용해 데이터를 불러 오기 수월하다.
SQL
Structured Query Language
데이터베이스용 프로그래밍 언어로, 주로 관계형 데이터베이스에서 사용한다
MySQL, Oracle, SQLite, PostgreSQL 등 다양한 데이터베이스에서 SQL 구문을 사용할 수 있다.
쿼리
예시) 검색을 할 때 입력하는 검색어
저장되어 있는 데이터를 필터하기 위한 질의문
데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있다.
SQL은 데이터베이스 종류를 SQL이라는 언어 단위로 분류할 정도로 중요하다.
SQL을 사용하기 위해서는 데이터가 구조가 고정되어 있어야 한다 (NoSQL: 고정 X)
🌳 DB 생성과 사용 명령
CREATE DATABASE 데이터베이스_이름;
USE 데이터베이스_이름;
🌳 테이블 생성
CREATE TABLE user (
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(255),
email varchar(255)
);
🌳 테이블 정보 확인
모든 테이블 정보
SHOW TABLES
DESCRIBE user;
mysql> describe user;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| email | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
🌿 SELECT (+ DISTINCT)
실행 순서: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
SELECT DISTINCT Country FROM Customers;
SELECT CustomerId, AVG(Total)
FROM invoices
WHERE CustomerId >= 10
GROUP BY CustomerId
HAVING SUM(Total) >= 30
ORDER BY 2
- FROM: invoices 테이블에 접근
- WHERE: CustomerId 필드가 10 이상인 레코드들을 조회
- GROUP BY: CustomerId를 기준으로 그룹화
- HAVING: Total 필드의 총합이 30 이상인 결과들만 필터링
- SELECT: 조회된 결과에서 CustomerId 필드와 Total 필드의 평균값 구하기
- ORDER BY: AVG(Total) 필드를 기준으로 오름차순 정렬한 결과를 리턴
🌿 WHERE (선택)
- = 동일 데이터
- <> 특정 값 제외
- < > <= >=
- LIKE, \%, \* 필터
- IN 일치 데이터 필터
SELECT *
FROM Customers
WHERE NOT City = 'Berlin';
SELECT *
FROM Customers
WHERE City = 'Berlin' AND PostalCode = 12209;
WHERE City = 'Berlin' OR City = 'London';
🌿 ORDER BY
SELECT *
FROM Customers
ORDER BY City DESC;
ORDER BY Country, City;
🌿 INSERT INTO
INSERT INTO Customers (
CustomerName,
Address,
City)
VALUES (
'Hekkan Burger',
'Gateveien 15',
'Sandnes');
🌿 NULL
SELECT *
FROM Customers
WHERE PostalCode IS NOT NULL;
🌿 UPDATE SET
UPDATE Customers
SET City = 'Oslo', Country = 'Norway';
WHERE CustomerID = 32;
🌿 DELETE FROM
DELETE FROM Customers
WHERE Country = 'Norway';
🌿 MIN, MAX, COUNT, AVG, SUM
SELECT COUNT(*)
FROM Products
WHERE Price = 18;
🌿LIKE
SELECT *
FROM Customers
WHERE City LIKE 'a%'; a로 시작되는 레코드
WHERE City LIKE '%a'; a로 끝나는 레코드
WHERE City LIKE '%a%'; a가 포함된 레코드
WHERE City LIKE 'a%b'; a로 시작해서 b로 끝나는 레코드
WHERE City NOT LIKE 'a%'; a로 시작하지 않는 레코드
🌿Wildcards
SELECT * FROM Customers
WHERE City LIKE '_a%'; 두 번째 글자가 a인 레코드
WHERE City LIKE '[acs]%'; 첫 글자가 a, c 혹은 s인 레코드
WHERE City LIKE '[a-f]%'; 첫 글자가 a에서 f로 시작하는 레코드
WHERE City LIKE '[!acf]%'; 첫 글자가 a, c 혹은 f가 아닌 레코드
🌿 IN
SELECT *
FROM Customers
WHERE Country IN ('Norway', 'France'); or
WHERE Country NOT IN ('Norway', 'France'); and
🌿 BETWEEN
SELECT *
FROM Products
WHERE Price BETWEEN 10 AND 20;
WHERE Price NOT BETWEEN 10 AND 20;
WHERE ProductName BETWEEN 'Geitost' AND 'Pavlova'; alphabetically
🌿 AS
SELECT CustomerName, Address, PostalCode AS Pno
FROM Customers;
SELECT *
FROM Customers AS Consumers;
🌿 LIMIT
결과로 출력한 데이터 개수 지정, 가장 마지막에 추가
LIMIT 200
🌿 INNER JOIN, OUTER JOIN
- (INNER) JOIN: Returns records that have matching values in both tables
- LEFT (OUTER) JOIN: Returns all records from the left table, and the matched records from the right table
- RIGHT (OUTER) JOIN: Returns all records from the right table, and the matched records from the left table
- FULL (OUTER) JOIN: Returns all records when there is a match in either left or right table
SELECT *
FROM Orders
LEFT JOIN Customers
ON Orders.CustomerID = Customers.CustomerID;
SELECT *
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;
SELECT *
FROM Orders
RIGHT JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;
🌿 GROUP BY
그룹에 대한 작업이 없이(아래에서는 COUNT) 조회만 하면 그룹의 첫 번째 데이터만 표현된다.
- GROUP BY 구에 있는 컬럼은 반드시 SELECT 절에도 존재해야 한다.
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country;
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;
🌿 HAVING
GROUP BY 로 조회된 결과를 필터링한다.
- WHERE: 저장된 레코드 필터링 → 그룹화 전에 데이터를 필터해야 할 때 사용!
- HAVING: 그룹화한 결과 필터링
# invoices 테이블을 CustomerId로 그룹화하고 그 평균이 6을 초과한 결과를 조회
SELECT CustomerId, AVG(Total)
FROM invoices
GROUP BY CustomerId
HAVING AVG(Total) > 6.00
'Back-End > Database' 카테고리의 다른 글
정규화(Normalization) (0) | 2022.08.08 |
---|---|
SQL vs. NoSQL (0) | 2022.08.04 |
댓글