Как упоминается в первом ответе, с ES6 / Babel вы можете теперь создавать многострочные строки просто с помощью обратных ссылок:
const htmlString = `Say hello to
multi-line
strings!`;
Интерполирующие переменные являются популярная новая функция, которая поставляется с строками с разделителями обратной ссылки:
const htmlString = `${user.name} liked your post about strings`;
Это просто переходит к конкатенации:
user.name + ' liked your post about strings'
Руководство по стилю JavaScript в стиле Google рекомендует использовать конкатенацию строк вместо экранирования строк:
Не делайте этого:
var myString = 'A rather long string of English text, an error message \ actually that just keeps going and going -- an error \ message to make the Energizer bunny blush (right through \ those Schwarzenegger shades)! Where was I? Oh yes, \ you\'ve got an error and all the extraneous whitespace is \ just gravy. Have a nice day.';
Пробелы на начало каждой строки не может быть безопасно удалено во время компиляции; пробел после косой черты приведет к сложным ошибкам; и в то время как большинство движков сценариев поддерживают это, оно не является частью ECMAScript.
Вместо этого используйте конкатенацию строк:
var myString = 'A rather long string of English text, an error message ' + 'actually that just keeps going and going -- an error ' + 'message to make the Energizer bunny blush (right through ' + 'those Schwarzenegger shades)! Where was I? Oh yes, ' + 'you\'ve got an error and all the extraneous whitespace is ' + 'just gravy. Have a nice day.';
INNER JOIN
- это синтаксис ANSI, который вы должны использовать.
Обычно считается более читаемым, особенно когда вы присоединяетесь к множеству таблиц.
Его также можно легко заменить OUTER JOIN
всякий раз, когда возникает необходимость.
Синтаксис WHERE
более ориентирован на реляционную модель.
Результат двух таблиц JOIN
ed является декартовым произведением таблиц к которому применяется фильтр, который выбирает только те строки с совпадающими столбцами.
Легче это увидеть с синтаксисом WHERE
.
Что касается вашего примера, в MySQL ( и в SQL вообще) эти два запроса являются синонимами.
Также обратите внимание, что MySQL также имеет предложение STRAIGHT_JOIN
.
Используя этот пункт, вы можете управлять порядком JOIN
: какая таблица проверяется во внешнем цикле и какая из них находится во внутреннем цикле.
Вы не можете управлять этим в MySQL с помощью синтаксиса WHERE
.
Синтаксис ANSI join определенно более переносимый.
Я собираюсь обновить Microsoft SQL Server, и я бы также упомянул, что синтаксис = * и * = для внешних соединений в SQL Server не поддерживается (без режима совместимости) для SQL Server 2005 года и позже.
*=
и =*
никогда не были ANSI и никогда не были хорошей нотой. Именно поэтому ON был необходим - для ВЗАИМОДЕЙСТВУЮЩИХ СОЕДИНЕНИЙ в отсутствие подзапросов (которые были добавлены одновременно, поэтому они фактически не нужны в CROSS & amp; INNER JOINs.)
– philipxy
26 November 2015 в 23:43
Стандарт SQL: 2003 изменил некоторые правила приоритета, поэтому оператор JOIN имеет преимущество перед соединением «запятая». Это может фактически изменить результаты вашего запроса в зависимости от того, как он настроен. Это вызывает некоторые проблемы для некоторых людей, когда MySQL 5.0.12 переключился на соблюдение стандарта.
Итак, в вашем примере ваши запросы будут работать одинаково. Но если вы добавили третью таблицу: SELECT ... FROM table1, table2 JOIN table3 ON ... WHERE ...
До MySQL 5.0.12 сначала будут объединены table1 и table2, а затем table3 , Теперь (5.0.12 и далее), table2 и table3 соединяются сначала, а затем table1. Он не всегда меняет результаты, но может, и вы даже не можете этого понять.
Я больше не использую синтаксис «запятая», предпочитая второй пример. В любом случае, это намного более читаемо, условия JOIN с JOINs, а не разделенные на отдельный раздел запроса.
Синтаксис неявного соединения ANSI является более старым, менее очевидным и не рекомендуется.
Кроме того, реляционная алгебра допускает взаимозаменяемость предикатов в предложении WHERE
и INNER JOIN
, поэтому даже INNER JOIN
с предложениями WHERE
могут иметь предикаты, переупорядоченные оптимизатором.
Я рекомендую вам писать запросы в наиболее читаемом виде.
Иногда это включает в себя создание INNER JOIN
относительно «неполным» и поместив некоторые из критериев в WHERE
просто, чтобы сделать списки критериев фильтрации более легко поддерживаемыми.
Например, вместо:
SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
ON ca.CustomerID = c.CustomerID
AND c.State = 'NY'
INNER JOIN Accounts a
ON ca.AccountID = a.AccountID
AND a.Status = 1
Запись:
SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
ON ca.CustomerID = c.CustomerID
INNER JOIN Accounts a
ON ca.AccountID = a.AccountID
WHERE c.State = 'NY'
AND a.Status = 1
Но это зависит, конечно.
Другие отметили, что INNER JOIN помогает читаемости для человека, и это главный приоритет; Согласен. Позвольте мне попытаться объяснить , почему синтаксис соединения более читабельен.
Основной запрос SELECT таков:
SELECT stuff
FROM tables
WHERE conditions
Предложение SELECT сообщает нам, что мы возвращаемся; предложение FROM сообщает нам, откуда мы его получаем, а предложение WHERE сообщает нам, какие из них мы получаем.
JOIN - это утверждение о таблицах, как они связаны друг с другом (концептуально, на самом деле , в одну таблицу). Любые элементы запроса, которые управляют таблицами - откуда мы получаем материал - семантически, относятся к предложению FROM (и, конечно же, здесь идут элементы JOIN). Ввод элементов соединения в предложение WHERE объединяет то, что и где-из; поэтому предпочтительным является синтаксис JOIN.
Я также укажу, что использование более старого синтаксиса более подвержено ошибкам. Если вы используете внутренние соединения без предложения ON, вы получите синтаксическую ошибку. Если вы используете старый синтаксис и забыли одно из условий соединения в предложении where, вы получите кросс-соединение. Разработчики часто исправляют это, добавляя отдельное ключевое слово (вместо того, чтобы фиксировать соединение, потому что они все еще не понимают, что само соединение не работает), что может показаться исцеляющим проблему, но значительно замедлит запрос.
Кроме того, для обслуживания, если у вас есть крест-соединение в старом синтаксисе, как разработчик узнает, хотите ли вы его иметь (есть ситуации, когда нужны перекрестные соединения) или если это была авария, которая должна быть исправлена?
Позвольте мне указать вам на этот вопрос, чтобы понять, почему неявный синтаксис является плохим, если вы используете левые соединения. Sybase * = для Ansi Standard с двумя разными внешними таблицами для одной и той же внутренней таблицы
Plus (личный rant здесь), стандарт с использованием явных объединений старше 20 лет, что означает синтаксис неявного соединения устарел для этих 20 лет. Вы могли бы написать код приложения, используя синтаксис, устаревший в течение 20 лет? Почему вы хотите написать код базы данных?
HAVING
, который был «устаревшим», поскольку SQL начал поддерживать производные таблицы. Я также замечаю, что вы не используете NATURAL JOIN
, хотя я бы сказал, что он сделал INNER JOIN
«устаревшим». Да, у вас есть свои причины (нет необходимости указывать их здесь снова!): Я хочу сказать, что те, кому нравится использовать старый синтаксис, тоже имеют свои причины, а относительный возраст синтаксиса мало, если есть какая-либо значимость.
– onedaywhen
14 October 2016 в 13:45
Применение условных операторов в ON / WHERE
Здесь я объяснил о шагах обработки логических запросов.
Ссылка: внутри Microsoft® SQL Server ™ 2005 T-SQL Querying Издатель: Microsoft Press Pub Дата: 07 марта 2006 г. Печать ISBN-10: 0-7356-2313-9 Печать ISBN-13: 978-0-7356-2313-2 Страницы: 640
Внутри Microsoft SQL Server ™ 2005 T-SQL Querying
(8) SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
Первым заметным аспектом SQL, который отличается от других языков программирования, является порядок в который обрабатывается кодом. В большинстве языков программирования код обрабатывается в том порядке, в котором он написан. В SQL первое обрабатываемое предложение - это предложение FROM, в то время как первое предложение SELECT, которое появляется первым, обрабатывается почти последним.
Каждый шаг генерирует виртуальную таблицу, которая используется как вход для следующего шаг. Эти виртуальные таблицы недоступны для вызывающего (клиентского приложения или внешнего запроса). Конечной стороне возвращается только таблица, сгенерированная на последнем шаге. Если определенное условие не указано в запросе, соответствующий шаг просто пропущен.
Не беспокойтесь слишком много, если описание шаги пока не имеют большого смысла. Они приведены в качестве ссылки.
<join_condition>
TRUE, вставляются в VT2. <where_condition>
TRUE, вставлены в VT4. <having_condition>
равно TRUE. Поэтому, (INNER JOIN) ON будет фильтровать данные (количество данных VT будет уменьшено здесь сами) перед применением предложения WHERE. Последующие условия соединения будут выполняться с отфильтрованными данными, что улучшает производительность. После этого условие WHERE будет применяться только к условиям фильтра.
(Применение условных операторов в ON / WHERE не будет иметь большого значения в нескольких случаях. Это зависит от того, сколько таблиц вы присоединились и количество строк доступно в каждой таблице соединений)
Я знаю, что вы говорите о MySQL, но так или иначе: В Oracle 9 явные объединения и неявные объединения будут генерировать разные планы выполнения. AFAIK, который был решен в Oracle 10+: больше нет такой разницы.
У них есть другое понятное для человека значение.
Однако, в зависимости от оптимизатора запросов, они могут иметь то же значение для машины.
Вы всегда должны указывать, чтобы быть читаемый.
То есть, если это встроенное отношение, используйте явное соединение. если вы согласны с слабо связанными данными, используйте предложение where.
Неявные объединения (что и называется вашим первым запросом) становятся намного более запутанными, трудными для чтения и сложными для поддержания, когда вам нужно начать добавлять в ваш запрос больше таблиц. Представьте, что вы делаете тот же запрос и тип соединения в четырех или пяти разных таблицах ... это кошмар.
Использование явного соединения (ваш второй пример) гораздо читабельнее и прост в обслуживании.
Oracle
,SQL Server
,MySQL
иPostgreSQL
- да. Для других систем, вероятно, тоже, но лучше проверить. – Quassnoi 26 July 2009 в 12:49WHERE
, также находится в стандарте ANSI. – Bill Karwin 13 January 2010 в 23:41WHERE
(без условий, соединение эквивалентно перекрестному соединению, как вы сказали). ANSI SQL-92 добавил ключевое словоJOIN
и соответствующий синтаксис, но синтаксис в стиле запятой по-прежнему поддерживается для обратной совместимости. – Bill Karwin 14 January 2010 в 00:03