Слайд 1SQL (Structured Query Language)- Структурированный Язык Запросов. - стандартный язык
запросов по работе с реляционными БД
Карпова Татьяна Сергеевна, к.т.н., профессор
МБИ
Слайд 2Стандарты SQL
SQL89 – ANSI SQL – SQL1
SQL 92 (окончательная формулировка
1995) – SQL2
SQL99 – SQL3
Большинство серверов
поддерживают в
настоящий момент
SQL2
Слайд 4 Язык запросов
Data Query Language (DQL)
Оператор
SELECT
Означает: выбрать строки
Действие: выбирает строки из одной или нескольких таблиц
по заданному критерию отбора и формирует в качестве результата новую виртуальную таблицу
Слайд 5Синтаксис оператора SELECT
SELECT
FROM
WHERE
соединения>
GROUP BY
HAVING
ORDER BY
столбцов упорядочения>
Слайд 6Список вывода
Фактически список столбцов результирующей таблицы
В список могут входить
столбцы исходных таблиц
Агрегатные функции
Выражения из столбцов и функций
*
Список может
предваряться ключевыми словами ALL или DISTINCT
Слайд 7Смысл ключевых слов в списке вывода
ALL означает, что в результирующий
набор строк включаются все строки, удовлетворяющие условиям запроса
DISTINCT означает,
что в результирующий набор включаются только различные строки, т.е. дубликаты строк результата не включаются в результирующий набор
* означает, что в результирующий набор включаются все столбцы из исходных таблиц запроса
Слайд 8Смысл остальных ключевых слов оператора
SELECT
В части FROM задается перечень
исходных отношений (таблиц) запроса.
В части WHERE задаются условия отбора срок
результата или условия соединения кортежей исходных таблиц.
В части GROUP BY задается список полей группировки.
В части HAVING задаются предикаты-условия, накладываемые на каждую группу.
В части ORDER BY задается список полей упорядочения результата.
Слайд 10Примеры простейших запросов
Вывести содержимое таблицы Cityes
Select * from Cityes
Вывести список
названий городов, которые присутствуют в нашей БД
Select City from Cityes
Вывести
список городов, из которых у нас есть клиенты
Select Distinct City from Cityes, Clients
Where Cityes.kod = Clients. kod
Слайд 11Примеры простейших запросов
Вывести список клиентов из города «Санкт-Петербург»
Select Name from
Cityes, Clients
Where Cityes.kod = Clients. kod and
City=‘Санкт-Петербург’
Вывести список счетов клиента
«Петров А.А.»
Select bill from Clients,Biils
Where Clients.Id_ckients=Biils.ID_ckients and name=‘Петров А.А.’
Слайд 12Обработка неопределенных значений
Неопределенные значения обозначаются при визуализации содержимого БД как
NULL
Нельзя напрямую сравнивать одно неопределенное значение с другим неопределенным значением
NULL
<> NULL
Для выявления неопределенных значений используются специальные предикаты
A Is NULL – истинен тогда, когда значение атрибута А неопределено
A Is Not Null -истинен тогда, когда значение атрибута А определено
Слайд 13В части WHERE используются:
предикаты сравнения { =, , >,=,
предикат Between, предикат IN, NOT IN, предикат сравнения с образцом
LIKE и NOT LIKE, предикат EXIST и NOT EXIST.
предикат Between - принимает значение между а1 и а2 включительно.
предикат Not Between - не принимает значение между а1 и а2
Слайд 14Смысл предикатов
предикат IN - входит в множество / Not IN
- не входит в множество.
предикат LIKE - включает (подобен) шаблону
Шаблон
может содержать символы _ подчеркивания для обозначения любого одиночного символа;
% символ процента - для обозначения любой произвольной последовательности символов.
Предикат LIKE истинен тогда, когда значение атрибута, заданного именем столбца в текущем кортеже включает в себя заданный <шаблон>.
Предикат NOT LIKE – истинен тогда, когда значение атрибута в текущем кортеже не включает в себя заданный <шаблон>.
Предикат IS NULL - неизвестно, неопределено
предикат EXISTS - существует что-то , истинен тогда, когда подзапрос к которому применяется предикат содержит хотя бы одну строку, т.е. не пуст.
Слайд 15Предикаты работы с множествами
Предикат IN – входит в множество
A IN
(1,3,6,9) – истинен, если значение атрибута A входит в множество
значений, заключенное в скобки
Предикат NOT IN – не входит в множество, истинен, если значение атрибута не входит в множество
Слайд 16Предикаты работы с множествами
Предикат EXIST () – истинен тогда, когда
множество, заключенное в скобках не пусто
Предикат NOT EXIST () –
истинен тогда, когда множество, заключенное в скобках пусто
Слайд 17Предикат сравнения с образцом
Предикат LIKE – подобен – истинен, когда
сравниваемое значение соответствует образцу
Предикат NOT LIKE – не подобен –
истинен, когда сравниваемое значение НЕ соответствует образцу
Слайд 18Во всех предикатах
в качестве проверяемого выражения может выступать
имя
атрибута одного из исходных отношений (имя столбца исходной таблицы)
выражение,
в котором используется имена атрибутов исходных отношений.
Слайд 19Таблица Clients
Вывести список клиентов
Select Name From Clients
Вывести список клиентов из
города с кодом 2
Select Name From Clients where kod=2
Слайд 20Примеры запросов с неопределенными значениями
Вывести список незакрытых счетов
Select N_bill,N_filial from
Bills
where Data_close Is Null
Вывести список закрытых счетов
Select N_bill,N_filial from Bills
where
Data_close Is Not Null
Слайд 21Группировка
Группировка – это механизм обработки записей в запросе, который предполагаем
компоновку множества записей с одинаковыми значениями столбцов группировки в одну
группу с последующей обработкой группы с использованием агрегатных функций.
Слайд 22Таблица Clients
Сгруппируем таблицу по коду города (это атрибут kod)
Сколько групп
получим?
А сколько строчек в каждой группе?
Слайд 23Таблица Students
Студентов 19
Сгруппируем
по полю N_groop
Получилось
5 групп
Слайд 25Сосчитаем количество студентов в каждой группе
Слайд 26Примеры запросов с группировкой
Для каждого города сосчитать количество клиентов банка,
проживающих в нем
Select City , count(*)
from cityes,clients
Where cityes.kod =Clients.kod
Group by
City
Слайд 27Особенности интерпретации функции COUNT
Count(*) – количество строк в группе
COUNT(имя столбца)
– количество определенных значений данного столбца в группе (т.е.NULL значения
не считаются)
COUNT(Distinct имя столбца)- количество различных значений данного атрибута в группе
Слайд 29Сколько студентов сдавало Сессию?
Слайд 31Примеры запросов
Сколько типов счетов поддерживается в нашем банке
Select count(*)
from
Type_bills
Сколько клиентов в нашем банке
Select count(*)
From Clients
Слайд 32Примеры
Вывести список клиентов с указанием количества счетов, открытых каждым клиентом
Select
bills.Id_ckient, Name, count(*)
From Clients, Bills
Where Clients.ID_Ckient=Bills.ID_ckient
Group by bills.Id_ckient, Name
Слайд 33Самостоятельно:
Для каждого клиента указать количество филиалов, с которым работает данный
клиент (в каком количестве филиалов у него открыты счета)
Для каждого
филиала сосчитать количество клиентов, которые в нем открыли счета
Для каждого филиала вывести количество открытых в нем счетов
Для каждого филиала сосчитать число закрытых счетов на текущий момент –
Текущая дата GetDate()
Слайд 34
Правила обработки значений NULL в агрегатных функциях
Если какие-либо
значения в столбце равны NULL при вычислении результата функции они
исключаются
Если все значения в столбце равны NULL то Max Min Sum Avg = NULL, count = 0 (ноль)
Если таблица пуста count(*) =0
Слайд 35Правила интерпретации агрегатных функций
Нельзя одновременно в списке вывода использовать значения
столбцов и агрегатные функции, без операции группировки!!!
Если в список вывода
включены агрегатные функции без других объектов и операций группировки, то они применимы ко всей таблице
В список вывода включается подсписок столбцов группировки и возможно значение агрегатных функций.
Не допустимо включать в список вывода столбцы, не входящие в список группировки !!!!!!!!!!
Слайд 36Применение агрегатных функций
Агрегатная функция не может быть аргументом другой агрегатной
функции!!!
Поэтому нельзя вкладывать агрегатные функции !!!
В список вывода могут включаться
арифметические выражения, аргументами которых являются агрегатные функции
Слайд 37Использование подзапросов
Предикаты сравнения:
IN – входит в множество
NOT IN –
не входит в множество
Слайд 38Пример использования подзапросов
Вывести список городов, из которых нет ни
одного клиента нашего банка
Select distinct City from Cityes
Where kod
NOT IN
(Select kod
from Clients)
Слайд 39Использование подзапросов при анализе групп
Слайд 40Пример подзапроса на уровне групп
Выбрать клиентов, у которых есть счета
во всех филиалов нашего банка
Select Name from Clients, Bills
Where Clients.ID_ckients=Bills.ID_Ckients
Group
BY Name
HAVING count(Distinct N_Filial)= (Select count(*)
from Filials)
Слайд 41Стандарт SQL92 – SQL2
Добавил понятие многократного сравнения
Ввел понятие внешнего объединения
Предложил
новый синтаксис оператора Select
Определил понятие встроенного SQL – связь с
базовым языком, понятие курсора, синтаксис хранимых процедур
Слайд 42Место использования операций многократного сравнения на уровне фильтрации строк
Select
вывода>
From
Where
ANY (Select <список значений> from … )
Select <список вывода>
From <список исходных таблиц>
Where
<имя столбца> <Операция Сравнения> ALL
Select <список значений>
from … )
Слайд 43Операции многократного сравнения (правила интерпретации)
Операция многократного сравнения ANY истинна (TRUE)
тогда, когда хотя бы одно сравнение истинно (TRUE)
В противном случае
она дает результат ложь FALSE.
Операция многократного сравнения ALL истинна (TRUE) тогда, когда ВСЕ элементарные сравнения истинны (TRUE)
В противном случае она дает результат ложь FALSE.
Слайд 44Применение многократного сравнения на уровне групп
Select
From
таблиц>
Group by
Having ALL
(Select <список значений>
from … )
Select <список вывода>
From <список исходных таблиц>
Group by <список столбцов>
Having <агрегатная функция><Операция Сравнения> ANY (Select <список значений>
from … )
Слайд 45Пример запроса с многократным сравнением
Вывести список филиалов, в которых открыто
максимальное количество счетов
Select N_Filial from Bills
Group by N_Filial
Having count(*) >=ALL
(Select COUNT(*)
From Bills
Group By N_filial)
Слайд 46Пример
Запрос: вывести список счетов, на которые были произведены максимальные
поступления средств.
select N_bill
from Operations
Where Type_oper
= 'занесение'
Group by N_bill
having SUM(SUM_Oper)>= All (Select SUM(SUM_Oper)
from Operations
Where Type_oper = 'занесение'
Group by N_bill)
Слайд 47Арифметические операции над агрегатными функциями
Пример
Вывести список счетов с указанием
остатка средств на каждом счету
select N_bill,N_filial, SUM(SUM_Oper) - (Select
SUM(SUM_Oper)
from Operations O
Where Type_oper = 'снятие' and
O.N_bill=Operations.N_bill and
O.N_filial = Operations.N_Filial)
from Operations
Where Type_oper = 'занесение'
group by N_bill,N_filial
Слайд 48Внешнее объединение
Ранее условием было соединение только по сравнимым значениям.
Внешнее
Левое left
Правое
Right
Полное Full
Слайд 49Левое внешнее
Из левой (первой таблицы в запросе) выбираются все строки,
а для тех у которых нет соответствующих значений в правой
таблице оставшиеся значения столбцов заполняются неопределенными значениями
Слайд 51Синтаксис
Select
From INNER JOIN < таб2>
Left
Right
Full
Cross
ON <условие> | USING <имя столбца>
Слайд 52Примеры
Select Name From Client
Inner JOIN Bills
where Clients.ID_ckient=Bills.ID_ckient
And N_filial =1
Слайд 53Интерпретация
Cross JOIN – перекрестное объединение – расширенное декартово произведение
Добавилась операция
UNION – аналог теоретико-множественного объединения
SELECT — запрос
UNION
SELECT — запрос
UNION
SELECT — запрос