Чому стандарт SQL ANSI-92 краще не прийнятий порівняно з ANSI-89?


107

У кожній компанії, в якій я працював, я виявив, що люди все ще пишуть свої SQL-запити за стандартом ANSI-89:

select a.id, b.id, b.address_1
from person a, address b
where a.id = b.id

а не стандарт ANSI-92:

select a.id, b.id, b.address_1
from person a
inner join address b
on a.id = b.id

Для надзвичайно простого запиту, подібного до цього, немає великої різниці в читабельності, але для великих запитів я вважаю, що об'єднання моїх критеріїв приєднання з перерахуванням таблиці дозволяє значно простіше зрозуміти, де у мене можуть виникнути проблеми при моєму приєднанні, і дайте мені зберегти всю фільтрацію в моєму пункті WHERE. Не кажучи вже про те, що я відчуваю, що зовнішні приєднання набагато інтуїтивніші, ніж синтаксис (+) в Oracle.

Коли я намагаюся евангелізувати ANSI-92 для людей, чи є якісь конкретні переваги від використання ANSI-92 над ANSI-89? Я б спробував це самостійно, але налаштування Oracle, які ми маємо тут, не дозволяють нам використовувати ПОЯСНИЙ ПЛАН - не хотіли б, щоб люди намагалися оптимізувати свій код, так?


7
Однією з головних переваг нотації приєднання SQL-92 є те, що існує стандартний та відносно розумний спосіб написання лівого зовнішнього з'єднання та варіанти. Кожна СУБД мала свій синтаксис варіанту (зазвичай поганий; насправді, я думаю, без винятку позначення були поганими) і часто з дещо різною семантикою. Це зафіксував SQL-92, і нове позначення варто використовувати лише з цих причин. Я думаю, що все одно зрозуміліше, як тільки ти звикнеш до цього. До цього потрібно трохи звикнути, але це не важко, і коли конвертувати, назад вже не буде.
Джонатан Леффлер

семантика, шемантика, антигемантика!
Сем

Я трохи запізнююся на вечірці тут, але, схоже, ніхто не вказував на те, що Oracle сам рекомендує використовувати синтаксис
клавіші ВІД ВИЙТЕ,

Я додав нову відповідь, яка є набагато більш актуальною та зрозумілою, з чіткістю стосовно інших помилок у відповідях тут stackoverflow.com/a/47720615/124486
Еван Керролл

Відповіді:


77

За даними "Налаштування продуктивності SQL" Пітера Гулутзана та Труді Пелзера, з шести-восьми тестових марок RDBMS, які вони протестували, різниці в оптимізації та продуктивності SQL-89 порівняно з стилем SQL-92 не було. Можна припустити, що більшість двигунів RDBMS перетворюють синтаксис у внутрішнє представлення перед оптимізацією або виконанням запиту, тому читабельний для людини синтаксис не має ніякої різниці.

Я також намагаюся евангелізувати синтаксис SQL-92. Шістнадцять років після його затвердження, настає час, коли люди почнуть його використовувати! І всі бренди бази даних SQL зараз підтримують її, тому немає ніяких причин продовжувати використовувати нестандартний (+)синтаксис Oracle або*= Microsoft / Sybase.

Щодо того, чому так важко зламати спільноту розробників звички SQL-89, я можу лише припустити, що існує велика "база піраміди" програмістів, які кодують копіювати та вставляти, використовуючи старовинні приклади з книг, статей журналів, або інша база коду, і ці люди не засвоюють новий синтаксис абстрактно. Деякі люди узгоджуються за малюнком, а деякі вчаться на мотузці.

Хоча я поступово бачу людей, які використовують синтаксис SQL-92 частіше, ніж раніше. Я відповідав на питання SQL в Інтернеті з 1994 року.


6
Я цілком погоджуюся. Я працюю з багатьма кодерами SQL, які вивчили свій SQL 15 років тому і більше (як я це робив сам) і які нічого не знають про будь-які нововведення з моменту свого початку. Вони також не мають інтересу до з'ясування.
Тоні Ендрюс

8
Погодьтеся, але додайте, що є добре задокументовані сценарії, коли старий синтаксис приєднання ANSI-89 приводить до неправильних результатів ... конкретно зовнішніх приєднань, коли в "сторонньому" стовпчику, що пов'язаний з умовною фільтрацією, є попередні фільтраційні предикати в стовпцях, що не пов'язані.
Чарльз Бретана

1
Я не знаю конкретних інтерфейсів MS SQL, але це хороші анекдотичні докази того, що синтаксис SQL-92 є вартим. Для мене працює!
Білл Карвін

2
Масивний? Будь ласка, опублікуйте свою роботу. Моя найкраща ставка полягає в тому, що це не порівняння яблук з яблуками, але не відповідайте "о так, це" Просто відповідь тестовим випадком, ми можемо відтворити, версію, рівень патчу тощо.

2
Крім того, "анекдотичні" докази так чи інакше не є науковим заходом. Його завжди приймають із зерном солі.
Білл Карвін

16

Ну а стандарт ANSI092 включає в себе досить симпатичний синтаксис. Натуральні приєднання це одне, а ЗАСТОСУВАННЯ - інше. ІМХО, додавання стовпця до таблиці не повинно порушувати код, а ПРИРОДНЕ ПРИЄДНАННЯ перерветься в найвиразніший спосіб. "Найкращий" спосіб зламати - це помилка компіляції. Наприклад, якщо ви десь виберіть *, додавання стовпця можене вдалося скласти. Наступним кращим способом невдачі буде помилка часу запуску. Це гірше, тому що ваші користувачі можуть це бачити, але це все одно дає вам гарне попередження про те, що ви щось зламали. Якщо ви використовуєте ANSI92 і пишете запити з NATURAL приєднується, він не порушиться під час компіляції і не порушиться під час виконання, запит просто раптом почне давати неправильні результати. Ці типи клопів підступні. Звіти йдуть не так, можливо, розкриття фінансових даних є невірним.

Для тих, хто не знайомий з НАТУРАЛЬНИМ Приєднанням. Вони об'єднують дві таблиці на кожне ім'я стовпця, яке існує в обох таблицях. Що дуже здорово, якщо у вас є клавіша з 4 стовпцями і вам не вистачає набору тексту. Проблема виникає, коли в Table1 є попередньо стовпчик з назвою DESCRIPTION, і ви додаєте новий стовпець у таблицю2 з назвою, о, я не знаю, щось нешкідливе, як, ммм, ОПИС, і тепер ви приєднуєтесь до двох таблиць на VARCHAR2 (1000) поле, яке є вільною формою.

Пропозиція USING може призвести до повної неоднозначності на додаток до описаної вище проблеми. В іншому повідомленні про те , хтось показав цей ANSI-92 SQL і попросив допомогти його прочитати.

SELECT c.* 
FROM companies AS c 
JOIN users AS u USING(companyid) 
JOIN jobs AS j USING(userid) 
JOIN useraccounts AS us USING(userid) 
WHERE j.jobid = 123

Це абсолютно неоднозначно. Я розміщую стовпчик UserID як у компаніях, так і в таблицях користувачів, і скарги немає. Що робити, якщо стовпець UserID у компаніях - це ідентифікатор останньої особи, яка змінила цей рядок?

Я серйозно, чи можу хтось пояснити, чому така неоднозначність була потрібна? Чому він вбудований прямо в стандарт?

Я думаю, Білл правильно, що існує велика база розробників, які копіюють / вставляють туди шляхом кодування. Насправді я можу визнати, що я такий собі, коли мова йде про ANSI-92. Кожен приклад, який я коли-небудь бачив, показав, що в круглих дужках вкладаються кілька приєднань. Чесність, що робить вибір таблиць у sql у кращому випадку складним. Але тоді евангліст SQL92 пояснив, що насправді змусить наказувати приєднання. JESUS ​​... всі ті копії пастерів, які я бачив, зараз насправді змушують приєднатися до замовлення - це робота, яка в 95% часу краще залишити оптимізаторам, особливо копіювальній / пастерній.

Томалак зрозумів це правильно, коли сказав:

люди не переходять на новий синтаксис лише тому, що він є

Це має щось мені дати, і я не бачу перелом. А якщо є перелом, негативи - це занадто великий альбатрос, щоб його ігнорувати.


3
Я схильний використовувати ON, оскільки це менш неоднозначно, ніж ВИКОРИСТАННЯ або ПРИРОДНИЙ ПРИЄДНАЙТЕСЬ. Що стосується дужок, люди, які вивчають "SQL" в Microsoft Access, використовуватимуть це як Access, скигнути, якщо ви їх опустите. (Цитати навколо SQL мають бути цитатами пальців.)
Powerlord

1
Кашель Що таке пункт ВИКОРИСТАННЯ? ;-) Я родом із фракції сервера SQL, тому це насправді не на моєму радарі. Як сказав Р. Бемроуз, є пункт ON, який працює просто чудово, ніколи не залишаючи мене приєднанням, яке я не міг висловити синтаксично. Не потрібно адаптувати мій дизайн БД до синтаксису запитів, щоб зберегти певний текст.
Томалак

3
Якщо ви не знаєте своїх даних досить добре, щоб використовувати НАТУРАЛЬНЕ ПРИЄДНАННЯ або ВИКОРИСТАННЯ, коли це доречно, ви, ймовірно, не повинні писати для цього SQL. -1 за незнання.
Роб

4
ІМХО, природні приєднання потрапляють у той самий мішок, що і SELECT *(тоді з’ясувавши, що клієнт покладається на порядок) - Він просто відчуває себе трохи неохайним
Основний

2
Проблема, яку ви описуєте природними приєднаннями, - це проблема дизайну вашої бази даних, а не стандартної. ви повинні знати про свої дані та встановити стандарти для назв стовпців.
Тревіс

14

Має на увазі кілька причин:

  • люди роблять це за звичкою
  • люди ліниві і віддають перевагу приєднанню «старого стилю», оскільки вони передбачають менше набору тексту
  • У початківців часто виникають проблеми з обгортанням голови навколо синтаксису приєднання SQL-92
  • люди не переходять на новий синтаксис лише тому, що він є
  • люди не знають про переваги нового синтаксису (якщо ви хочете назвати це так), насамперед, що він дозволяє вам фільтрувати таблицю перед тим, як зробити зовнішнє з'єднання, а не після неї, коли все, що у вас є, є пунктом WHERE.

Зі свого боку, я виконую всі свої приєднання до синтаксису SQL-92 і конвертую код, де можу. Це більш чистий, читабельний і потужніший спосіб зробити це. Але важко переконати когось у використанні нового стилю, коли вони думають, що це шкодить їм у плані більшого набору тексту, не змінюючи результату запиту.


3
Для багатьох людей погляд на SQL взагалі шкодить їм. Зміна будь-якого робочого коду несе за собою ризик ввести помилку, особливо коли кодер відволікає очі. :-)
Білл Карвін

Гм ... мені навіть дивитися на складні регулярні вирази зовсім не шкода. SQL не може завдати мені шкоди. ;-)
Томалак

"У початківців часто виникають проблеми ..." Ну, це точка продажу

2
Чомусь я не впевнений, чи це був "профі" чи "контра" коментар ... Можливо, мій детектор іронії зламаний.
Томалак

10

У відповідь на ПРИРОДНЕ ПРИЄДНАННЯ та ВИКОРИСТАННЯ повідомлення вище.

ЧОМУ ви коли-небудь бачите необхідність їх використання - вони не були доступні в ANSI-89 і додавались до ANSI-92 як те, що я бачу лише як ярлик.

Я б ніколи не залишав приєднання до випадковості і завжди вказував би таблицю / псевдонім та ідентифікатор.

Для мене єдиний шлях - ANSI-92. Він є більш багатослівним, і синтаксис не подобається послідовникам ANSI-89, але він акуратно відокремлює ваші ПРИЄДНАННЯ від вашого фільтрування.


Я не бачу ПРИРОДНІ ПРИЄДНАННЯ як ярлик, але перехід до об'єктно-орієнтованого програмування БД в реляційній БД.
Арман

5

Спершу дозвольте сказати, що у SQL Server зовнішній синтаксис приєднання (* =) весь час не дає правильних результатів. Бувають випадки, коли трактується, що як з'єднання хреста, а не зовнішнє з'єднання. Так що є вагомий привід припинити його використання. І цей синтаксис зовнішнього приєднання є застарілою функцією, і він не буде в наступній версії SQL Server після SQL Server 2008. Ви все одно зможете робити внутрішнє з'єднання, але чому б на землі хто-небудь захотів? Їх незрозуміло і набагато складніше в обслуговуванні. Ви легко не знаєте, що є частиною приєднання і що насправді є лише пунктом де.

Однією з причин, чому я вважаю, що ви не повинні використовувати старий синтаксис, - це те, що розуміння приєднується до того, що вони роблять, а що не роблять, є критичним кроком для тих, хто пише SQL-код. Не слід писати будь-який код SQL, не розуміючи приєднується до нього. Якщо ви їх добре розумієте, ви, мабуть, прийдете до висновку, що синтаксис ANSI-92 чіткіший і легший у обслуговуванні. Я ніколи не зустрічав експерта SQL, який не використовував синтаксис ANSI-92, віддаючи перевагу старому синтаксису.

Більшість людей, з якими я зустрічався або мав справу з тим, хто використовує старий код, по-справжньому не розуміє приєднання і, таким чином, потрапляє в проблеми при запиті до бази даних. Це мій особистий досвід, тому я не кажу, що це завжди правда. Але як спеціаліст з даних, мені довелося виправляти надто багато цього сміття протягом багатьох років, щоб не повірити.


1
Радий познайомитись з тобою. Радий бути вашим першим.

4

Мене вчили в АНСІ-89 в школі і кілька років працювали в галузі. Потім я покинув казковий світ СУБД на 8 років. Але потім я повернувся, і цей новий матеріал з ANSI 92 викладався. Я вивчив синтаксис Join On, і тепер фактично навчаю SQL, і рекомендую новий синтаксис JOIN ON.

Але недолік, який я бачу, - корельовані підзапити, здається, не має сенсу в світлі приєднання ANSI 92. Коли інформація про приєднання була включена до WHERE, а співвіднесені підзапити «приєднуються» до WHERE, все здавалося правильним та послідовним. У таблиці ANSI 92 критерії приєднання не містять WHERE, а підзапит "join" є, синтаксис здається непослідовним. З іншого боку, спроба "виправити" цю невідповідність, ймовірно, просто погіршить її.


З іншого боку, ви p [robaly не повинні взагалі писати кореляційні підзапити, оскільки вони є перформансними свинями. Вони як уведення курсору у ваш запит. Тьфу.
HLGEM

3

Я точно не знаю відповіді. Це вірна віра (альбієт меншої міри, ніж Mac-Pc або інші)

Припущення полягає в тому, що ще зовсім недавно Oracle (а може бути, і інші постачальники) також не прийняв стандарт ANSI-92 (я думаю, це було в Oracle v9, або в наступних випадках) і так, для розробників DBA / Db, що працюють у компаніях, які все ще використовували ці версії (або хотіли, щоб код був переносним на серверах, які могли використовувати ці версії, вони повинні були дотримуватися старого стандарту ...

Це справді прикро, тому що новий синтаксис приєднання набагато читає, а старий синтаксис генерує неправильні (неправильні) результати у кількох добре задокументованих сценаріях.

  • Зокрема, зовнішні об'єднання, коли є умовні предикативні фільтрації в стовпцях, що не пов’язані з приєднанням, з таблиці на "зовнішній" стороні з'єднання.

Так, Oracle 9i; вийшов у 2001 році. Трохи запізнився на вечірку!

1
MS SQL додано INNER JOINв 1995 році, хоча LEFT JOINне до 1996 року. MySQL підтримує його щонайменше з 3.23, випущеного в 1999 році; PostgreSQL принаймні з 7.2, випущений у 2002 році. Деякі випадкові Googling не дають мені відповіді на Терадату.

Так, це осуд, який довів перевагу Oracle у 1991 році: такі системи баз даних, як доступ до MS, які використовували синтаксис "Ліворуч" та "Праворуч", не були стандартом ANSI SQL. Опублікувати подібний SQL було можливістю, щоб інші люди насміхалися над вами. Начебто твіттер і фейсбук зараз.
Девід

2

Інертність та практичність.

ANSI-92 SQL - це як сенсорне введення тексту. Якимось теоретичним чином це може зробити все краще колись, але я можу набрати набагато швидше, дивлячись на клавіші чотирма пальцями зараз. Мені потрібно буде йти назад, щоб йти вперед, без жодної гарантії, що коли-небудь буде виплата.

Написання SQL - це близько 10% моєї роботи. Якщо мені потрібен ANSI-92 SQL для вирішення проблеми, яку ANSI-89 SQL не вдається вирішити, я буду використовувати його. (Я фактично використовую його в Access.) Якщо використання його весь час допоможе мені вирішити свої існуючі проблеми набагато швидше, я витратив би час на її засвоєння. Але я можу вичавити ANSI-89 SQL, не задумуючись про синтаксис. Мені платять за вирішення проблем - думати про синтаксис SQL - це марна трата мого часу та грошей мого роботодавця.

Коли-небудь, молодий Grasshopper, ви будете захищати використання синтаксису ANSI-92 SQL від молодих людей, скуголячи, що вам слід користуватися SQL3 (або чим завгодно). І тоді ти зрозумієш. :-)


2
Описаний тут підхід звучить багато, як "виправити це, коли воно порушиться", думка, ухиляючись від ідеї профілактичного обслуговування. Так, ви отримуєте зарплату для вирішення проблем, але ви також отримуєте зарплату, щоб забезпечити більше користі для своєї компанії. У вашому випадку ANSI-89 забезпечує більшу цінність у короткостроковій перспективі, але в перспективі не вкладення часу в ANSI-92 буде більш дорогим варіантом.
Тревіс

Дотримуючись того, що ви завжди робили, виникла вартість для бідного хлопця, який повинен підтримувати ваш код, коли вас немає. Це не означає, що вам слід перейти до аромату місяця, але прийняття кращих практик майже завжди окупиться в ремонті.

Я не перейду до Excel (де ви можете зробити що завгодно за три клацання миші або менше), тому що я запам'ятав тисячі команд Lotus 123, які мені потрібні, і мені зручно їх використовувати! Га!
Чарльз

2

У мене був запит, який спочатку був написаний для SQL Server 6.5, який не підтримував синтаксис приєднання SQL 92, тобто

select foo.baz
from foo
  left outer join bar
  on foo.a = bar.a

замість цього було написано як

select foo.baz
from foo, bar
where foo.a *= bar.a

Запит деякий час існував, і відповідні дані накопичились для того, щоб запит працював надто повільно, задовго 90 секунд. На момент виникнення цієї проблеми ми перейшли до SQL Server 7.

Після спілкування з індексами та іншими великодніми написаннями я змінив синтаксис приєднання на сумісний з SQL 92. Час запиту впав до 3 секунд.

Є вагомий привід перейти.

Повідомлено звідси .


1

Я можу відповісти з точки зору пересічного розробника, знаючи достатньо SQL, щоб зрозуміти обидва синтаксиси, але все одно гуглюючи точний синтаксис вставки кожного разу, коли мені це потрібно: :-P (я не займаюся SQL цілий день , просто час від часу виправляючи деякі проблеми.)

Ну, власне, я вважаю першу форму більш інтуїтивно зрозумілою, не роблячи явної ієрархії між двома таблицями. Те, що я навчився SQL, можливо, зі старими книгами, показуючи першу форму, ймовірно, не допомагає ... ;-)
І перше посилання, яке я знаходжу на sql select search в Google (який повертає здебільшого французькі відповіді для мене ... ) перший показує старішу форму (потім поясніть другу).

Лише даючи деякі підказки щодо питання "чому" ... ^ _ ^ Я повинен прочитати добру, сучасну книгу (БД агностик) на цю тему. Якщо хтось має пропозиції ...


1

Я не можу говорити для всіх шкіл, але в моєму університеті, коли ми займалися модулем SQL нашого курсу, вони не навчали ANSI-92, вони навчали ANSI-89 - за старою системою VAX! Я не піддавався ANSI-92, поки не почав копатися в Access, побудувавши кілька запитів за допомогою конструктора запитів, а потім перекопавшись до коду SQL. Зрозумівши, я поняття не мав, як це завершує приєднання, або наслідки синтаксису я почав копати глибше, щоб я міг це зрозуміти.

Зважаючи на те, що наявна документація не дуже інтуїтивно зрозуміла у багатьох випадках, і що люди прагнуть дотримуватися того, що вони знають, і в багатьох випадках не прагнуть дізнатися більше, ніж потрібно для того, щоб виконати свою роботу, це легко зрозуміти, чому усиновлення триває так довго.

Звичайно, є ті технічні євангелісти, які люблять хитрувати і розуміти, і це, як правило, ті типи, які приймають «новіші» принципи і намагаються перетворити решту.

Як не дивно, мені здається, що багато програмістів виходять із школи і припиняють просуватися; думаючи, що тому що цього вчили, так це робиться. Це лише до того, як ви знімете свої мигалки, коли ви зрозумієте, що школа призначена лише для того, щоб навчити вас основ і дати вам достатнє розуміння, щоб навчитися решті самостійно, і що ви насправді ледве почухали поверхню того, що вам потрібно знати; тепер ваша робота продовжувати цей шлях.

Звичайно, це лише моя думка, виходячи з мого досвіду.


Це не просто програмісти. У багатьох сферах важко переконати людей перекваліфікуватися, як тільки вони заснують у своїй кар'єрі. Є виняткові особи, я, звичайно, припускаю в однаковій пропорції в кожній галузі.
Білл Карвін

2
Важко переконати когось перейти від чогось успішного, до чогось іншого, що не дає користі. Наша .net сторона будинку змінилася від 1,0 до 3,5, і кожен крок між тим, що відбувся з керолінгу ZERO. Кожна нова версія була кращою. Не можу сказати те саме тут.

1

1) Стандартний спосіб запису ВНУТРІШНЬОГО ПРИЄДНАННЯ проти * = або (+) =

2) ПРИРОДНЕ ПРИЄДНАННЯ

3) Залежно від двигуна бази даних, ANSI-92 тенденції бути більш оптимальними.

4) Ручна оптимізація:

Скажімо, у нас є наступний синтаксис (ANSI-89):

(1)select * from TABLE_OFFICES to,BIG_TABLE_USERS btu
where to.iduser=tbu.iduser and to.idoffice=1

Це можна записати так:

(2)select * from TABLE_OFFICES to
inner join BIG_TABLE_USERS btu on to.iduser=tbu.iduser
where to.idoffice=1

Але також як:

(3)select * from TABLE_OFFICES to
inner join BIG_TABLE_USERS btu on to.iduser=tbu.iduser and to.idoffice=1

Усі вони (1), (2), (3) повертають однаковий результат, однак вони оптимізовані по-різному, це залежить від двигуна бази даних, але більшість з них:

  • (1) його до двигуна бази даних вирішують оптимізацію.
  • (2) він приєднує обидві таблиці, потім робить фільтр по офісу.
  • (3) він фільтрує BIG_TABLE_USERS за допомогою idoffice, а потім приєднується до обох таблиць.

5) Більш тривалі запити менш брудні.


1

Причини, по яких люди використовують ANSI-89 з мого практичного досвіду зі старими та молодими програмістами та слухачами та випускниками:

  • Вони вивчають SQL з існуючого коду, який вони бачать (а не книги) та вивчають ANSI-89 з коду
  • ANSI-89, тому що він набирає менше тексту
  • Вони не замислюються над цим і користуються тим чи іншим стилем і навіть не знають, який з обох вважається новим чи старим, і не хвилюється ні
  • Ідея про те, що код також є повідомленням наступному програмісту, який приходить разом із підтримкою коду, не існує. Вони думають, що спілкуються з комп’ютером, а комп’ютер не хвилює.
  • Мистецтво «чистого кодування» невідоме
  • Знання мови програмування та спеціально SQL настільки погано, що вони копіюють та вставляють разом те, що знаходять в іншому місці
  • Особисті переваги

Я особисто віддаю перевагу ANSI-92 і змінюю кожен запит, який я бачу в синтаксисі ANSI-89, іноді лише для того, щоб краще зрозуміти заяву SQL під рукою. Але я зрозумів, що більшість людей, з якими я працюю, недостатньо кваліфіковані для написання приєднань до багатьох таблиць. Вони кодують якомога краще і використовують те, що запам'ятовували, коли вони стикалися з оператором SQL.


1

Ось декілька моментів, що порівнюють SQL-89 та SQL-92 та усувають деякі помилки в інших відповідях.

  1. NATURAL JOINS- жахлива ідея. Вони неявні, і їм потрібна метаінформація про таблицю. Ніщо про SQL-92 не вимагає їх використання, тому просто ігноруйте їх . Вони не стосуються цієї дискусії.
  2. USING це чудова ідея, вона має два ефекти:
    1. Він створює лише один стовпчик на множині результатів з екіджоїну.
    2. Він застосовує чітку та здорову умову. У SQL-89 у вас були люди, що писали стовпчик idна обох таблицях. Після того, як ви приєднаєтесь до таблиць, це стає неоднозначним і вимагає явного згладжування. Крім того, дані idпро з'єднання майже напевно мали різні дані. Якщо ви приєднаєтеся до особі компанії, тепер у вас є псевдонім одного idдо person_id, і один idдо company_id, без якого приєднатися буде виробляти дві неоднозначні колони. Використання глобально унікального ідентифікатора для сурогатного ключа таблиці - це умова, з яким стандарт винагороджує USING.
  3. Синтаксис SQL-89 є неявним CROSS JOIN. A CROSS JOINне зменшує набір, він неявно збільшує його. FROM T1,T2те саме FROM T1 CROSS JOIN T2, що виробляє декартову приєднання, яке зазвичай не є тим, що ви хочете. Маючи вибірковість для зменшення віддаленого на віддаленеWHERE умовного означає, що ви більше схильні до помилок під час проектування.
  4. SQL-89 ,і SQL-92 явні JOINs мають різний пріоритет. JOINмає вищий пріоритет. Що ще гірше, деякі бази даних, як MySQL, помилялися дуже довго. . Тож змішування двох стилів - погана ідея, і куди більш популярним стилем сьогодні є стиль SQL-92.

1) Якщо ви вивчаєте реляційну модель, ви зрозумієте, що не тільки природне приєднання до чудової ідеї, це єдиний вид приєднання, який вам потрібен. 2) Див. 1, тобто не потрібен. 3) Незалежно від синтаксису (і обидва є синтаксисом SQL-92), реляційний оператор є продуктом (помножити), тобто насправді не є об'єднанням (декартовий приєднання - це навіть не річ). 4. Див. 1, тобто не потрібен.
день, коли

0

Oracle взагалі не реалізує ANSI-92. У мене виникло декілька проблем, не в останню чергу через те, що таблиці даних в Oracle Apps так добре наділені стовпцями. Якщо кількість стовпців у ваших приєднаннях перевищує близько 1050 стовпців (що дуже просто зробити в Apps), ви отримаєте цю помилкову помилку, яка абсолютно не має логічного сенсу:

ORA-01445: cannot select ROWID from a join view without a key-preserved table.

Повторне написання запиту для використання синтаксису старого стилю приєднання змушує проблему зникати, що, здається, прямо вказує на палець звинувачення на реалізацію приєднання ANSI-92.

Поки я не стикався з цією проблемою, я був непохитним промоутером ASNI-92 через переваги у зменшенні шансів випадкового перехресного з'єднання, що набагато занадто легко зробити із синтаксисом старого стилю.

Однак зараз мені важче наполягати на цьому. Вони вказують на погану реалізацію Oracle і кажуть: "Ми зробимо це по-своєму, дякую".


1
Зробити Cross Cross може бути просто, це також щось, що не відбувається спонтанно, і це, звичайно, неоднозначно. Будь-який гідний розробник SQL міг це помітити. Але ВИКОРИСТАННЯ та ПРИРОДНИЙ ПРИЄДНАЙТЕСЬ - це спокуси, які кличуть до вас і розбивають ваш маленький човен на скелях туги і нещастя.

1
Моя думка полягала в тому, що простіше успішно створити випадкове перехресне з'єднання, не вистачаючи пункту де, який з'єднує дві таблиці разом. Перехресне з'єднання повинно бути навмисним в ANSI-92. Але я згоден, що ПРИРОДНИЙ ПРИЄДНАЙТЕ - це гидота. :)
Джонатан

Я зрозумів вашу думку. Але це не просто буває непритомним. Під час налагодження запиту ви помічаєте проблему та виправляєте її. Якщо ви використовуєте природне з'єднання, без змін - або все - до самого запиту, воно може змінитися через зміну таблиці.

0

Новий стандарт SQL успадковує все від попереднього стандарту, який називається "кайданами сумісності". Таким чином, стиль "старий" / "розділений комами" / "некваліфікований" стиль ідеально відповідає синтаксису SQL-92.

Тепер я стверджую, що SQL-92 NATURAL JOIN- це єдине, що вам потрібно. Наприклад, я стверджую, що це перевершує те, inner joinщо він не генерує повторюваних стовпців - більше змінних діапазону вSELECT застереженнях для розмежування стовпців! Але я не можу очікувати, що я змінять кожне серце і розум, тому мені потрібно працювати з кодерами, які продовжуватимуть приймати те, що я особисто вважаю стилями приєднання (і вони навіть можуть називати змінні діапазону як "псевдоніми"!). Така природа роботи в команді і не працює у вакуумі.

Одне з зауважень мови SQL полягає в тому, що той самий результат можна отримати, використовуючи ряд семантично-еквівалентних синтаксисів (деякі з використанням реляційної алгебри, інші з використанням реляційного числення), коли вибір "найкращого" просто зводиться до особистого стилю . Тож мені так само комфортно приєднується до «старого стилю», як і я INNER. Чи потрібно мені час, щоб їх переписати, NATURALзалежно від контексту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.