2011-10-27 7 views
2

私はmysqlを正しく学習しようとしています。私は2つのテーブルを使用してクエリを持って、私はすべての時間フィールド名の前にテーブル名を書く必要がありますか?私はどのクエリを使うべきですか?

これは私がしなければ、この方法は、それがOK 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、ペットbから選択します。a.owner_id = b.owner_idをa.usernameで並べ替えます。b。名前 ' –

答えて

3

、この:

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

がある(SQL-92規格による)のように記述:あなたの質問に答えるために

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

、私が変更された(最初の選択肢を好むだろう主に読みやすくするために、上記のように)。他の誰かが(数日または数ヶ月後に、またはあなた)あなたのコードを読む必要があり、すべての列が属するテーブルを知っておくと便利です。

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

テーブル名を使用する必要はありません。しかし、複数のテーブルにアクセスしている場合は、列の衝突の可能性があります。その場合は、どのテーブルを意味するかを指定すると便利です。

あなたが参照している列が不明な場合、データベースシステム(特にPostgreSQLなど)によっては不平を言うことがあります。

+2

使用しているフィールドがわからない場合は、すべてのDBが文句を言います。 –

+0

あなたは正しいです。どちらのクエリも正しいですが、テーブル名の使用に慣れなければならない理由は正解です。 –

+1

それは意味がある、ありがとうMarc。私は、SELECT *を使用するときにさまざまな振る舞いを思いついたと思います。大部分のdbsは重複する列名の名前を変更します(名前は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に取り込むことができ、おそらく何も変更する必要はありません。 1992年以来

+0

+1きれいな構文です。 – Johan

+0

私たちはまだJOINを学んでいません。 – emre

+1

@baris:テーブルを結合する方法を学びました。しかし、古い、非常に古い方法を使用しています。 –

関連する問題