데이터 베이스, 테이블 구조
데이터 베이스 (폴더)
┖ 테이블1 (파일)
┖ sheet (column1, value1 …)
┖ 테이블2 (파일)
┖ sheet (column1, value1 …)
6가지 핵심 키워드
- 핵심 쿼리 “작성” 순서 :
- SELECT > FROM > WHERE > GROUP BY > HAVING > ORDER BY
- 핵심 쿼리 “실행” 순서 :
- FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY
데이터 베이스
쿼리 | 의미 |
---|---|
CREATE DATABASE [데이터베이스 이름]; | 데이터베이스 만들기 |
SHOW DATABASES; | 모든 데이터베이스 조회하기 |
USE [데이터베이스 이름]; | 데이터베이스 사용 선언하기 |
DROP DATABASE [데이터베이스 이름]; | 데이터베이스 지우기 |
DROP DATABASE IF EXISTS [데이터베이스 이름]; | 데이터베이스가 존재한다면 지우기 |
테이블
쿼리 | 의미 |
---|---|
CREATE TABLE [테이블 이름] ( [컬럼 이름] [데이터 타입], [컬럼 이름] [데이터 타입],); | 테이블 생성하기 |
ALTER TABLE [테이블 이름] RENAME [새로운 테이블 이름]; | 테이블 이름 변경하기 |
ALTER TABLE [테이블 이름] ADD COLUMN [컬럼 이름] [데이터 타입]; |
새로운 컬럼 추가하기 |
ALTER TABLE [테이블 이름] MODIFY COLUMN [컬럼 이름] [새로운 데이터 타입]; |
기존 컬럼 타입 변경하기 |
ALTER TABLE [테이블 이름] CHANGE COLUMN [컬럼 이름] [새로운 컬럼 이름] [새로운 데이터 타입]; | 기존 컬럼 이름과 타입 변경하기 |
ALTER TABLE [테이블 이름] DROP COLUMN [컬럼 이름]; | 컬럼 지우기 |
DROP TABLE IF EXISTS [테이블 이름]; | 테이블이 존재한다면 지우기 |
TRUNCATE TABLE [테이블 이름]; | 테이블 값만 지우기 |
데이터 삽입, 삭제
쿼리 | 의미 |
---|---|
INSERT INTO [테이블 이름] ( [컬럼1 이름], [컬럼2 이름], [컬럼3 이름]) VALUES ([컬럼1 값], [컬럼2 값], [컬럼3 값]), ([컬럼1 값], [컬럼2 값], [컬럼3 값]), ([컬럼1 값], [컬럼2 값], [컬럼3 값]); |
데이터 여러 개 삽입하기 단, 항상 insert와 values의 리스트 내 갯수가 일치해야 합니다. |
DELETE FROM [테이블 이름] WHERE 조건식; | 데이터 삭제하기 |
UPDATE [테이블 이름] SET [컬럼 이름] = [새 값] WHERE 조건식; | 데이터 수정하기 |
기본 필수 쿼리 틀
작성 순서 | 데이터 입력 | 기능 |
---|---|---|
USE input; | input : 데이터 베이스 | 데이터 베이스 사용 선언 |
SELECT input1 AS input2 ★ GROUP BY가 쓰인 쿼리인 경우 SELECT 절은 GROUP BY 대상 컬럼과 그룹 함수만 사용 가능 | input1 : 컬럼, * , 데이터 input2 : 별명 (이름 표시) | 가져올 데이터 선택, 컬럼을 선택 |
FROM input | input : 테이블 | 가져올 테이블을 지정 |
WHERE | 조건식 (함수 가능) 비교, NOT, AND, OR, 컬럼 BETWEEN AND, 컬럼 IN (값, 값, 값) | 행을 필터링 (테이블 전체) 즉, 개별 행임 조건을 지정 (참이 되는 로우 선택) |
GROUP BY input | input : 컬럼 | 데이터 그룹화 |
HAVING | 조건식 (함수 가능) | 그룹을 필터링 (그룹화된 테이블) 즉, 결과 집합의 행 참이 되는 그룹만 선택 |
ORDER BY 1, [2] [DESC] | 컬럼1, [컬럼2] 단, 내림차순 DESC 복수 개의 컬럼 지정 컬럼 번호는 SELECT절의 컬럼 이름의 순서(1부터) | 데이터를 정렬 |
- 응용 쿼리 작성 틀
쿼리 위치 | 작성 순서 | 데이터 입력 | 기능 |
---|---|---|---|
필수 쿼리 | USE input; | input : 데이터 베이스 | 데이터 베이스 사용 선언, 미작성 시 FROM 절 데이터베이스.테이블이름 형식으로 표기 필수 |
필수 쿼리 | SELECT input1 AS input2 ★ GROUP BY가 쓰인 쿼리인 경우 SELECT 절은 GROUP BY 대상 컬럼과 그룹 함수만 사용 가능 |
- input1 : 컬럼, * , 데이터 - input2 : 별명 (이름 표시) |
가져올 데이터 선택, 컬럼을 선택 |
● SELECT 절 내 | [SELECT DISTINCT input] | input : 컬럼 | 중복을 제거 |
● SELECT 절 내 | RANK() OVER (ORDER BY input) AS DENSE_RANK() OVER (ORDER BY input) AS ROW_NUMBER() OVER (ORDER BY input) AS |
input : 컬럼 | 순위 매기기 , RANK : 공동 순위 있다면 순위가 건너 띔 (1, 2, 2, 4, 5) , DENSE_RANK : 공동 순위 있어도 순위 건너 띄지 않음 (1, 2, 2, 3, 4), ROW_NUMBER : 공동 순위 무시함, (1, 2, 3, 4, 5) |
● SELECT 절 내 | - 다양한 숫자 함수 : ABS, CEILING, FLOOR, ROUND 등 - 다양한 문자 함수 : LOCATE, LENGTH, RIGHT, LEFT 등 - 시간, 날짜 함수 : NOW, YEAR, MONTH, HOUR, MINUTE 등 |
함수(컬럼) | 연산 편의 제공 |
● SELECT 절 내 | - 다양한 집계 함수 : COUNT, SUM, AVG, MIN, MAX with GROUP BY |
집계함수(컬럼) | 그룹 내 연산 편의 제공 |
● SELECT 절 내 | IF() | (조건, 참값, 거짓값) | 하나의 조건으로 새 컬럼 반환 (조건 형식의 새로운 컬럼) |
● SELECT 절 내 | IF NULL() | (컬럼, NULL대신할 값) | 데이터가 NULL이라면 새로운 값을 반환 |
● SELECT 절 내 | CASE WHEN 1 THEN a WHEN 2 THEN b ELSE c END |
1, 2 : 조건식 / a, b, c : 조건에 해당하면 결과값 | 여러 개 조건으로 새 컬럼 반환 ※ CASE 컬럼이름 형식으로 작성할 경우 조건식이 아닌 컬럼과 비교하는 조건값으로 작성해야 함 ※ ELSE 문장은 생략 시 NULL값을 반환해 줍니다. |
✏︎ sub 쿼리 반드시** 괄호 안** | SELECT [컬럼 이름], ( SELECT [컬럼 이름] FROM [테이블 이름] WHERE 조건식 ) | 스칼라 서브 쿼리 반드시 결과값이 하나의 값 | |
필수 쿼리 | FROM input | input : 테이블 | 가져올 테이블을 지정 |
✏︎ sub 쿼리 반드시 괄호 안 | ( SELECT [컬럼 이름] FROM [테이블 이름] WHERE 조건식 ) AS [테이블 별명] | 인라인 뷰 서브쿼리 반드시 결과값이 하나의 테이블 반드시 별명을 가져야 함 | |
🄙 조인 쿼리 (공통) | INNER JOIN input1 ON input2 | - input1 : another 테이블 (FROM 내 테이블과 다른 테이블) -input2 : tableA.columnA = tableB.columnB (각 테이블에서 같은 이름의 컬럼 = KEY 컬럼 확인) |
같은 기준으로 테이블을 합칩니다. |
🄙 조인쿼리 (왼쪽 기준) | LEFT JOIN input1 ON input2 | - input1 : another 테이블 (FROM 내 테이블과 다른 테이블) - input2: tableA.columnA = tableB.columnB (각 테이블에서 같은 이름의 컬럼 = KEY 컬럼 확인) |
왼쪽 기준으로 테이블을 합칩니다. |
🄙조인쿼리 (오른쪽 기준) | RIGHT JOIN input1 ON input2 | - input1 : another 테이블 (FROM 내 테이블과 다른 테이블) - input2 : tableA.columnA = tableB.columnB (각 테이블에서 같은 이름의 컬럼 = KEY 컬럼 확인) |
오른쪽을 기준으로 테이블을 합칩니다. |
🄙 기타 조인 쿼리 | 1. LEFT JOIN 쿼리 UNION RIGHT JOIN 쿼리 2. CROSS JOIN 3. INNER JOIN ON | CROSS JOIN은 ON 키워드가 없어도 됨 SELF JOIN은 같은 테이블 간의 구분을 위해 AS(별명)가 필수이다. SELF JOIN은 SELECT 지정 시 '테이블.컬럼' 형식으로 지정해야 한다. |
1. OUTER JOIN : 두 테이블에 있는 모든 값 합치기 (중복 제외) 2. CROSS JOIN : 두 테이블에 있는 모든 값을 각각 합치기 (모든 경우의 수를 합친다) 3. SELF JOIN : 같은 테이블에 있는 값 합치기 |
행 쿼리 | [LIMIT input1 OFFSET input2] | - input1 로우 개수 - input2 로우 번호 (0부터) |
로우 개수를 지정 |
기본 쿼리 | WHERE | 조건식 (함수 가능) 비교, NOT, AND, OR, 컬럼 BETWEEN AND, 컬럼 IN (값, 값, 값) | 행을 필터링 (테이블 전체) 즉, 개별 행 조건을 지정 (참이 되는 로우 선택) |
● WHERE 절 내 | [LIKE] | 컬럼 LIKE 문자열 ex) “%e” 끝남, “%e%” 포함 , “ _e” 1개문자와 끝남 | 문자열 검색하기 |
● WHERE 절 내 | [IS NULL], [IS NOT NULL] | 컬럼 IS NULL, 컬럼 IS NOT NULL | NULL 값을 확인 |
✏︎ sub 쿼리 반드시 괄호 안 | WHERE [컬럼 이름] [연산자] ( SELECT [컬럼 이름] FROM [테이블 이름] WHERE 조건식 ) | 중첩 서브쿼리 반드시 결과값이 하나의 컬럼 연산자가 비교 연산자면 서브 쿼리는 하나의 값 주요 연산자면(IN, ALL,ANY) 서브 쿼리는 하나의 컬럼 단, EXISTS는 단독으로 쓰며, 결과값이 여러 컬럼이여도 됨 (값이 있는지 확인할 때 사용하는 연산자) | |
기본 쿼리 | GROUP BY input | input : 컬럼 | 데이터 그룹화 |
기본 쿼리 | HAVING | 조건식 (함수 가능) | 그룹을 필터링 (그룹화된 테이블) 즉, 결과 집합의 행, 참이 되는 그룹만 선택 |
정렬 쿼리 | ORDER BY 1, [2] [DESC] | 컬럼1, [컬럼2] 단, 내림차순 DESC 복수 개의 컬럼 지정 컬럼 번호는 SELECT절의 컬럼 이름의 순서(1부터) | 데이터를 정렬 |
※ 집계 함수는 그냥 사용할 경우 데이터 전체 로우에 적용되고 GROUP BY와 쓰인 경우 (피벗처럼)그룹별로 집계하는 함수로 적용된다.
※ COUNT(칼럼명) : 이것은 NULL값은 제외하고 나온다. (실제 값을 읽기에 속도가 느립니다) 즉, 해당 컬럼의 행이 몇 개인지 세는 경우
COUNT(*), COUNT(1) : 이것은 NULL값을 포함합니다. (데이터를 읽지 않고 레코드 수만 불러와 속도가 빠르다) 즉, 전체 행이 몇 개인지 세는 경우
※ 기타 조인 방법 중 OUTER JOIN는 우회하여 구현합니다. (MySQL 키워드에 없음)
※ SELECT 결과를 INSERT 하기
INSERTINTO 목적지테이블
SELECT *FROM 출발지테이블
※ 서브 쿼리
- 의미 : 하나의 쿼리 내 포함된 또 하나의 쿼리
- 서브 쿼리는 반드시 괄호 안에 있어야 합니다.
- SELECT, FROM, WHERE, HAVING, ORDER BY 절에 사용 가능합니다.
= 6가지 쿼리 중 GROUP BY를 제외한 쿼리에서 사용 가능합니다.
- INSERT, UPDATE, DELETE 문에도 사용 가능합니다.
- 서브쿼리에는 ; (세미 콜론)을 붙이지 않아도 됩니다.
※ From sub-query에 alias(as)가 반드시 붙는 이유 : From 절 안에 모든 테이블은 이름을 가져야 하기 때문에 파생 테이블인 서브 쿼리도 이름을 가져야 합니다.
※ ALL은 큰 값은 최대값 보다 크고 작은 값은 최소값보다 작으면 됨, ANY는 큰 값은 최소값보다 크고 작은 값은 최대값보다 작으면 됨
- JOIN과 UNION 차이
- 공통점 - 테이블의 데이터를 연결, 차이점 - 연결하는 방법이 다름
- UNION: 하나의 결과 세트만 나타난다. (Append result sets vertically)
- JOIN: 적어도 하나의 속성이 공통인 두 테이블 속성을 결합하고자 할 때 사용된다. (Append result sets horizontally)
- 쿼리와 쿼리 간 결과 합치기 (여러 테이블 한 번에 다루기)
형식 | 함수 | 설명 |
---|---|---|
[쿼리A] UNION [쿼리B] | UNIOIN | 각 쿼리의 결과 합을 반환하는 합집합 (중복제거) |
[쿼리A] UNION ALL [쿼리B] | UNION ALL | 각 쿼리의 모든 결과를 포함한 합집합 (중복제거 안함) |
- UNION 규칙
- 열의 개수와 순서가 모든 쿼리에서 동일해야 한다. 단일 결과 세트로 나오기 때문이다.
- 데이터 형식이 호환되어야 한다. 즉, 숫자면 숫자, 문자면 문자라는 조건이 성립되어야 한다.
- ORDER BY는 마지막에 [쿼리A]에서 가져온 컬럼으로만 가능
- 함수 만들기 (isStrong 으로 이해해보기)
- 프로시저(Procedure)란 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합
- Delimiter은 구문 문자를 정의하는 기능
- 프로시저 안의 세미콜론(;)으로 인해 여러 명령문으로 나눠지는 것을 막고 프로시저 자체를 하나의 명령문으로 묶어주기 위해서 Delimiter 를 사용
- 하나의 프로시저 전체를 서버로 보내기 위해서는 DELIMITER 를 이용해 구분자를 재정의해줘야 한다.
SET GLOBAL log_bin_trust_function_creators = 1;
DELIMITER//
CREATE FUNCTION isSTrong(attack INT, defense INT)
RETURNS VARCHAR(20)
BEGIN
DECLARE a INT;
DECLARE b INT;
DECLARE isstrong VARCHAR(20);
SET a = attack;
SET b = defense;
SELECT CASE
WHEN a + b > 120 THEN 'very strong'
WHEN a + b > 90 THEN 'strong'
ELSE 'not strong'
END INTO isstrong;
RETURN isstrong
END
//
DELIMITER ;
함수 삭제 : DROP FUNCTION isStorng;
'[Tools] > [SQL]' 카테고리의 다른 글
The SQL cheatsheet-Created (0) | 2024.01.29 |
---|
댓글