Для создания запросов будем использовать демонстрационную базу данных Northwind. Прежде всего, подсоедините базу данных к SQL Server. После того как БД появится в списке баз данных можно приступать к написанию запросов.
Запросы на выборку. Создание простых запросов.
Для выборки всех полей и всех строк из таблицы необходимо выполнить запрос следующего вида:
select * from [имя_таблицы]
Например, выберем все строки и столбцы из таблицы Employees
select * from Employees
Примечание. Для выполнения запросов необходимо находиться в контексте нужной базы данных или записывать полное название таблицы, включая имя базы данных. Для переключения к нужной базе данных используйте команду USE [имя_БД] (например, USE Northwind) или выберите нужную БД из соответствующего списка на панели SQL Server Management Studio.
Для того чтобы указать SQL-серверу, что необходимо выбрать только ограниченное количество столбцов, то необходимо перечислить столбцы в списке выбора через запятую:
select EmployeeID, LastName, FirstName, Title, BirthDate
from Employees
Для того чтобы переименовать столбец в результирующем наборе данных необходимо использовать ключевое слово AS (хотя это слово можно и опускать):
select EmployeeID AS [Код сотрудника], LastName AS [Фамилия], FirstName AS [Имя], BirthDate [Дата рождения]
from Employees
Для ограничения размера выборки и выбора только определенных строк из таблицы необходимо использовать предложение WHERE. Например, выберем сотрудников только из определенного города:
select EmployeeID, LastName, FirstName, BirthDate
from Employees
where City = 'London'
Выберем только продажи с количеством больше 100:
select * from [Order Details]
where Quantity > 100
Выберем продажи со стоимостью продукта меньше 2,5:
select * from [Order Details]
where UnitPrice < 2.5
Обратите внимание, что символьные данные заключаются в апострофы, а числовые – нет.
Сравнение со значением NULL несколько отличается от обычного. В этом случае нельзя (на самом деле можно с использованием команды SET) использовать обычные операции сравнения, например, следующий запрос вернет неожиданный результат, так как такие записи есть:
select * from employees
where Region = null
Чтобы заставить запрос работать так, как предполагалось вместо операции сравнения “=”необходимо использовать IS [NOT] NULL:
select * from employees
where Region IS NULL
В предложение WHERE можно включать множество логических условий:
select *,
EmployeeID, LastName, FirstName, BirthDate
from Employees
where City = 'London' and TitleOfCourtesy = 'Mr.'
Оператор IN позволяет задать множество значений, например, следующий запрос SELECT вернет сотрудников из Лондона или Сиэтла:
select *
from Employees
where City IN ('London', 'Seattle')
Оператор LIKE позволяет задавать для символьных данных не просто равенство, но осуществлять поиск и сравнение по шаблону. Запишем запрос на выборку всех сотрудников, у которых фамилия начинается с “D”:
select *
from Employees
where LastName LIKE 'D%'
Для задания шаблона можно использовать следующие специальные символы и шаблоны:
Символ-шаблон | Описание | Пример |
% | Любая строка длиной от нуля и более символов. | Инструкция WHERE Название LIKE '%компьютер%' выполняет поиск и выдает все названия книг, содержащие слово «компьютер». |
_ (подчеркивание) | Любой одиночный символ. | Инструкция WHERE фамилия_автора LIKE '_етров' выполняет поиск и выдает все имена, состоящие из шести букв и заканчивающиеся сочетанием «етров» (Петров, Ветров и т.п.). |
[ ] | Любой одиночный символ, содержащийся в диапазоне ([a-f]) или наборе ([abcdef]). | Инструкция WHERE Фамилия_автора LIKE '[Л-С]омов' выполняет поиск и выдает все фамилии авторов, заканчивающиеся на «омов» и начинающиеся на любую букву в промежутке от «Л» до «С», например Ломов, Ромов, Сомов и т.п. |
[^] | Любой символ, не содержащийся в диапазоне ([^a-f]) или наборе ([^abcdef]). | Инструкция WHERE Фамилия_автора LIKE 'ив[^а]%' выполняет поиск и выдает все фамилии, начинающиеся на «ив», в которых третья буква отличается от «а». |
Можно использовать следующие логические операторы:
Оператор | Значение |
ALL | TRUE, если все сравнения в наборе равны TRUE. |
AND | TRUE, если оба выражения типа Boolean равны TRUE. |
ANY | TRUE, если любое из сравнений в наборе равно TRUE. |
BETWEEN | TRUE, если операнд принадлежит указанному диапазону. |
EXISTS | TRUE, если вложенный запрос возвращает как минимум одну строку. |
IN | TRUE, если операнд содержится в заданном списке выражений. |
LIKE | TRUE, если оператор удовлетворяет шаблону. |
NOT | Меняет значение оператора типа Boolean на противоположное. |
OR | TRUE, если одно из выражений типа Boolean равно TRUE. |
SOME | TRUE, если некоторые из сравнений в наборе равны TRUE. |
И следующие операторы сравнения
Оператор | Значение |
= (равно) | Равно |
> (больше) | Больше |
< (меньше) | Меньше |
>= (больше или равно) | Больше или равно |
<= (меньше или равно) | Меньше или равно |
<> (не равно) | Не равно |
!= (не равно) | Не равно (не входит в стандарт SQL-92) |
!< (не меньше) | Не меньше (не входит в стандарт SQL-92) |
!> (не больше) | Не больше (не входит в стандарт SQL-92) |
Запишем запрос, возвращающий работников, нанятых после 1 января 1994 года. Обратите внимание, что тип дата-время не является символьным:
select * from employees
where HireDate >= '01.01.1994'
Задание.
1. Составить запрос на выборку всех столбцов и только тех строк из таблицы Order Details, где цена единицы (UnitPrice) больше 15 и количество между 24 и 30.
2. Найти всех сотрудников, в номере телефона которых встречается последовательность символов '77'
3. Найти список заказов (Orders), сделанных в 1998 году.
4. Найти список заказов, сделанных в 1998 году, заключенных сотрудником с кодом 5.
5. Найти список заказов, сделанных в 1998 году, отправленных в Италию (ShipCountry).
В запросах на выборку можно применять вычисляемые столбцы, состоящие из столбцов, констант, выражений и т.д.
Команда SELECT является универсальной и может быть применена как к таблицам, так и к любым другим данным, например:
select 5, null, 5*5, 'New'
Создадим выборку с вычисляемым столбцом, в котором будет сумма, равная цене за единицу, умноженной на количество из таблицы Order Details:
select *, UnitPrice*Quantity as [Summa]
from [order details]
Задание.
1. Добавить в таблицу еще столбец, с сумой скидки по продаже.
2. Добавить еще один столбец, с фактической стоимостью, равной «сумма – скидка»