Аналитика

Основные запросы в SQL для баз данных

Взял у Ромы Игошина в его доксе

Как заменить текст в всех полях sql запросом

UPDATE * SET name = REPLACE(name, ‘text1’, ‘text2’);

Простой выбор данных

select * from core.SourceData

Запрос звучит: “выбрать (select) всё (*) из (from) таблицы (core.SourceData)

Можно выбрать не все поля, а только нужные нам. Для этого заменяем значок *, на нужные названия столбцов. Они разделяются запятой, кроме последнего.

select

AtomId,

Date,

Clicks

from core.SourceData

Выбор данных с условием

Условие записывается после основного запроса. 

select * from core.SourceData

where Date between ‘2016-10-01’ and ‘2016-10-02’

Запрос звучит: “выбрать всё из таблицы ДанныеИзИсточников, где (where) дата между (between) значениями”.

Условия можно задавать по любому полю таблицы. Операторы могут быть разные: 

  • = — равно;
  • <> — не равно;
  • > — больше;
  • < — меньше;
  • between — диапазон между заданных значений;
  • like — поле содержит какое-то значение;
  • in — поле равно одному из значений.

select * from core.Campaigns 

where Name like N’%Интересы%’

Запрос звучит: “выбрать всё из талицы Кампании, где поле Имя содержит (like) символы ‘Интересы’”

Знаки % означают, что до и после запроса могут быть любые символы. 

(?) Что будет, если убрать знак % в начале условия? — Будет означать, что нужно выбрать все записи, в которых поле Имя начинается с ‘Интересы’ и заканчивающиеся чем угодно.

select * from core.Campaigns 

where Id in (5, 6, 7)

(?) Как звучит запрос? — Запрос звучит: “выбрать всё из талицы Кампании, где поле Идентификатор (Id) имеет значения (in) 5 или 6 или 7

Вставить данные

Иногда в таблицы нужно вставить новые строки.

Первый способ.

insert core.Campaign (Id, Name, OrderBy)

values (12, N’Не целевая’, 980)

Запрос звучит: “вставить (insert) в таблицу Кампании, которая имеет столбцы (Идентификатор, Имя, Порядок) строку со значениями значения (values) (12, N’Не целевая’, 980).

Символ N перед одинарными кавычками предупреждает базу, что в значении могут быть кириллические символы.

Второй способ. То же самое, но запись проще. 

insert into core.Campaigns

values (12, N’Не целевая’, 980)

Существуют автоматически создаваемые поля. Чаще всего это идентификаторы записей. Их не нужно указывать, не в перечислении столбцов, не в перечислении значений. Вы узнаете о том, что они автоматические, когда попробуйте добавить запись, всё будет вроде правильно, но программа выдаст ошибку. 

Обновить данные

Любые записи в таблице можно исправить — обновить.

update core.Atoms

set SegmentId = 321

where id = 123

Запрос звучит: “обнови (update) таблицу Атомы, запиши (set) в столбец ИдентификаторСегмента значение 321, где Идентификатор равен 123”.

Соединить данные

Данные распределены по разным таблицам. Чтобы соединить их используем оператор join.

select *

from core.Atoms as A

left outer join core.Sources as Src on A.SourceId = Src.Id

В данном примере мы присоединили к таблице Атомов таблицу Источников.

Запрос звучит: “выбрать все строки из таблицы Атомы, назовём её (as) А, присоединяем слева (left outer join) таблицу Источники, назовём её Scr, по полям ИдентификаторИсточника в таблице Атомов равен Идентификатору в таблице Источников и т.д.”

(?) Присоедините к таблице атомов все необходимые справочники, чтобы можно было удобно смотреть статистику.

select *

from core.Atoms as A

left outer join core.Sources as Src on A.SourceId = Src.Id

left outer join core.Campaigns as Camp on A.CampaignId = Camp.Id

left outer join core.Cities as C on A.CityId = C.Id

left outer join core.Segments as Seg on A.SegmentId = Seg.Id

(?) Выберите только номера Атомов и названия городов, источников, кампаний и сегментов.

select

A.Id,

C.Name,

Src.Name,

Camp.Name,

Seg.Name

from core.Atoms as A

left outer join core.Sources as Src on A.SourceId = Src.Id

left outer join core.Campaigns as Camp on A.CampaignId = Camp.Id

left outer join core.Cities as C on A.CityId = C.Id

left outer join core.Segments as Seg on A.SegmentId = Seg.Id

Удалить данные

Удаляются всегда строки с данными, не сама таблица. Саму таблицу тоже можно, но другим запросом, сейчас рассматривать не будем.

delete from core.Atoms 

where id =1111

Запрос звучит: удалить (delete) строку из таблицы Атомов, где Идентификатор равен 1111

Начать запрос и отменить действия

Иногда запрос нужно протестировать, для этого мы его отменяем после исполнения. Чтобы не заносить данные в базу «на живую».

В начало любого запроса вставляем begin tran, в конец rollback.

begin tran

delete from core.Atoms 

where id = 1111

select * from core.Atoms

rollback

Запрос звучит: “начни запрос (begin tran), удали строки из таблицы Атомы, где Идентификатор равен 1111, отмени запрос (rollback)”.

Примеры запросов с джедайской встречи 03.10.2019

Удаление

begin tran

delete from client.Leads where Date between ‘2016-08-01’ and ‘2016-08-15’

select * from client.Leads

rollback

Переименовать что–то

BEGIN TRAN

UPDATE [core].[Segments]

SET Name = REPLACE(Name, N’Все факультеты’,N’УНИК’),

GaDynamicSegment = REPLACE(Name, N’Все факультеты’,N’УНИК’)

GO

select * from core.Segments

ROLLBACK

Дубли

select  from [client].[CrmPartners] where id in (select id from [client].[CrmPartners] group by id having count() > 1)

Выборки со Взаимно:

На рассмотрении по дате сделки:

SELECT        *

FROM        (

           SELECT        C.*, S.[StatusId], ROW_NUMBER() OVER (PARTITION BY C.[Id] ORDER BY S.[Date] DESC) AS [RowNumber]

           FROM        [crm].[Calls]        AS C

           INNER JOIN    [crm].[Comments]    AS S ON S.[CallId] = C.[Id]

           WHERE        C.[Date] >= N’2019-01-01′ AND C.[Date] < N’2019-02-01′

           ) AS q

WHERE        q.[RowNumber] = 1 AND q.[StatusId] NOT IN (5, 28, 29, 13)

———————————————————————-

На рассмотрении по дате статуса:

SELECT        *

FROM        (

           SELECT        C.*, S.[StatusId], S.[Date] AS [StatusDate], ROW_NUMBER() OVER (PARTITION BY C.[Id] ORDER BY S.[Date] DESC) AS [RowNumber]

           FROM        [crm].[Calls]        AS C

           INNER JOIN    [crm].[Comments]    AS S ON S.[CallId] = C.[Id]

           ) AS q

WHERE        q.[RowNumber] = 1 AND q.[StatusId] NOT IN (5, 28, 29, 13) AND q.[StatusDate] >= N’2019-01-01′ AND q.[StatusDate] < N’2019-02-01′

———————————————————————-

Сумма статусов по качественным:

SELECT        q.[StatusId], COUNT(*)

FROM        (

           SELECT        C.*, S.[StatusId], S.[Date] AS [StatusDate], ROW_NUMBER() OVER (PARTITION BY C.[Id] ORDER BY S.[Date] DESC) AS [RowNumber]

           FROM        [crm].[Calls]        AS C

           INNER JOIN    [crm].[Comments]    AS S ON S.[CallId] = C.[Id]

           WHERE        C.[RejectId] IN (0, 2, 3)

           ) AS q

WHERE        q.[RowNumber] = 1 AND q.[StatusId] NOT IN (5, 28, 29, 13) AND q.[StatusDate] >= N’2019-01-01′ AND q.[StatusDate] < N’2019-02-01′

GROUP BY    q.[StatusId]

———————————————————————-

Сумма статусов всех сделок, созданных в январе:

SELECT        q.[StatusId], COUNT(*)

FROM        (

           SELECT        C.*, S.[StatusId], S.[Date] AS [StatusDate], ROW_NUMBER() OVER (PARTITION BY C.[Id] ORDER BY S.[Date] DESC) AS [RowNumber]

           FROM        [crm].[Calls]        AS C

           INNER JOIN    [crm].[Comments]    AS S ON S.[CallId] = C.[Id]

           WHERE        C.[Date] >= N’2019-01-01′ AND C.[Date] < N’2019-02-01′

           ) AS q

WHERE        q.[RowNumber] = 1

GROUP BY    q.[StatusId]

Выборки с IBS

Отклики с известным телефоном и известным источником:

select R.Id, R.TelMob, R.CreateDate, R.IbsApplicantSourceId, R.IbsApplicantSourceName, C.Tel from client.CrmResumeDaxtra AS R

INNER JOIN [client].[Calls] AS C on R.TelMob = C.CallerTel

where R.AtomId = 0 and C.Tel in (N’+78002220337′, N’+78002220447′, N’+78002220449′, N’+78002220453′, N’+78002221529′, N’+78002222834′, N’+78002222859′,

N’+78002223554′, N’+78002223668′, N’+78002224318′, N’+78002224378′, N’+78002224391′, N’+78002224605′, N’+78002224652′, N’+78002224785′, N’+78002225083′, N’+78002225930′,

N’+78002225942′, N’+78002226258′, N’+78002226453′, N’+78002226708′, N’+78002226754′, N’+78002227339′, N’+78002228902′, N’+78005504986′, N’+78005509482′, N’+78005509632′)

Order by R.CreateDate

Номера на которые звонили из кол–во звонков:

select DISTINCT(C.Tel), COUNT(C.CallerTel) from client.CrmResumeDaxtra AS R

INNER JOIN [client].[Calls] AS C on R.TelMob = C.CallerTel

where R.AtomId = 0

GROUP BY C.Tel

Проверка по конкретному номеру

select R.Id, R.AtomId, R.TelMob, R.CreateDate, C.DateTime, R.IbsApplicantSourceId, R.IbsApplicantSourceName, C.CallerTel , C.AtomId, C.Tel, A.Name

from client.CrmResumeDaxtra AS R

INNER JOIN (

SELECT *, ROW_NUMBER() OVER (PARTITION BY CallerTel ORDER BY [DateTime] DESC) AS [RowNumber]

        FROM [client].[Calls]

        WHERE CallerTel is not null and CallerTel!=» and Status = N’Ответили’

) AS C on R.TelMob = C.CallerTel

INNER JOIN [core].[Atoms] AS A on C.AtomId = A.Id

where R.AtomId = 0 and C.RowNumber = 1 and C.CallerTel in (N’79030831501′) and C.RowNumber = 1

order by C.DateTime

Комментарии к записи Основные запросы в SQL для баз данных отключены