{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Богдан Стефанюк: дописи з тегом sql",
    "_rss_description": "Всім привіт! Я — Богдан, фулстек розробник з Києва. Пишу в основному про програмування та штуки які вивчаю. Час від часу публікую підбірки фоток, зроблених на плівку, розказую про подорожі та цікаві речі, що оточують мене.",
    "_rss_language": "uk",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/www.stefaniuk.website\/tags\/sql\/",
    "feed_url": "https:\/\/www.stefaniuk.website\/tags\/sql\/json\/",
    "icon": "https:\/\/www.stefaniuk.website\/pictures\/userpic\/userpic@2x.jpg?1565716580",
    "authors": [
        {
            "name": "Bohdan Stefaniuk",
            "url": "https:\/\/www.stefaniuk.website\/",
            "avatar": "https:\/\/www.stefaniuk.website\/pictures\/userpic\/userpic@2x.jpg?1565716580"
        }
    ],
    "items": [
        {
            "id": "167",
            "url": "https:\/\/www.stefaniuk.website\/all\/delete-duplicates-in-table\/",
            "title": "Удаления дубликатов строк",
            "content_html": "<p>Недавно мне попалась интересная задачка по SQL.<br \/>\nУ вас есть таблица с 2 колонками: Id, Name. Но на колонках нет никаких ограничений. И получилось так что там если дубли и нам надо их удалить.<\/p>\n<p>Пример таблички<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.stefaniuk.website\/pictures\/TableWithDuplicates.png\" width=\"168\" height=\"136\" alt=\"\" \/>\n<\/div>\n<p>В случае когда у нас нет ни одного уникального значения, мы можем использовать номер строки для идентификации записи для удаления.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">; WITH DuplicatesForDelete(Row) AS (\r\n\tSELECT ROW_NUMBER() OVER(PARTITION BY t1.Id, t1.Name ORDER BY Id, Name) AS Row \r\n\tFROM TableWithDuplicates t1\r\n)\r\nDELETE FROM DuplicatesForDelete WHERE Row &gt; 1<\/code><\/pre><p><a href=\"https:\/\/www.fastreport.ru\/ru\/blog\/251\/show\/\">Статья о том что такое оконные функции (OVER) <\/a><\/p>\n",
            "date_published": "2019-11-13T17:29:28-04:00",
            "date_modified": "2019-11-06T05:48:50-04:00",
            "tags": [
                "sql",
                "програмування"
            ],
            "image": "https:\/\/www.stefaniuk.website\/pictures\/TableWithDuplicates.png",
            "_date_published_rfc2822": "Wed, 13 Nov 2019 17:29:28 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "167",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/www.stefaniuk.website\/pictures\/TableWithDuplicates.png"
                ]
            }
        },
        {
            "id": "121",
            "url": "https:\/\/www.stefaniuk.website\/all\/get-blocked-queries-on-sql-server\/",
            "title": "Полезные SQL скрипты: запросы, которые страдают от блокировок",
            "content_html": "<pre class=\"e2-text-code\"><code class=\"\">SELECT TOP 10\r\n    [Average Time Blocked] = (total_elapsed_time - total_worker_time) \/ qs.execution_count,\r\n    [Total Time Blocked] = total_elapsed_time - total_worker_time,\r\n    [Execution count] = qs.execution_count,\r\n    [Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset\/2,\r\n        (CASE\r\n        WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2\r\n        ELSE qs.statement_end_offset\r\n        END - qs.statement_start_offset)\/2),\r\n    [Parent Query] = qt.text,\r\n    [DatabaseName] = DB_NAME(qt.dbid)\r\nFROM sys.dm_exec_query_stats qs\r\nCROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt\r\nORDER BY [Average Time Blocked] DESC;<\/code><\/pre>",
            "date_published": "2019-11-05T17:04:49-04:00",
            "date_modified": "2019-08-13T09:16:33-04:00",
            "tags": [
                "sql"
            ],
            "_date_published_rfc2822": "Tue, 05 Nov 2019 17:04:49 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "121",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "131",
            "url": "https:\/\/www.stefaniuk.website\/all\/get-information-about-table-index-in-mssql\/",
            "title": "Получить информацию по индексу в таблице",
            "content_html": "<pre class=\"e2-text-code\"><code class=\"\">DECLARE @TableName varchar(255) = 'LeadInFolder'\r\nDECLARE @TableIndexName varchar(255) = 'Icy1fjQeGXuR5svQcM20sAenE8U'\r\n\r\nSELECT * FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(@TableName), NULL, NULL, NULL) ips\r\nINNER JOIN sys.indexes i ON (ips.object_id = i.object_id) AND (ips.index_id = i.index_id)\r\nWHERE i.name = @TableIndexName<\/code><\/pre>",
            "date_published": "2019-10-25T06:27:24-04:00",
            "date_modified": "2020-01-27T06:59:51-04:00",
            "tags": [
                "sql"
            ],
            "_date_published_rfc2822": "Fri, 25 Oct 2019 06:27:24 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "131",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "120",
            "url": "https:\/\/www.stefaniuk.website\/all\/get-not-used-indexes-in-mssql\/",
            "title": "Полезные SQL скрипты: неиспользуемые индексы",
            "content_html": "<p>Скрипт показывает индексы, которы не участвуют в построении планов, но постоянно обноляються при изменении данных.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">SELECT DatabaseName = DB_NAME(),\r\n    TableName = OBJECT_NAME(s.[object_id]),\r\n    IndexName = i.name,\r\n    user_updates,\r\n    system_updates,\r\n    'alter index [' +OBJECT_SCHEMA_NAME(i.object_id, DB_ID())+ '].['+i.name+'] ON ['+OBJECT_NAME(s.[object_id])+'] DISABLE' as [Disable],\r\n    'exec sp_rename ''['+OBJECT_SCHEMA_NAME(i.object_id, DB_ID())+'].['+OBJECT_NAME(s.[object_id])+'].['+i.name+']'',''disable_'+i.name+''',''INDEX''' as [Rename]\r\nFROM sys.dm_db_index_usage_stats s\r\nINNER JOIN sys.indexes i ON s.object_id = i.object_id and\r\n                            s.index_id  = i.index_id\r\nWHERE s.database_id = DB_ID() and\r\n    OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0 and\r\n    s.user_seeks   = 0 and\r\n    s.user_scans   = 0 and\r\n    s.user_lookups = 0 and\r\n    i.is_disabled  = 0 and\r\n    i.is_unique = 0 and\r\n    i.is_primary_key = 0 and\r\n    i.type_desc &lt;&gt; 'HEAP'\r\norder by user_updates + system_updates desc<\/code><\/pre>",
            "date_published": "2019-10-21T04:57:03-04:00",
            "date_modified": "2019-10-19T11:08:28-04:00",
            "tags": [
                "sql"
            ],
            "_date_published_rfc2822": "Mon, 21 Oct 2019 04:57:03 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "120",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "122",
            "url": "https:\/\/www.stefaniuk.website\/all\/search-foreign-key-by-name\/",
            "title": "Полезные SQL скрипты: поиск foreign key по БД",
            "content_html": "<pre class=\"e2-text-code\"><code class=\"\">SELECT \r\n    f.name AS ForeignKey, \r\n    OBJECT_NAME(f.parent_object_id) AS TableName, \r\n    COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName, \r\n    OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, \r\n    COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName \r\nFROM \r\n    sys.foreign_keys AS f \r\nINNER JOIN \r\n    sys.foreign_key_columns AS fc \r\nON \r\n    f.OBJECT_ID = fc.constraint_object_id \r\nWHERE \r\n    f.name = 'FKnokgcq1rxh5Y7DLhgCqIZJ4KY'<\/code><\/pre>",
            "date_published": "2019-09-28T06:19:02-04:00",
            "date_modified": "2019-09-28T06:18:58-04:00",
            "tags": [
                "sql"
            ],
            "_date_published_rfc2822": "Sat, 28 Sep 2019 06:19:02 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "122",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "119",
            "url": "https:\/\/www.stefaniuk.website\/all\/poleznye-sql-skripty-tekuschaya-situaciya-na-servere\/",
            "title": "Полезные SQL скрипты: текущая ситуация на сервере",
            "content_html": "<p>С помощью этих скрипов можно посмотреть какие запросы в данных момент выполняются на сервере.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">select *\r\nfrom sys.sysprocesses \r\nwhere \r\n\tspid &gt; 50 and \r\n\tspid &lt;&gt; @@spid and \r\n\tstatus &lt;&gt; 'sleeping'\r\norder by spid, ecid<\/code><\/pre><pre class=\"e2-text-code\"><code class=\"\">select \r\n\tsession_id, \r\n\tstatus, \r\n\twait_type, \r\n\tcommand, \r\n\tlast_wait_type, \r\n\tpercent_complete, \r\n\tqt.text, \r\n\ttotal_elapsed_time\/1000 as [total_elapsed_time, сек],\r\n\twait_time\/1000 as [wait_time, сек],\r\n\t(total_elapsed_time - wait_time)\/1000 as [work_time, сек]\r\nfrom sys.dm_exec_requests as qs\r\nCROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt\r\nwhere session_id &gt;= 50 and session_id &lt;&gt; @@spid<\/code><\/pre>",
            "date_published": "2019-09-27T06:21:00-04:00",
            "date_modified": "2019-08-13T09:11:43-04:00",
            "tags": [
                "sql"
            ],
            "_date_published_rfc2822": "Fri, 27 Sep 2019 06:21:00 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "119",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "140",
            "url": "https:\/\/www.stefaniuk.website\/all\/indexes-in-ms-sql\/",
            "title": "Небольшая заметка об индексах в ms sql",
            "content_html": "<p>Индексы это важная часть большинства серверов баз данных. Они позволяют ускорить доступ к данным. Суть индексов хорошо описывает следующий пример: оглавление книги, оно позволяет найти нужную нам страницу вместо перебора всех страниц. Но у индексов есть недостатки: они заполняют дополнительное место (бывают случаи что индексы занимают в 3 раза больше места чем сами данные), также замедляются операции изменения данных, так как теперь нам надо менять еще и индексы.<\/p>\n<h2>Что из себя представляет индекс?<\/h2>\n<p>Внутри сервера они представлены в виде B-tree, где B означает сбалансированное, а не бинарное дерево.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.stefaniuk.website\/pictures\/b-tree-index-view.png\" width=\"572\" height=\"437\" alt=\"\" \/>\n<\/div>\n<p>Например мы хотим найти запись с Id = 2581.<br \/>\nНачиная с корня, выполняется поиск наименьшего значения ключа, большего или равного требуемому. Так мы найдем узел 18316, потом спустимся в узел 9031 и там мы увидим что есть прямая ссылка на лежащие данные по ключу 2581, после чего осуществляем вычитку данных.<\/p>\n<h2>Кластерный индекс<\/h2>\n<p>Кластерный индекс позволяет определить порядок данных в таблице. Таким образом индекс содержит не только указатели на строки но и сами данных. Из этого выходит что у таблицы может быть только один кластерный индекс, так как нельзя физически упорядочить элементы более чем одним способом. Индекс создается автоматически для каждой таблицы, в которой определен первичный ключ.<\/p>\n<h2>Не кластерный индекс<\/h2>\n<p>Структура такая же как и кластерного индекса, но с двумя отличиями:<\/p>\n<ol start=\"1\">\n<li>Не изменяет физическое упорядочивание данных.<\/li>\n<li>Страницы индекса состоят из ключа индекса и ссылки на строку.<\/li>\n<\/ol>\n<p>SQL Server использует индекс для нахождения записей, совпадающих с условиями запроса.<\/p>\n<h2>Составной ключ в индексе<\/h2>\n<p>SQL Server позволяет создавать индексы по нескольким колонкам. Но в таком случае у нас появляется ограничение. Длинна составного ключа не должна быть больше 900 байт. Но бывают исключения, например у нас есть две колонки, каждая из которых длинной в 500 байт. Сервер создаст индекс, в случае если нет данных, которые будут превышать длину в 900 байт.<\/p>\n<p>Также стоит помнить что индексы типа (Col1, Col2) и (Col2, Col1) разные.<\/p>\n<h2>Уникальные индексы<\/h2>\n<p>Такие индексы создаются для реализации целостности данных. Таким образом сервер гарантирует уникальные значение для указанной колонки или составного ключа.<\/p>\n<h2>Статьи, которые советую почитать чтобы глубже разобраться в теме<\/h2>\n<ol start=\"1\">\n<li><a href=\"https:\/\/professorweb.ru\/my\/sql-server\/2012\/level3\/3_5.php\">Очень хорошая статья о всех типах индексов, когда их стоит создавать и как использовать<\/a><\/li>\n<li><a href=\"http:\/\/www.sql.ru\/articles\/mssql\/03013101indexes.shtml\">Индексы. Теоретические основы.<\/a><\/li>\n<\/ol>\n",
            "date_published": "2019-09-21T06:20:03-04:00",
            "date_modified": "2019-09-17T17:16:17-04:00",
            "tags": [
                "sql",
                "алгоритми та структури даних",
                "програмування"
            ],
            "image": "https:\/\/www.stefaniuk.website\/pictures\/b-tree-index-view.png",
            "_date_published_rfc2822": "Sat, 21 Sep 2019 06:20:03 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "140",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/www.stefaniuk.website\/pictures\/b-tree-index-view.png"
                ]
            }
        },
        {
            "id": "137",
            "url": "https:\/\/www.stefaniuk.website\/all\/recursion-in-sql\/",
            "title": "Изучение SQL: рекурсивные запросы",
            "content_html": "<p>Основой любого рекурсивного запроса является <a href=\"https:\/\/metanit.com\/sql\/sqlserver\/10.4.php\">производная таблица<\/a>.  С ее помощью мы можем сделать запрос. который будет выполняться до тех пор, пока не выполниться условие.<\/p>\n<p><b>Общий вид рекурсивного запроса<\/b><\/p>\n<pre class=\"e2-text-code\"><code class=\"\">WITH &lt;имя&gt; (&lt;список столбцов&gt;)\r\nAS (\r\n\tSELECT    -- анкорная часть\r\n\tUNION ALL -- рекурсивная часть\r\n        SELECT FROM &lt;имя&gt;\r\n        WHERE &lt;условие продолжения интерации&gt;\r\n)<\/code><\/pre><p>Для того чтобы происходила рекурсия мы используем в рекурсивной части ссылку на самого себя.<\/p>\n<p><b>Пример 1<\/b><br \/>\nУ нас есть табличка, в которой лежат сотрудники, у каждого сотрудника есть руководитель, который указывается в колонку ParentId. Нам надо найти менеджера, в непрямом подчинении которого есть указанный нами человек.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.stefaniuk.website\/pictures\/Screenshot_11.png\" width=\"296\" height=\"104\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Наполнение таблицы.<\/div>\n<\/div>\n<p>Код запроса:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">;WITH OrgStructure AS \r\n(\r\n\tSELECT Id, ParentId, EmployeeType, EmployeeName\r\n\tFROM Employees\r\n\tWHERE EmployeeName = 'Jim' -- отправная точка, нам надо найти менеджера сотрудника Jim\r\n\r\n\tUNION ALL\r\n\r\n\tSELECT e.Id, e.ParentId, e.EmployeeType, e.EmployeeName\r\n\tFROM Employees as e\r\n\tJOIN OrgStructure as os\r\n\tON e.Id = os.ParentId\r\n)\r\n\r\nSELECT * FROM OrgStructure\r\nWHERE EmployeeType = 'manager' -- указываем что мы ищем менеджера.<\/code><\/pre><p><b>Пример 2<\/b><br \/>\nНайдем первые 10 чисел Фибоначчи:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">;WITH FIBONACHI AS \r\n(\r\n\tSELECT\r\n\t\t1 Iteration,\r\n\t\t1 SecondValue,\r\n\t\t2 CurrentValue\r\n\tUNION ALL\r\n\r\n\tSELECT\r\n\t\tIteration + 1,\r\n\t\tSecondValue = CurrentValue,\r\n\t\tCurrentValue = SecondValue + CurrentValue\r\n\tFROM FIBONACHI\r\n\tWHERE Iteration &lt; 10\r\n)\r\nSELECT CurrentValue FROM FIBONACHI<\/code><\/pre>",
            "date_published": "2019-09-16T16:00:05-04:00",
            "date_modified": "2019-09-06T08:25:10-04:00",
            "tags": [
                "sql",
                "програмування"
            ],
            "image": "https:\/\/www.stefaniuk.website\/pictures\/Screenshot_11.png",
            "_date_published_rfc2822": "Mon, 16 Sep 2019 16:00:05 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "137",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/www.stefaniuk.website\/pictures\/Screenshot_11.png"
                ]
            }
        },
        {
            "id": "116",
            "url": "https:\/\/www.stefaniuk.website\/all\/sql-join-cheetsheet\/",
            "title": "Шпаргалка по джоинам в SQL",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.stefaniuk.website\/pictures\/sql-join-cheat-sheet.png\" width=\"600\" height=\"472\" alt=\"\" \/>\n<\/div>\n<p>А также <a href=\"http:\/\/www.skillz.ru\/dev\/php\/article-Obyasnenie_SQL_obedinenii_JOIN_INNER_OUTER.html\">отличная статья<\/a> которая раскрывает тему объединения данных.<\/p>\n",
            "date_published": "2019-08-20T05:39:15-04:00",
            "date_modified": "2019-08-20T05:37:19-04:00",
            "tags": [
                "sql"
            ],
            "image": "https:\/\/www.stefaniuk.website\/pictures\/sql-join-cheat-sheet.png",
            "_date_published_rfc2822": "Tue, 20 Aug 2019 05:39:15 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "116",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/www.stefaniuk.website\/pictures\/sql-join-cheat-sheet.png"
                ]
            }
        },
        {
            "id": "99",
            "url": "https:\/\/www.stefaniuk.website\/all\/sql-go-statement\/",
            "title": "Изучение SQL: ключевое слово GO",
            "content_html": "<p>SQL позволяет объединять несколько команд в один пакет, который будет выполняться вместе и представлять одно целое. В качестве сигнала завершения пакета и его выполнения служит команда GO. Смысл в том, что одни команды должны выполниться после выполнения предыдущих.  Тем самым мы можем строить последовательность команд.<\/p>\n<p>Например, создание БД и добавления в нее таблиц:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">CREATE DATABASE TestDB\r\nGO\r\n\r\nUSE TestDB\r\n\r\nCREATE TABLE Users\r\n(\r\n\tId uniqueidintefier PRIMARY KEY IDENTITY,\r\n\tFirstName varchar(50) NOT NULL\r\n)<\/code><\/pre>",
            "date_published": "2019-08-02T04:34:05-04:00",
            "date_modified": "2019-07-30T15:14:04-04:00",
            "tags": [
                "sql"
            ],
            "_date_published_rfc2822": "Fri, 02 Aug 2019 04:34:05 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "99",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "50",
            "url": "https:\/\/www.stefaniuk.website\/all\/learn-sql-except-i-intersect\/",
            "title": "Изучение SQL: EXCEPT и INTERSECT",
            "content_html": "<h2>EXCEPT<\/h2>\n<p>С помощью данной команды можно найти разницу двух выборок.<br \/>\nРезультатом будут строки первой таблицы, которых нету во второй.<\/p>\n<p>Например нам нужно вывести только тех пользователей, которые не являются сотрудниками:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">SELECT Name, SecondName\r\nFROM Contact\r\nEXCEPT\r\nSELECT Name, SecondName\r\nFROM Employee<\/code><\/pre><h2>INTERSECT<\/h2>\n<p>Работает похожим образом как EXCEPT, только наоборот.<br \/>\nПозволяет найти общие записи для двух выборок.<\/p>\n<p>Выведем контакты, которые являются нашими сотрудниками.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">SELECT Name, SecondName\r\nFROM Contact\r\nINTERSECT\r\nSELECT Name, SecondName\r\nFROM Employee<\/code><\/pre>",
            "date_published": "2019-04-28T11:28:28-04:00",
            "date_modified": "2019-04-27T14:35:02-04:00",
            "tags": [
                "sql"
            ],
            "_date_published_rfc2822": "Sun, 28 Apr 2019 11:28:28 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "50",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "49",
            "url": "https:\/\/www.stefaniuk.website\/all\/learn-sql-union\/",
            "title": "Изучение SQL: UNION",
            "content_html": "<p>Оператор UNION позволяет соединить две таблицы. Но в отличие от inner\/outer join объединения соединяют не столбцы разных таблиц, а два однотипных набора в один.<\/p>\n<p>Также должно совпадать количество колонок и их тип, в противном случае будет ошибка.<\/p>\n<p>Пример:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">SELECT Name, Age \r\nFROM Contact\r\nUNION \r\nSELECT Name, Age \r\nFROM Employees<\/code><\/pre><p>Также мы можем отсортировать выборку. Для этого нужно ориентироваться на имена колонок из первой выборки.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">SELECT Name, Age as FirstAge\r\nFROM Contact\r\nUNION \r\nSELECT Name, Age as SecondAge \r\nFROM Employees\r\nORDER BY FirstAge<\/code><\/pre><p>Если при объединении буду дубли данных, они не будут отображаться, для того чтобы их отобразить, нужно использовать UNION ALL.<\/p>\n",
            "date_published": "2019-04-27T14:19:22-04:00",
            "date_modified": "2019-04-28T11:29:18-04:00",
            "tags": [
                "sql"
            ],
            "_date_published_rfc2822": "Sat, 27 Apr 2019 14:19:22 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "49",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "48",
            "url": "https:\/\/www.stefaniuk.website\/all\/izuchenie-sql-operatory-group-by-i-having\/",
            "title": "Изучение SQL: Операторы GROUP BY и HAVING",
            "content_html": "<p>Для группировки данных существуют 2 ключевых слова: GROUP BY и HAVING.<\/p>\n<h2>GROUP BY<\/h2>\n<p>Оператор GROUP BY определяет, как строки будут группироваться.<\/p>\n<p>Например сгруппировать контакты по стране:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">SELECT country, Count(*) AS UserByCountryCount\r\nFROM Contacts\r\nGROUP BY country<\/code><\/pre><h2>HAVING<\/h2>\n<p>Используется для фильтрации групп.<\/p>\n<p>Например, найдем страны в которых больше 100 пользователей:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">SELECT country, COUNT(*) AS UserByCountryCount\r\nFROM Contacts\r\nGROUP BY country\r\nHAVING COUNT(*) &gt; 100<\/code><\/pre>",
            "date_published": "2019-04-23T10:40:43-04:00",
            "date_modified": "2019-04-23T10:40:30-04:00",
            "tags": [
                "sql"
            ],
            "_date_published_rfc2822": "Tue, 23 Apr 2019 10:40:43 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "48",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "32",
            "url": "https:\/\/www.stefaniuk.website\/all\/sql-triggers\/",
            "title": "Изучение SQL: триггеры",
            "content_html": "<p>Сегодня на работе была задача по созданию триггеров на таблицу БД.<br \/>\nСуть заключалась в том, что надо сделать механизм, при котором update\/insert в одну таблицу, переносил данные в другую таблицу, а предыдущую удалял.<\/p>\n<p>Так как я раньше не работал с триггерами, пришлось немного почитать и сделать для себя эту заметку.<\/p>\n<h2>Типы триггеров.<\/h2>\n<ol start=\"1\">\n<li><b>AFTER<\/b> — выполняется после выполнения действия. Определяется только для таблиц. Можно определять несколько действий через запятую.<\/li>\n<li><b>INSTEAD OF<\/b> — выполняется вместо действия (то есть по сути действие — добавление, изменение или удаление — вообще не выполняется). Определяется для таблиц и представлений. Можно определять только одно действие.<\/li>\n<\/ol>\n<h2>Создание простого триггера<\/h2>\n<pre class=\"e2-text-code\"><code class=\"\">CREATE TRIGGER User_Insert_Update_TR\r\nON Users\r\nAFTER INSERT, UPDATE -- сработает как для INSERT так и для UPDATE скриптов.\r\nAS\r\nBEGIN\r\n    INSERT UsersLog (UserId)\r\n    SELECT Id FROM inserted\r\nEND<\/code><\/pre><h2>Управление триггером<\/h2>\n<p>Удаление<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">DROP TRIGGER User_Insert_Update_TR<\/code><\/pre><p>Отключение<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">DISABLE TRIGGER User_Insert_Update_TR ON Users<\/code><\/pre><p>Включение<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ENABLE TRIGGER User_Insert_Update_TR ON Users<\/code><\/pre><h2>Работа со значениями запроса<\/h2>\n<p>Внутри каждого триггера можно работать с данными, которые изменяет тот или иной триггер.<\/p>\n<ol start=\"1\">\n<li>Добавление — виртуальная табличка INSERTED.<\/li>\n<li>Удаление — виртуальная табличка DELETED.<\/li>\n<li>Изменение — содержит 2 таблички.<br \/>\nINSERTED хранит строки после обновления.<br \/>\nDELETED до обновления.<\/li>\n<\/ol>\n<h2>INSTEAD OF<\/h2>\n<p>Данный тип триггеров работает вместо операций с данными. Также его можно применять не только для таблиц но и для представлений.<\/p>\n<p><b>Пример<\/b><br \/>\nДанный триггер не будет удалять данный из таблицы Users, он просто деактивирует запись<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">CREATE TRIGGER User_Delete_TR\r\nON Users\r\nINSTED OF DELETE\r\nAS\r\nBEGIN\r\n    UPDATE Users\r\n    SET IsActive = 0\r\n    WHERE Id = (SELECT Id FROM deleted)\r\nEND<\/code><\/pre>",
            "date_published": "2019-03-27T14:01:33-04:00",
            "date_modified": "2019-03-27T14:01:03-04:00",
            "tags": [
                "sql"
            ],
            "_date_published_rfc2822": "Wed, 27 Mar 2019 14:01:33 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "32",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4116,
    "_e2_ua_string": "Aegea 11.2 (v4116)"
}