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

Содержание

Слайд 2

Цели После освоения материала данной лекции, Вы должны быть в состоянии

Цели

После освоения материала данной лекции, Вы должны быть в состоянии выполнить

следующие действия:
Описать типы функций языка Oracle SQL
Использовать различные типы функций: символьные, числовые и типа «дата» - в команде SELECT
Назвать и использовать функции преобразования данных
Слайд 3

SQL Функции Функция Арг. 1 Арг. 2 Арг. n Выполняет действие Результат

SQL Функции

Функция

Арг. 1

Арг. 2

Арг. n

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

Результат

Слайд 4

Типы SQL Функций Однострочные Многострочные Возвращают один результат для одной строки

Типы SQL Функций

Однострочные

Многострочные

Возвращают один результат
для одной строки

Возвращают один результат
для набора

строк

Функции

Слайд 5

Однострочные функции (Single-Row Functions) Особенности однострочных функций: Обрабатывает каждую строку, возвращаемую

Однострочные функции (Single-Row Functions)

Особенности однострочных функций:
Обрабатывает каждую строку, возвращаемую запросом
Возвращает по

одному результату для строки
Могут изменять тип данных: тип данных на выходе может отличаться от типа данных, к которым обращается пользователь
Могут принимать один или несколько аргументов
Могут использоваться в предложениях SELECT, WHERE, ORDER BY
Могут быть вложенными

function_name [(arg1, arg2,...)]

Слайд 6

Однострочные функции (Single-Row Functions) Преобразования (Conversion) Символьные (Character) Числовые (Number) Даты (Date) Общие (General) Single-row functions

Однострочные функции (Single-Row Functions)

Преобразования
(Conversion)

Символьные
(Character)

Числовые
(Number)

Даты
(Date)

Общие
(General)

Single-row
functions

Слайд 7

Символьные функции (Character Functions)

Символьные функции (Character Functions)

Слайд 8

Функции преобразования регистра символов (Case-Manipulation Functions)

Функции преобразования регистра символов (Case-Manipulation Functions)

Слайд 9

SELECT employee_id, last_name, department_id FROM employees WHERE LOWER(last_name) = 'higgins'; Пример

SELECT employee_id, last_name, department_id
FROM employees
WHERE LOWER(last_name) = 'higgins';

Пример использования Case-Manipulation Functions

Выбрать

номер, фамилию и номер отдела, в котором работает сотрудник по фамилии Higgins:

SELECT employee_id, last_name, department_id
FROM employees
WHERE last_name = 'higgins';
no rows selected

Слайд 10

Функции манипулирования символами (Character-manipulation)

Функции манипулирования символами (Character-manipulation)

Слайд 11

SELECT employee_id, CONCAT(first_name, last_name) NAME, job_id, LENGTH (last_name), INSTR(last_name, 'a') "Contains

SELECT employee_id, CONCAT(first_name, last_name) NAME,
job_id, LENGTH (last_name),
INSTR(last_name,

'a') "Contains 'a'?"
FROM employees
WHERE SUBSTR(job_id, 4) = 'REP';

Примеры использования Character-Manipulation Functions

2

3

1

2

1

3

Слайд 12

Числовые функции (Number Functions) ROUND: Округляет значение до десятичных разрядов TRUNC:

Числовые функции (Number Functions)

ROUND: Округляет значение до десятичных разрядов
TRUNC: Усекает значение

до десятичных разрядов
MOD: Возвращает остаток от деления
Слайд 13

SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) FROM DUAL; Пример использования функции ROUND 3 3 1 2 1 2

SELECT ROUND(45.923,2), ROUND(45.923,0),
ROUND(45.923,-1)
FROM DUAL;

Пример использования функции ROUND

3

3

1

2

1

2

Слайд 14

Пример использования функции TRUNC SELECT trunc(45.923,2) , trunc(45.923) , trunc(45.923,-1) FROM

Пример использования функции TRUNC

SELECT trunc(45.923,2) , trunc(45.923)
, trunc(45.923,-1)
FROM dual;

3

3

1

2

1

2

Слайд 15

SELECT last_name, salary, MOD(salary, 5000) FROM employees WHERE job_id = 'SA_REP'; Пример использования функции MOD

SELECT last_name, salary, MOD(salary, 5000)
FROM employees
WHERE job_id = 'SA_REP';

Пример использования функции

MOD
Слайд 16

SELECT last_name, hire_date FROM employees WHERE hire_date Работа с датами База

SELECT last_name, hire_date
FROM employees
WHERE hire_date < '01-FEB-88';

Работа с датами

База данных Oracle

хранит даты во внутреннем числовом формате: век, год, месяц, день, часы, минуты и секунды.
Стандартный формат отображения DD-MON-RR.
Можно перенастроить для всей бызы или отдельно сессии dd.mm.yyyy
Слайд 17

Работа с датами Функция SYSDATE возвращает: Текущую дату Текущее время Функция

Работа с датами

Функция SYSDATE возвращает:
Текущую дату
Текущее время
Функция сurrent_date возвращает:
Текущую дату
Текущее время

Слайд 18

Arithmetic with Dates Прибавить или вычесть число из даты Найти разность между двумя датами.

Arithmetic with Dates

Прибавить или вычесть число из даты
Найти разность между

двумя датами.
Слайд 19

SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS FROM employees WHERE department_id = 90; Использование арфиметических операций с датами

SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS
FROM employees
WHERE department_id = 90;

Использование арфиметических операций

с датами
Слайд 20

Date Functions

Date Functions

Слайд 21

Using Date Functions

Using Date Functions

Слайд 22

Using Date Functions Assume SYSDATE = '25-JUL-03':

Using Date Functions

Assume SYSDATE = '25-JUL-03':

Слайд 23

Practice 3: Overview of Part 1 This practice covers the following

Practice 3: Overview of Part 1

This practice covers the following topics:
Writing

a query that displays the current date
Creating queries that require the use of numeric, character, and date functions
Performing calculations of years and months of service for an employee
Слайд 24

Conversion Functions Implicit data type conversion Explicit data type conversion Data type conversion

Conversion Functions

Implicit data type
conversion

Explicit data type
conversion

Data type
conversion

Слайд 25

Implicit Data Type Conversion For assignments, the Oracle server can automatically convert the following:

Implicit Data Type Conversion

For assignments, the Oracle server can automatically convert

the following:
Слайд 26

Implicit Data Type Conversion Oracle Server может автоматически неявно преобразовывать типы:

Implicit Data Type Conversion

Oracle Server может автоматически неявно преобразовывать типы:

Слайд 27

Explicit Data Type Conversion

Explicit Data Type Conversion

Слайд 28

Explicit Data Type Conversion

Explicit Data Type Conversion

Слайд 29

Using the TO_CHAR Function with Dates The format model: Must be

Using the TO_CHAR Function with Dates


The format model:
Must be enclosed by

single quotation marks
Is case-sensitive
Can include any valid date format element
Has an fm element to remove padded blanks or suppress leading zeros
Is separated from the date value by a comma

TO_CHAR(date, 'format_model')

Слайд 30

Elements of the Date Format Model

Elements of the Date Format Model

Слайд 31

Elements of the Date Format Model Time elements format the time

Elements of the Date Format Model

Time elements format the time portion

of the date:
Add character strings by enclosing them in double quotation marks:
Number suffixes spell out numbers:

DD "of" MONTH

12 of OCTOBER

ddspth

fourteenth

HH24:MI:SS AM

15:45:32 PM

Слайд 32

SELECT last_name, TO_CHAR(hire_date, 'fmDD Month YYYY') AS HIREDATE FROM employees; Using

SELECT last_name,
TO_CHAR(hire_date, 'fmDD Month YYYY')
AS HIREDATE
FROM employees;

Using the TO_CHAR

Function with Dates


Слайд 33

Using the TO_CHAR Function with Numbers These are some of the

Using the TO_CHAR Function with Numbers
These are some of the format

elements that you can use with the TO_CHAR function to display a number value as a character:

TO_CHAR(number, 'format_model')

Слайд 34

SELECT TO_CHAR(salary, '$99,999.00') SALARY FROM employees WHERE last_name = 'Ernst'; Using the TO_CHAR Function with Numbers

SELECT TO_CHAR(salary, '$99,999.00') SALARY
FROM employees
WHERE last_name = 'Ernst';

Using the TO_CHAR Function

with Numbers
Слайд 35

Using the TO_NUMBER and TO_DATE Functions Convert a character string to

Using the TO_NUMBER and TO_DATE Functions

Convert a character string to

a number format using the TO_NUMBER function:
Convert a character string to a date format using the TO_DATE function:
These functions have an fx modifier. This modifier specifies the exact matching for the character argument and date format model of a TO_DATE function.

TO_NUMBER(char[, 'format_model'])

TO_DATE(char[, 'format_model'])

Слайд 36

Nesting Functions Single-row functions can be nested to any level. Nested

Nesting Functions

Single-row functions can be nested to any level.
Nested functions are

evaluated from deepest level to the least deep level.

F3(F2(F1(col,arg1),arg2),arg3)

Step 1 = Result 1

Step 2 = Result 2

Step 3 = Result 3

Слайд 37

SELECT last_name, UPPER(CONCAT(SUBSTR (LAST_NAME, 1, 8), '_US')) FROM employees WHERE department_id = 60; Nesting Functions

SELECT last_name,
UPPER(CONCAT(SUBSTR (LAST_NAME, 1, 8), '_US'))
FROM employees
WHERE department_id = 60;

Nesting

Functions
Слайд 38

General Functions The following functions work with any data type and

General Functions

The following functions work with any data type and pertain

to using nulls:
NVL (expr1, expr2)
NVL2 (expr1, expr2, expr3)
NULLIF (expr1, expr2)
COALESCE (expr1, expr2, ..., exprn)
Слайд 39

NVL Function Converts a null value to an actual value: Data

NVL Function

Converts a null value to an actual value:
Data types that

can be used are date, character, and number.
Data types must match:
NVL(commission_pct,0)
NVL(hire_date,'01-JAN-97')
NVL(job_id,'No Job Yet')
Слайд 40

SELECT last_name, salary, NVL(commission_pct, 0), (salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL FROM

SELECT last_name, salary, NVL(commission_pct, 0),
(salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL
FROM employees;

Using

the NVL Function


1

1

2

2

Слайд 41

SELECT last_name, salary, commission_pct, NVL2(commission_pct, 'SAL+COMM', 'SAL') income FROM employees WHERE

SELECT last_name, salary, commission_pct,
NVL2(commission_pct,
'SAL+COMM', 'SAL') income
FROM employees WHERE

department_id IN (50, 80);

Using the NVL2 Function

1

2

2

1

Слайд 42

SELECT first_name, LENGTH(first_name) "expr1", last_name, LENGTH(last_name) "expr2", NULLIF(LENGTH(first_name), LENGTH(last_name)) result FROM

SELECT first_name, LENGTH(first_name) "expr1",
last_name, LENGTH(last_name) "expr2",
NULLIF(LENGTH(first_name), LENGTH(last_name)) result
FROM

employees;

Using the NULLIF Function


1

2

3

1

2

3

Слайд 43

Using the COALESCE Function The advantage of the COALESCE function over

Using the COALESCE Function

The advantage of the COALESCE function over the

NVL function is that the COALESCE function can take multiple alternate values.
If the first expression is not null, the COALESCE function returns that expression; otherwise, it does a COALESCE of the remaining expressions.
Слайд 44

SELECT last_name, COALESCE(manager_id,commission_pct, -1) comm FROM employees ORDER BY commission_pct; Using the COALESCE Function …

SELECT last_name,
COALESCE(manager_id,commission_pct, -1) comm
FROM employees
ORDER BY commission_pct;


Using the COALESCE Function


Слайд 45

Conditional Expressions Provide the use of IF-THEN-ELSE logic within a SQL

Conditional Expressions

Provide the use of IF-THEN-ELSE logic within a SQL statement
Use

two methods:
CASE expression
DECODE function
Слайд 46

CASE Expression Facilitates conditional inquiries by doing the work of an

CASE Expression

Facilitates conditional inquiries by doing the work of an IF-THEN-ELSE

statement:

CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END

Слайд 47

SELECT last_name, job_id, salary, CASE job_id WHEN 'IT_PROG' THEN 1.10*salary WHEN

SELECT last_name, job_id, salary,
CASE job_id WHEN 'IT_PROG' THEN 1.10*salary
WHEN

'ST_CLERK' THEN 1.15*salary
WHEN 'SA_REP' THEN 1.20*salary
ELSE salary END "REVISED_SALARY"
FROM employees;

Using the CASE Expression

Facilitates conditional inquiries by doing the work of an IF-THEN-ELSE statement:



Слайд 48

DECODE Function Facilitates conditional inquiries by doing the work of a

DECODE Function

Facilitates conditional inquiries by doing the work of a CASE

expression or an IF-THEN-ELSE statement:

DECODE(col|expression, search1, result1
[, search2, result2,...,]
[, default])

Слайд 49

SELECT last_name, job_id, salary, DECODE(job_id, 'IT_PROG', 1.10*salary, 'ST_CLERK', 1.15*salary, 'SA_REP', 1.20*salary,

SELECT last_name, job_id, salary,
DECODE(job_id, 'IT_PROG', 1.10*salary,
'ST_CLERK', 1.15*salary,
'SA_REP', 1.20*salary,

salary)
REVISED_SALARY
FROM employees;

Using the DECODE Function



Слайд 50

SELECT last_name, salary, DECODE (TRUNC(salary/2000, 0), 0, 0.00, 1, 0.09, 2,

SELECT last_name, salary,
DECODE (TRUNC(salary/2000, 0),
0, 0.00,
1, 0.09,
2,

0.20,
3, 0.30,
4, 0.40,
5, 0.42,
6, 0.44,
0.45) TAX_RATE
FROM employees
WHERE department_id = 80;

Using the DECODE Function

Display the applicable tax rate for each employee in department 80:

Слайд 51

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

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


Слайд 52

Objectives После завершения этого урока вы должны знать : Что такое

Objectives

После завершения этого урока вы должны знать :
Что такое групповые функции

и как их использовать
Как производить группировку с помощю GROUP BY
Как производить включение или исключение сгруппированных строк с помощью HAVING
Слайд 53

Что такое групповая функция? Групповые функции работают с наборами строк, чтобы

Что такое групповая функция?

Групповые функции работают с наборами строк, чтобы дать

один результат в каждой группе.

EMPLOYEES

Maximum salary in EMPLOYEES table


Слайд 54

Типы групповых функций AVG COUNT MAX MIN SUM …

Типы групповых функций

AVG
COUNT
MAX
MIN
SUM

Слайд 55

SELECT [column,] group_function(column), ... FROM table [WHERE condition] [GROUP BY column]

SELECT [column,] group_function(column), ...
FROM table
[WHERE condition]
[GROUP BY column]
[ORDER BY column];

Функции Группа:

Синтаксис
Слайд 56

SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary) FROM employees WHERE job_id LIKE '%REP%';

SELECT AVG(salary), MAX(salary),
MIN(salary), SUM(salary)
FROM employees
WHERE job_id LIKE '%REP%';

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

и SUM

Вы можете использовать AVG и SUM для числовых данных.

Слайд 57

SELECT MIN(hire_date), MAX(hire_date) FROM employees; Использование функций MIN и MAX Вы

SELECT MIN(hire_date), MAX(hire_date)
FROM employees;

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

Вы можете использовать MAX и MIN для типов
numeric,

character, date
Слайд 58

COUNT(*) возвращает количество строк в таблице : COUNT(expr) возвращает количество строк

COUNT(*) возвращает количество строк в таблице :
COUNT(expr) возвращает количество строк с

ненулевых значений для expr:

SELECT COUNT(commission_pct)
FROM employees
WHERE department_id = 80;

SELECT COUNT(*)
FROM employees
WHERE department_id = 50;

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

1

2

Слайд 59

SELECT COUNT(DISTINCT department_id) FROM employees; Использование DISTINCT COUNT(DISTINCT expr) возвращает число

SELECT COUNT(DISTINCT department_id)
FROM employees;

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

COUNT(DISTINCT expr) возвращает число различных ненулевых значениях

expr.
Для того, чтобы отобразить количество различных значений отдела в таблице EMPLOYEES :
Слайд 60

Групповые функции и значения Null Групповые функции игнорируют столбцы со значением

Групповые функции и значения Null

Групповые функции игнорируют столбцы со значением

null :
Функция NVL позволяет включать нулевые значения:

SELECT AVG(commission_pct)
FROM employees;

SELECT AVG(NVL(commission_pct, 0))
FROM employees;

1

2

Слайд 61

Создание групп данных EMPLOYEES … Average salary in EMPLOYEES table for each department

Создание групп данных

EMPLOYEES


Average salary in
EMPLOYEES table for each
department

Слайд 62

Вы можете разделить строки в таблице на более мелкие группы при


Вы можете разделить строки в таблице на более мелкие группы при

помощи предложения GROUP BY.

Создание групп данных: Синтаксис предложения GROUP BY

SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];

Слайд 63

SELECT department_id, AVG(salary) FROM employees GROUP BY department_id ; Использование предложения

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id ;

Использование предложения GROUP BY

Все столбцы

в списке выбора, к которым не применяются групповые функции должны быть описаны в предложении GROUP BY.
Слайд 64

Использование предложения GROUP BY Столбец в GROUP не обязательно должен находиться

Использование предложения GROUP BY

Столбец в GROUP не обязательно должен находиться в

SELECT .

SELECT AVG(salary)
FROM employees
GROUP BY department_id ;

Слайд 65

Группировка по нескольким столбцам EMPLOYEES Add the salaries in the EMPLOYEES

Группировка по нескольким столбцам

EMPLOYEES

Add the
salaries in
the EMPLOYEES
table for each

job, grouped by department


Слайд 66

SELECT department_id dept_id, job_id, SUM(salary) FROM employees GROUP BY department_id, job_id

SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id ;

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

BY на несколько колонок
Слайд 67

Некорректные Запросы Использование групповых функций Любой столбец или выражение в списке

Некорректные Запросы Использование групповых функций

Любой столбец или выражение в списке SELECT,

который не является агрегатной функцией должен быть описан в предложении GROUP BY:

SELECT department_id, COUNT(last_name)
FROM employees;

SELECT department_id, COUNT(last_name)
*
ERROR at line 1:
ORA-00937: not a single-group group function

Колонка отсутствуют в списке предложения GROUP BY

Слайд 68

Вы не можете использовать групповые функции в WHERE. Для этой цели

Вы не можете использовать групповые функции в WHERE.
Для этой цели используйте

HAVING.

SELECT department_id, AVG(salary)
FROM employees
WHERE AVG(salary) > 8000
GROUP BY department_id;

WHERE AVG(salary) > 8000
*
ERROR at line 3:
ORA-00934: group function is not allowed here

Cannot use the WHERE clause to restrict groups

Некорректные Запросы Использование групповых функций

Слайд 69

Ограничение результатов группировки EMPLOYEES … The maximum salary per department when it is greater than $10,000

Ограничение результатов группировки

EMPLOYEES


The maximum salary per department
when it is
greater than $10,000

Слайд 70

SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING

SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];

Ограничение результатов

группировки с использованием HAVING

При использовании предложения HAVING, сервер Oracle ограничивает группы следующим образом:
1. Строки сгруппированы.
2. Применяется групповая функция.
3. Отображаются группы, соответствующие предложения HAVING.

Слайд 71

SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary)>10000 ; Использование предложения HAVING

SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 ;

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

Слайд 72

SELECT job_id, SUM(salary) PAYROLL FROM employees WHERE job_id NOT LIKE '%REP%'

SELECT job_id, SUM(salary) PAYROLL
FROM employees
WHERE job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING

SUM(salary) > 13000
ORDER BY SUM(salary);

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

Слайд 73

SELECT MAX(AVG(salary)) FROM employees GROUP BY department_id; Nesting Group Functions Отображение максимальной средней заработной платы:

SELECT MAX(AVG(salary))
FROM employees
GROUP BY department_id;

Nesting Group Functions

Отображение максимальной средней заработной платы:

Слайд 74

SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING

SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];

Summary

Вы научились:
Использовать

групповые функции COUNT, MAX, MIN и AVG
Писать запросы, которые используют GROUP BY
Писать запросы, которые используют HAVING
Слайд 75

Количество сотрудников по департаментам. Оставить только департаменты с средней ЗП >

Количество сотрудников по департаментам.
Оставить только департаменты с средней ЗП >

7000
2. Количество уникальных JOB_ID в разрезе департаментов
3. Вывести одним запросом дату найма первого сотрудника
и дату найма последнего сотрудника в компании.
4. Вывести количество сотрудников, являющихся руководителями.
5.* Вывести среднюю ЗП руководителей.
6.* Размер 2 по величине ЗП.
* - Задачки «на вырост». Темы мы еще не проходили. Можно погуглить «использование подзапросов»

Задания на занятие

Слайд 76

Employees 1. Часть сотрудников, при выполнении планов получает премию к ЗП.

Employees 1. Часть сотрудников, при выполнении планов получает премию к ЗП.

Доля этой премии указана в поле comission_pct. A) Выведите список сотрудников в алфавитном порядке с указанием ЗП с учетом премии.
б) Выведите список подразделений, среднюю ЗП с учетом премии и среднюю ЗП без учета премии. Отсортировать по абсолютному размеру премии.
2. Служба найма попросила предоставить данные, в какие месяцы чаще всего люди устраивались в компанию? Результат вывести в формате месяц, количество сотрудников. Отсортировать в порядке возрастания по количеству сотрудников.

Домашнее задание