Использование в sas языка запросов...
TRANSCRIPT
![Page 1: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/1.jpg)
Использование в SASязыка запросов SQL
Лекция 5: SQL
Роман Волынец, [email protected]
1
Москва – 2015 – ВМК МГУ
Замечания об ошибках и опечатках просьба направлять лектору
![Page 2: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/2.jpg)
План лекции
Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания
![Page 3: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/3.jpg)
План лекции
Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания
![Page 4: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/4.jpg)
Structured Query Language
SQL — язык структурированных запросов Стандартный инструмент для работы с
реляционными базами данных
![Page 5: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/5.jpg)
Основные операции SQL
Data Definition Language (DDL) Создание в базе данных новой таблицы Изменение структуры таблицы
Data Manipulation Language (DML) Добавление в таблицу новых записей Изменение записей Удаление записей Выборка записей (из одной или нескольких таблиц)
Data Control Language (DCL) Предоставление/отзыв разрешений
Transaction Control Language (TCL) Поддержка транзакций
![Page 6: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/6.jpg)
Краткая история SQL
1970 – первая работа по реляционным моделям данных (Э.Кодд)*
1974 – первая реализация SQL в составе СУБД System R компании IBM
1979 – реализация SQL в составе СУБД: Oracle V2 компании Relational Software Inc. System/38 компании IBM
1986 – первый стандарт ANSI SQL-86 1989 – свыше 75 систем, реализующих SQL 1989 – 2008 – дальнейшая стандартизация SQL
(ISO/ANSI)
* Codd, Edgar F (June 1970). "A Relational Model of Data for Large Shared Data Banks"
![Page 7: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/7.jpg)
План лекции
Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания
![Page 8: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/8.jpg)
PROC SQL
SQL в системе SAS (1)
1989 — выход SAS 6.06 с поддержкой PROC SQL Развитие возможностей PROC SQL в новых версиях
Base SAS
PROC SQL follows most of the guidelines set by the American National Standards Institute (ANSI) in its implementation of SQL. However, it is not fully compliant with the current ANSI standard for SQL. The SQL research project at SAS has focused primarily on the expressive power of SQL as a query language. Consequently, some of the database features of SQL have not yet been implemented in PROC SQL.
Учитывает стандарты
ANSI
Включает
улучшения
SAS
![Page 9: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/9.jpg)
SQL в системе SAS (2)
• Особенности SQL в SAS Нет поддержки транзакций (TCL) Нет операторов контроля доступа (DCL) Два типа данных (numeric и character) Пустые значения MISSING, отсутствие NULL
• Улучшения SQL в SAS Атрибуты колонок (модификаторы) Ключевое слово CALCULATED Remerging – сведение детальных и агрегированных
данных
SAS – это не СУБД!
![Page 10: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/10.jpg)
Сравнение PROC SQL и DATA Step (1)
Возможности DATA Step SQL
Полноценный язык программирования (произвольные алгоритмы)
Создание нескольких таблиц за один проход по набору данных
Работа с данными во внешних файлах
Удобно совмещать несколько операций в одном шаге (отбор записей, соединение таблиц, сортировка, группировка)
Удобно вводить данные в тексте программы (генерировать данные)
![Page 11: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/11.jpg)
PROC SQL может заменить несколько шагов обработки данных SAS
PROC SQL
DATA Step
PROC SORT PROC PRINT
Сравнение PROC SQL и DATA Step (2)
![Page 12: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/12.jpg)
Входные данные и результаты
12
Input Output
PROC SQL
DBMS Table
SAS Data Set
SAS Data View
Report
![Page 13: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/13.jpg)
1
3
PROC SQL – это … PROC SQL – это не …
Инструмент для выполнения
запросов к данным
Инструмент для выполнения
преобразований данных и
для управления данными
Дополнение к шагу данных
(DATA Step), еще один
способ работать с наборами
данных SAS
Инструмент для создания
пользовательских отчетов
Замена шага данных
(DATA Step)
Кратко о PROC SQL
![Page 14: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/14.jpg)
Терминология
Обработка данных(Data Processing) SAS SQL
File
Файл
Data Set
Набор данных
TableТаблица
Record
Запись
ObservationНаблюдение
Row
Строка
FieldПоле
VariableПеременная
Column
Колонка
![Page 15: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/15.jpg)
Синтаксис PROC SQL
• Справка: SAS® 9.3 SQL Procedure User's Guide• Синтаксис:
• Примеры опций PROC SQL NOEXEC – проверка синтаксиса операторов OUTOBS=N – выводить не более N записей в результат INOBS=N – использовать не более N записей из каждого
источника PRINT | NOPRINT – разрешить или запретить вывод
отчета оператором SELECT NONUMBER | NUMBER – нумерация строк в результатах
PROC SQL <опции>;
<оператор ... ;>
QUIT;
![Page 16: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/16.jpg)
Использование опций PROC SQL
proc sql noexec;
NOTE: Statement not executed due to NOEXEC
option.
libname ecsql1 '/folders/myfolders/ecsql1';
proc sql inobs=10;
select * from ecsql1.qtr1_2007;
WARNING: Only 10 records were read from
ECSQL1.QTR1_2007 due to INOBS= option.
proc sql outobs=10;
WARNING: Statement terminated early due to
OUTOBS=10 option.
![Page 17: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/17.jpg)
План выполнения SQL-запрооса
• Информация от оптимизатора SQL
(официально данные опции не документированы*)
* Paper CS-11 The SQL Optimizer Project: _Method and _Tree in SAS®9.1, Russ Lavery
proc sql _method _tree;
![Page 18: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/18.jpg)
План лекции
Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания
![Page 19: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/19.jpg)
Операторы PROC SQL
• В теле PROC SQL можно указывать несколько операторов
• Каждый оператор (statement) начинается с ключевого слова и заканчивается точкой с запятой
• Каждый оператор выполняется отдельно
Операции с объектами Операции с записями Служебные операторы
ALTER ...;CREATE ...;DESCRIBE ...;DROP ...;
DELETE ...;INSERT ...;SELECT ...;UPDATE ...;
RESET <опции>;VALIDATE ...;
PROC SQL <опции>;
<оператор ... ;>
QUIT;
![Page 20: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/20.jpg)
Оператор SELECT• Используется для запросов к данным – к одной или
нескольким таблицам (до 256 таблиц)• Результаты выводятся в виде отчета• Используется с оператором CREATE TABLE | VIEW
для создания таблиц/представлений• Синтаксис оператора SELECT:
SELECT object-item <, … object-item>
FROM from-list
<WHERE sql-expression>
<GROUP BY object-item <, … object-item >>
<HAVING sql-expression>
<ORDER BY order-by-item <DESC>
<, … order-by-item> <DESC>>;
![Page 21: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/21.jpg)
Пример использования SELECT
proc sql;
select Employee_ID, Employee_Gender, Salary
from orion.employee_information
where Employee_Gender='F'
order by Salary desc;
quit;
Employee
Employee Annual
Employee ID Gender Salary
--------------------------------------
120260 F $207,885
120719 F $87,420
120661 F $85,495
121144 F $83,505
120798 F $80,755
![Page 22: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/22.jpg)
Отбор записей
• Исключение дубликатов (DISTINCT)
• Отбор записей по условиям (WHERE)
Операторы сравнения Логические операторы Специальные операторы
select Employee_ID, Job_Title, Salary
from orion.employee_information
where Salary > 112000;
select distinct Department
from orion.employee_information;
![Page 23: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/23.jpg)
Условия: Операторы сравнения
• Стандартные операторы сравнения для использования в условиях на отбор записей
Мнемоника Символы Определение
LT < Меньше
GT > Больше
EQ = Равно
LE <= Меньше или равно
GE >= Больше или равно
NE < >
¬=
^=
Не равно
Не равно (EBCDIC)
Не равно (ASCII)
![Page 24: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/24.jpg)
Условия: Логические операторы
• Логические операторы используются для формирования комбинаций условий
Мнемоника Символы Определение
OR | ИЛИ, любое
AND & И, оба
NOT ¬ НЕ, отрицание (EBCDIC)
NOT ^ НЕ, отрицание (ASCII)
![Page 25: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/25.jpg)
Условия: Специальные операторы
Оператор Пример
INwhere JobCategory in
('PT','NA','FA')
CONTAINS или ? where word ? 'LAM'
IS NULL
или
IS MISSING
where Product_ID is missing
BETWEEN – ANDwhere Salary between 70000 and
80000
SOUNDS LIKE (=*) where LastName =* 'SMITH'
LIKE
(с % или _ в шаблоне)
where Employee_Name like 'H%'
where JobCategory like '__1'
![Page 26: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/26.jpg)
Выражения для колонок (1)
• Отбор всех колонок (звездочка):
• Для уточнения из какой таблицы/view поступает колонка используются префиксы имен таблиц/view
• Любые выражения SAS (константы, выражения –арифметические, логические, строковые; функции)
select * from orion.employee_information;
select customers.ID, T.Name, Action, Amount
from customers, transactions as T
where customers.ID=T.ID;
select Employee_ID, Employee_Gender,
int((today()-Birth_Date)/365.25) as Age
from orion.employee_information;
![Page 27: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/27.jpg)
Выражения для колонок (2)
• Атрибуты колонок (имя, тип, описание, формат, информат)
• Ключевое слово CALCULATED для отсылки к колонке, значение которой вычисляется в данном запросе
select Employee_ID 'Employee ID',
Salary*0.1 label='Bonus'
format=dollar10.
from orion.employee_information;
select Employee_ID, Employee_Gender,
Salary, Salary*0.1 as Bonus
from orion.employee_information
where calculated Bonus<3000;
![Page 28: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/28.jpg)
Выражения для колонок (3)
• Выражение SELECT / CASE / WHEN / ELSE / END
• Многие стандартные функции SAS и пользовательские функции (PROC FCMP)
• Суммирующие функции (статистики)
select Job_Title, Salary,
case scan(Job_Title,-1,' ')
when 'I' then Salary*.05
when 'II' then Salary*.07
when 'III' then Salary*.10
when 'IV' then Salary*.12
else Salary*.08
end as Bonus
from orion.employee_information;
![Page 29: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/29.jpg)
Использование функций
• В SQL-запросах можно использовать встроенные и пользовательские функции
proc fcmp outlib=work.fun1.fun1;
function myfun(id) $ 4;
return (substr(put(id,10.),1,4));
endsub;
run;
options cmplib=work.fun1.fun1;
proc sql;
select order_id,
myfun(order_id) as first_4_left
from ecsql1.qtr1_2007 ;
quit;
Определение функции
Использование функции
![Page 30: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/30.jpg)
SQL SAS Описание
AVG MEAN Среднее значение
COUNT FREQ, N Количество непустых (non-missing) значений
MAX MAX Наибольшее значение
MIN MIN Наименьшее значение
SUM SUM Сумма непустых (non-missing) значений
NMISS Количество пустых (missing) значений
STD Стандартное отклонение
VAR Дисперсия
• В PROC SQL можно использовать имена статистик по стандарту ANSI SQL и SAS:
Примеры суммирующих функций
![Page 31: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/31.jpg)
Агрегирование данных (1)
• Выражение GROUP BY – для задания групп• Использование суммирующих функций
• В GROUP BY и ORDER BY можно ссылаться на колонку по номеру
select
order_type,
avg(quantity) format=3.1 label="Average",
sum(total_retail_price)
format=dollar10. label="Sum"
from ecsql1.order_fact
group by 1;
![Page 32: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/32.jpg)
Агрегирование данных (2)
• Выражение HAVING – отбор записей после группировки (фильтрация по агрегатам)
• DISTINCT – для отбора уникальных значений переменных (в суммирующих функциях) или для отбора уникальных записей (с оператором SELECT)
select
order_type,
count(distinct customer_id),
sum(total_retail_price)
from esql1.order_fact
group by order_type
having sum(total_retail_price) > 30000;
![Page 33: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/33.jpg)
Remerge (1)
• Сведение исходных и агрегированных данных • Если SELECT содержит колонку, созданную
суммирующей функцией, и колонку из детальных данных, то агрегированные данные автоматически добавляются в каждую запись исходных данных
• Опция NOREMERGE (для отключения такого поведения PROC SQL)
select employee_id, salary, max(salary) as maxs
from ecsql1.sales ;
NOTE: The query requires remerging summary
statistics back with the original data.
![Page 34: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/34.jpg)
Remerge (2)
• Задача: найти сотрудников, которые имеют максимальную зарплату
• Обычный SQL: с помощью вложенного запроса
• SAS SQL:
select employee_id, gender, salary
from ecsql1.sales
where salary = (select max(salary)
from ecsql1.sales);
select employee_id, gender, salary
from ecsql1.sales
where salary = max(salary);
![Page 35: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/35.jpg)
Вложенные запросы
• Внутри одного SQL-запроса могут использоваться другие SQL-запросы
• При формировании условий в WHERE / HAVING(subquery, подзапрос)
• При использовании в качестве источника данных в FROM (in-line views, встроенное представление)
![Page 36: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/36.jpg)
Подзапросы
• Используются при формировании условий в выражениях WHERE / HAVING
• Подзапрос должен возвращать ровно одну колонку• Может возвращать одно значение (запись) или
несколько значений (записей)• Коррелированные (зависимые) и
некоррелированные (независимые) подзапросы• Операторы сравнения, ключевые слова ALL/ANY,
оператор IN, операторы EXIST/NOT EXIST
![Page 37: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/37.jpg)
Коррелированные подзапросы
• Некоррелированный (независимый) подзапрос
• Коррелированный (зависимый)
select * from orion.staff
where Salary > (select avg(Salary)
from orion.staff);
select * from orion.staff as S
where Salary > (select avg(Salary)
from orion.staff
where Gender=S.Gender);
![Page 38: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/38.jpg)
Ключевые слова ANY/ALL
• ANY – истинно, если выражение истинно для некоторого из значений
• ALL – истинно, если выражение истинно для каждого из значений
Выражение Эквивалент
= ANY(20,30,40) =20 или =30 или =40
> ANY(20,30,40) > 20
Выражение Эквивалент
> ALL(20,30,40) > 40
< ALL(20,30,40) < 20
![Page 39: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/39.jpg)
Операторы EXISTS/NOT EXISTS
• EXISTS – истинно, если подзапрос возвращает хотя бы одну запись
• NOT EXISTS – истинно, если подзапрос не возвращает ни одной записи
select Employee_ID, Job_Title
from orion.sales
where not exists
(select *
from orion.order_fact
where sales.Employee_ID=
order_fact.Employee_ID);
![Page 40: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/40.jpg)
Встроенные представления
• SQL-запрос, указанный в скобках в выражении FROM (в операторе SELECT)
• Используется при построении сложных запросов
SELECT *
FROM (запрос встроенного представления)
<AS alias>
… ;
![Page 41: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/41.jpg)
Пример сложного запроса
• Задача: Получить данные о начальниках сотрудников, продавших в 2011 году продукт 'Expedition Zero'select Employee_Name format=$25. as Name, City
from orion.employee_addresseswhere Employee_ID in
(select Manager_ID from orion.employee_organization as o,
(select distinct Employee_IDfrom orion.order_fact as of,
orion.product_dim as pwhere of.Product_ID=p.Product_ID
and year(Order_Date)=2011 and Product_Name contains
'Expedition Zero') as IDwhere o.Employee_ID=ID.Employee_ID);
Подзапрос
Встроенный запрос
![Page 42: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/42.jpg)
Операции с несколькими таблицами
• «По горизонтали» (combining data horizontally) SQL Joins / Соединения Записи одной таблицы сопоставляются с записями
другой таблицы К колонкам в записях одной таблицы добавляются
колонки из другой таблицы
• «По вертикали» (combining data vertically) SQL Set Operators / Объединения Записи таблиц рассматриваются как множества Операции с множествами
![Page 43: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/43.jpg)
Типы соединений (1)
• Декартово произведение (Cartesian Product) Все записи одной таблицы – со всеми записями другой Количество записей – произведение количеств записей
• Внутреннее соединение
• Внешние соединения
RIGHTLEFT FULL
INNER
![Page 44: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/44.jpg)
Типы соединений (2)
• Декартово произведение (Cartesian Product)
• Внутреннее соединение
• Внешние соединения
select * from customers, transactions;
select * from customers, transactionswhere customers.ID=transactions.ID;
select * from customers as c
left join transactions as t on c.ID=t.ID;
select coalesce(c.ID,t.ID) as ID,c.Name, t.Action, t.Amount
from customers c full join transactions t on c.ID=t.ID;
Без условия
Условие сопоставления
записей
![Page 45: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/45.jpg)
Типы объединений (1)
UNION
RS1
RS2
OUTER UNION
RS1
RS2
EXCEPT
RS1
RS2
INTERSECT
RS1
RS2
SELECT …UNION | OUTER UNION | EXCEPT | INTERSECT <ALL><CORR> SELECT …;
![Page 46: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/46.jpg)
Типы объединений (2)
• UNION – с исключением дубликатов, колонки в исходных данных сопоставляются по позициям
• OUTER UNION – без исключения дубликатов, колонки в исходных данных сопоставляются по именам, несопоставленные колонки сохраняются
/* Результаты продаж в 1 кв. и во 2 кв. */select * from ecsql1.qtr1_2007outer unionselect * from ecsql1.qtr2_2007 ;
/* Список студентов, прошедших обучение по курсу А или по курсу Б */
select ID, Name from work.train_aunionselect ID, Name from work.train_b ;
![Page 47: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/47.jpg)
Работа с таблицами
• CREATE TABLE – создание таблицы• DESCRIBE TABLE – получение описания таблицы• ALTER TABLE – модификация таблицы• DROP TABLE – удаление таблицы
Аналогичные операции с представлениями (VIEW)
![Page 48: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/48.jpg)
Создание новой таблицы (1)
• Три метода создания новой таблицы
Метод 1 Из существующей таблицы (с данными)
Метод 2 Из существующей таблицы (без данных)
Метод 3 Создать пустую таблицу кодом SQL
PROC SQL
PROC SQL
PROC SQL
![Page 49: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/49.jpg)
Создание новой таблицы (2)
• Три метода создания новой таблицы
Метод 1 Из существующей таблицы (с данными)
Метод 2 Из существующей таблицы (без данных)
Метод 3 Создать пустую таблицу кодом SQL
CREATE TABLE table-name ASSELECT …;
CREATE TABLE table-name(column-name type(length)<, ...column-name type(length)> );
CREATE TABLE table-name-2 LIKE table-name-1;
![Page 50: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/50.jpg)
Типы колонок
• Можно использовать типы данных ANSI SQL
ANSI Type
Resulting
SAS Type
Default
Length
Default
Format
CHAR(n) Character 8 $w.
VARCHAR(n) Character 8 $w.
INTEGER Numeric 8 BEST.
SMALLINT Numeric 8 BEST.
DECIMAL Numeric 8 BEST.
NUMERIC Numeric 8 BEST.
FLOAT Numeric 8 BEST.
REAL Numeric 8 BEST.
DOUBLE PRECISION Numeric 8 BEST.
DATE Numeric 8 DATE.
![Page 51: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/51.jpg)
Изменение структуры таблицы
• Добавление новой колонки
• Удаление колонки
• Изменение атрибутов колонки
ALTER TABLE table-nameADD column-definition< , … column-definition>;
ALTER TABLE table-nameDROP column-1<, …column-2> ;
ALTER TABLE table-nameMODIFY column-definition<, …column-definition>;
alter table work.employee_payrollmodify Bonus num format=comma8.2,
Level char(10) label='Employee Level';
![Page 52: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/52.jpg)
Операции с записями (1)
• INSERT – вставка записей в таблицу По одной записи INSERT INTO … VALUES | SET … Множество записей INSERT INTO … SELECT…
• UPDATE – модификация записей в таблице• DELETE– удаление записей из таблицы
/* Скидка на товары заданного поставщика */insert into discounts
(Product_ID, Discount, Start_Date, End_Date)select distinct Product_ID,.35,
'01MAR2013'd,'31MAR2013'dfrom orion.Product_Dimwhere Supplier_Name contains
'Pro Sportswear Inc';
![Page 53: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/53.jpg)
Операции с записями (2)
Метод Описание Синтаксис
A Один оператор на каждую
запись с использованием
пар «колонка=значение»
INSERT INTO table-name
SET column-name=value,
column-name=value,...;
B Один оператор на каждую
запись с использованием
порядка следования
колонок
INSERT INTO table-name
<(column list)>
VALUES (value,value,...);
C Запрос, возвращающей
множество записей, с
использованием порядка
следования колонок
INSERT INTO table-name
<(column list)>
SELECT columns
FROM table-name;
• Методы вставки записей в таблицу
![Page 54: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/54.jpg)
Операции с записями (3)
• UPDATE – модификация записей в таблице
• DELETE – удаление записей из таблицы
update work.salesset Salary=Salary*1.05where Job_Title='Sales Rep. I';
delete from work.staff
where Emp_Term_Date is not missing;
![Page 55: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/55.jpg)
План лекции
Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания
![Page 56: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/56.jpg)
Доступ к другим СУБД (1)
Используются продукты SAS/ACCESS (модули доступа к внешним данным) К реляционным СУБД (Oracle, DB2, Sybase, Teradata, …) К нереляционным СУБД (ADABAS, IDMS, ...) К стандартным протоколам (ODBC, OLE DB) К файловым форматам (DBF, Excel)
Два способа работы с внешними базами и источниками данных Сквозные запрос к базам данных (SQL Pass-Through Facility) Назначение библиотек на внешние базы данных
(SAS/ACCESS LIBNAME Statement)
![Page 57: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/57.jpg)
Доступ к другим СУБД (2) Сквозные запросы к базам данных
Назначение библиотеки на внешнюю базу данных
После назначения библиотеки на СУБД с таблицами из этой библиотеки в SAS можно работать как с наборами данных
LIBNAME <имя> DBMS <опции подключения к СУБД>;
PROC SQL;CONNECT TO DBMS (<опции подключения к СУБД>)
<AS alias>;
SELECT * FROM CONNECTION TO DBMS( SELECT-запрос для внешней СУБД );
EXECUTE ( SQL-запрос для внешней СУБД ) BY DBMS;
DISCONNECT FROM DBMS;QUIT;
![Page 58: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/58.jpg)
Доступ к другим СУБД (3) Сквозной запрос к базе данных Oracle
Назначение библиотеки на базу данных Oracle
Чтобы не указывать пароли в открытом виде, можно использовать пароль, закодированный PROC PWENCODE
proc sql;connect to oracle (user=u1 pw=xxx path=hrd);select * from connection to oracle(select * from employees;where dept='CSR010');
disconnect from oracle;quit;
libname mydblib oracle user=u1 pw=xxx path=hrd;proc sql;
select * from mydblib.employees where dept='CSR010';
quit;
![Page 59: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/59.jpg)
План лекции
Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания
![Page 60: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/60.jpg)
PROC SQL и макроязык (1)
• Текст PROC SQL проходит обработку макропроцессором SAS
• Текст PROC SQL проходит обработку макропроцессором SAS (т.е. можно использовать макропеременные, макрофункции, макросы)
• PROC SQL может создавать пользовательские макропеременные (SELECT … INTO …)
• PROC SQL возвращает информацию с использованием автоматических макропеременных (SQLOBS, SQLRC, SQLOOPS, SQLEXITCODE, SQLXRC, SQLXMSG)
![Page 61: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/61.jpg)
PROC SQL и макроязык (2)
• Примеры использования макропеременных
%let country=US;proc sql;
create table work.&country._employees as select * from ecsql1.employeeswhere country="&country";
quit;
%let stat=min;proc sql;
select * from ecsql1.employeesgroup by genderhaving salary=&stat(salary);
quit;
![Page 62: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/62.jpg)
PROC SQL и макроязык (3)options mprint mlogic symbolgen;%MACRO QTR12;proc sql;%do i=1 %to 2;select * from ecsql1.qtr&i._2007;%end;
quit;%MEND;%QTR12
MLOGIC(QTR12): Beginning execution.MPRINT(QTR12): proc sql;MLOGIC(QTR12): %DO loop beginning; index variable I; start value is 1; stop value is 2; by value is 1.
SYMBOLGEN: Macro variable I resolves to 1MPRINT(QTR12): select * from ecsql1.qtr1_2007;MLOGIC(QTR12): %DO loop index variable I is now 2; loop will iterate again.
SYMBOLGEN: Macro variable I resolves to 2MPRINT(QTR12): select * from ecsql1.qtr2_2007;MLOGIC(QTR12): %DO loop index variable I is now 3; loop will not iterate again.
MPRINT(QTR12): quit;NOTE: PROCEDURE SQL used (Total process time):
real time 0.05 seconds. . .MLOGIC(QTR12): Ending execution.
![Page 63: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/63.jpg)
PROC SQL и макроязык (4)
• Создание макропеременных (несколько вариантов)
proc sql;
select avg(salary) into :avgsal
from ecsql1.employees;
select min(salary),max(salary)
into :minsal, :maxsal
from ecsql1.employees;
select distinct upcase(country)
into :country1 - :country100
from ecsql1.employees;
select distinct upcase(country)
into :clist separated by ', '
from ecsql1.employees;
quit;
%put _USER_;
GLOBAL AVGSAL 40476.92
GLOBAL MAXSAL 433800
GLOBAL MINSAL 22710
GLOBAL COUNTRY1 AU
GLOBAL COUNTRY2 US
GLOBAL CLIST AU, US
GLOBAL SQLOBS 2
GLOBAL SQLRC 0
![Page 64: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/64.jpg)
Таблицы с метаданными
• Dictionary tables – содержат информацию о структурах данных SAS (свыше 30 таблиц) DICTIONARY.TABLES – информация о таблицах DICTIONARY.COLUMNS – информация о колонках DICTIONARY.MEMBERS – информация объектах в
библиотеках SAS
• Создаются автоматически SAS, доступ Read-Only
• Доступны также как view в библиотеке SASHELP (например, SASHELP.VTABLE)
select memname 'Table Name', nobs, nvar, crdatefrom dictionary.tableswhere libname='ECSQL1';
![Page 65: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/65.jpg)
План лекции
Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания
![Page 66: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/66.jpg)
Задания
• 3 (три) задания • Решение должно включать ответы на
вопросы и соответствующие программы• Срок сдачи - до 23:59:59 10 ноября 2015 г.• Программы присылать на адрес
[email protected] пометкой в теме письма:
Задание спецкурс ВМК (SQL)• Решения и результаты будут опубликованы
на странице с лекциями: http://tiny.cc/msu_sas
66
![Page 67: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/67.jpg)
Задание 1В наборе данных ecsql1.employees содержится информация о сотрудниках компании.В наборе данных ecsql1.employee_organization содержится информация о структуре компании (иерархия «начальник -подчиненный»). Напишите SQL-запросы, которые позволят ответить на следующие вопросы.Насколько в среднем начальники получают большую зарплату по сравнению с непосредственными подчиненными(в процентном выражении):1) В целом по компании?2) В разрезе каждого подразделения?(отсортировать записи по убыванию показателя увеличения зарплаты)
![Page 68: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/68.jpg)
Задание 2В наборе данных ecsql1.employees содержится информация о сотрудниках компании. Предположим, что сегодня 01.01.2007. 1) Необходимо с помощью PROC SQL сформировать приведенный ниже отчет (возрастные категории — по 3 года).2) Сколько всего строк будет в отчете?3) Для каких возрастных категорий (у мужчин и у женщин) средняя зарплата самая высокая?
Возрастная категория (от)
Возрастная категория (до)
Средняя зарплата у мужчин
Средняя зарплата у женщин
18 21 $28,728 $28,283
21 24 $27,029 $29,201
… … … …
![Page 69: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном](https://reader034.vdocuments.pub/reader034/viewer/2022052022/6036e93d846ddc72403e118c/html5/thumbnails/69.jpg)
Задание 3В наборе данных ecsql1.employees содержится информация о сотрудниках компании с указанием страны и города. В наборе данных ecsql1.order_fact содержится информация о заказах.
1) Необходимо написать программу, которая создаст таблицы work.order_fact_<Страна>_<Город>, содержащие данные по заказам, связанным с сотрудниками подразделения компании в соответствующем городе. Количество стран и городов заранее не известно. Если имя города содержит дефис или пробел, из имени создаваемой таблицы эти символы нужно удалить. Необходимо использовать только PROC SQL и макроязык SAS.
2) Сколько будет создано таблиц? Сколько в каждой записей?
3) Сколько проходов по набору данных ecsql1.order_factпотребуется выполнить?
4) Перепишите программу с использованием DATA Step так, чтобы по набору данных ecsql1.order_fact было только 2 прохода.