반응형

SQL의 JOIN에서 ON과 WHERE의 차이점은 JOIN하는 범위가 다르다. 아래 두 SQL문을 보자. 두 SQL문 모두 LEFT JOIN을 수행하는 OUTER JOIN이다.

 

1) 
SELECT * 
FROM test1 a LEFT JOIN test2 b 
ON (a.aa = b.aa) 
WHERE b.cc = 7; 

2) 
SELECT * 
FROM test1 a LEFT JOIN test2 b 
ON (a.aa = b.aa AND b.cc = 7);

1)의 경우는 a와 b 테이블의 OUTER JOIN을 수행한 후에 b.cc = 7인 데이터들을 추출하지만 2)의 경우는 (a 테이블)과 (b 테이블 중 b.cc = 7인 경우)를 OUTER JOIN 한 결과가 나온다.

 

따라서 1)의 결과는 b.dd = 7인 데이터만 존재하지만 2)의 결과는 b.cc = 7이 아닌 데이터도 존재한다. 아래와 같은 test1, test2 테이블이 있을 때,

 

test1 test2 
aa|bb aa|cc 
----- ----- 
1 | 4 1 | 7 
2 | 5 2 | 8 
3 | 6

그 SQL의 결과는 다음과 같다.

 

1) 
1 | 4 | 1 | 7 

2) 1 | 4 | 1 | 7 
2 | 5 | null | null 
3 | 6 | null | null

한마디로 ON과 WHERE의 경우는 JOIN을 할 대상(범위)이 달라진다는 것이다.

 

이 점을 이용해서 LEFT OUTER JOIN으로 차집합을 구현할 수 있다. 오라클이나 MSSQL과 같은 경우는 EXCEPT 혹은 MINUS 등을 사용하면 되겠지만, MySQL은 버전에 따라 지원하는 경우도 있고 아닌 경우도 있다.

test1 테이블의 데이터 중 test2 테이블에 있는 데이터를 제외하고 가져오고 싶다. 위의 테이블에서 JOIN하는 column을 기준으로 1, 2는 test2 테이블에도 있으니 제외하고, 3 | 6만을 가져오고 싶은 경우이다.

 

SELECT * 
FROM test1 a LEFT JOIN test2 b 
ON (a.aa = b.aa) 
WHERE b.aa IS NULL;
3 | 6 | null | null

 

test2.aa에 있는 1, 2의 데이터를 제외한 데이터를 test1.aa에서 가져왔다. LEFT OUTER JOIN이기 때문에 WHERE절 이전까지 실행했을 때 아래와 같은 결과가 나온다.

 

SELECT * 
FROM test1 a LEFT JOIN test2 b 
ON (a.aa = b.aa); 

1 | 4 | 1    | 7 
2 | 5 | 2    | 8 
3 | 6 | null | null

여기에서 test2 테이블에 존재하지 않아서 test2 테이블의 column이 null인 부분만을 가지고 오게 WHERE절을 달아주면!! 차집합이 된다는 것이다.

 

 

출처 : https://blog.leocat.kr/notes/2017/07/28/sql-join-on-vs-where

반응형

'DB > SQL' 카테고리의 다른 글

SQL의 종류 DDL, DML, DCL 이란?  (0) 2022.02.25
sql Join & Where개요  (0) 2020.05.06
Foreign Key 제약 설정 Delete Rule  (0) 2020.04.21
WHERE 절의 조합(AND / OR / NOT / IN)  (0) 2020.04.21
반응형

 

깃헙 공식 레포

https://github.com/inorganik/CountUp.js

 

 

inorganik/countUp.js

Animates a numerical value by counting to it. Contribute to inorganik/countUp.js development by creating an account on GitHub.

github.com

데모페이지

https://inorganik.github.io/countUp.js/

스크린샷과 같이 데모 테스트를 해볼 수도있으며 소스코드도 바로 제공해준다.

반응형
반응형

MVC Result에서 Json 형태의 결과값을 받고자 할때

 

Prameter에 의한 아래와 같은 오류가 발생할 수 있따.

 

This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.

 

 

 

 

위와 같은 문제가 발생 할경우는

 

Request에 대한 Allow를 해주면 된다.

 

다음과 같은 형태로 변경 해보자

public ActionResult Index()

{

   return Json(data, JsonRequestBehavior.AllowGet)

}

출처: https://devman.tistory.com/entry/MVC4-JSON-Problem-JsonRequestBehavior-to-AllowGet [코딩하는 녀석]

반응형
반응형

SET NOCOUNT란? 

쿼리문 또는 프로시저의 영향을 받은 행 수를 나타내는 메시지가 결과 집합의 일부로 반환되지 않도록 하는것

구문 : SET NOCOUNT{ON/OFF}

 

사용하는 이유 

MSSQL에서 프로시저를 만들경우 프로시저의 속도(성능)에 대해서 생각을 안할 수 없습니다.

프로시저의 속도가 프로그램의 속도에 밀접한 관련이 있는만큼

프로시저의 성능에 대해 초점을 맞추고 쿼리문을 짜야합니다.

이번 포스팅에서는 SET NOCOUNT라는 함수를 사용하여

쿼리문의 속도를 향상시키는 방법에 대해 알아보겠습니다.

 

MSSQL에서 프로시저를 만들고 실행을 해보면

 

 

위와 같은 메시지를 보신적이 있으실텐데요.

위 메시지는 INSERT나 UPDATE DELETE 처럼 테이블에 영향을 주게되면 출력이 됩니다.

하지만 위에 보이는 0개행이 영향을 받았다는 메시지는 전혀 필요가 없죠

괜히 메시지를 출력하는데 서버 부하만 걸릴뿐입니다.

이 메시지는 프로시저 시작점에 SET NOCOUNT ON이라는 문구를 삽입해줌으로써 제거해줄 수 있습니다.

 

예제 

CREATE PROCEDURE PROC_NAME
(
    COMPANY NVARCHAR(7),--회사
    NO_TRAN NVARCHAR(20), --전표번호
    PLANT NVARCHAR(7), --공장
    DT_TRAN NVARCHAR(8) --작업일
)
AS
BEGIN
SET NOCOUNT ON 

    INSERT INTO EX_TABLE(CD_COMPANY,NO_TRAN,CD_PLANT,,DT_TRAN)
    VALUES(@P_CD_COMPANY,@P_NO_TRAN,@P_CD_PLANT,@P_DT_TRAN)

SET NOCOUNT OFF
RETURN
END;

 

이렇게 해주면 1개의 메시지만 출력이 됩니다.

반응형

+ Recent posts