-
중급 (1)SELECT 쿼리 수행 순서, semantic error, syntax error, *io비용, 계층형쿼리, LIKE % _DB/SQL 2023. 2. 11. 13:21
---
https://youtube.com/playlist?list=PLyQR2NzLKOCbOYNJHKpCax4ija38yCqBN
이거 보는 중
---
(37/44)
https://youtu.be/eeq0wDl3bLs - SELECT 쿼리 수행 순서
select쿼리를 날렸을 때
DB가 내부적으로 이거를 어떤 순서대로 수행을 하는지---
결론
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
순서를 알고서 하면 더 효율적이고 손쉽게 쿼리를 작성할 수 있기 때문에
▽alias같은거 뒷문장에서 준 것 같은데 왜 앞에서 먹히는지에 대한
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
이렇게 작성을 했다고 해서 db가 내부적으로 위에서부터 쭈욱 수행을 하는게 아니에요
처음에는 from절로 감
(1)여기 적혀있는 테이블들이 정말로 존재하는 테이블인지를 확인함
(2)select권한이 있는지도 체크 -> 없으면 semantic error(업데이트 권한이 없을때도 이 error)
*syntax error - 구문오류 : 오타, 쉼표빠진거
from절을 체크해서 어떤 테이블을 액세스 해야하는지를 확인을 하고다음에는 where절로 내려갑니다
where절에서 어떤 조건들이 있는지를 체크,그래서 테이블에서 이 조건에 맞는 로우들을 갖고 옴
그 다음 group by
내가 갖고온 row들을 어떤 방식으로 group by 할건지 체크
그리고 having절
내가 group by한 것중에 혹시 버려야할 데이터들이 있는지 등을 체크
이제야 비로소 select절로 올라감
내가 갖고 온 row중 어떤 컬럼들을 출력해야 하는지 체크
*여기서 체크 포인트, 컬럼을 전부 다 가져오고 난 다음에 select절을 체크하기 때문에(레코드는 where로 걸러)
select * from한거랑
select에서 컬럼 하나만 가져온거랑 사실상 드는 비용 io비용이 같다
만약 select절에 있는 컬럼들이 모두 인덱스에 담겨있다라고 할 때는 조금 다른 문제지만 index 제외하고 생각해보면 select절에 컬럼이 하나 있든 열개 있든 드는 io비용은 같다
맨 마지막 order by
다 갖고 왔다고 생각 됐을 때 정렬
*order by절이 select절보다 더 늦게 수행되기 때문에 select절에서 컬럼에 alias를 지정해 놨을 경우에
우리가 보통 집계함수 같은거 사용할 때 count하거나 sum같은거 사용할 때 alias를 많이 지정해놓는데
그런걸 order by절에서는 사용을 할 수가 있음
하지만 group by는 select절보다 먼저 수행돼서 select절에 alias지정해 놓은것을 group by에서는 사용을 할 수가 없음.
---
댓글 : 영상에서 설명하는 수행순서는 논리적인 수행 순서임을 밝힙니다. 물리적인 수행순서는 옵티마이저에 의해 달라질 수 있으니 참고해 주세요~
댓글 : 쿼리를 보니 mysql 계열 사용하시는 것 같은데요, mysql이나 Postgres에서는 예외적으로 group by 나 having절에 alias 사용을 지원하고 있습니다. 하지만 논리적인 수행 순서가 바뀌는 것은 아니고 옵티마이저 내부적으로 age를 TRUNCATE~~~ 로 바꿔서 수행을 시켜줘요!
댓글 : ordered는 select의 논리적 수행순서가 아닌 테이블 join 시 드라이빙 테이블을 정해주기 위해 쓰이는 힌트입니다. 약간 개념이 달라요!
댓글 :
Q.
A.
connect by 절에 오는 prior 컬럼 = ? 조건은 계층을 이루면서 체크해 나가는 조건입니다. start with 절을 도출한 후 다음 계층으로 넘어갈 때 앞서 도출된 row의 N1값이 N2의 값과 같은 row를 찾아야 하는데 and prior c2='B' 조건이 하나 더 있으므로 앞서 도출된 row의 c2값까지 체크를 해야합니다. 그런데 앞의 row의 c2값은 A이므로 조건에 위배되고 계층은 첫번째 row에서 멈추게 되는거죠.
Q.그런데, AND PRIOR C2='B'랑요 그냥 AND C2='B'랑 같다고 봐야되나요?
A.아니요~ prior c2는 이전 row 그냥 c2는 현재 row예요!
Q.아.. C1='B'행이 시작위치인데, 시작행 지나고 다음 행으로 넘어갈때 다음행에서 PRIOR C2=''B' 조건을 만족하지 않아서(C2값이 'A'니까) 멈추니까 시작 행인 C1='B'인 행만 도출된다는거죠??
A.네!
---
(1/44)
https://youtu.be/CH6SkbI2aVo - LIKE에 %만 쓰는줄 알았지?
댓글 :
Q._(언더바) 문자 자체를 검색할 때는 어떻게 하는지도 알려주세요.
A.
'_' 혹은 '%'가 포함된 문자를 검색하고 싶을 때는 ESCAPE를 지정해서 쿼리를 작성할 수 있습니다.
_가 포함된 문자를 검색 SELECT * FROM LIKE_TEST WHERE NAME LIKE '%\_%' ESCAPE '\';
%가 포함된 문자를 검색 SELECT * FROM LIKE_TEST WHERE NAME LIKE '%\%%' ESCAPE '\';
같은 방식으로 맨 앞이나 뒤에 해당 기호가 포함된 문자를 검색할 수도 있으며 ESCAPE는 다른 기호나 문자로도 지정 가능합니다.
Q.쿼리 속도 관련해서 조회조건에 LIKE '%' 형태로 쓰는 걸 조심하라고 들었던 것 같은데 같은 LIKE 절이어도 '%'를 쓰는 것과 '_'를 사용하는 것이 효율성이나 수행속도 측면에서 차이가 있나요..?
A.음.. 속도면에서 주의해야하는 경우는 해당 컬럼이 인덱스 컬럼인 경우 like로 첫 문자부터 찾지 않을때입니다. 아래 영상을 보시면 도움이 되실 것 같아요! https://youtu.be/uO8tL0okg7Q - 중급 (2)에 있 index영상
---
우리가 데이터에서 특정 문자가 포함된 데이터만 골라내기 위해서 LIKE명령어를 씁니다
보통 %기호를 쓰는데 _도 쓸 수 있습니다
SELECT * FROM LIKE_TEST WHER NAME LIKE '정%';'정'으로 시작하는
SELECT * FROM LIKE_TEST WHER NAME LIKE '%나';
'나'로 끝나는
SELECT * FROM LIKE_TEST WHER NAME LIKE '%미%';
'미'가 포함된
_는 한 자리수를 의미한다
SELECT * FROM LIKE_TEST WHER NAME LIKE '정__';
정**
SELECT * FROM LIKE_TEST WHER NAME LIKE '정_';
정*
SELECT * FROM LIKE_TEST WHER NAME LIKE '_나';
*나
SELECT * FROM LIKE_TEST WHER NAME LIKE '__나';
**나
SELECT * FROM LIKE_TEST WHER NAME LIKE '_미_';
*미*, 3글자
SELECT * FROM LIKE_TEST WHER NAME LIKE '*리__';
크리스탈이 나옴, 리 다음에 두글자가 오는
*스_로 해도 크리스탈이 나오지만 *스__ 언더바 두개하면 안나와
'DB > SQL' 카테고리의 다른 글
중급 (3-1)통계, group by실전, rollup, cube, union all (0) 2023.02.19 중급 (2)INSERT ALL, INSERT FIRST, EXISTS (0) 2023.02.13 초급 (9)SUBSTR, REPLACE, UPPER, LOWER, GREATEST, LEAST, TRUNC, 게시판의ERD, DUAL (0) 2023.02.11 초급 (8)SYNONYM&오류가능성, 계정 개념, 정규화, 반정규화 (0) 2023.02.11 초급 (7)NVL(+컬럼추가시주의), NULLIF, COALESCE, 엑셀데이터import, UNION & UNION ALL, SORT를 발생시키는 명령어 (0) 2023.02.11