69
Использование в SAS языка запросов SQL Лекция 5: SQL Роман Волынец, [email protected] 1 Москва – 2015 – ВМК МГУ Замечания об ошибках и опечатках просьба направлять лектору

Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

  • Upload
    others

  • View
    14

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Использование в SASязыка запросов SQL

Лекция 5: SQL

Роман Волынец, [email protected]

1

Москва – 2015 – ВМК МГУ

Замечания об ошибках и опечатках просьба направлять лектору

Page 2: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

План лекции

Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания

Page 3: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

План лекции

Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания

Page 4: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Structured Query Language

SQL — язык структурированных запросов Стандартный инструмент для работы с

реляционными базами данных

Page 5: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Основные операции 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 · Удобно совмещать несколько операций в одном

Краткая история 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 · Удобно совмещать несколько операций в одном

План лекции

Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания

Page 8: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

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 · Удобно совмещать несколько операций в одном

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 · Удобно совмещать несколько операций в одном

Сравнение PROC SQL и DATA Step (1)

Возможности DATA Step SQL

Полноценный язык программирования (произвольные алгоритмы)

Создание нескольких таблиц за один проход по набору данных

Работа с данными во внешних файлах

Удобно совмещать несколько операций в одном шаге (отбор записей, соединение таблиц, сортировка, группировка)

Удобно вводить данные в тексте программы (генерировать данные)

Page 11: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

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 · Удобно совмещать несколько операций в одном

Входные данные и результаты

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 · Удобно совмещать несколько операций в одном

1

3

PROC SQL – это … PROC SQL – это не …

Инструмент для выполнения

запросов к данным

Инструмент для выполнения

преобразований данных и

для управления данными

Дополнение к шагу данных

(DATA Step), еще один

способ работать с наборами

данных SAS

Инструмент для создания

пользовательских отчетов

Замена шага данных

(DATA Step)

Кратко о PROC SQL

Page 14: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Терминология

Обработка данных(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 · Удобно совмещать несколько операций в одном

Синтаксис 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 · Удобно совмещать несколько операций в одном

Использование опций 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 · Удобно совмещать несколько операций в одном

План выполнения 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 · Удобно совмещать несколько операций в одном

План лекции

Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания

Page 19: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Операторы 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 · Удобно совмещать несколько операций в одном

Оператор 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 · Удобно совмещать несколько операций в одном

Пример использования 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 · Удобно совмещать несколько операций в одном

Отбор записей

• Исключение дубликатов (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 · Удобно совмещать несколько операций в одном

Условия: Операторы сравнения

• Стандартные операторы сравнения для использования в условиях на отбор записей

Мнемоника Символы Определение

LT < Меньше

GT > Больше

EQ = Равно

LE <= Меньше или равно

GE >= Больше или равно

NE < >

¬=

^=

Не равно

Не равно (EBCDIC)

Не равно (ASCII)

Page 24: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Условия: Логические операторы

• Логические операторы используются для формирования комбинаций условий

Мнемоника Символы Определение

OR | ИЛИ, любое

AND & И, оба

NOT ¬ НЕ, отрицание (EBCDIC)

NOT ^ НЕ, отрицание (ASCII)

Page 25: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Условия: Специальные операторы

Оператор Пример

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 · Удобно совмещать несколько операций в одном

Выражения для колонок (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 · Удобно совмещать несколько операций в одном

Выражения для колонок (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 · Удобно совмещать несколько операций в одном

Выражения для колонок (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 · Удобно совмещать несколько операций в одном

Использование функций

• В 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 · Удобно совмещать несколько операций в одном

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 · Удобно совмещать несколько операций в одном

Агрегирование данных (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 · Удобно совмещать несколько операций в одном

Агрегирование данных (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 · Удобно совмещать несколько операций в одном

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 · Удобно совмещать несколько операций в одном

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 · Удобно совмещать несколько операций в одном

Вложенные запросы

• Внутри одного SQL-запроса могут использоваться другие SQL-запросы

• При формировании условий в WHERE / HAVING(subquery, подзапрос)

• При использовании в качестве источника данных в FROM (in-line views, встроенное представление)

Page 36: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Подзапросы

• Используются при формировании условий в выражениях WHERE / HAVING

• Подзапрос должен возвращать ровно одну колонку• Может возвращать одно значение (запись) или

несколько значений (записей)• Коррелированные (зависимые) и

некоррелированные (независимые) подзапросы• Операторы сравнения, ключевые слова ALL/ANY,

оператор IN, операторы EXIST/NOT EXIST

Page 37: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Коррелированные подзапросы

• Некоррелированный (независимый) подзапрос

• Коррелированный (зависимый)

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 · Удобно совмещать несколько операций в одном

Ключевые слова 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 · Удобно совмещать несколько операций в одном

Операторы 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 · Удобно совмещать несколько операций в одном

Встроенные представления

• SQL-запрос, указанный в скобках в выражении FROM (в операторе SELECT)

• Используется при построении сложных запросов

SELECT *

FROM (запрос встроенного представления)

<AS alias>

… ;

Page 41: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Пример сложного запроса

• Задача: Получить данные о начальниках сотрудников, продавших в 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 · Удобно совмещать несколько операций в одном

Операции с несколькими таблицами

• «По горизонтали» (combining data horizontally) SQL Joins / Соединения Записи одной таблицы сопоставляются с записями

другой таблицы К колонкам в записях одной таблицы добавляются

колонки из другой таблицы

• «По вертикали» (combining data vertically) SQL Set Operators / Объединения Записи таблиц рассматриваются как множества Операции с множествами

Page 43: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Типы соединений (1)

• Декартово произведение (Cartesian Product) Все записи одной таблицы – со всеми записями другой Количество записей – произведение количеств записей

• Внутреннее соединение

• Внешние соединения

RIGHTLEFT FULL

INNER

Page 44: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Типы соединений (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 · Удобно совмещать несколько операций в одном

Типы объединений (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 · Удобно совмещать несколько операций в одном

Типы объединений (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 · Удобно совмещать несколько операций в одном

Работа с таблицами

• CREATE TABLE – создание таблицы• DESCRIBE TABLE – получение описания таблицы• ALTER TABLE – модификация таблицы• DROP TABLE – удаление таблицы

Аналогичные операции с представлениями (VIEW)

Page 48: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Создание новой таблицы (1)

• Три метода создания новой таблицы

Метод 1 Из существующей таблицы (с данными)

Метод 2 Из существующей таблицы (без данных)

Метод 3 Создать пустую таблицу кодом SQL

PROC SQL

PROC SQL

PROC SQL

Page 49: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Создание новой таблицы (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 · Удобно совмещать несколько операций в одном

Типы колонок

• Можно использовать типы данных 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 · Удобно совмещать несколько операций в одном

Изменение структуры таблицы

• Добавление новой колонки

• Удаление колонки

• Изменение атрибутов колонки

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 · Удобно совмещать несколько операций в одном

Операции с записями (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 · Удобно совмещать несколько операций в одном

Операции с записями (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 · Удобно совмещать несколько операций в одном

Операции с записями (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 · Удобно совмещать несколько операций в одном

План лекции

Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания

Page 56: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Доступ к другим СУБД (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 · Удобно совмещать несколько операций в одном

Доступ к другим СУБД (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 · Удобно совмещать несколько операций в одном

Доступ к другим СУБД (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 · Удобно совмещать несколько операций в одном

План лекции

Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания

Page 60: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

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 · Удобно совмещать несколько операций в одном

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 · Удобно совмещать несколько операций в одном

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 · Удобно совмещать несколько операций в одном

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 · Удобно совмещать несколько операций в одном

Таблицы с метаданными

• 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 · Удобно совмещать несколько операций в одном

План лекции

Краткая информация о языке SQL Особенности реализации SQL в SAS Основные операторы PROC SQL Доступ к другим СУБД PROC SQL и макроязык Задания

Page 66: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Задания

• 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 · Удобно совмещать несколько операций в одном

Задание 1В наборе данных ecsql1.employees содержится информация о сотрудниках компании.В наборе данных ecsql1.employee_organization содержится информация о структуре компании (иерархия «начальник -подчиненный»). Напишите SQL-запросы, которые позволят ответить на следующие вопросы.Насколько в среднем начальники получают большую зарплату по сравнению с непосредственными подчиненными(в процентном выражении):1) В целом по компании?2) В разрезе каждого подразделения?(отсортировать записи по убыванию показателя увеличения зарплаты)

Page 68: Использование в SAS языка запросов SQL57705.selcdn.com/MSU_2015/LEC_SQL.pdf · Удобно совмещать несколько операций в одном

Задание 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 · Удобно совмещать несколько операций в одном

Задание 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 прохода.