[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-sql-chto-delaet-operator-merge":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},863,"chto-delaet-operator-merge",25,"sql","SQL","🗃️","Что делает оператор MERGE?","`MERGE` (также известный как UPSERT) — оператор, который выполняет слияние данных одной таблицы с данными другой на основе условия. Если условие истинно (строка найдена) — выполняется `UPDATE`, если нет — `INSERT`. Это атомарная операция, заменяющая комбинацию `SELECT` + `IF EXISTS` + `UPDATE`\u002F`INSERT`.\n\n```sql\nMERGE INTO target_table t\nUSING source_table s\nON t.id = s.id\nWHEN MATCHED THEN\n    UPDATE SET t.name = s.name, t.value = s.value\nWHEN NOT MATCHED THEN\n    INSERT (id, name, value) VALUES (s.id, s.name, s.value);\n```\n\nВ секции `UPDATE` нельзя изменять столбцы, по которым выполняется связывание (`ON`). Стандарт SQL:2003 определяет `MERGE`, но не все СУБД реализуют его одинаково. PostgreSQL до версии 15 не поддерживал `MERGE` и использовал альтернативный синтаксис `INSERT ... ON CONFLICT`:\n\n```sql\n-- PostgreSQL UPSERT (до версии 15)\nINSERT INTO products (id, name, price)\nVALUES (1, 'Widget', 9.99)\nON CONFLICT (id)\nDO UPDATE SET name = EXCLUDED.name, price = EXCLUDED.price;\n```\n\nНачиная с PostgreSQL 15, полноценный `MERGE` поддерживается по стандарту SQL.\n\n> **На собеседовании:** объясните, что `MERGE` — это атомарный UPSERT, и упомяните `ON CONFLICT` как альтернативу в PostgreSQL. Частая ошибка — не знать, что в секции `UPDATE` нельзя менять столбцы из условия `ON`.","","junior",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что делает оператор EXISTS? — Gymterview","`EXISTS` принимает подзапрос в качестве аргумента и возвращает `TRUE`, если подзапрос возвращает хотя бы одну строку, и `FALSE`, если подзапрос не возвращает ни","`EXISTS` принимает подзапрос в качестве аргумента и возвращает `TRUE`, если подзапрос возвращает хотя бы одну строку, и ",[7,13],"`EXISTS` принимает подзапрос в качестве аргумента и возвращает `TRUE`, если подзапрос возвращает хотя бы одну строку, и `FALSE`, если подзапрос не возвращает ни одной строки. В отличие от `IN`, оператор `EXISTS` не загружает весь результат подзапроса — он останавливается, как только найдена первая с",true]