in-memory 는 휘발성 메모리고, File I/O 는 원하는 데이터만 가져올 수 없고, 항상 모든 데이터를 가져온 뒤 서버에서 필터링 필요하다보니 서버 부하가 많이 걸리는 단점이 발생했다. 이 단점을 보완하기 위해 나타난 것이 데이터베이스이다. 여러 기능을 갖고 있는 데이터를 효율적으로 관리하기 위한 서버다.
데이터베이스는 별도의 인터페이스가 존재하지 않기 때문에 아래와 같은 SQL 언어를 통해 데이터에 접근할 수 있다.
//모든 열을 출력하라
SELECT *
// employee 테이블에서
FROM employee
// 성별이 M인 데이터들을
WHERE gender = 'M';
ORM = JS도 가능
구조화된 쿼리 언어로 DB용 프로그래밍 언어다. DB에 쿼리를 보내서 원하는 데이터만 뽑아올 수 있다.
Query : 저장되어있는 정보를 필터하기 위한 질문
ex) 검색창에 적는 검색어도 쿼리의 일종
데이터베이스에서는 하나 혹은 그 이상의 'Table'이 존재하는데 각각의 테이블은 고유한 이름을 갖고 있다. 테이블 안에는 데이터가 기록된다.
//테이블에서 특정 열
SELECT column1, column2, ...
FROM table_name;
//테이블의 모든 열 검색
SELECT * FROM table_name;
SELECT 구문 외에도 UPDATE, DELETE 구문 등과 함께 사용할 수 있다.
SELECT column1, column2, ...
FROM table_name
//조건을 건다(필터링)
WHERE condition;
문자열 검색 시, 따옴표를 사용하지만 숫자의 경우 따옴표가 없어도 된다.
and, or은 원하는 만큼 추가할 수 있어서, 복잡한 필터링도 가능하다.
ORDER BY는 정렬 시, ascending 이 기본 값으로 매겨져 있다. ASC 순차 | DESC 역순정렬을 의미한다. ORDER BY 열1, 열2 일 경우, 열1이 정렬 기준이 된다.
테이블에 새로운 값을 넣는데 사용하는 구문으로, 2가지 방법이 있다. 예시
// 1.테이블의 특정 열에 넣는 경우 - 1:1 매핑
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
// 2.테이블의 모든 열에 값을 넣는 경우
// 컬럼 순서대로 빠짐없이 넣지 않으면 에러가 날 수 있으므로 전자 방법을 추천
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
필드 값이 NULL인 경우는 해당 필드가 '값이 없다' 즉, 해당 필드는 비어있다는 것(blank)을 의미한다. '0'이나 '공백'을 가진 필드랑은 다른 의미이다.
비교연산자(=,<> 등)로는 NULL 값을 판별할 수 없다. 꼭 IS
혹은 IS NOT
을 써줘야한다.
//IS NULL Syntax
SELECT column_names
FROM table_name
WHERE column_name IS NULL;
//IS NOT NULL Syntax
SELECT column_names
FROM table_name
WHERE column_name IS NOT NULL;
테이블 안의 데이터를 '갱신/수정' 한다.
단, 여기서 주의해야할 점은 UPDATE 문에서 WHERE 절을 주목한다. WHERE 절은 업데이트할 레코드를 지정한다. WHERE 절을 생략하면 표의 모든 레코드가 업데이트된다!
//테이블을 갱신한다
UPDATE table_name
// 아래의 값들로
SET column1 = value1, column2 = value2, ...
// 조건에 해당하는
WHERE condition;
테이블 안의 데이터를 삭제한다.
UPDATE와 마찬가지로 WHERE 절을 주목한다. WHERE 절은 삭제할 레코드를 지정한다. WHERE 절을 생략하면 표의 모든 레코드가 삭제된다!
DELETE FROM table_name WHERE condition;
SELECT COUNT(column_name)
FROM table_name
WHERE condition;
열에서 특정한 패턴을 찾을 때 사용할 수 있다.
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;
//a로 시작하지 않는 고객이름을 모두 표현하라.
SELECT * FROM Customers
WHERE CustomerName NOT LIKE 'a%';
// 고객이름이 a나 b로 시작하는 모든 열을 표시하라
SELECT * FROM Customers
WHERE (CustomerName LIKE 'b%' OR CustomerName LIKE 'a%');
// b로 시작하면서 세번째에 a가 위치한 고객이름을 가진 데이터를 표시하라
SELECT * FROM Customers
WHERE (CustomerName LIKE 'b%' AND CustomerName LIKE '__a%');
// O 나 M으로 시작하지 않는 도시 데이터를 나타내라
SELECT * FROM Customers
WHERE City LIKE '[!OM]%';
// 같은 결과
SELECT * FROM Customers
WHERE City NOT LIKE '[OM]%';
//Alias Column Syntax
SELECT column_name AS alias_name
FROM table_name;
//Alias Table Syntax
SELECT column_name(s)
FROM table_name AS alias_name;
// o = Orders의 약칭, c = Customers의 약칭
SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Customers AS c, Orders AS o
// Customers 테이블의 고객명이 A~ 이면서 ID가 OrderID가 같은 데이터를 추출
WHERE c.CustomerName='Around the Horn' AND c.CustomerID=o.CustomerID;
JOIN .. ON 구문은 2개 혹은 그 이상의 테이블을 합치는 명령어인데, 해당 테이블의 열들이 관련되어있다는 것을 기반으로 둔다.
참고 학습자료 : 생활코딩
지정한 열을 기준으로 그룹으로 묶어서 요약을 해준다. COUNT 등과 함께 쓸 수 있다.
SHOW DATABASES
를 통해 잘 생성되었는지 확인할 수 있다.CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
....
);
만약 기존에 만들어둔 테이블의 형태와 특정 데이터를 가져온 테이블을 제작하고 싶을 때도 만들 수 있다. 예시
CREATE TABLE new_table_name AS
SELECT column1, column2,...
FROM existing_table_name
WHERE ....;
// 열 추가
ALTER TABLE table_name
ADD column_name datatype;
// 열 삭제
ALTER TABLE table_name
DROP COLUMN column_name;
// 열 데이터 타입 수정
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
//DATA TYPE 수정
// int로 설정된 Age 열의 데이터 타입을 NOT NULL로 수정
ALTER TABLE Persons
MODIFY Age int NOT NULL;
//MySQL
ALTER TABLE Persons
ALTER City SET DEFAULT 'Sandnes';
select * from information_schema.table_constraints;
고유 숫자를 자동적으로 생성해주는 역할을 한다. 새로운 데이터가 들어올 때마다 1씩 증가한다.
CREATE TABLE Persons (
Personid int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
PRIMARY KEY (Personid)
);