Перейти к содержимому

Вывести города в которых проживает не менее n пользователей sql

  • автор:

Использование критерия Like для поиска данных

Условия или оператор Like используются в запросе для поиска данных, которые соответствуют определенному шаблону. Например, в нашей базе данных есть таблица «Клиенты», как по примеру ниже, и нам нужно найти только клиентов, живущих в городах, названия которых начинаются с «B». Вот как мы создадим запрос и будем использовать условия Like:

Таблица клиентов

«Клиенты»:

  • На вкладке Создание нажмите кнопку Конструктор запросов.
  • Нажмите кнопку «Добавить», и таблица «Клиенты» будет добавлена в конструктор запросов.
  • Дважды щелкните поля «Фамилия»и «Город», чтобы добавить их в сетку конструктора запросов.
  • В поле «Город» добавьте условия «Нравится B*» и нажмите кнопку «Выполнить».

    Критерий запроса Like

    В результатах запроса будут отбираться только клиенты из названий городов, названия которых начинаются с буквы «B».

    Результаты запроса Like

    Дополнительные информацию об использовании критериев см. в этой теме.

    Использование оператора Like в SQL в синтаксис

    Если вы предпочитаете синтаксис SQL (язык SQL), вот как это сделать:

    1. Откройте таблицу «Клиенты» и на вкладке «Создание» нажмите кнопку «Конструктор запросов».
    2. На вкладке «Главная» нажмите кнопку «>SQL», а затем введите следующий синтаксис:

    SELECT [Last Name], City FROM Customers WHERE City Like “B*”;

    1. Щелкните Выполнить.
    2. Щелкните вкладку запроса правой кнопкой мыши и выберите >«Закрыть».

    Дополнительные сведения см. в SQL Access: основные понятия, лексика и синтаксис, а также о том, как изменять SQL для более четкого получения результатов запроса.

    Примеры шаблонов условий Like и результатов

    Условия или оператор Like удобны при сравнении значения поля с строкным выражением. Следующий пример возвращает данные, которые начинаются с буквы P, за которой идут любая буква от A до F и три цифры:

    Like “P[A-F]###”

    Вот несколько способов использования like для различных шаблонов:

    Если ваша база данных имеет
    соответствие, вы увидите

    Если в базе данных нет
    совпадений, вы увидите

    Тесты по SQL с ответами

    2. Имеются элементы запроса: 1. SELECT employees.name, departments.name; 2. ON employees.department_id=departments.id; 3. FROM employees; 4. LEFT JOIN departments. В каком порядке их нужно расположить, чтобы выполнить поиск имен всех работников со всех отделов?

    3. Как расшифровывается SQL?

    + structured query language

    — strict question line

    — strong question language

    4. Запрос для выборки всех значений из таблицы «Persons» имеет вид:

    — SELECT ALL Persons

    + SELECT * FROM Persons

    5. Какое выражение используется для возврата только разных значений?

    6. Для подсчета количества записей в таблице «Persons» используется команда:

    — COUNT ROW IN Persons

    + SELECT COUNT(*) FROM Persons

    — SELECT ROWS FROM Persons

    7. Наиболее распространенным является тип объединения:

    8. Что возвращает запрос SELECT * FROM Students?

    + Все записи из таблицы «Students»

    — Рассчитанное суммарное количество записей в таблице «Students»

    — Внутреннюю структуру таблицы «Students»

    9. Запрос «SELECT name ___ Employees WHERE age ___ 35 AND 50» возвращает имена работников, возраст которых от 35 до 50 лет. Заполните пропущенные места в запросе.

    тест 10. Какая агрегатная функция используется для расчета суммы?

    11. Запрос для выборки первых 14 записей из таблицы «Users» имеет вид:

    + SELECT * FROM Users LIMIT 14

    — SELECT * LIMIT 14 FROM Users

    — SELECT * FROM USERS

    12. Выберите верное утверждение:

    — SQL чувствителен к регистру при написании запросов

    — SQL чувствителен к регистру в названиях таблиц при написании запросов

    — SQL нечувствителен к регистру

    13. Заполните пробелы в запросе «SELECT ___, Сountry FROM ___ », который возвращает имена заказчиков и страны, где они находятся, из таблицы «Customers».

    14. Запрос, возвращающий все значения из таблицы «Countries», за исключением страны с имеет вид:

    — SELECT * FROM Countries EXP >

    + SELECT * FROM Countries WHERE ID !=8

    — SELECT ALL FROM Countries LIMIT 8

    15. Напишите запрос для выборки данных из таблицы «Customers», где условием является проживание заказчика в городе Москва

    + SELECT * FROM Customers WHERE City=”Moscow”

    — SELECT City=”Moscow” FROM Customers

    — SELECT Customers WHERE City=”Moscow”

    16. Напишите запрос, возвращающий имена, фамилии и даты рождения сотрудников (таблица «Employees»). Условие – в фамилии содержится сочетание «se».

    — SELECT FirstName, LastName, BirthDate from Employees WHERE LastName=“se”

    — SELECT * from Employees WHERE LastName like “_se_”

    + SELECT FirstName, LastName, BirthDate from Employees WHERE LastName like “%se%”

    17. Какая функция позволяет преобразовать все буквы в выбранном столбце в верхний регистр?

    18. Напишите запрос, позволяющий переименовать столбец LastName в Surname в таблице «Employees».

    — RENAME LastName into Surname FROM Employees

    + ALTER TABLE Employees CHANGE LastName Surname varchar(50)

    — ALTER TABLE Surname(LastName) FROM Employees

    19. Для создания новой виртуальной таблицы, которая базируется на результатах сделанного ранее SQL запроса, используется команда:

    — CREATE VIRTUAL TABLE

    тест-20. В таблице «Emlpoyees» содержатся данные об именах, фамилиях и зарплате сотрудников. Напишите запрос, который изменит значение зарплаты с 2000 на 2500 для сотрудника с >

    — SET Salary=2500 FROM Salary=2000 FOR FROM Employees

    — ALTER TABLE Employees Salary=2500 FOR >

    + UPDATE Employees SET Salary=2500 WHERE >

    21. К какому результату приведет выполнение запроса DROP DATABASE Users?

    + Полное удаление базы данных «Users»

    — Блокировка на внесение изменений в базу данных «Users»

    — Удаление таблицы «Users» из текущей базы данных

    22. В таблице «Animals» базы данных зоопарка содержится информация обо всех обитающих там животных, в том числе о лисах: red fox, grey fox, little fox. Напишите запрос, возвращающий информацию о возрасте лис.

    — SELECT %fox age FROM Animals

    + SELECT age FROM Animals WHERE Animal LIKE «%fox»

    — SELECT age FROM %Fox.Animals

    23. Что возвращает запрос SELECT FirstName, LastName, Salary FROM Employees Where Salary<(Select AVG(Salary) FROM Employees) ORDER BY Salary DESC?

    — Имена, фамилии и зарплаты сотрудников, значения которых соответствуют среднему значению среди всех сотрудников

    — Имена, фамилии сотрудников и их среднюю зарплату за весь период работы, с выполнением сортировки по убыванию

    + Имена, фамилии и зарплаты сотрудников, для которых справедливо условие, что их зарплата ниже средней, с выполнением сортировки зарплаты по убыванию

    24. Напишите запрос, возвращающий значения из колонки «FirstName» таблицы «Users».

    + SELECT FirstName FROM Users

    — SELECT * FROM Users.FirstName

    25. Напишите запрос, возвращающий информацию о заказчиках, проживающих в одном из городов: Москва, Тбилиси, Львов.

    — SELECT Moscow, Tbilisi, Lvov FROM Customers

    + SELECT * FROM Customers WHERE City IN (‘Moscow’, ‘Tbilisi’, ‘Lvov’)

    — SELECT City IN (‘Moscow’, ‘Tbilisi’, ‘Lvov’) FROM Customers

    26. Какая команда используется для объединения результатов запроса без удаления дубликатов?

    27. Оператор REVOKE предназначен для:

    — Предоставления пользователю или группе пользователей прав на осуществление определенных операций;

    — Задавания пользователю или группе пользователей запрета, который является приоритетным по сравнению с разрешением;

    + Отзыва у пользователя или группы пользователей выданных ранее разрешений

    28. Для чего в SQL используются aliases?

    + Для назначения имени источнику данных в запросе при использовании выражения в качестве источника данных или для упрощения структуры запросов

    — Для переименования полей

    — Для более точного указания источника данных, если в базе данных содержатся таблицы с одинаковыми названиями полей

    29. Напишите запрос, который будет возвращать значения городов из таблицы «Countries».

    — SELECT * FROM Countries WHERE >

    + SELECT City FROM Countries

    тест_30. Имеются элементы запроса: 1. ORDER BY Name; 2. WHERE Age В каком порядке их нужно расположить, чтобы выполнить поиск имен и фамилий студентов в возрасте до 19 лет с сортировкой по имени?

    31. Для чего в SQL используется оператор PRIVILEGUE?

    — Для наделения суперпользователя правами администратора

    — Для выбора пользователей с последующим наделением их набором определенных прав

    + Такого оператора не существует

    32. Напишите запрос, который будет возвращать текущую дату.

    33. Какой оператор используется для выборки значений в пределах заданного диапазона?

    Примеры SELECT (Transact-SQL)

    В этой статье приведены примеры использования инструкции SELECT .

    В этой статье требуется AdventureWorks2022 пример базы данных, которую можно скачать на домашней странице примеров и проектов сообщества Microsoft SQL Server.

    А. Использование SELECT для получения строк и столбцов

    В следующем примере приведены три примера кода. В ходе выполнения первого примера кода возвращаются все строки (предложение WHERE не указано), а также все столбцы (используется звездочка, * ) таблицы Product базы данных AdventureWorks2022 .

    USE AdventureWorks2022; GO SELECT * FROM Production.Product ORDER BY Name ASC; -- Alternate way. USE AdventureWorks2022; GO SELECT p.* FROM Production.Product AS p ORDER BY Name ASC; GO 

    В ходе выполнения данного примера кода происходит выдача всех строк (предложение WHERE не задано) и подмножества столбцов ( Name , ProductNumber , ListPrice ) таблицы Product базы данных AdventureWorks2022 . Дополнительно выведено название столбца.

    USE AdventureWorks2022; GO SELECT Name, ProductNumber, ListPrice AS Price FROM Production.Product ORDER BY Name ASC; GO 

    В ходе выполнения данного примера кода происходит выдача всех строк таблицы Product , для которых линейки продуктов начинаются символом R и для которых длительность изготовления не превышает 4 дней.

    USE AdventureWorks2022; GO SELECT Name, ProductNumber, ListPrice AS Price FROM Production.Product WHERE ProductLine = 'R' AND DaysToManufacture < 4 ORDER BY Name ASC; GO 

    B. Использование SELECT с заголовками столбцов и вычислениями

    В ходе выполнения следующего примера возвращаются все строки таблицы Product . В результате выполнения первого примера выдаются все объемы продаж и скидки по всем продуктам. Во втором примере вычисляется годовой доход от продажи каждого вида продукции.

    USE AdventureWorks2022; GO SELECT p.Name AS ProductName, NonDiscountSales = (OrderQty * UnitPrice), Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount) FROM Production.Product AS p INNER JOIN Sales.SalesOrderDetail AS sod ON p.ProductID = sod.ProductID ORDER BY ProductName DESC; GO 

    Данный запрос вычисляет доход от продажи по каждому виду продукции для каждого заказа.

    USE AdventureWorks2022; GO SELECT 'Total income is', ((OrderQty * UnitPrice) * (1.0 - UnitPriceDiscount)), ' for ', p.Name AS ProductName FROM Production.Product AS p INNER JOIN Sales.SalesOrderDetail AS sod ON p.ProductID = sod.ProductID ORDER BY ProductName ASC; GO 

    C. Использование DISTINCT с SELECT

    В приведенном ниже примере для предотвращения получения повторяющихся заголовков используется оператор DISTINCT .

    USE AdventureWorks2022; GO SELECT DISTINCT JobTitle FROM HumanResources.Employee ORDER BY JobTitle; GO 

    D. Создание таблиц с помощью SELECT INTO

    В следующем примере в базе данных #Bicycles создается временная таблица tempdb .

    USE tempdb; GO IF OBJECT_ID(N'#Bicycles', N'U') IS NOT NULL DROP TABLE #Bicycles; GO SELECT * INTO #Bicycles FROM AdventureWorks2022.Production.Product WHERE ProductNumber LIKE 'BK%'; GO 

    В данном примере создается постоянная таблица NewProducts .

    USE AdventureWorks2022; GO IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL DROP TABLE dbo.NewProducts; GO ALTER DATABASE AdventureWorks2022 SET RECOVERY BULK_LOGGED; GO SELECT * INTO dbo.NewProducts FROM Production.Product WHERE ListPrice > $25 AND ListPrice < $100; GO ALTER DATABASE AdventureWorks2022 SET RECOVERY FULL; GO 

    Д. Использование сопоставленных вложенных запросов

    Коррелированный запрос — это запрос, зависящий от результатов выполнения другого запроса. Этот запрос можно выполнять многократно, один раз для каждой строки, которая может быть выбрана внешним запросом.

    В первом примере представлены семантически эквивалентные запросы для демонстрации различий в использовании ключевых слов EXISTS и IN . В обоих примерах приведены допустимые вложенные запросы, извлекающие по одному экземпляру продукции каждого наименования, для которых модель продукта — «long sleeve logo jersey» (кофта с длинными рукавами, с эмблемой), а значения столбцов ProductModelID таблиц Product и ProductModel совпадают.

    USE AdventureWorks2022; GO SELECT DISTINCT Name FROM Production.Product AS p WHERE EXISTS ( SELECT * FROM Production.ProductModel AS pm WHERE p.ProductModelID = pm.ProductModelID AND pm.Name LIKE 'Long-Sleeve Logo Jersey%' ); GO -- OR USE AdventureWorks2022; GO SELECT DISTINCT Name FROM Production.Product WHERE ProductModelID IN ( SELECT ProductModelID FROM Production.ProductModel AS pm WHERE p.ProductModelID = pm.ProductModelID AND Name LIKE 'Long-Sleeve Logo Jersey%' ); GO 

    В следующем примере используется и извлекается IN один экземпляр первого имени и имени семьи каждого сотрудника, для которого указан 5000.00 бонус в SalesPerson таблице, и для которого идентификаторы сотрудников совпадают в Employee таблицах и SalesPerson таблицах.

    USE AdventureWorks2022; GO SELECT DISTINCT p.LastName, p.FirstName FROM Person.Person AS p INNER JOIN HumanResources.Employee AS e ON e.BusinessEntityID = p.BusinessEntityID WHERE 5000.00 IN ( SELECT Bonus FROM Sales.SalesPerson AS sp WHERE e.BusinessEntityID = sp.BusinessEntityID ); GO 

    Предыдущий вложенный запрос в этом операторе нельзя оценивать независимо от внешнего запроса. Он требует значения параметра Employee.EmployeeID , однако это значение меняется, когда ядро СУБД SQL Server обрабатывает строки в Employee .

    Коррелированный вложенный запрос также может использоваться в предложении HAVING внешнего запроса. В данном примере осуществляется поиск моделей продуктов, для которых максимальная цена в каталоге в два раза превышает среднюю цену по нему.

    USE AdventureWorks2022; GO SELECT p1.ProductModelID FROM Production.Product AS p1 GROUP BY p1.ProductModelID HAVING MAX(p1.ListPrice) >= ( SELECT AVG(p2.ListPrice) * 2 FROM Production.Product AS p2 WHERE p1.ProductModelID = p2.ProductModelID ); GO 

    В этом примере используются два сопоставленных вложенных запроса для поиска имен сотрудников, которые продали определенный продукт.

    USE AdventureWorks2022; GO SELECT DISTINCT pp.LastName, pp.FirstName FROM Person.Person pp INNER JOIN HumanResources.Employee e ON e.BusinessEntityID = pp.BusinessEntityID WHERE pp.BusinessEntityID IN ( SELECT SalesPersonID FROM Sales.SalesOrderHeader WHERE SalesOrderID IN ( SELECT SalesOrderID FROM Sales.SalesOrderDetail WHERE ProductID IN ( SELECT ProductID FROM Production.Product p WHERE ProductNumber = 'BK-M68B-42' ) ) ); GO 

    F. Использование GROUP BY

    В следующем примере находится общий объем продаж для каждого заказа в базе данных.

    USE AdventureWorks2022; GO SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail GROUP BY SalesOrderID ORDER BY SalesOrderID; GO 

    Так как в запросе используется предложение GROUP BY , то для каждого заказа выводится только одна строка, содержащая общий объем продаж.

    G. Использование GROUP BY с несколькими группами

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

    USE AdventureWorks2022; GO SELECT ProductID, SpecialOfferID, AVG(UnitPrice) AS [Average Price], SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail GROUP BY ProductID, SpecialOfferID ORDER BY ProductID; GO 

    H. Использование GROUP BY и WHERE

    В следующем примере после извлечения строк, содержащих цены каталога, превышающие $1000 , происходит их разделение на группы.

    USE AdventureWorks2022; GO SELECT ProductModelID, AVG(ListPrice) AS [Average List Price] FROM Production.Product WHERE ListPrice > $1000 GROUP BY ProductModelID ORDER BY ProductModelID; GO 

    I. Использование GROUP BY с выражением

    В следующем примере производится группировка с помощью выражения. Можно сгруппировать по выражению, если выражение не включает агрегатные функции.

    USE AdventureWorks2022; GO SELECT AVG(OrderQty) AS [Average Quantity], NonDiscountSales = (OrderQty * UnitPrice) FROM Sales.SalesOrderDetail GROUP BY (OrderQty * UnitPrice) ORDER BY (OrderQty * UnitPrice) DESC; GO 

    J. Использование GROUP BY с ORDER BY

    В следующем примере для каждого типа продуктов вычисляется средняя цена, а также осуществляется сортировка полученных результатов по возрастанию.

    USE AdventureWorks2022; GO SELECT ProductID, AVG(UnitPrice) AS [Average Price] FROM Sales.SalesOrderDetail WHERE OrderQty > 10 GROUP BY ProductID ORDER BY AVG(UnitPrice); GO 

    K. Использование предложения HAVING

    В первом из приведенных ниже примеров показывается использование предложения HAVING с агрегатной функцией. В нем производится группировка строк таблицы SalesOrderDetail по коду продукта, а также удаляются строки, соответствующие продуктам, для которых средний объем заказа не превышает пяти. Во втором примере показывается использование предложения HAVING без агрегатной функции.

    USE AdventureWorks2022; GO SELECT ProductID FROM Sales.SalesOrderDetail GROUP BY ProductID HAVING AVG(OrderQty) > 5 ORDER BY ProductID; GO 

    В данном запросе внутри предложения LIKE используется предложение HAVING .

    USE AdventureWorks2022; GO SELECT SalesOrderID, CarrierTrackingNumber FROM Sales.SalesOrderDetail GROUP BY SalesOrderID, CarrierTrackingNumber HAVING CarrierTrackingNumber LIKE '4BD%' ORDER BY SalesOrderID ; GO 

    L. Использование HAVING и GROUP BY

    В следующем примере показано использование предложений GROUP BY , HAVING , WHERE и ORDER BY в одной инструкции SELECT . В результате его выполнения в группах и сводных значениях не учитываются строки, соответствующие продуктам с ценами выше $25 и средним объемом заказов ниже 5. Также осуществляется сортировка результатов по ProductID .

    USE AdventureWorks2022; GO SELECT ProductID FROM Sales.SalesOrderDetail WHERE UnitPrice < 25.00 GROUP BY ProductID HAVING AVG(OrderQty) >5 ORDER BY ProductID; GO 

    M. Использование HAVING с СУММ и AVG

    В следующем примере производится группировка строк таблицы SalesOrderDetail по коду продукта, а затем выводятся только те группы, для которых общий объем продаж составляет более $1000000.00 , а средний объем заказа не превышает 3 .

    USE AdventureWorks2022; GO SELECT ProductID, AVG(OrderQty) AS AverageQuantity, SUM(LineTotal) AS Total FROM Sales.SalesOrderDetail GROUP BY ProductID HAVING SUM(LineTotal) > $1000000.00 AND AVG(OrderQty) < 3; GO 

    Чтобы просмотреть продукты с общим объемом продаж, превышающих $2000000.00 , используйте следующий запрос:

    USE AdventureWorks2022; GO SELECT ProductID, Total = SUM(LineTotal) FROM Sales.SalesOrderDetail GROUP BY ProductID HAVING SUM(LineTotal) > $2000000.00; GO 

    Если вы хотите убедиться в наличии не менее 1500 элементов, участвующих в вычислениях для каждого продукта, используйте HAVING COUNT(*) > 1500 для устранения продуктов, возвращающих итоги для меньшего количества 1500 проданных элементов. Этот запрос выглядит следующим образом.

    USE AdventureWorks2022; GO SELECT ProductID, SUM(LineTotal) AS Total FROM Sales.SalesOrderDetail GROUP BY ProductID HAVING COUNT(*) > 1500; GO 

    О. Использование указания оптимизатора INDEX

    В следующем примере показаны два способа использования указания оптимизатора INDEX . В первом примере показано, как принудительно принудить оптимизатора использовать некластеризованный индекс для получения строк из таблицы. Во втором примере выполняется проверка таблицы с помощью индекса 0.

    USE AdventureWorks2022; GO SELECT pp.FirstName, pp.LastName, e.NationalIDNumber FROM HumanResources.Employee AS e WITH (INDEX (AK_Employee_NationalIDNumber)) INNER JOIN Person.Person AS pp ON e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO -- Force a table scan by using INDEX = 0. USE AdventureWorks2022; GO SELECT pp.LastName, pp.FirstName, e.JobTitle FROM HumanResources.Employee AS e WITH (INDEX = 0) INNER JOIN Person.Person AS pp ON e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO 

    M. Использование OPTION и подсказок GROUP

    В следующем примере демонстрируется совместное использование предложений OPTION (GROUP) и GROUP BY .

    USE AdventureWorks2022; GO SELECT ProductID, OrderQty, SUM(LineTotal) AS Total FROM Sales.SalesOrderDetail WHERE UnitPrice < $5.00 GROUP BY ProductID, OrderQty ORDER BY ProductID, OrderQty OPTION (HASH GROUP, FAST 10); GO 

    O. Использование указания запроса UNION

    В следующем примере используется указание запроса MERGE UNION .

    USE AdventureWorks2022; GO SELECT BusinessEntityID, JobTitle, HireDate, VacationHours, SickLeaveHours FROM HumanResources.Employee AS e1 UNION SELECT BusinessEntityID, JobTitle, HireDate, VacationHours, SickLeaveHours FROM HumanResources.Employee AS e2 OPTION (MERGE UNION); GO 

    P. Использование UNION

    При выполнении следующего примера в результирующий набор включается содержимое столбцов ProductModelID и Name таблиц ProductModel и Gloves .

    USE AdventureWorks2022; GO IF OBJECT_ID('dbo.Gloves', 'U') IS NOT NULL DROP TABLE dbo.Gloves; GO -- Create Gloves table. SELECT ProductModelID, Name INTO dbo.Gloves FROM Production.ProductModel WHERE ProductModelID IN (3, 4); GO -- Here is the simple union. USE AdventureWorks2022; GO SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID NOT IN (3, 4) UNION SELECT ProductModelID, Name FROM dbo.Gloves ORDER BY Name; GO 

    В. Использование SELECT INTO с UNION

    При выполнении следующего примера предложение INTO во второй инструкции SELECT указывает, что в таблице с именем ProductResults содержится итоговый результирующий набор объединения заданных столбцов таблиц ProductModel и Gloves . Таблица Gloves была создана в результате выполнения первой инструкции SELECT .

    USE AdventureWorks2022; GO IF OBJECT_ID('dbo.ProductResults', 'U') IS NOT NULL DROP TABLE dbo.ProductResults; GO IF OBJECT_ID('dbo.Gloves', 'U') IS NOT NULL DROP TABLE dbo.Gloves; GO -- Create Gloves table. SELECT ProductModelID, Name INTO dbo.Gloves FROM Production.ProductModel WHERE ProductModelID IN (3, 4); GO USE AdventureWorks2022; GO SELECT ProductModelID, Name INTO dbo.ProductResults FROM Production.ProductModel WHERE ProductModelID NOT IN (3, 4) UNION SELECT ProductModelID, Name FROM dbo.Gloves; GO SELECT ProductModelID, Name FROM dbo.ProductResults; 

    R. Использование UNION двух операторов SELECT с ORDER BY

    При использовании предложения UNION необходимо соблюдать порядок следования определенных параметров. В следующем примере показаны случаи правильного и неверного использования UNION в двух инструкциях SELECT , в которых необходимо переименовать столбцы на выходе.

    USE AdventureWorks2022; GO IF OBJECT_ID('dbo.Gloves', 'U') IS NOT NULL DROP TABLE dbo.Gloves; GO -- Create Gloves table. SELECT ProductModelID, Name INTO dbo.Gloves FROM Production.ProductModel WHERE ProductModelID IN (3, 4); GO /* INCORRECT */ USE AdventureWorks2022; GO SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID NOT IN (3, 4) ORDER BY Name UNION SELECT ProductModelID, Name FROM dbo.Gloves; GO /* CORRECT */ USE AdventureWorks2022; GO SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID NOT IN (3, 4) UNION SELECT ProductModelID, Name FROM dbo.Gloves ORDER BY Name; GO 

    S. Использование UNION трех инструкций SELECT для отображения эффектов ALL и круглых скобок

    В следующих примерах используются UNION для объединения результатов трех таблиц, которые имеют одинаковые пять строк данных. В первом примере используется предложение UNION ALL , в результате чего выдаются все 15 строк. Второй пример используется без ALL исключения повторяющихся UNION строк из объединенных результатов трех SELECT операторов и возвращает пять строк.

    В третьем примере с первым предложением ALL используется ключевое слово UNION , а во втором предложении UNION вместо ключевого слова ALL используются скобки. Второй UNION обрабатывается сначала, так как он находится в скобках, и возвращает пять строк, так как ALL параметр не используется и дубликаты удаляются. Эти пять строк объединяются с результатами первого SELECT с помощью UNION ALL ключевое слово. В данном случае повторяющиеся строки двух множеств, состоящих из пяти строк, не удаляются. Окончательный результат состоит из 10 строк.

    USE AdventureWorks2022; GO IF OBJECT_ID('dbo.EmployeeOne', 'U') IS NOT NULL DROP TABLE dbo.EmployeeOne; GO IF OBJECT_ID('dbo.EmployeeTwo', 'U') IS NOT NULL DROP TABLE dbo.EmployeeTwo; GO IF OBJECT_ID('dbo.EmployeeThree', 'U') IS NOT NULL DROP TABLE dbo.EmployeeThree; GO SELECT pp.LastName, pp.FirstName, e.JobTitle INTO dbo.EmployeeOne FROM Person.Person AS pp INNER JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO SELECT pp.LastName, pp.FirstName, e.JobTitle INTO dbo.EmployeeTwo FROM Person.Person AS pp INNER JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO SELECT pp.LastName, pp.FirstName, e.JobTitle INTO dbo.EmployeeThree FROM Person.Person AS pp INNER JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO -- Union ALL SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeOne UNION ALL SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeTwo UNION ALL SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeThree; GO SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeOne UNION SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeTwo UNION SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeThree; GO SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeOne UNION ALL ( SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeTwo UNION SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeThree ); GO 

    Связанный контент

    • CREATE TRIGGER (Transact-SQL)
    • CREATE VIEW (Transact-SQL)
    • DELETE (Transact-SQL)
    • EXECUTE (Transact-SQL)
    • Выражения (Transact-SQL)
    • INSERT (Transact-SQL)
    • LIKE (Transact-SQL)
    • Операторы set — UNION (Transact-SQL)
    • Операторы set — EXCEPT и INTERSECT (Transact-SQL)
    • UPDATE (Transact-SQL)
    • WHERE (Transact-SQL)
    • PathName (Transact-SQL)
    • SELECT — предложение INTO (Transact-SQL)

    Обратная связь

    Были ли сведения на этой странице полезными?

    SQL запросы быстро. Часть 1

    Язык SQL очень прочно влился в жизнь бизнес-аналитиков и требования к кандидатам благодаря простоте, удобству и распространенности. Из собственного опыта могу сказать, что наиболее часто SQL используется для формирования выгрузок, витрин (с последующим построением отчетов на основе этих витрин) и администрирования баз данных. И поскольку повседневная работа аналитика неизбежно связана с выгрузками данных и витринами, навык написания SQL запросов может стать фактором, из-за которого кандидат или получит преимущество, или будет отсеян. Печальная новость в том, что не каждый может рассчитывать получить его на студенческой скамье. Хорошая новость в том, что в изучении SQL нет ничего сложного, это быстро, а синтаксис запросов прост и понятен. Особенно это касается тех, кому уже доводилось сталкиваться с более сложными языками.

    Обучение SQL запросам я разделил на три части. Эта часть посвящена базовому синтаксису, который используется в 80-90% случаев. Следующие две части будут посвящены подзапросам, Join'ам и специальным операторам. Цель гайдов: быстро и на практике отработать синтаксис SQL, чтобы добавить его к арсеналу навыков.

    Практика

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

    Кликнуть здесь

    После перехода по ссылке можно будет увидеть сам редактор запросов и вывод данных в центральной части экрана, список таблиц базы данных находится в правой части.

    Структура sql-запросов

    Общая структура запроса выглядит следующим образом:

    SELECT ('столбцы или * для выбора всех столбцов; обязательно') FROM ('таблица; обязательно') WHERE ('условие/фильтрация, например, city = 'Moscow'; необязательно') GROUP BY ('столбец, по которому хотим сгруппировать данные; необязательно') HAVING ('условие/фильтрация на уровне сгруппированных данных; необязательно') ORDER BY ('столбец, по которому хотим отсортировать вывод; необязательно')

    Разберем структуру. Для удобства текущий изучаемый элемент в запроса выделяется CAPS'ом.

    SELECT, FROM

    SELECT, FROM — обязательные элементы запроса, которые определяют выбранные столбцы, их порядок и источник данных.

    Выбрать все (обозначается как *) из таблицы Customers:

    SELECT * FROM Customers

    Выбрать столбцы CustomerID, CustomerName из таблицы Customers:

    SELECT CustomerID, CustomerName FROM Customers
    WHERE

    WHERE — необязательный элемент запроса, который используется, когда нужно отфильтровать данные по нужному условию. Очень часто внутри элемента where используются IN / NOT IN для фильтрации столбца по нескольким значениям, AND / OR для фильтрации таблицы по нескольким столбцам.

    Фильтрация по одному условию и одному значению:

    select * from Customers WHERE City = 'London'

    Фильтрация по одному условию и нескольким значениям с применением IN (включение) или NOT IN (исключение):

    select * from Customers where City IN ('London', 'Berlin')
    select * from Customers where City NOT IN ('Madrid', 'Berlin','Bern')

    Фильтрация по нескольким условиям с применением AND (выполняются все условия) или OR (выполняется хотя бы одно условие) и нескольким значениям:

    select * from Customers where Country = 'Germany' AND City not in ('Berlin', 'Aachen') AND CustomerID > 15
    select * from Customers where City in ('London', 'Berlin') OR CustomerID > 4
    GROUP BY

    GROUP BY — необязательный элемент запроса, с помощью которого можно задать агрегацию по нужному столбцу (например, если нужно узнать какое количество клиентов живет в каждом из городов).

    При использовании GROUP BY обязательно:

    1. перечень столбцов, по которым делается разрез, был одинаковым внутри SELECT и внутри GROUP BY,
    2. агрегатные функции (SUM, AVG, COUNT, MAX, MIN) должны быть также указаны внутри SELECT с указанием столбца, к которому такая функция применяется.
    select City, count(CustomerID) from Customers GROUP BY City

    Группировка количества клиентов по стране и городу:

    select Country, City, count(CustomerID) from Customers GROUP BY Country, City

    Группировка продаж по ID товара с разными агрегатными функциями: количество заказов с данным товаром и количество проданных штук товара:

     select ProductID, COUNT(OrderID), SUM(Quantity) from OrderDetails GROUP BY ProductID

    Группировка продаж с фильтрацией исходной таблицы. В данном случае на выходе будет таблица с количеством клиентов по городам Германии:

     select City, count(CustomerID) from Customers WHERE Country = 'Germany' GROUP BY City

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

    select City, count(CustomerID) AS Number_of_clients from Customers group by City
    HAVING

    HAVING — необязательный элемент запроса, который отвечает за фильтрацию на уровне сгруппированных данных (по сути, WHERE, но только на уровень выше).

    Фильтрация агрегированной таблицы с количеством клиентов по городам, в данном случае оставляем в выгрузке только те города, в которых не менее 5 клиентов:

     select City, count(CustomerID) from Customers group by City HAVING count(CustomerID) >= 5 

    В случае с переименованным столбцом внутри HAVING можно указать как и саму агрегирующую конструкцию count(CustomerID), так и новое название столбца number_of_clients:

     select City, count(CustomerID) as number_of_clients from Customers group by City HAVING number_of_clients >= 5

    Пример запроса, содержащего WHERE и HAVING. В данном запросе сначала фильтруется исходная таблица по пользователям, рассчитывается количество клиентов по городам и остаются только те города, где количество клиентов не менее 5:

     select City, count(CustomerID) as number_of_clients from Customers WHERE CustomerName not in ('Around the Horn','Drachenblut Delikatessend') group by City HAVING number_of_clients >= 5
    ORDER BY

    ORDER BY — необязательный элемент запроса, который отвечает за сортировку таблицы.

    Простой пример сортировки по одному столбцу. В данном запросе осуществляется сортировка по городу, который указал клиент:

     select * from Customers ORDER BY City

    Осуществлять сортировку можно и по нескольким столбцам, в этом случае сортировка происходит по порядку указанных столбцов:

     select * from Customers ORDER BY Country, City

    По умолчанию сортировка происходит по возрастанию для чисел и в алфавитном порядке для текстовых значений. Если нужна обратная сортировка, то в конструкции ORDER BY после названия столбца надо добавить DESC:

     select * from Customers order by CustomerID DESC

    Обратная сортировка по одному столбцу и сортировка по умолчанию по второму:

    select * from Customers order by Country DESC, City
    JOIN

    JOIN — необязательный элемент, используется для объединения таблиц по ключу, который присутствует в обеих таблицах. Перед ключом ставится оператор ON.

    Запрос, в котором соединяем таблицы Order и Customer по ключу CustomerID, при этом перед названиям столбца ключа добавляется название таблицы через точку:

    select * from Orders JOIN Customers ON Orders.CustomerID = Customers.CustomerID

    Нередко может возникать ситуация, когда надо промэппить одну таблицу значениями из другой. В зависимости от задачи, могут использоваться разные типы присоединений. INNER JOIN — пересечение, RIGHT/LEFT JOIN для мэппинга одной таблицы знаениями из другой,

     select * from Orders join Customers on Orders.CustomerID = Customers.CustomerID where Customers.CustomerID >10

    Внутри всего запроса JOIN встраивается после элемента from до элемента where, пример запроса:

    Другие типы JOIN'ов можно увидеть на замечательной картинке ниже:

    В следующей части подробнее поговорим о типах JOIN'ов и вложенных запросах.

    При возникновении вопросов/пожеланий, всегда прошу обращаться!

  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *