복붙노트

[SQL] 이유는 무엇입니까 대신 "널"이 아닌 SQL 지원 "= 널 (null)"?

SQL

이유는 무엇입니까 대신 "널"이 아닌 SQL 지원 "= 널 (null)"?

이 않는 경우 내가 물어 아니에요. 나는 그것을하지 않는 것을 알고있다.

나는 그 이유를 궁금 해요. 나는 MySQL과의 작업으로 널 (null)에 이것만큼 지원 문서를 읽은하지만 그들은 정말 어떤 이유를 제공하지 않습니다. 그들은 단지 대신 "널"당신이 사용해야하는 만트라를 반복합니다.

이것은 항상 나를 귀찮게했다. 동적 SQL을 (그 드문 시간이 그것을 할하는 경우) 일 때 그것은에 "널 (null)"을 전달하는 데 훨씬 쉬울 것 곳과 같은 절 :

@where = "where GroupId = null"

어떤는 일반 변수에 대한 간단한 교체 될 것입니다. 대신에 우리는 같은 물건을 할 경우 / 다른 블록을 사용해야합니다 :

if @groupId is null then
     @where = "where GroupId is null"
else
     @where = "where GroupId = @groupId"
end

더 큰 더-복잡한 쿼리,이 목에 큰 고통이다. SQL 및 모든 주요 RDBMS 벤더는 이것을 허용하지 않는 특정의 이유가 있나요? 키워드 충돌하거나 만드는 것이 가치 충돌의 일종?

편집하다:

(내 생각에) 답변의 많은 문제는 모든 사람이 널 (null)와 "나는 가치가 무엇인지 모른다"사이의 동등성을 설정이다. 그 두 가지 사이에 큰 차이가있다. null의 의미가 "이 값입니다 만의 알 수없는"나는 100 %는 널 (null)이 같지 않을 수 동의 할 것입니다. 그러나 SQL 널 (null)는 뜻은 아닙니다. 그것은 값이 없음을 의미합니다. null의 두 SQL 결과는 두 값이 없습니다. 값은 알 수없는 값과 동일하지 않습니다. 다른 두 가지. 즉 중요한 차이입니다.

편집 2 :

내가 가진 또 다른 문제는 다른 어셈블러는 완벽하게 잘 널 = 널을 허용하고 적절하게 해결하는 것입니다. 예를 들어 C #에서, 널 (null) = null는, true를 돌려줍니다.

해결법

  1. ==============================

    1.그것은 기본적으로 꺼져 이유는 널 정말 아닌 비즈니스 감각에 null로 동일 점이다. 예를 들어, 주문 및 고객에 합류 한 경우 :

    그것은 기본적으로 꺼져 이유는 널 정말 아닌 비즈니스 감각에 null로 동일 점이다. 예를 들어, 주문 및 고객에 합류 한 경우 :

    select * from orders o join customers c on c.name = o.customer_name
    

    그것은 알 수없는 이름을 가진 고객과 알 수없는 고객과 일치하는 주문에 의미를 많이하지 것이다.

    대부분의 데이터베이스는이 동작을 사용자 정의 할 수 있습니다. 예를 들어, SQL Server의 :

    set ansi_nulls on
    if null = null  
        print 'this will not print' 
    set ansi_nulls off
    if null = null  
        print 'this should print'
    
  2. ==============================

    2.평등은 절대적으로 판단 할 수있는 일이다. 널 (null)과의 문제는 본질적으로 알 수없는 점이다. 세 개의 값 논리에 대한 진리표를 수행하면 다른 값과 결합 널은 널 (null)입니다 - 알 수없는. SQL을 요구하는 것은 "내 값이 null 같다?" 입력이 null의 경우에도, 매번 알 수없는 것입니다. 나는 IS NULL의 구현이 명확하게 생각합니다.

    평등은 절대적으로 판단 할 수있는 일이다. 널 (null)과의 문제는 본질적으로 알 수없는 점이다. 세 개의 값 논리에 대한 진리표를 수행하면 다른 값과 결합 널은 널 (null)입니다 - 알 수없는. SQL을 요구하는 것은 "내 값이 null 같다?" 입력이 null의 경우에도, 매번 알 수없는 것입니다. 나는 IS NULL의 구현이 명확하게 생각합니다.

  3. ==============================

    3.그것은 언어의 의미입니다.

    그것은 언어의 의미입니다.

    널는 값의 부족이다.

    널 (null)이 나에게 의미가있다. 그것은 "값이 부족하다"또는 "알 수없는"라고 말한다. 무언가가있다 "값을 결여와 같은"경우 개인적으로 나는 누군가 물었다 적이 없어요.

  4. ==============================

    4.난 내가 다른 압정을 시도 할 줄 알았는데, 그래서 당신은 여전히 ​​지금까지 제공 한 답변에 만족하지 않는 것이 도움이되지만 느낌이 없습니다. 하자가 (아니, 나는이 특정 예제는 내 머리에 와서 왜 아무 생각도 없어) 예를 들어 있습니다.

    난 내가 다른 압정을 시도 할 줄 알았는데, 그래서 당신은 여전히 ​​지금까지 제공 한 답변에 만족하지 않는 것이 도움이되지만 느낌이 없습니다. 하자가 (아니, 나는이 특정 예제는 내 머리에 와서 왜 아무 생각도 없어) 예를 들어 있습니다.

    우리는 직원, EMP에 대한 테이블이 있습니다

    EMP
    ---
    EMPNO           GIVENNAME
    E0001           Boris
    E0002           Chris
    E0003           Dave
    E0004           Steve
    E0005           Tony
    

    그리고, 기괴한 어떤 이유로 든, 우린 추적 어떤 특정 일 (TROUS)에 색 바지를 입고 각 직원이 선택하는을 :

    TROUS
    -----
    EMPNO       DATE        COLOUR
    E0001       20110806    Brown
    E0002       20110806    Blue
    E0003       20110806    Black
    E0004       20110806    Brown
    E0005       20110806    Black
    E0001       20110807    Black
    E0003       20110807    Black
    E0004       20110807    Grey
    

    나는에 갈 수 있었다. 우리는 우리가 모든 직원의 이름을 알고 싶어 질의, 어떤 색 바지가 7 8 월에 미친 쓰기 :

    SELECT e.GIVENNAME,t.COLOUR
    FROM
        EMP e
            LEFT JOIN
        TROUS t
            ON
                 e.EMPNO = t.EMPNO and
                 t.DATE = '20110807'
    

    그리고 우리는 결과 세트를 얻을 :

    GIVENNAME       COLOUR
    Chris           NULL
    Steve           Grey
    Dave            Black
    Boris           Black
    Tony            NULL
    

    자,이 결과 세트는보기 또는 CTE, 또는 무엇이든 될 수 있고, 우리는 SQL을 사용하여,이 결과에 대한 질문을 계속 할 수 있습니다. 이러한 질문은 무엇을 할 수 있는가?

    참고, 당신은 이미 당신이 정보를 누락 마커로 NULL을 사용하지 않습니다에 데이터베이스를 설계 한 경우, 당신이 원하는 결과를 강제로 (예를 들어,이 NULL IS) 특정 메커니즘을 알고있다.

    그러나 SQL에서, NULL은 (적어도) 두 가지 역할을 부여하고있다 - 적용 할 정보를 표시하는 (어쩌면 우리는 데이터베이스에 완전한 정보를 가지고 있고, 크리스와 토니는 그 날 일을 올려, 또는했지만 착용하지 않은 않았다 바지), 및 누락 된 정보를 표시합니다 (크리스가했던 그 날을 설정, 우리가이 시점에서 데이터베이스에 기록 된 정보가 없습니다)

    당신이 적용 할 정보의 마커로 순수 NULL을 사용하는 경우, 나는 외부 조인 당신이 이러한 구조를 피한다고 가정.

    내가보고하지 않고, 당신이 다른 답변에 의견 NaN를 제기 한 것은 흥미로운 일을 찾아 그 NaN의 및 일반의 (SQL) NULL이 많은. 그들 사이의 가장 큰 차이점은 NULL 시스템, 관련되는 데이터 유형에 상관없이 전역에서 사용하기위한 것입니다 것입니다.

    넌 가장 큰 문제는 NULL은 모든 프로그래밍 언어에서 하나의 의미를 가지고 결정했습니다 것 같다, 당신은 SQL이 의미하는 것이 깨진 것을 느낄 것 같다. 사실, 다른 언어로 널 자주 미묘하게 다른 의미를 가지고있다. 일부 언어에서는 비교 0 == null의 일부에 성공, 그리고 다른 사람에 실패하게됩니다 다른 사람이 아닌, 그래서 0의 동의어입니다. 당신은 널 (null)이없는 (당신이 .NET 버전을 이야기하고 가정) VB,하지만 VB를 언급했다. 그것은 다시 (는 C #을 구조 기본 (T)의 대부분의면에서 동등의) 미묘한 차이가 없음을 가지고 있습니다.

  5. ==============================

    5.개념은 NULL이 공정한 가치되지 않는 것입니다. 이 값이 없음을 나타낸다.

    개념은 NULL이 공정한 가치되지 않는 것입니다. 이 값이 없음을 나타낸다.

    따라서, 변수 또는 열은 그것이 NULL EQUAL TO하지 경우이 NULL 인 경우 선택 될 수 있지만.

    당신은 산술 비교를 열면, 당신은 이하가 NULL IS보다 큰 NULL에 맞설 필요가, 또는 수

  6. ==============================

    6.NULL은 알 수 없습니다. 그것은 당신이 알 수없는 무엇을 비교하고도 진실도 거짓 그렇습니다, 유일한 대답은 위키 피 디아 http://en.wikipedia.org/wiki/Null_(SQL에 "알 수없는"훨씬 더 좋은 문서)입니다

    NULL은 알 수 없습니다. 그것은 당신이 알 수없는 무엇을 비교하고도 진실도 거짓 그렇습니다, 유일한 대답은 위키 피 디아 http://en.wikipedia.org/wiki/Null_(SQL에 "알 수없는"훨씬 더 좋은 문서)입니다

  7. ==============================

    7.때문에 ANSI SQL에서, 값이 아닌 널 수단 "알 수없는",. 따라서, 그것은 같지 아무것도하지; 당신은 단지 값의 상태 (알려진 또는 알려지지 않은)을 평가할 수 있습니다.

    때문에 ANSI SQL에서, 값이 아닌 널 수단 "알 수없는",. 따라서, 그것은 같지 아무것도하지; 당신은 단지 값의 상태 (알려진 또는 알려지지 않은)을 평가할 수 있습니다.

  8. ==============================

    8.ㅏ. 널은 "값의 부족"아니다

    ㅏ. 널은 "값의 부족"아니다

    비. 널은 "빈"아니다

    씨. 널은 "미 설정 값"아니다

    그것은 위 및 위의 아무도의 모든입니다.

    기술적 권한으로 NULL은 "알 수없는 값"입니다. 그러나, C / C에서 초기화되지 않은 포인터처럼 ++, 당신이 정말로 무엇을 포인팅을 모른다. 데이터베이스로, 그들은 공간을 할당하지만 그 공간에있는 값을 초기화하지 않습니다.

    그래서, 그것은 초기화되지하다는 의미의 '빈'공간이다. 당신은 NULL, 그 저장 위치에 원래 값의 숙박에 값을 설정합니다. 원래 빈 문자열 (예를 들어) 인 경우, 그 유지됩니다.

    그것은 데이터베이스가 유효한 값을하다고 판단 무슨 설정을하지 않았다는 사실에 "값의 부족"입니다.

    그것은 공간 만 할당 된 경우이며, 값이 세트가 결코 것을에서 "미 설정 값"입니다.

    "알 수없는"는 우리가 진정으로 우리가 NULL을 검사 할 때 무엇을 기대해야하는지 알고 올 수있는 가장 가까운 것입니다.

    우리는이 "알 수없는"값을 비교하려고하면 그 때문에, 우리는 비교가를 얻을 것이다

    a) 또는 유효하지 않을 수있다

    B) 또는 우리가 기대하는 결과가있을 수도 있고 없을 수도 있습니다

    C) 또는 데이터베이스를 중단하지 않을 수도 있습니다.

    그래서, DBMS 시스템 (오래 전에)가 NULL에 올 때조차 사용 평등 이해가되지 않는 것을 결정했다.

    따라서 "= null가"말도 안돼.

  9. ==============================

    9.이미 말했다되어 모든뿐만 아니라, 나는 당신이 당신의 첫 번째 줄에 쓰는 것은 잘못되었다는 스트레스를 바랍니다. SQL은 "= NULL"구문을 지원하지만, "NULL IS"과는 다른 의미를 가지고 - 당신이 링크 된 문서의 매우 조각에서 볼 수있다.

    이미 말했다되어 모든뿐만 아니라, 나는 당신이 당신의 첫 번째 줄에 쓰는 것은 잘못되었다는 스트레스를 바랍니다. SQL은 "= NULL"구문을 지원하지만, "NULL IS"과는 다른 의미를 가지고 - 당신이 링크 된 문서의 매우 조각에서 볼 수있다.

  10. ==============================

    10.나는 OP 그 동의

    나는 OP 그 동의

    where column_name = null
    

    에 대한 문법 설탕해야한다

    where column_name is null
    

    SQL의 제작자는 구별을하고 싶어하는 이유 그러나, 나는 이해한다. 에서 (IMO이 잘못된 이름이다), 술어는 두 개의 값 (true 또는 false) 또는 기술적 값하지만 우리가하는 두 값이 몰라 "라고하는 단지 방법이 아니다 알 수없는 반환 할 수 3 개 값 논리 "입니다. 3 치 논리의 관점에서 다음과 같은 조건에 대해 생각 :

    A == B
    

    A는 B와 같은지 여부를이 술어 테스트는 여기에 무엇이 진실 테이블 외모와 같은 :

        T U F
        -----
    T | T U F
    U | U U U
    F | F U T
    

    중 A 또는 B를 알 수없는 경우, 술어 자체에 관계없이 항상 다른 하나는 참 또는 거짓 또는 알 수 있는지 여부, 알 수없는 반환합니다.

    SQL에서 널 알 수없는 동의어입니다. 그래서, SQL 술어

    column_name = null
    

    COLUMN_NAME의 값이 단지처럼 관계없이 COLUMN_NAME이 참 또는 거짓 또는 알 수 없거나 무엇인지 값이 알 수없는 무언가, 그리고 반환 알 수없는 같은지 여부를 테스트 위의 3 개 값 논리. SQL DML 작업은 행에 운영을 제한하는 where 절 반환 사실, 무시 행되는 술어는 false를 돌려줍니다 불명의 조건. 모든 행에 "여기서 COLUMN_NAME = 널 (null)"를 작동하지 않는 이유입니다.

  11. ==============================

    11.NULL은 동일한 NULL을하지 않습니다. 그것은 동일한 NULL은 할 수 없습니다. 그들이 동일해야하는 것은 이해가되지 않습니다.

    NULL은 동일한 NULL을하지 않습니다. 그것은 동일한 NULL은 할 수 없습니다. 그들이 동일해야하는 것은 이해가되지 않습니다.

    그것에 대해 생각하는 몇 가지 방법 :

  12. ==============================

    12.왜 ISNULL 기능을 사용하지 않는?

    왜 ISNULL 기능을 사용하지 않는?

    @where = "where GroupId = "+ isnull(@groupId,"null")
    
  13. from https://stackoverflow.com/questions/7078837/why-doesnt-sql-support-null-instead-of-is-null by cc-by-sa and MIT license