🚩 변수 선언

🧷SET @[변수명] = 변수값;
🧷SELECT @[변수명];
🧷SELECT @[변수명] := 변수 활용 계산식 ~;


🚩 JOIN

: 여러 개의 테이블의 데이터를 한 테이블에 합쳐서 보여줄 때 사용하는 키워드
: 의미가 같은 컬럼값을 기준으로 설정
📌INNER JOIN, LEFT JOIN, RIGHT JOIN, OUTER JOIN, CROSS JOIN, SELF JOIN

🔹INNER JOIN

: 두 테이블의 공통된 값만 출력(INTERSECT)
: 공통된 값이 없는 로우는 출력되지 않음
🧷SELECT ~ FROM [테이블명1]
  (INNER) JOIN [테이블명2]
  ON [테이블명1].[컬럼명1] = [테이블명2].[컬럼명2]
  WHERE 조건식;

🔹LEFT JOIN

: 왼쪽 테이블을 기준으로 왼쪽 테이블의 모든 값이 출력
: 오른쪽 테이블과 매핑되는 값이 없으면 NULL로 출력됨
🧷SELECT ~ FROM [테이블명1]
  LEFT JOIN [테이블명2]
  ON [테이블명1].[컬럼명1] = [테이블명2].[컬럼명2]
  WHERE 조건식;

🔹RIGHT JOIN

: 오른쪽 테이블을 기준으로 오른쪽 테이블의 모든 값이 출력
: 왼쪽 테이블과 매핑되는 값이 없으면 NULL로 출력됨
🧷SELECT ~ FROM [테이블명1]
  RIGHT JOIN [테이블명2]
  ON [테이블명1].[컬럼명1] = [테이블명2].[컬럼명2]
  WHERE 조건식;

🔹OUTER JOIN

: 두 테이블에 있는 모든 데이터를 출력(UNION)
: MySQL에는 OUTER JOIN 키워드가 없기 때문에 UNION 키워드 사용
🧷SELECT ~ FROM [테이블명1]
  LEFT JOIN [테이블명2]
  ON [테이블명1].[컬럼명1] = [테이블명2].[컬럼명2]
  WHERE 조건식;
UNION(중복은 제거됨)
🧷SELECT ~ FROM [테이블명1]
  RIGHT JOIN [테이블명2]
  ON [테이블명1].[컬럼명1] = [테이블명2].[컬럼명2]
  WHERE 조건식;

🔹CROSS JOIN

: 두 테이블에 있는 모든 데이터를 각각 합쳐서 출력
: 예를 들어 5개, 3개의 로우를 가진 두개의 테이블이 CROSS JOIN을 한다면 합쳐지는 테이블의 로우 개수는 15개
🧷SELECT ~ FROM [테이블명1]
  CROSS JOIN [테이블명2]
  WHERE 조건식;

🔹SELF JOIN

: 같은 테이블에서의 JOIN
🧷SELECT ~ FROM [테이블명1] AS a
  (INNER) JOIN [테이블명1] AS b
  ON a.[컬럼명1] = b.[컬럼명2]
  WHERE 조건식;


🚩 합집합 연산

🔸UNION
: SELECT 문의 결과 데이터를 하나로 합쳐서 출력
: 중복은 제거하여 출력
❗컬럼의 갯수와 타입, 순서가 같아야 함

🔸UNION ALL
: UNION과 비슷하나 중복을 제거하지 않고 출력


🚩 Sub Query

: 쿼리문 안에 있는 또 하나의 쿼리
: SELECT절, FROM절, WHERE절 등에 사용 가능

🔸SELET 절에서의 Sub Query

: 스칼라 서브쿼리
❗반드시 결과값이 하나의 값이여야 함
🧷SELECT [컬럼명], (SELECT [컬럼명] FROM ~)
   FROM ~;

🔸FROM 절에서의 Sub Query

: 인라인 뷰 서브쿼리
❗반드시 결과값이 하나의 테이블이여야 함
🧷SELECT [컬럼명]
   FROM (SELECT [컬럼명] FROM ~);

⚡ Sub Query vs HAVING 예시 비교

🍀Sub Query 사용

SELECT country.code, country.name AS country_name
		, city.name AS city_name, city.population
FROM (SELECT * FROM city WHERE population >= 800 ⁎ 10000) AS city 
JOIN country
ON country.code = city.countrycode;

🍀HAVING 사용

SELECT country.code, country.name AS country_name
		, city.name AS city_name, city.population
FROM country JOIN city
ON country.code = city.countrycode
HAVING city.population >= 800 ⁎ 10000;

✔️두 쿼리 모두 같은 결과 출력
하지만, 서브 쿼리를 사용하는 것이 JOIN 전에 필터링 된 테이블을 사용하므로 데이터의 수가 더 작음(자원 사용이 더 적음) ➡️ 더 효율적인 쿼리

🔸WHERE 절에서의 Sub Query

: 중첩 뷰 서브쿼리
❗반드시 결과값이 하나의 컬럼이여야 함
🧷SELECT [컬럼명]
   FROM ~
   WHERE [컬럼명][연산자] [서브 쿼리];

💭서브 쿼리에 사용하는 연산자
🍀비교 연산자
🍀IN
🍀ALL : A <(>) ALL([서브 쿼리]) : A가 모든 [서브 쿼리]의 결과값보다 크거나 작다.
🍀ANY : A <(>) ANY([서브 쿼리]) : A가 [서브 쿼리]의 결과값보다 하나라도 크거나 작다.
🍀(NOT) EXISTS : (NOT) EXSITS([서브 쿼리]) : [서브 쿼리]의 결과값이 존재한다.(존재하지 않는다.)


🚩 INDEX

: 테이블에서 데이터를 검색할 때 바르게 찾을 수 있도록 해주는 기능
: B - TREE 알고리즘 사용
: SELECT 시 WHERE 절에 들어가는 컬럼을 INDEX로 설정
: 여러 개 컬럼을 가지는 인덱스도 설정 가능

✔️장점
: 검색(READ) 속도증가

✔️단점
: CREATE, UPDATE, DELEATE 속도 감소
: 추가 저장공간 사용

🔸인덱스 생성

🧷CREATE INDEX [인덱스명] ON 테이블명;

🔸인덱스 확인

🧷SHOW INDEX FROM [테이블명];

🔸인덱스 삭제

🧷DROP INDEX [인덱스명] ON [테이블명];

🌈 실행계획

🔸EXPLAIN(실행계획)

: 쿼리를 실행하기 전에 쿼리가 어떻게 실행될 지에 대해서 알려줌
: 쿼리 실행 전에 실행될 쿼리가 오래 걸리는지 확인
🧷EXPLAIN SELECT ~ FROM ~ ;

profile
To be Data Analysist

0개의 댓글