본문 바로가기
Back-End/Database

SQL

by 달의 조각 2022. 8. 4.

데이터베이스의 필요성

 

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
  1. FROM: invoices 테이블에 접근
  2. WHERE: CustomerId 필드가 10 이상인 레코드들을 조회
  3. GROUP BY: CustomerId를 기준으로 그룹화
  4. HAVING: Total 필드의 총합이 30 이상인 결과들만 필터링
  5. SELECT: 조회된 결과에서 CustomerId 필드와 Total 필드의 평균값 구하기
  6. 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

https://www.w3schools.com/sql/sql_join.asp

  • (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

댓글