以下の間に大きな違いはありますか?
SELECT a.name, b.name FROM a, b WHERE a.id = b.id AND a.id = 1
と
SELECT a.name, b.name FROM a INNER JOIN b ON a.id = b.id WHERE a.id = 1
SO ユーザーはどちらかを優先しますか?
違いはありませんが、フィルタリング用の追加の where 句を含む大きな複数結合クエリがある場合、2 番目の読みやすさははるかに優れています。
結合句とフィルター句を分離することは良いことです:)
前者は ANSI 89 構文で、後者は ANSI 92 です。
その特定のクエリには違いはありません。ただし、前者では、複雑なクエリで結合条件からフィルターを分離する機能が失われます。また、LEFT と RIGHT と INNER を指定する構文は、特に異なるデータベース ベンダー間を行き来する必要がある場合に、しばしば混乱します。古い構文はまったく好きではありません。
SQL クエリ エンジンとの違いはありません。
読みやすさのために、改行とインデントを使用すると、後者の方がはるかに読みやすくなります。
INNER JOIN の場合、「フィルター」と「結合」を ON 句または WHERE 句に入れるかどうかは関係ありません。とにかく、クエリ オプティマイザーが最初に何をするかを決定する必要があります (最初にフィルターを実行するか、後で結合するか、またはその逆を選択する場合があります)。逆に
ただし、OUTER JOIN の場合は違いがあり、条件を ON 句に入れたい場合や、WHERE 句に入れたい場合があります。OUTER JOIN の WHERE 句に条件を入れると、INNER JOIN に変わる可能性があります (NULL の仕組みのため)。
たとえば、次の 2 つのサンプルの可読性を確認します。
SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c, order o, orderrow r, article a
WHERE o.customer_id = c.customer_id
AND r.order_id = o.order_id
AND a.article_id = r.article_id
AND o.orderdate >= '2003-01-01'
AND o.orderdate < '2004-01-01'
AND c.customer_name LIKE 'A%'
ORDER BY r.price DESC
対
SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c
INNER JOIN order o
ON o.customer_id = c.customer_id
AND o.orderdate >= '2003-01-01'
AND o.orderdate < '2004-01-01'
INNER JOIN orderrow r
ON r.order_id = o.order_id
INNER JOIN article a
ON a.article_id = r.article_id
WHERE c.customer_name LIKE 'A%'
ORDER BY r.price DESC
両方を使用してほとんどのタスクを実行できますが、あなたの場合はまったく違いはありませんが、常に2番目を使用します。
技術的には違いはありませんが、最初の方法を使用して結合を行う場合は特に注意する必要があります。誤って間違えると、a と b のテーブル間でデカルト結合を行うことになる可能性があります (非常に長く、メモリと CPU を集中的に使用するクエリ - a の各行が b のすべての行と一致します。および b は、そもそも大きなテーブルです)。明示的な INNER JOIN を使用すると、より安全で読みやすくなります。
変わりはない。最初の形式の方が読みやすく、2 番目の形式は他の種類の結合 (OUTER、LEFT INNER など) を行う場合にのみ使用します。
2 番目の形式は、SQL92 準拠の構文です。これは、現在および将来のすべてのデータベース ベンダーでサポートされることを意味します。しかし、真実は、最初の形式が非常に普及しているため、私たちが気にするよりも長く存在することが保証されていることです.
それ以外の場合、データベースが 2 つを処理する方法はすべての点で同じです。