Backend 취업준비/SQL
SQL 기초
aammddkkzxc
2024. 2. 24. 00:06
- database (DB) : 전자적으로 저장되고 사용되는 관련있는 데이터들의 조직화된 집합
- DBMS : 사용자에게 DB를 정의하고 만들고 관리하는 기능을 제공하는 소프트웨어 시스템, DB를 정의하다 보면 부가적인 데이터가 발생한다(메타 데이터)
- meta data : 데이터를 설명하는 데이터, database를 정의하거나 기술하는 data, metadata 또한 DBMS로 저장/관리
데이터 베이스 시스템 과정 간단 정리
- 사용자나 프로그래머가 어플리케이션 사용
- 어플리케이션 프로그램에는 데이터 페이스에 접근하기 위한 여러가지 쿼리들이 존재
- 프로그램들이 쿼리를 날리게 되면 DBMS들이 쿼리를 받아서 쿼리가 어떤 의미인지 분석
- 요청을 처리하기 위해 데이터를 읽어오기 위한 부가적인 정보들을 확인한 후, 그 정보를 바탕으로 실제 요청받은 데이터를 찾아 어플리케이션으로 전송하는 형태로 동작
data model
- DB의 구조를 기술하는데 사용될 수 있는 개념들이 모인 집합
- DB구조를 추상화 해서 표현할 수 있는 수단을 제공한다
- 여러 종류가 있으며, 추상화 수준과 구조화 방식이 다르다(conceptual, logical, physical)
- logical data model 중에서 relational data model을 가장 많이 사용한다
RDMBS
관계형 데이터베이스는 테이블 간의 관계를 정의하여 데이터 사이의 연관성을 표현
- 1:1 관계: 한 개의 행이 다른 한 개의 행에 대응
- 1:N 관계: 한 개의 행이 다른 여러 개의 행에 대응
- N:M 관계: 여러 개의 행이 다른 여러 개의 행에 대응
schema
- data model을 바탕으로 database의 구조를 기술한 것
- schema는 db를 설계 할 때 정해지며 한번 정해진 후에는 자주 바뀌지 않는다
- schema를 보면 database의 구조가 어떤식으로 되어 있는지 전체 큰 그림을 알 수 있다
database state
- database에 있는 실제 데이터는 꽤 자주 바뀔 수 있다
- 특정 시점에 database에 있는 데이터를 database state 혹은 snapshot이라 한다
- 임의의 각 시점에서의 database state는 같을 수도 있고 다를 수도 있다
SQL
- three-schema architecture의 각각 레벨에서 사용되는 database language들로 DDL, DML 등이 있다
- 오늘날의 DBMS는 DML, DDL등이 따로 존재하기 보다는 통합된 언어로 존재
- 대표적인 예가 relational database language 의 SQL
- SQL이 모든 역할을 하게 된다
- 추가(Create), 조회(Read), 수정(Update), 삭제(Delete)의 앞 글자만 따서 CRUD라고 부르기도 한다.
RDBMS 대략 구조
- tuple
- 순서는 중요하지 않다
- 하나의 tuple에서 attribute의 순서는 중요하지 않다
- attribute
- atomic해야한다. (ex) 주소 : 서울특별시 강남구 => 쪼개기 가능, atomic하지 않음)
- 속성의 값은 속성 범위를 넘지 않는 값이어야 한다
- 속성이 NOT NULL로 명시됐다면 NULL을 값으로 가질 수 없다
- 속성의 값으로 null => 매우 중의적인 표현이 될수 있으므로 지양해야함
- 기본키 (Primary Key)
- relation의 tuple을 식별하기 위해 attribute의 부분집합을 key로 설정한다. 이를 기본키 라고 하고 한다.
테이블에서 유일해야하며 중복 값을 가질 수 없다. - 보통 데이터를 수정하거나 삭제하고, 조회할 때 사용되며 다른 테이블과 관계를 맺어 데이터를 가져올 수도 있다.
- 또한 기본키의 값은 수정되어서는 안되며 유효한 값이어야 한다. (null 불가)
- relation의 tuple을 식별하기 위해 attribute의 부분집합을 key로 설정한다. 이를 기본키 라고 하고 한다.
- Foreign Key
- 다른 relation의 PK를 참조하는 attribute set
- FK와 PK와 도메인이 같아야 하고 PK에 없는 values를 FK가 값으로 가질 수 없다
database vs schema
MySQL에서는 database와 schema가 같은 뜻을 의미
PostgreSQL에서는 schema가 database의 namespace를 의미
조회
- SELECT : 조회할 열을 지정
- *일 경우 열 전부 선택
- AS로 열에 별칭을 부여하여 조회할 수 있다. 원본 데이터엔 영향을 미치지 않는다
- DISTINCT로 중복을 제거하여 조회할 수 있다. 원본 데이터엔 영향을 미치지 않는다
- FROM : 조회할 테이블을 지정
- WHERE : 조회할 데이터를 필터링, 조건식이 뒤따름
삽입
- 행 삽입
- INSERT INTO 테이블명 (열 이름, 열 이름)
- VAKUES (열 값, 열값), (열 값, 열값);
한 행 삽입을 할 때 테이블의 모든 열의 값을 삽입할 필요는 없지만, 지정하지 않는다면 NULL값이 들어가게 되고, NOT NULL로 속성으로 설정한 열이라면 오류가 나게 된다.
- 조회 후 삽입
INSERT INTO students (name, age, address)
SELECT name, age, address FROM students WHERE age < 30;
수정
update : 수정할 테이블을 지정
set : 데이터 수정
where : 수정할 데이터를 필터링
UPDATE students
SET age = 10,
address = '서울특별시'
WHERE name = '정약용';
삭제
DELETE
FROM students
WHERE age BETWEEN 30 AND 33;
DELETE
FROM students; // 모든 행 삭제
SQL 내장 함수
SUM() : 숫자의 합 반환
AVG() : 숫자의 평균 반환
MAX() : 숫자의 최댓값 반환
MIN() : 숫자의 최솟값 반환
COUNT() : 행의 개수 반환
CONCAT() : 두 문자열을 연결
LENGTH() : 문자열의 길이를 반환
REPALCE() : 특정 문자열을 다른 문자열로 치환
NOW() : 현재 날짜와 시간 반환
그룹화
같은 값을 가진 행끼리 하나의 그룹으로 뭉치는 기능
SELECT 열, 집계함수
FROM 테이블
[WHERE 필터 조건]
GROUP BY 열
// 어떤 절을 기준으로 그룹화 할지 명시
// GROUP BY 절에 명시된 열은 SELECT 절에도 존재하여야 한다
HAVING
GROUP BY 절에 의해 생성된 그룹 중에서 원하는 조건에 부합하는 그룹 만을 선택
SELECT 열, 집계함수
FROM 테이블
[WHERE 필터 조건]
GROUP BY 열
HAVING 그룹 필터 조건
- GROUP BY 연산 후 HAVING절에 의해 필터링됩니다.
- 실행 순서: WHERE -> GROUP BY -> HAVING
ORDER BY
특정 기준에 따라 정렬하는 구문
SELECT 열, 집계함수
FROM 테이블
[WHERE 필터 조건]
GROUP BY 열
HAVING 그룹 필터 조건
ORDER BY 열 [ASC | DESC]
- ORDER BY 절에 기준이 될 열을 적는다
- ORDER BY에 명시된 열은 SELECT 절에 존재하지 않아도 된다. (GROUP BY와 차이점)
- 기본값 ASC(오름차순)
- DESC = 내림차순
AND 와 OR에서 주의사항
- AND가 OR에 비해서 우선 순위가 높다
- a = 1 OR a=2 AND b=1 OR b=2; 이 조건식은 다음으로 나뉨
- a=1
- a=2 and b=1
- b=2
- 이는 의도하지 않은 결과일 확률이 있음. => 괄호를 잘 사용하자.
출처