기대된다..!
쿼리 배워보고 싶었어서 오늘은 기대되는 날이다 ㅎㅎ
# Database & SQL
- SQL의 주요 문법을 이해할 수 있다.
# SQL
- 조회, 삽입, 갱신, 삭제 구문을 자유자재로 사용할 수 있다.
- 조회 시 다양한 조건을 걸어 원하는 정보만 조회할 수 있다.
- 통계를 위한 쿼리를 만들 수 있다.
# 과제 / Learn SQL
- 사용권한과 소유자에 대해 이해하고 사용권한을 변경할 수 있다.
1. Prompt
- 키보드의 입력을 확인하고 편집할 수 있는 한 줄의 공간을 의미
2. 기본 명령어
- pwd (print working directory)
: 폴더 or 파일의 현재 위치를 출력
→ pwd
1. 데이터 베이스의 필요성
- In - Memory
: Java에서 데이터를 다룰 때에는 프로그램이 실행될 때만 존재하는 데이터가 있음
→ 이 데이터는 프로그램이 종료되면 사라짐
- File I/O
: 파일을 읽는 방식으로 작동하는 형태 (엑셀시트, CSV 파일 등)
- 관계형 데이터베이스
: 하나의 CSV파일이나 엑셀시트의 한 개의 테이블로 저장 가능
→ 한 번에 여러개의 테이블을 가지기 때문에 데이터를 불러오기 편함 (대용량 데이터 저장)
2. SQL
- SQL 이란?
: SQL (Structured Query Language)
→ SQL은 구조화된 쿼리 언어
- 쿼리 란?
: 쿼리(Query) → "질의문" 이라는 뜻을 가짐 (검색할때 입력하는 "검색어")
→ SQL을 사용하기 위해서는 데이터의 구조가 고정되어 있어야 함
- SQL vs NoSQL
: 데이터베이스는 관계형 데이터베이스(SQL)와 비관계형 데이터베이스(NoSQL)로 구분
이 둘은 만들어진 방식, 저장하는 정보의 종류, 저장방법 등에 차이가 있음
SQL | NoSQL | |
데이터 저장 (Storage) |
▪ SQL을 이용해서 데이터를 테이블에 저장 (스키마를 기반으로 정해진 형식에 맞게 데이터를 저장) ▪ 테이블의 구조와 데이터 타입을 사전에 정의 ▪ 정의된 형태와 맞는 데이터만 삽입 가능 ▪ 행(row)과 열(column)로 구성된 테이블에 데이터를 저장 ▪ 열은 하나의 속성, 행은 열의 데이터형식에 맞는 데이터가 저장됨 ▪ 특정한 형식을 지키기 때문에 데이터를 정확히 입력했다면 사용이 매우 용이 |
▪ key-value, document, wide-column, graph 등의 방식으로 저장 ▪ 데이터가 고정되어있지 않음 ▪ 데이터를 읽어올 때 특정한 형식에 따라 읽어옴 |
스키마 (Schema) |
▪ 고정된 형식의 스키마가 필요 ▪ 처리하는 데이터 속성별 열에 대한 정보를 미리 지정 ▪ 나중에 변경 가능 (데이터베이스 전체를 수정 or 오프라인으로 전환) ▪ 테이블 간의 관계를 직관적으로 파악할 수 있음 |
▪ 동적으로 스키마의 형태 관리 ▪ 행추가 즉시 새로운 열 추가가능 ▪ 개별 속성에 대해 모든 열에 대한 데이터를 반드시 입력하지 않아도 됨 |
쿼리 (Querying) |
▪ 테이블의 형식, 테이블 간의 관계에 맞춰 데이터를 요청해야 함 | ▪ 데이터 그룹 자체를 조회 |
확장성 (Scalability) |
▪ 수직 확장 (높은 메모리, CPU 사용) ▪ 여러 서버에 걸쳐 데이터베이스의 관계 정의 가능 ▪ 복잡하고 시간이 많이 소요됨 |
▪ 수평 확장 ▪ 서버를 추가로 구축 → 많은 트래픽 처리가 편리 ▪ SQL보다 상대적으로 저렴 |
대표적인 데이터베이스 |
MySQL, Oracle, SQLite, PostgresSQL, MariaDB | 몽고DB, Casandra |
사용 케이스 | ▪ 데이터베이스의 ACID 성질을 준수해야 하는 경우 (전자상거래 or 모든 금융 서비스 소프트웨어 개발) ▪ 소프트웨어에 사용되는 데이터가 구조적, 일관적인 경우 (많은 서버가 필요없고, 일관된 데이터 사용시) |
▪ 데이터의 구조가 거의(전혀) 없는 대용량의 데이터를 저장하는 경우 (정형화 되지 않은 많은 양의 데이터가 필요할 때) ▪ 클라우드 컴퓨팅 or 저장공간을 최대한 활용하는 경우 (데이터베이스의 확장성이 중요할 때) ▪ 빠르게 서비스를 구축하는 과정에서 데이터 구조를 자주 업데이트 하는 경우 (스키마를 미리 정하지 않아도 됨) |
3. SQL Basics
- 데이터베이스 관련 명령어
▪ 데이터베이스 생성(SQL Create DB)
CREATE DATABASE 디렉토리명;
▪ 데이터베이스 사용
USE 디렉토리명; → 해당 디렉토리로 이동
-----------------------------------------------------------------------------------------------
▪ 테이블 생성(SQL Create Table)
CREATE TABLE user (
id int PRIMARY KEY AUTO_INCTEMENT,
name varchar(255),
email varvhar(255)
);
▪ 테이블 정보 확인
DESCRIBE user;
SQL Drop DB
SQL Drop Table - TRUNCATE - DROP COLUMN
SQL Alter Table
SQL Not Null
SQL Unique
SQL Primary Key
SQL Foreign Key
SQL Default
SQL Auto Increment
SQL Dates
- 기본 쿼리문
▪ SELECT → 데이터셋에 포함 될 특성을 정의
SELECT 'hello world' → 일반 문자열
SELECT 2 → 숫자
SELECT 10+5 → 간단한 연산
SELECT * → 전부선택
SELECT 특성1, 특성2 → 여러개 선택
▪ DISTINCT → 특성에서 유니크한 값을 받고 싶을때
SELECT DISTINCT 특성1
FORM 테이블명 → 특성1을 기준으로 유니크한 값만 선택
-----------------------------------------------------------------------------------------------
SELECT
DISTINCT
특성1
,특성2
,특성3
FORM 테이블명 → 특성1, 특성2, 특성3의 유니크한 '조합' 값을 선택
▪ FORM → 테이블 관련 작업을 할 때는 반드시 입력(결과를 도출해 낼 테이블명 입력)
SELECT 특성
FORM 테이블명 → 선택 특성을 테이블에서 사용
-----------------------------------------------------------------------------------------------
SELECT *
FORM 테이블명 → 테이블의 모든 특성 선택
▪ WHERE → 필터역할 (선택적 사용 가능)
SELECT 특성1, 특성2
FORM 테이블명
WHERE 특성1 = '특정 값' → 특성1에서 특정 값과 동일한 데이터 찾기
-----------------------------------------------------------------------------------------------
SELECT 특성1, 특성2
FORM 테이블명
WHERE 특성2 <> '특정 값' → 특성2를 제외한 값 찾기
-----------------------------------------------------------------------------------------------
SELECT 특성1, 특성2
FORM 테이블명
WHERE 특성1 > '특정 값' → 특성1보다 작은 값 찾기
WHERE 특성2 <= '특정 값' → 특성2와 같거나 큰 값 찾기
-----------------------------------------------------------------------------------------------
SELECT 특성1, 특성2
FORM 테이블명
WHERE 특성1 LIKE '%특정 문자열%' → 특성1에서 특정 문자열이 포함된 값 반환
WHERE 특성1 LIKE '특정 문자열%' → 특성1에서 특정 문자열로 시작되는 값 반환
WHERE 특성1 LIKE '%특정 문자열' → 특성1에서 특정 문자열로 끝나는 값 반환
WHERE 특성1 LIKE '문자열B%문자열B' → 특성1에서 문자열A로 시작하고 B로 끝나는 값 반환
WHERE 특성1 LIKE '%_a%' → 특성1에서 두번째로 a가 포함된 값 반환
-----------------------------------------------------------------------------------------------
SELECT 특성1, 특성2
FORM 테이블명
WHERE 특성2 IN ('특정값1', '특정값2') → 특성2에서 리스트의 값과 일치하는 데이터 필터링
-----------------------------------------------------------------------------------------------
SELECT *
FORM 테이블명
WHERE 특성1 IS NULL → 값이 없는 경우 NULL 지정
WHERE 특성1 IS NOT NULL → 값이 없는 경우 제외
▪ ORDER BY → 돌려받는 데이터의 결과를 정렬하여 출력 (정렬기준 선택, 선택적 사용 가능)
SELECT 특성1, 특성2
FORM 테이블명
ORDER BY 특성1 → 오름차순 정렬
ORDER BY 특성2 DESC → 내림차순 정렬
▪ LIMIT → 결과로 출력할 데이터 개수 지정 (선택적 사용가능, 쿼리문 사용시 가장 마지막에 추가)
SELECT *
FORM 테이블명
LIMIT 200 → 데이터의 결과를 200개만 출력
▪ JOIN (INNER JOIN) → JOIN과 INNER JOIN은 기본적으로 같은 역할을 수행
SELECT *
FROM 테이블1
JOIN 테이블2 ON 테이블1.특성A = 테이블2.특성B → 둘 이상의 테이블을 서로 공통된 부분을 기준으로 연결
▪ OUTER JOIN → → 기준이 되는 테이블의 데이터는 모두 반환, 만약 비교하는 테이블에 일치하는 행이 없을 경우 NULL값 반환 (선택지가 다양함)
SELECT *
FORM 테이블명
LEFT OUTER JOIN 테이블2 ON 테이블1.특성A = 테이블2.특성B
→ 테이블1.특성A의 모든 데이터 + 테이블1.특성A의 데이터와 일치하는 테이블2.특성B의 데이터 반환
→ 왼쪽 테이블의 모든 행과 열을 포함하여 오른쪽 테이블과 조인
-----------------------------------------------------------------------------------------------
SELECT *
FORM 테이블명
RIGHT OUTER JOIN 테이블2 ON 테이블1.특성A = 테이블2.특성B
→ 테이블2.특성B의 모든 데이터 + 테이블2.특성B의 데이터와 일치하는 테이블1.특성A의 데이터 반환
→ 오른쪽 테이블의 모든 행과 열을 포함하여 왼쪽 테이블과 조인
▪ 여러 쿼리문 한 번에 써보기
: Brizil에서 온 고객을 도시별로 묶은 뒤, 각 도시수에 따라 내림차순 정렬, CustomerId에 따라 오름차순으로 정렬한 3개의 결과만 요청
SELECT c.CistonmerID, c.FirstName, count(c.City) as 'City Count'
FROM customers AS c
JOIN employees AS e ON c.SUpportRepId = e.EmployeeID
WHERE c.Country = 'Brazil'
GROUP BY c.City
ORDER BY 3 DESC, c.CustomerID ASC
LIMIT 3
// 같은 결과를 여러가지 다른 방법으로 표현 가능
-----------------------------------------------------------------------------------------------
▪ And, Or, Not
▪ Insert Into
▪ Null Values (IS NULL, IS NOT NULL)
▪ Update - SET
▪ Delete
▪ Count
▪ Wildcards
▪ Aliases
▪ Group By
4. ACID
- 트랜잭션 (Transaction)
: 여러 개의 작업을 하나로 묶은 실행 유닛
→ 성공과 실패, 두개의 결과만 존재하기 때문에 미완료된 작업 없이 모든 작업을 성공해야 함
- ACID
: 데이터베이스 내에서 일어나는 하나의 트랜잭션의 안전성을 보장하기 위해 필요한 성질
▪ 원자성 (Atomicity)
: 하나의 트랜잭션에 속해있는 모든 작업이 전부 성공 or 전부 실패 해서 결과를 예측할 수 있어야 함
→ 따라서 하나의 작업이 실패한다면 모든 작업이 실패로 간주되어야 함
▪ 일관성 (Consistency)
: 하나의 트랜잭션 이전과 이후에 데이터베이스의 상태는 이전과 같이 유효해야 함
→ 데이터베이스에서 데이터의 상태에 대한 일관성은 변하지 않아야 함
▪ 격리성, 고립성 (Isolation)
: 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 함
→ 동시에 여러 개의 트랜잭션이 수행될 때, 각 트랜잭션은 고립(격리)되어 있어 연속으로 실행된 것과 동일한 결과를 냄
▪ 지속성 (Duravility)
: 하나의 트랜잭션이 성공했다면, 해당 트랜잭션에 대한 로그가 남아 있어야 함
→ 만약 로그가 기록되기 전에 시스템이 종료된다면, 해당 작업은 실패하고 실행 이전 상태로 돌아감
5. SQL vs NoSQL
- 쿼리 란?
: 쿼리(Query) → "질의문" 이라는 뜻을 가짐 (검색할때 입력하는 "검색어")
데이터베이스 용 프로그래밍 언어
데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있음
SQL은 데이터가 구조화된 테이블을 사용하는 데이터베이스에서 활용가능
→ SQL을 사용하기 위해서는 데이터의 구조가 고정되어 있어야 함
1. SQL Quiz
With SQL, how do you select a column named "FirstName" from a table named "Persons"?
With SQL, how do you select all the records from a table named "Persons" where the value of the column "FirstName" starts with an "a"?
How can you change "Hansen" into "Nilsen" in the "LastName" column in the Persons table?
2. SQL Practice
Use the NOT keyword to select all records where City is NOT "Berlin".
SELECT * FROM Customers
WHERE NOT City = 'Berlin';
Select all records from the Customers table, sort the result alphabetically, first by the column Country, then, by the column City.
SELECT * FROM Customers
ORDER BY Country, City;
Insert a new record in the Customers table.
INSERT INTO Customers (
CustomerName,
Address,
City,
PostalCode,
Country)
VALUES (
'Hekkan Burger',
'Gateveien 15',
'Sandnes',
'4306',
'Norway');
Select all records from the Customers where the PostalCode column is empty.
SELECT * FROM Customers
WHERE PostalCode IS NULL ;
Update the City value and the Country value.
UPDATE Customers
SET City = 'Oslo',
Country = 'Norway'
WHERE CustomerID = 32;
Delete all the records from the Customers table where the Country value is 'Norway'.
DELETE FROM Customers
WHERE Country = 'Norway';
Use the MIN function to select the record with the smallest value of the Price column.
SELECT MIN(Price)
FROM Products;
Use the correct function to return the number of records that have the Price value set to 18.
SELECT COUNT(*)
FROM Products
WHERE Price = 18;
Use an SQL function to calculate the average price of all products.
SELECT AVG(Price)
FROM Products;
Select all records where the first letter of the City is an "a" or a "c" or an "s".
SELECT * FROM Customers
WHERE City LIKE '[acs]%';
# 버전 관리 시스템 - Git
# Git 설치
# Git Workflow
# Pair - Simple Git Workflow
# Checkpoint - Git Command
↓ 이전 글 ↓
↓ 코트스테이츠 부트캠프 관련 글 한번에 보기 ↓
[코드스테이츠] 05_30_TIL : Spring Framework 기본 (0) | 2023.05.30 |
---|---|
[코드스테이츠] 05_25_TIL : (0) | 2023.05.25 |
[코드스테이츠] 05_23_TIL : 네트워크 _ HTTP (0) | 2023.05.23 |
[코드스테이츠] 05_22_TIL : 네트워크 _ 웹 애플리케이션의 작동원리 (0) | 2023.05.23 |
[코드스테이츠] 05_19_TIL : 알고리즘/자료구조 _ Algorithm with Math (순열/조합) (0) | 2023.05.19 |