2016-10-02 8 views
0

は、クエリがこれらのクエリとその動作の違いは何ですか?我々はすべての書籍を選択する必要がある場合

select * from mybooks; 

ので、なぜ我々はエイリアシングする必要がないようなものとなりますサンプルTABLE_NAME = Mybooks、
を取るようなクエリ

select books.* from mybooks books; 

私はこの動作とその使い方を理解していません

+0

のように2つのクエリは同等です第二に、あなたがテーブル名の別名を持っていて、すべてのテーブルの列(ただし、必要性を必要とする場合に便利です他の列の列alsio) – scaisEdge

+0

@scaisEdge「他の列の列も必要です」をご説明ください。 –

+0

.thereは間違いがあります。他の表の意味もあります。たとえば、booksの選択。*、u。* books for books.key = u.key ..これはあなたの場合ではありません) – scaisEdge

答えて

2

エイリアスは、テーブルの特定の使用の名前を変更するようなもので、いずれかを使用する理由は以下のとおりです。

  1. は、単にあなたが(クエリで複数回、同じテーブルを使用する短い記述
  2. を使用します

テーブルを1つだけ使用すると、エイリアスは必要ありませんが、何も使用できなくなります。

例:

  1. 一つのテーブルには、値を追加しませんが、あなたはこれらのいずれかに行くことができます:

    -- Cartesian join or cross join, at least one of the instances requires an alias 
    SELECT * 
    FROM LongTableName, LongTableName l 
    
    -- You are forced to use the full name to refer to an "un-aliased" table 
    SELECT LongTableName.Field, l.Field 
    FROM LongTableName, LongTableName l 
    
    -- For any other join, if only one table has an alias, like in the previous case, 
    -- you will have to use the full name to refer to the other instance 
    SELECT * 
    FROM LongTableName 
    INNER JOIN LongTableName l ON LongTableName.Field = l.Field 
    
    -- Normally you simply use a short alias for both, like this 
    SELECT * 
    FROM LongTableName l1 
    INNER JOIN LongTableName l2 ON l1.Field = l2.Field 
    
    -- Only selecting some fields 
    SELECT l1.PrimaryKey, l1.Field, l2.PrimaryKey, l2.Field 
    FROM LongTableName l1 
    INNER JOIN LongTableName l2 ON l1.Field = l2.Field 
    
  2. :複数のテーブルで

    SELECT * 
    FROM LongTableName 
    
    -- Only if you enjoy typing 
    SELECT LongTableName.* 
    FROM LongTableName 
    
    SELECT * 
    FROM LongTableName t 
    
    SELECT t.* 
    FROM LongTableName t 
    

SELECTで、すべての使用されているテーブルのすべてのフィールドが必要な場合は、*を使用するだけで済みます。しかし、複数のテーブルから特定のフィールドを選択する必要がある場合は、エイリアスがあることに本当に感謝します。

0

あなたのクエリにジョインがあると、シンプル*はジョインに含まれるすべてのテーブルのすべてのフィールドになります。 books。*を使用すると、結果にbooksテーブルのすべてのフィールドのみが含まれます。

これはこれまでのエイリアシングとは関係がありません。別名では、同じ名前の2つのテーブルを区別できるように別名を付けることもできます。

どちらの概念も、複数のテーブルでより複雑なクエリがある場合にのみ意味があります。

+0

私は本のテーブルを持っていません....まだこのクエリはOracleで働いています....私はこの方法でJava EEのResultSetクラスに渡す必要があります。そうでなければ、それを変換します読み込み専用フォーマット –

+0

2番目のステートメントでは、「mybooks」という名前のテーブルに別名「books」を指定しました。つまり、本やmybooksを使ってもともとmybooksという名前のテーブルにアクセスすることができます。 – usterdev

+0

ok ....「書籍」から「mybooks」にアクセスできる場合....これは機能するはずです。書籍から選択してください。 .....なぜ別名が必要なのですか? –

2

2つのものを混在させています。エイリアスの使用については、すでに良い回答があります。しかし、これは別の方法でselect *を書く唯一の方法ではありません。

エイリアスがない場合は、select mybooks.* ...と指定できます。テーブル名はエイリアスではありません。

場合によってはテーブル名が不要で、select *を使用することもできます。ただし、他の列を追加する必要がある場合は、SYSDATE as DTなど、select *の後にはこれを行うことはできません。エイリアスを必要としないでselect mybooks.*, SYSDATE as DT ...を使用する必要がありますが、クエリが1つのテーブルのみを参照していても、*にプレフィックスとしてテーブル名を付ける必要があります。

がより頻繁に。これは、分析関数で発生しますrow_number() over ...

関連する問題

 関連する問題