2011-10-27 3 views
2

나는 mysql을 올바르게 배우려고 노력하고있다. 2 개의 테이블을 사용하는 쿼리가있을 때 항상 필드 이름 앞에 테이블 이름을 써야합니까? 난이 방법으로 그것을 확인 aswell이다 할 경우 어떤 쿼리를 사용해야합니까?

는 하나 내가

SELECT 
owner.title, owner.forename, owner.surname, 
pet.name, pet.breed 
FROM 
owner,pet 
WHERE 
owner.owner_id = pet.owner_id 
ORDER BY 
owner.surname ASC, pet.name ASC 

을 가지고 있습니까?

SELECT 
title, forename, surname, 
name, breed 
FROM 
owner,pet 
WHERE 
owner.owner_id = pet.owner_id 
ORDER BY 
surname ASC, name ASC 
+2

내가 위의 어느 것도 말할 것입니다. whera a.id = b.id 대신에 'INNER JOIN'을 사용하십시오. a.id = b.id는 의도를 숨 깁니다. 내부 조인은 참여하려는 필드를 매우 명시 적으로 지정합니다. 가독성이 향상됩니다 – Icarus

+0

가 잘못되었습니다. 두 쿼리 모두 올바름 –

+0

@ baris22 긴 테이블 이름을 입력하지 않으려는 경우 테이블 이름의 별명을 지정할 수 있습니다. 예 :'a.title, a.forename, a.surname, b.name, b.breed 소유자 a, pet b를 선택하십시오. a.owner_id = b.owner_id 순서는 a.username으로 b.name' –

답변

3

1992 년부터이 : (당신의 질문에 대답하려면

FROM 
    owner 
    JOIN       --- or the equivalent: INNER JOIN 
    pet 
     ON owner.owner_id = pet.owner_id 

, 내가 첫 번째 선택을 선호 수정 :

FROM 
    owner,pet 
WHERE 
    owner.owner_id = pet.owner_id 

는 다음과 같이 작성 (SQL-92 표준에 의해)입니다 위와 같음). 주로 읽기 쉽습니다. 다른 사람이 코드를 읽을 수있다 (또는 당신은 몇 일 또는 몇 달 후) 모든 열이 속한 테이블과 아는 유용 할 수 있습니다 :

SELECT 
    owner.title, owner.forename, owner.surname, 
    pet.name, pet.breed 
FROM 
    owner 
    JOIN 
    pet 
     ON owner.owner_id = pet.owner_id 
ORDER BY 
    owner.surname ASC, pet.name ASC 

또 다른 이유는 (또는 사람) 나중에 사건을 잡을 것입니다 테이블에 열을 추가 (또는 이름 변경)하면 "이름 충돌"이 발생하여 쿼리에 오류가 발생하고 작업이 중단되거나 예상했던 결과와 다르게 나타날 수 있습니다.


당신은 또한 다음과 같이 별칭을 사용할 수 있습니다

SELECT 
    o.title, o.forename, o.surname, 
    p.name, p.breed 
FROM 
    owner AS o 
    JOIN 
    pet AS p 
     ON o.owner_id = p.owner_id 
ORDER BY 
    o.surname ASC, p.name ASC 
2

테이블 이름을 사용할 필요가 없습니다. 그러나 여러 테이블에 액세스하는 경우 열 충돌이 발생할 가능성이 있습니다.이 경우 어떤 테이블을 의미하는지 지정하는 것이 좋습니다.

일부 db 시스템 (특히 PostgreSQL)은 참조하는 열이 확실하지 않은 경우 불만을 표시합니다.

+2

당신이 사용하고있는 필드를 파악할 수 없다면 모든 DB가 불평 할 것입니다. –

+0

당신 말이 맞아요. 두 가지 쿼리가 모두 정확하지만 테이블 이름을 사용하는 이유에 대한 답이 정당합니다. –

+1

감사합니다. Marc. SELECT *를 사용할 때 다양한 동작을 염두에 두었습니다. 대부분의 DB는 중복 된 열 이름의 이름을 바꿉니다 (이름은 name_1과 같아집니다). 반면 PostgreSQL은 자동 별칭이 아닙니다. – halfer

0

양쪽 테이블에 동일한 열 이름이 들어 있으면 모호한 상황을 방지하기 위해 열 이름과 함께 테이블 이름을 지정해야합니다. 그렇지 않으면 필요하지 않습니다. 내 의견

4

최고의 양식을 이런 식으로 뭔가를 할 것이다 (그리고 기억, 형태는 크게 주관적이다) :

SELECT o.title, o.forename, o.surname, p.name, p.breed 
FROM pet p 
INNER JOIN owner o ON o.owner_id = p.owner_id 
ORDER BY o.surname ASC, p.name ASC 

나는이 가장 읽을 같은 쿼리를 찾아 수정하는 가장 쉬운 방법. 쿼리에 여러 개의 테이블이있는 경우 항상 별칭 테이블을 사용하고 필드 선택에 항상 별칭을 사용합니다. 필자가 쓴 쿼리의 종류는 상당히 이식성이 좋은 쿼리이기 때문에 아주 기본적인 SQL 기능과 구문을 사용하므로 다른 DBMS로 가져올 수 있으므로 아무 것도 변경할 필요가 없을 것입니다.

+0

+1 더 깨끗한 구문. – Johan

+0

우리는 아직 JOIN을 배웠습니다. – emre

+1

@baris : 테이블 조인 방법을 배웠다. 그러나 오래된, 아주 오래된 방법을 사용합니다. –

관련 문제