🚩 SQL(Structured Query Language)

: 데이터에 구조화된 질문을 하는 언어

🔹쿼리(Query)

: SQL로 쓰인 데이터베이스에 명령을 내리는 문장


🔊MySQL 기준

🚩 데이터

: 컴퓨터가 처리할 수 있는 문자, 숫자, 소리, 그림 따위의 형태로 된 정보

🔹데이터 타입

🌲정수형 : 소수점이 없는 숫자 데이터
🧷DECIMAL, TININT, SMALLINT, MEDIUMINT, INT, BIGINT
🌲실수형 : 소수점이 있는 숫자 데이터
🧷FLOAT, DOUBLE, DECIMAL(총 자릿수, 소수점 자릿수)
🌲문자형 : 텍스트로 구성된 문자열 데이터
🧷CHAR(n), VARCHAR(n)-가변 길이, TEXT- CHAR, VARCHAR보다 크기 큼 등
🌲날짜형 : 날짜와 시간 데이터
🧷DATE, DATETIME, YEAR(n) n:2자리 연도, 4:4자리 연도, TIME, TIMESTAMP-현재 UTC시간, TIMESTAMPZ 등

❗ VARCHAR는 CHAR형보다 자원이 1 더 필요
  - 예를 들어 'abc'를 저정하려면 CHAR형은 3byte, VARCHAR형은 4byte 필요

❗ 숫자형, 문자형, 날짜형 데이터는 함수를 사용하여 서로 타입 변환이 가능하다.
🧷CAST(바꿀 데이터 AS 바꿀 타입), CONVERT(), DATE_FORMAT()


🚩 데이터베이스 요소

🔸테이블

: 데이터베이스에서 데이터의 형태를 정해 모아 놓은 저장 공간
: 행(로우)과 열(컬럼)로 이루어진 데이터 표

💭 테이블 구성요소

🍀컬럼(열) : 데이터를 저장하기 위한 툴
❗ 컬럼명과 데이터 타입은 테이블을 만들 때 미리 정해진다.
❗ 컬럼명은 동일한 테이블 내에서 중복될 수 없다.
❗ 테이블은 반드시 1개 이상의 컬럼을 가져야 한다

🍀값 : 컬럼에 속한 실제 데이터 값
❗ 컬럼의 데이터 타입만을 값으로 가질 수 있다.

🍀로우(행) : 관계된 값의 리스트
❗ 하나의 로우는 하나의 관계된 데이터를 의미한다.
❗ 같은 테이블 안에서 로우는 항상 동일한 구조를 갖는다.
❗ 로우를 단위로 데이터를 삽입한다.

🔸스키마(Schema)

: 테이블을 저장해두는 저장소

🪄 데이터베이스 생성 → 데이터베이스 내에 테이블 생성


🚩 쿼리 문법

✨쿼리에서는 기능적으로 대소문자 구분이 필요 없으나, 가독성을 위해 일반적으로 키워드나 함수명은 대문자, 사용자가 정의한 이름에는 소문자를 사용한다는 규칙이 존재

🔸DESC [테이블명];

: 테이블 구조를 볼 수 있음
: 필드명, 데이터 타입, NULL 조건 여부, KEY 여부, DEFAULT 설정 여부 등

🌈 DML(Data Manipulation Language)

: 데이터 조작어
: 데이터 검색, 삽입, 수정, 삭제 등에 사용
➡️ 수정, 삭제 시 신중해야 함
➡️ Safe Update 설정(LIMIT 설정), SELECT 문으로 변경할 대상 확인 후 진행
: 트랜잭션이 발생하는 SQL문
📌 SELECT, INSERT, UPDATE, DELETE

💫 SELECT

🔹데이터(컬럼) 가져오기

🧷SELECT [컬럼명], ~ FROM [데이터베이스명].[테이블명];
🧷USE [데이터베이스명]; SELECT [컬럼명], ~ FROM [테이블명];
🧷컬럼 전체 - SELECT * FROM [테이블명];

💫 INSERT

🔹데이터 삽입

: 모든 컬럼의 데이터 삽입 시 컬럼명 생략 가능
🧷데이터 하나 삽입
  - INSERT INTO [테이블명]([컬럼명1], [컬럼명2], [컬럼명2], ...)
    VALUES([컬럼1 값], [컬럼2 값], [컬럼2 값], ...);
❗ 컬럼 이름과 값의 개수가 일치해야 한다.

🧷데이터 여러 개 삽입
  - INSERT INTO [테이블명]([컬럼명1], [컬럼명2], [컬럼명3], ...)
    VALUES(([컬럼1 값], [컬럼2 값], [컬럼3 값]),([컬럼1 값], [컬럼2 값], [컬럼3 값]), ([컬럼1 값], [컬럼2 값], [컬럼3 값]) ...);

💫 DELETE

🔹데이터 삭제

🧷DELETE FROM [테이블명] WHERE [조건식];

💫 UPDATE

🔹데이터 수정

🧷UPDATE [테이블명] SET [컬럼명] = [새로운 값] WHERE [조건식];
❗Safe Update 설정


🌈 DDL(Data Definition Language)

: 데이터 정의어
: 데이터 베이스, 테이블, 뷰, 인덱스 등의 데이터 베이스 개체를 생성, 삭제, 변경에 사용
📌 CREATE, DROP, ALTER, TRUNCATE

💫 CREATE

🔹테이블 생성

🧷CREATE TABLE [테이블명] ([컬럼명1][데이터 타입], [컬럼명2][데이터 타입], ... );
❗하나의 데이터베이스 내에서 테이블 이름 이름 중복 불가

💫 ALTER

🔹테이블 이름 변경

🧷ALTER TABLE [테이블명] RENAME [새로운 테이블명];

🔹테이블 컬럼 타입 변경

🧷ALTER TABLE [테이블명] MODIFY COLUMN [컬럼명][새로운 데이터 타입];

🔹테이블 컬럼 이름, 타입 같이 변경

🧷ALTER TABLE [테이블명] CHANGE COLUMN [컬럼명][새로운 컬럼명][새로운 데이터 타입];

🔹테이블 컬럼 삭제

🧷ALTER TABLE [테이블명] DROP COLUMN [컬럼명];

💫 DROP

🔹테이블 삭제

🧷DROP TABLE [테이블명];
🧷테이블이 존재하면 삭제(ERROR 방지) DROP TABLE IF EXISTS [테이블명];

💫 TRUNCATE

🔹테이블 값만 삭제

🧷TRUNCATE TABLE [테이블명];

⚡DELETE vs DROP vs TRUNCATE

✔️DELETE(DML) : 테이블의 데이터만 삭제(스키마, 컬럼명 남아있음)
✔️TRUNCATE(DDL) : 테이블 구조(스키마)만 남기고 데이터 모두 삭제(테이블 초기화)
✔️DROP(DDL) : 테이블의 데이터, 구조까지 전체 삭제


🌈 DCL(Data Control Language)

: 데이터 제어어
: 사용자의 권한을 부여하거나 빼앗을때 사용
📌 GRUNT, REVORKE, DENY


🌈 데이터베이스 관련 문법

🔹데이터베이스 생성

🧷CREATE DATABASE [데이터베이스명];
❗데이터베이스 이름 중복 불가

🔹현재 존재하는 모든 데이터베이스 목록 출력

🧷SHOW DATABASES;

🔹[데이터베이스명]의 데이터베이스 사용

🧷USE [데이터베이스명];

🔹데이터베이스 삭제

🧷DROP DATABASE [데이터베이스명];
🧷데이터베이스가 존재하면 삭제(ERROR 방지)
  - DROP DATABASE IF EXISTS [데이터베이스명];

🔹사용중인 데이터베이스 인코딩 방식 확인

🧷SHOW VARIABLES LIKE "character_set_database"
🧷테이블 인코딩 방식 확인 - SHOW FULL COLUMS FROM [테이블명];

🔹 인코딩 변경

🧷ALTER DATABASE [테이블명] CHARACTER SET = ascii
🧷ALTER DATABASE [테이블명] CHARACTER SET = utf8
🧷테이블 인코딩 방식 변경
  - ALTER TABLE [테이블명] CONVERT TO CHARACTER SET [바꿀 인코딩 방식];


🌈 WHERE

🔹WHERE [조건식]

: 가져올 데이터의 조건을 지정해주는 키워드
: 조건식이 참(1)이 되는 로우만 선택(거짓-0)
🧷SELECT [컬럼명] FROM [테이블명] WHERE [조건식];

💭연산자 종류
🍀비교 연산자 : < , >, !=, =, >=, <=
🍀논리 연산자 : AND, OR, NOT
🍀BETWEEN : 특정 범위 내의 데이터를 선택할 때 사용하는 연산자
🧷[컬럼명] BETWEEN A AND B
🍀IN : 목록 내 포함되는 데이터를 선택할 때 사용하는 연산자
🧷[컬럼명] IN(A,B,...) = [컬럼명]=A OR [컬럼명] = B ...

🔹LIKE

: 특정 문자열이 포함된 데이터를 선택하는 연산자
🧷WHERE [컬럼명] LIKE [검색할 문자열]

💭와일드카드(검색할 문자열 구체화)
🍀% : 0개 이상의 문자
🍀_ : 1개의 문자


🌈 NULL

: 데이터 값이 존재하지 않는다면 표현
: 0 이나 공백이 아닌 알 수 없는 값을 의미

🔹IS NULL

: 데이터가 NULL인지 아닌지를 확인하는 연산자
🧷WHERE [컬럼명] IS (NOT) NULL
❗ [컬럼명] = NULL, [컬럼명] != NULL 사용 불가


🌈 SELECT 설정

🔹별칭 붙이기(Alias)

: 테이블 내의 실제 컬럼명은 변하지 않으며, 별명은 쿼리 내에서만 유효
🧷AS [컬럼 별명]
🧷SELECT [컬럼명] AS [컬럼 별명] FROM ~ ;

🔹LIMIT [로우 수]

: 가져올 데이터의 로우 개수를 지정하는 키워드
: 쿼리의 가장 마지막에 위치
: 만약 입력한 숫자가 전체 로우 수보다 크다면, 있는 로우까지만 가져옴
🧷LIMIT N : 가져올 로우 N개로 지정
🧷LIMIT N, M : N+1부터 M개 가져옴

🔹DISTINCT [컬럼명], DISTINCT([컬럼명])

: 중복된 데이터는 제외하고 같은 값은 한 번만 가져오는 키워드
🧷SELECT DISTINCT [컬럼명1], [컬럼명2] FROM ~ ;
→ 컬럼명1, 컬럼명2 둘 다의 중복을 제거한 값을 가져옴
🧷SELECT DISTINCT ([컬럼명1]), [컬럼명2] FROM ~ ;
→ 컬럼명1만 중복 제거


🌈 데이터 그룹화

🔹GROUP BY

: 컬럼에서 동일한 값을 가지는 로우를 그룹화하는 키워드
: 그룹 별 데이터를 집계할 때 사용
: 컬럼 번호로도 그룹화 가능
🧷GROUP BY [컬럼명]
❗GROUP BY가 쓰인 쿼리의 SELECT 절에는 GROUP BY 대상 컬럼과 그룹 함수만 사용 가능(대상 컬럼이 아닌 컬럼을 SELECT하면 에러 발생)

🔹HAVING

: 가져올 데이터 그룹에 조건을 지정해주는 키워드
: 조건식이 참이 되는 그룹만 선택
🧷HAVING [조건식]
❗HAVING 절의 조건식에는 그룹 함수 활용

🔹그룹 함수

: SELECT, HAVING 절에 사용
❗GROUP BY가 없는 쿼리에서도 사용 가능하며, 이때는 전체 로우에 함수 적용
🧷SUM() : 그룹의 합계를 구해주는 함수
🧷COUNT() : 그룹의 값 수를 세는 함수
🧷SUM() : 그룹의 합을 계산하는 함수
🧷AVG() : 그룹의 평균을 계산하는 함수
🧷MIN() : 그룹의 최솟값을 계산하는 함수
🧷MAX() : 그룹의 최댓값을 계산하는 함수

🔹ROLLUP

: 그룹 항목의 총합(총계)이나 각 그룹별 중간합계(소계)가 필요할 경우 사용
: 합계값만 추가하기 때문에 나머지 필드 이름 자리는 NULL값
➡️ IFNULL 함수를 통해 이름을 지정해줄 수 있음
🧷GROUP BY ~ WITH ROLLUP


🌈 ORDER BY

🔹ORDER BY

: 가져온 데이터를 정렬해주는 키워드
: 기본 정렬 규칙은 오름차순 ASC(생략 가능), 내림차순은 DESC
🧷ORDER BY [컬럼명] ASC/DESC - 컬럼명 기준으로 모든 로우 정렬
🧷ORDER BY [컬럼명1] ASC/DESC, [컬럼명2] ASC/DESC - 여러 컬럼 기준 정렬
🧷컬럼 번호(SELECT 절의 컬럼명 순서)로도 정렬 가능

🔹RANK

: 데이터를 정렬해 순위를 만들어주는 함수
: 공동 순위가 있으면 다음 순서로 건너 띔
: SELECT 절에 사용하며, 정렬된 순서에 순위를 붙인 새로운 컬럼을 보여줌(실제 데이터에 영향 X)
❗항상 ORDER BY와 함께 사용
🧷RANK() OVER (ORDER BY [컬럼명])

🔹DENSE_RANK

: RANK 함수와 비슷하나 공동 순위가 있어도 다음 순위를 뛰어넘지 않음

🔹ROW_NUMBER

: 공동 순위를 무시


🚩 쿼리 작성 순서, 실행 순서

🔸작성 순서

🪄 SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY

🔸실행 순서

🪄 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

profile
To be Data Analysist

0개의 댓글