DB/SQL4 [SQL] ORDER BY와 JOIN 사용 시 정렬 제대로 안됨... 개발 중 ORDER BY가 정상적으로 작동하지 않는 상황이 발생했다. 검색해보니 서브쿼리 내에서 ORDER BY를 사용하고 JOIN을 걸면 이런 문제가 발생한다고 한다. A 테이블 내 쿼리 실행-> B 테이블 내 쿼리 실행 -> 두개 테이블 조인 -> 조건에 부합하는 데이터 체크 -> 정렬 -> 출력 이게 이상적인 순서라면 서브쿼리 내에서 사용했을 때는 A 테이블 내 쿼리 실행-> A 테이블 정렬 -> B 테이블 내 쿼리 실행 -> 두개 테이블 조인 -> 조건에 부합하는 데이터 체크 -> 출력 이렇게 작동한다는 것이다. 해결 방법은 ORDER BY를 가장 바깥쪽으로 빼주는 것이다. 어떤 글에선 limit를 걸면 해결이 된다는데 내 경우엔 변화가 없었다. 원인은 잘 모르겠다... 이거 때문에 CS 들어오고.. DB/SQL 2022. 10. 9. [MySQL] SELECT ~ FOR UPDATE 란? SELECT ~ FOR UPDATE 란 SELECT ~ FOR UPDATE 는 선택된 행들에 대해 배타적으로 LOCK을 거는 것이다. 즉 "데이터 수정하려고 SELECT 했어. 건드리지마 !" 와 같은 뜻이다. 위와 같은 경우 동시제어가 필연적으로 필요하다. 은행의 예금 및 통장의 잔액 변경 시 일관성을 유지하기위해, 영화 및 공연장의 특정 좌석을 예약하기 위해 사용한다. SELECT FOR UPDATE를 사용하지 않으면 다른 세션에서 업데이트를 하고 있어도 같은 행을 조회가능하며, COMMIT을 하기 전까지는 결과가 반영되지 않는다. SELECT ~ FOR UPDATE 의 옵션 SELECT ~ FOR UPDATE: 누군가가 LOCK 중이면 무한정 기다려야 한다. SELECT ~ FOR UPDATE NO.. DB/SQL 2022. 10. 2. LEFT JOIN 시 주의할 점 left join(혹은 left outer join) 시 주의할 점에 대해 알아보자. left join 시 왼쪽에 있는 테이블에만 집중해서 실수를 할 수 있다. left join은 왼쪽 테이블을 기준으로 오른쪽 데이터를 불러오는 것이다. 그런데 여기에는 함정이 있다. 위와 같은 결과를 얻고자 한 상황이다. 위 예시는 N:1 관계이다. 그런데 1:N 관계가 되면 전체 행의 개수가 왼쪽 테이블의 행 개수보다 늘어나고 중복 데이터가 발생한다. 그러므로 left join 시 distinct나 group by로 중복제거를 해야 한다. 데이터를 검증할 때 count를 이용해서 행의 개수가 맞는지 확인하는 방식을 사용한다. 틀릴 이유가 없는데 행의 개수가 다른 경우 이런 함정에 빠진 케이스가 많았다. 위의 사항에 유.. DB/SQL 2022. 9. 4. [SQL] ROW 중복제거(DISTINCT, GROUP BY) DISTINCT 로 중복 행 제거 SELECT DISTINCT 컬럼명 FROM 테이블명 WHERE 조건절; 예제 SELECT DISTINCT DEPT_NO FROM TB_DEPT ↓ GROUP BY 로 중복 행 제거 SELECT DISTINCT 컬럼명 FROM 테이블명 WHERE 조건절 GROUP BY 그룹화할 컬럼명; 예제 SELECT DEPT_NO FROM TB_DEPT GROUP BY DEPT_NO; ↓ DISTINCT, GROUP BY 차이점 DISTINCT : 중복을 없애주지만 정렬을 해주지 않는다. GROUP BY : 중복을 없애주고 정렬도 해준다. DB/SQL 2021. 10. 12. 이전 1 다음