데이터베이스 스키마
컴퓨터 과학에서 데이터베이스 스키마(database schema)는 데이터베이스에서 자료의 구조, 자료의 표현 방법, 자료 간의 관계를 형식 언어로 정의한 구조이다.
상세하게 말하면,
개체의 특성을 나타내는 속성(Attribute)과
속성들의 집합으로 이루어진 개체(Entity),
개체 사이에 존재하는 관계(Relation)에 대한 정의와
이들이 유지해야 할 제약조건들
을 기술한 것
쉽게 정리하여, DB내에 어떤 구조로 데이터가 저장되는가를 나타내는 데이터베이스 구조를 스키마라고 한다.
SQL 문법의 흐름
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
- LIMIT
문법의 해석
- FROM : 어느 테이블을 대상으로 할 것인지를 먼저 결정
- WHERE : 해당 테이블에서 특정 조건(들)을 만족하는 row들만 선별
- GROUP BY : row들을 그루핑 기준대로 그루핑합니다. 하나의 그룹은 하나의 row로 표현
- HAVING : 그루핑 작업 후 생성된 여러 그룹들 중에서, 특정 조건(들)을 만족하는 그룹들만 선별
- SELECT : 모든 컬럼 또는 특정 컬럼들을 조회, SELECT 절에서 컬럼 이름에 alias를 붙인 게 있다면, 이 이후 단계(ORDER BY, LIMIT)부터는 해당 alias를 사용할 수 있다.
- ORDER BY : 각 row를 특정 기준에 따라서 정렬
- LIMIT : 이전 단계까지 조회된 row들 중 일부 row들만을 추린다.
SQL 문법
- SELECT ~~ FROM ~~
SELECT는 선택이라는 단어처럼 데이터셋에 포함될 특성들을 특정한다. 그리고 FROM은 테이블과 관련이 있는 경우 필수로 명시해야 하는 명령어 이고 결과들을 도출해낼 데이터베이스 테이블을 명시한다.
SELECT 특성_1, 특성_2
FROM 테이블_이름;
-- 예시
SELECT customers.FirstName, customers.LastName
FROM customers;
- WHERE
필터 역할을 하는 쿼리문
- 특정 값과 동일한 데이터 찾기
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 = "특정 값";
-- 예시
SELECT customers.FirstName, customers.LastName
FROM customers
WHERE customers.FirstName = 'Helena';
- 문자열에서 특정 값과 비슷한 값들을 필터할 때에는 LIKE 와 '%' 혹은 '*' 를 사용한다.
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 LIKE "%특정 문자열%";
-- 예시
SELECT customers.FirstName, customers.LastName
FROM customers
WHERE customers.LastName LIKE '%han%';
- 리스트의 값들과 일치하는 데이터를 필터할 때에는 IN 을 사용한다.
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 IN ("특정값_1", "특정값_2");
-- 예시
SELECT customers.FirstName, customers.LastName
FROM customers
WHERE customers.LastName IN ('Hansen', 'Johansson');
- ORDER BY
돌려받는 데이터 결과를 어떻게 정렬하지에 대한 선택적 항목이다.
기본 정렬은 오름차순
SELECT *
FROM 테이블_이름
ORDER BY 특성_1 DESC;
-- 예시
SELECT *
FROM employees
ORDER BY employees.EmployeeId DESC;
- LIMIT
돌려받는 데이터 결과 갯수를 정할 수 있다. 쿼리문에서 사용을 할 때에는 마지막에 추가해야 한다.
데이터 결과 갯수를 200개 한정으로 정할 수 있다.
SELECT *
FROM 테이블_이름
LIMIT 200;
-- 예시
SELECT *
FROM customers
LIMIT 10;
- DISTINCT
유니크한 값들을 받고 싶을 때에는 SELECT 뒤에 붙여 사용할 수 있다.
SELECT DISTINCT 특성_1
FROM 테이블_이름;
-- 예시
SELECT DISTINCT employees.Title
FROM employees;
- JOIN
- INNER JOIN
SELECT *
FROM 테이블_1
JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B;
-- 예시
SELECT
c.FirstName || ' ' || c.LastName AS 'Customer Name',
e.Firstname || ' ' || e.LastName AS 'Employee Name'
FROM customers AS c
JOIN employees AS e ON c.SupportRepId = e.EmployeeId;
- LEFT OUTER JOIN
SELECT *
FROM 테이블_1
LEFT OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B
- RIGHT OUTER JOIN
SELECT *
FROM 테이블_1
RIGHT OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B
집계함수와 산술함수
집계함수
- 개수(COUNT)
- 최댓값(MAX)
- 최솟값(MIN)
- 평균값(AVG)
이 함수들처럼 어떤 컬럼의 값들을 대상으로 원하는 특징값을 구해주는 함수를 Aggregate Function, 우리말로는 집계 함수라고 한다.
산술함수
모든 값의 합을 구하는 SUM 함수,
모든 값의 표준편차를 구하는 STD 함수 등이 있다. 각각 다음과 같다.
- SUM 함수 - 합계
- STD 함수 - 표준편차
그런데 SQL에는 집계 함수 말고도, 단순한 산술 연산을 해주는 Mathematical Function들도 있다. 우리 말로 '산술 함수'라고 할 수 있고 산술 함수에는 다음과 같은 것들이 있습니다.
- ABS 함수 - 절대값을 구하는 함수
- SQRT 함수 - 제곱근을 구하는 함수
- CEIL 함수 - 올림 함수
- FLOOR 함수 - 내림 함수
- ROUND 함수 - 반올림 함수
이것 말고도 또 다양한 산술 함수들이 있는데 그밖의 다양한 산술 함수들이 궁금하신 분들은 이 링크를 참조하세요.
그렇다면 집계 함수와 산술 함수는 정확히 어떤 차이점이 있을까? 둘의 차이점은
(1) 집계 함수는 특정 컬럼의 여러 row의 값들을 동시에 고려해서 실행되는 함수이고
(2) 산술 함수는 특정 컬럼의 각 row의 값마다 실행되는 함수
라는 점이다.
함수
- DISTINCT 함수 : 중복값 제거
- COALESCE 함수 : NULL값 대체 EX) COALESCE(칼럼, '대체문자') 칼럼의 ROW가 NULL값일때 '대체문자'로 대체한다.
- IFNULL과 같음
- CASE 함수 : 프로그래밍의 IF와 유사 CASE 컬럼 이름
WHEN 값 THEN 값
WHEN 값 THEN 값
WHEN 값 THEN 값
ELSE 값
END - SUBSTRING(칼럼, 1, 2) : 문자의 일부만 추출, 칼럼열의 앞에서 1번째부터 2자리를 추출
- LENGTH 함수 : 문자열의 길이를 구함
- UPPER, LOWER 함수 : 문자열을 대문자, 소문자로 변환
- LPAD, RPAD 함수 : 문자열의 왼쪽 또는 오른쪽을 특정 문자열로 채워주는 함수
- EX) LPAD(age, 10, ’0’)는 age 컬럼의 값을, 왼쪽에 문자 0을 붙여서 총 10자리로 만드는 함수
- TRIM, LTRIM, RTRIM 함수 : 문자열의 공백을 제거하는 함수
group by - 그루핑
- 그루핑을 통해 생성된 각 그룹의 수치적인 특성을 집계함수를 이용해서 구할 수 있다.
- 그루핑 한 결과에 조건을 넣으려면 'HAVING' 함수 사용
이렇게 GROUP BY를 사용할 때는 지켜야하는 중요한 규칙이 하나 있다.
그건 바로 GROUP BY를 사용할 때는, SELECT 절에는
(1) GROUP BY 뒤에서 사용한 컬럼들 또는
(2) COUNT, MAX 등과 같은 집계 함수만
쓸 수 있다는 규칙이다. 이건 거꾸로 말해 GROUP BY 뒤에 쓰지 않은 컬럼 이름을 SELECT 뒤에 쓸 수는 없다는 말이다.
ROLLUP : 세부 그룹들을 좀더 큰 단위의 그룹으로 중간중간에 합쳐줍니다.
- GROUP BY 의 순서에 따라서 'WITH ROLLUP의' 결과도 달라진다.
- 원래 NULL값이 있는경우와 부분총계를 나타내기 위해 NULL값이 있는 경우를 구분하고 싶다면 'GROUPING' 사용한다.
'DB(DataBase)' 카테고리의 다른 글
[Hadoop] HDFS 기본 특징와 노드 종류 (0) | 2022.05.17 |
---|---|
[Hadoop] 하둡 특징 및 기본설명 (0) | 2022.05.17 |
DataBase 기초 _ 관계형 데이터베이스 (0) | 2021.07.23 |
DataBase 기초 _ SQL이란? (0) | 2021.07.23 |