복붙노트

[SQL] 사람이 읽을 수있는 설명에서 SQL 쿼리를 구성하는 엄지 손가락의 규칙이 있나요?

SQL

사람이 읽을 수있는 설명에서 SQL 쿼리를 구성하는 엄지 손가락의 규칙이 있나요?

우리 앞의 쿼리의 설명이있을 때마다, 우리는 추론을 적용하려고하고 쿼리를 구성하는 브레인 스토밍.

체계적인 단계별 또는 주어진 사람이 읽을 수있는 설명에서 SQL 쿼리를 구성하는 수학적 방법이 있습니까?

예를 들어, 어떻게 ....는 등, A의 절을 필요로하는지 여부를 SQL 쿼리, 그것은으로 그룹을 필요 여부에 관계없이 하위 쿼리보다는 참여해야하는지 여부, 그 결정

예를 들어, 누구든지 디지털 전자 카르노지도 나 퀸 McClausky 방법과 같은 방법을 알고있을 것입니다 공부했다. 여기에는 디지털 로직을 단순화하기 위해 몇 가지 체계적인 접근 방법이다.

이 경우 다음과 같은 어떤 방법마다 브레인 스토밍을 방지하기 위해 수동으로 SQL 쿼리를 분석하는?

해결법

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

    1.예, 있습니다.

    예, 있습니다.

    그것은 자연 언어 표현과 논리적 표현과 관계 대수의 표현과 SQL 식을 다소 직접적인 방법에 해당한다 (마지막 두의 하이브리드) 그것을 밝혀졌습니다. (다음은 어떤 중복 행 및 더 널 (null)입니다.)

    열 이름에 의해 파라미터 자연 언어 채우기에-the- (named-) 공백 문 템플릿 - 각 테이블 (기본 또는 쿼리 결과)는 관련 조건을 가지고있다.

    [liker] likes [liked]
    

    테이블은 (이름) 공백을 채우기 위해 행의 열 값을 사용하여, 제안 일명 진정한 성명을, 모든 행을 보유하고 있습니다. 여기에 그 술어 및 그 행 'propostions있는 테이블입니다 :

    liker  | liked
    --------------
    Bob    | Dex    /* Bob likes Dex */
    Bob    | Alice  /* Bob likes Alice */
    Alice  | Carol  /* Alice likes Carol */
    

    테이블의 행의 값으로 술어를 작성에서 각각의 제안은 사실이다. 그리고이 아닌 테이블의 행의 값으로 술어를 채우는 각 제안은 false입니다. 여기에 해당 테이블의 말씀입니다 :

    /*
        Alice likes Carol
    AND NOT Alice likes Alice
    AND NOT Alice likes Bob
    AND NOT Alice likes Dex
    AND NOT Alice likes Ed
    ...
    AND Bob likes Alice
    AND Bob likes Dex
    AND NOT Bob likes Bob
    AND NOT Bob likes Carol
    AND NOT Bob likes Ed
    ...
    AND NOT Carol likes Alice
    ...
    AND NOT Dex likes Alice
    ...
    AND NOT Ed likes Alice
    ...
    */   
    

    DBA는 각 기본 테이블에 대한 조건을 제공합니다. 테이블 선언에 대한 SQL 구문은 주어진 조건의 자연 언어 버전의 기존 논리 속기처럼 많이있다. 여기에 우리의 가치를 유지하는 기본 테이블의 선언입니다 :

    /* (person, liked) rows where [liker] likes [liked] */
    /* (person, liked) rows where Likes(liker, liked) */
    CREATE TABLE Likes (
        liker ...,
        liked ...
    );
    

    SQL 쿼리 (하위) 새로운 조건에서 진정한 성명을 발표 행을 들고 새 테이블 값으로 표현 변환 인수 테이블 값. 새로운 테이블 술어는 (부) 식의 관계 / 테이블 사업자에 의한 인자 테이블 술어 (들)로 표현 될 수있다. 쿼리는 누구의 조건 우리가 원하는 행의 테이블에 대한 조건 인 SQL 표현식입니다.

    SELECT 문 내부 : 별명 A를 T라는 이름 •의 기본 테이블 행을 / 술어가 여기서 T (A.C, ...). • R CROSS는 JOIN S & R INNER JOIN S 유무 술어 / 각 인자의 행의 조합 R의 술어 AND S.의 술어 (행이 열을 C 이름을 변경 한 후에이 앨리어싱 행이고, ... 행 AC, ...) • R ON 조건 & R WHERE 조건 유무 조건 / 행 어디에 R AND 조건의 술어. DISTINCT AC AS D를 선택 • ... 술어를 갖는 R FROM (아마 암시 A. 및 / 또는 암시 적으로 AS D) / 로우이고 다음 적하 후 열 AC와 R의 술어 SOME [가치], .. . D로 대체 .... (손실 된 열은 새로운 술어 파라미터되지 않음). R이 조건을 가지고 FROM • 동등하게 DISTINCT AC AS D를 선택, ... / 행 여기서 몇 가지를했다. *, ..., AC = D 및 ...이 적은 소형 될 수 R.의 술어 (하지만 외모입니다 는 SQL 같은 더.) • (X, ...) IN (R) 수단은, 열 C와 R의 술어 ... X로 대체 .... • 그래서 (...) IN (T SELECT * FROM)는 T를 의미한다 (...).

    [사람] 밥과 밥이다 (사람, 좋아) 행에 대한 자연 언어 및 속기는 좋아 [좋아]하지만 좋아하는 사람 에드 좋아하지 않는 사람 :

    /* (person, liked) rows where
    for some value for x,
        [person] likes [x]
    and [x] likes [liked]
    and [person] = 'Bob'
    and not [x] likes 'Ed'
    */
    
    /* (person, liked) rows where
    FOR SOME [value for] x,
            Likes(person, x)
        AND Likes(x, liked)
        AND person = 'Bob'
        AND NOT Likes(x, 'Ed')
    */
    

    SQL 다음 우리의 기본 테이블의 속기 술어를 사용하여 다시 작성 :

    /* (person, liked) rows where
    FOR SOME [values for] l1.*, l2.*,
            person = l1.liker AND liked = l2.liked
        AND Likes(l1.liker, l1.liked)
        AND Likes(l2.liker, l2.liked)
        AND l1.liked = l2.liker
        AND person = 'Bob'
        AND NOT Likes(l1.liked, 'Ed')
    */
    
    SELECT l1.liker AS person, l2.liked AS liked
    FROM
        /* (l1.liker, l1.liked, l2.liker, l2.liked) rows where
            Likes(l1.liker, l1.liked)
        AND Likes(l2.liker, l2.liked)
        AND l1.liked = l2.liker
        AND l1.liker = 'Bob'
        AND NOT Likes(l1.liked, 'Ed')
        */
    Likes l1 INNER JOIN Likes l2
    ON l1.liked = l2.liker
    WHERE l1.liker = 'Bob'
    AND NOT (l1.liked, 'Ed') IN (SELECT * FROM Likes)
    

    • R 연합 / S 술어를 가지고 대응하는 행이고 R의 술어 OR S.의 술어 • S를 제외하고 R이이 술어 / 행입니다 어디 R의 조건 AND NOT S.의 조건 • VALUES (X, ...) ... 열과 C ... / 술어있다 행 (C = X AND ...) OR ....

    /* (person) rows where
        (FOR SOME liked, Likes(person, liked))
    OR  person = 'Bob'
    */
    
        SELECT liker AS person
        FROM Likes
    UNION
        VALUES ('Bob')
    

    그래서 우리는 행이 참 또는 거짓이 (반환 여부 될) 수 있도록 주어진 기본 테이블 자연 언어 문 템플릿의 측면에서 우리의 원하는 행을 표현하는 경우에 우리는 논리 shorthands 및 운영자 및 / 또는 테이블 이름의 중첩이있는 SQL 쿼리로 변환 할 수 있습니다 연산자 &. 그리고 다음 DBMS는 우리의 조건이 참 만드는 행을 계산하기 위해 테이블을 완전히 변환 할 수 있습니다.

    두 개의 서로 다른 열에 대한 또 다른 SQL 테이블에서 일치하는 데이터를 얻을하는 방법을 참조하십시오 : 내부 및 / 또는 조합에 가입? SQL이 적용 다시. (또 다른 자기 조인.) 자연 언어의 어법에 대한 자세한 내용은 시나리오를 은행에 대한 관계형 대수를 참조하십시오. (관계형 대수 맥락에서.) 관계형 쿼리의 또 다른 프리젠 테이션 관계형 대수에 널 (null)을 참조하십시오.

  2. ==============================

    2.여기에 내가 아닌 그룹화 쿼리에서 할 수있는 작업은 다음과 같습니다

    여기에 내가 아닌 그룹화 쿼리에서 할 수있는 작업은 다음과 같습니다

    나는 테이블에 행 당 0 또는 1의 출력 행을 받으실있는 FROM 절에 테이블에 넣어. 종종, 당신은 "특정 속성을 가진 모든 고객"같은 것을 원한다. 그런 다음, 고객 테이블이 FROM 절에 간다.

    사용 열 및 필터 행을 추가 합류했다. 행을 복제하지 않아야 결합합니다. A는 결코 더 0 또는 1 행을 찾을 수 있어야 가입 할 수 있습니다. 당신은 "A가 일부 행에서 열 및 필터를 추가 가입"말할 수 있기 때문는 매우 직관적 유지합니다.

    A는 그들을 대체 할 수있는 가입하는 경우 하위 쿼리는 피해야한다. 모양 좋네요 합류,보다 일반적인 그리고 자주 (때문에 일반적인 쿼리 최적화 약점) 더 효율적입니다.

    어떻게 쉽게 WHERE 및 예측이다 사용할 수 있습니다.

  3. from https://stackoverflow.com/questions/33947260/is-there-any-rule-of-thumb-to-construct-sql-query-from-a-human-readable-descript by cc-by-sa and MIT license