나한테 필요한 SQL 정리

노요셉·2020년 9월 8일
0
post-thumbnail

insert 여러개
https://tomining.tistory.com/197

insert, update 한번에
https://hks003.tistory.com/494


SQL 고급 - 데이터형 변환, 내장함수
https://www.youtube.com/watch?v=4N8dsbKfF9g&list=PLVsNizTWUw7Hox7NMhenT-bulldCp9HP9&index=24

CAST, CONVERT 둘다 똑같음.

문자열 DATE형도 변환가능

숫자타입 -> 문자타입

암시적 형변환

MYSQL 내장 함수
IF문

CASE 연산자
CASE 뒤 값으로 분기가 되며 여기선 세 번째 WHEN이 수행되어 '십'이 반한되며,
해당사항이 없는 경우 ELSE 부분이 반환, END AS 뒤에 출력될 열의 별칭을 써주면 된다.

문자열함수

  • 문자의 아스키 값

  • 문자열 길이
    Bit 길이, Byte 길이, Char 길이

mysql utf-8 영문 3Byte 한글 9Byte

  • 문자열 이어붙이기
    CONCAT

인덱스

https://jojoldu.tistory.com/243

https://joont92.github.io/db/mysql-index/

데이터베이스 구조에서

page란?
8kb 단위의 블럭을 페이지라고 함. 이건 예전에 OS공부할때 봤던 용어같은데, 결과적으로 데이터베이스는 1MB에 128page를 저장할 수 있게 됩니다.
하나의 Row는 여러개의 page에 걸쳐서 저장될 수 없고, 단하나의 페이지에만 저장될 수 있습니다.
https://agreeable.tistory.com/entry/Database%EB%9E%80#:~:text=%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%8A%94%208KB%20%EB%8B%A8%EC%9C%84%EC%9D%98,%EC%97%90%EB%A7%8C%20%EC%A0%80%EC%9E%A5%20%EB%90%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.

레인지 스캔, 풀스캔

https://zorba91.tistory.com/292

https://d2.naver.com/helloworld/1155


BETWEEN, IN 연산자

출처: https://weicomes.tistory.com/m/176

BETWEEN 연산자는 범위에 해당하는 모든 인덱스 범위를 검색해야 한다. 비교 범위를 줄이지 못함.

IN 연산자는 여러개의 동등 비교(=)를 하나로 묶은 것과 같은 연산자라서 IN과 동등 비교 연산자는 같은 형태로 인덱스를 사용하게 된다.

BETWEEN이 선형으로 인덱스를 검색하는 것과 달리 IN은 동등 비교를 여러 번 수행하는 것과 같은 효과가 있기 때문에 dept_emp 테이블의 인덱스를 최적으로 사용할 수 있다.

IN 연산자에 사용할 상수 값을 가져오기 위해 별도의 SELECT 쿼리를 한번 더 실행해야 할 때도 있다. 서브쿼리의 결과를 IN 연산자에 사용한다면 더 나쁜 결과를 가져올 수 있다.

서브 쿼리의 외부가 먼저 실행되고, In은 체크 조건으로 사용되기에 느려지는 경우가 많다.

서브쿼리

출처: https://ttend.tistory.com/623

서브쿼리의 위치에 따른 명칭

스칼라 서브쿼리: select 문에 있는 서브쿼리

SELECT column1 = (SELECT column-name FROM table-name WHERE condition),
       column-names
  FROM table-name
 WEHRE condition

인라인 뷰: FROM절에 있는 서브쿼리 (table처럼 쓰임)
https://www.essentialsql.com/get-ready-to-learn-sql-server-22-using-subqueries-in-the-from-clause/

SELECT TerritoryID,
       AverageBonus
FROM   (SELECT   TerritoryID,
                 Avg(Bonus) AS AverageBonus
        FROM     Sales.SalesPerson
        GROUP BY TerritoryID) AS TerritorySummary
ORDER BY AverageBonus

서브쿼리: WHERE 절에 있는 서브쿼리
https://www.essentialsql.com/get-ready-to-learn-sql-server-21-using-subqueries-in-the-where-clause/

SELECT column-names
  FROM table-name1
 WHERE value IN (SELECT column-name
                   FROM table-name2 
                  WHERE condition)

서브쿼리 반환 값에 따른 서브쿼리 종류

  • Single-Row Subquery : 서브쿼리의 결과가 1행
  • Muliple-Row Subquery : 서브쿼리의 결과가 여러 행
  • Multi-Column Subquery : 서브 쿼리의 결과가 여러컬럼

Single-Row Subquery : 서브쿼리의 결과가 1행
쿼리 결과 row 한 개가 반환되고, 단일행 연산자 =, <>, <, > 등 연산자를 사용할 수 있음.

레퍼런스 : mysql 비교연산자 -
https://randa.tistory.com/entry/%EC%97%B0%EC%82%B0%EC%9E%902-MySQL-%EB%B9%84%EA%B5%90%EC%97%B0%EC%82%B0%EC%9E%90

Muliple-Row Subquery : 서브쿼리의 결과가 여러 행
다중행 비교 연산자들
IN : 동등 비교
> ANY: 최솟값 반환
< ALL: 최솟값 반환
< ANY: 최댓값 반환
> ALL: 최댓값 반환

https://ttend.tistory.com/621

Multi-Column Subquery : 서브 쿼리의 결과가 여러 컬럼
메인쿼리 WHERE 절과 서브쿼리에서 반환하는 컬럼수가 반드시 같아야 함.
https://www.w3resource.com/sql/subqueries/multiple-row-column-subqueries.php

select ord_num, agent_code, ord_date, ord_amount
from orders
where(agent_code, ord_amount) IN
(SELECT agent_code, MIN(ord_amount)
FROM orders 
GROUP BY agent_code);

서브쿼리 성능

https://jojoldu.tistory.com/520
좋은 성능을 내려면 최대한 Join을 사용할 것

profile
서로 아는 것들을 공유해요~

0개의 댓글