- •11. Первая нормальная форма (1нф)
- •13. Третья нормальная форма.
- •Создание групп (group by)
- •Пример создания временной таблицы:
- •Пример создания временной таблицы с использованием поздапроса
- •Виды секционирования Диапазонное секционирование
- •Интервальное секционирование
- •Секционирование по виртуальному столбцу
- •Системное секционирование
Создание групп (group by)
Группы создаются с помощью предложения GROUP BY оператора SELECT. Рассмотрим на примере.
SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product
class rollno section marks stuName
A 1 a 80 manoj
A 2 a 70 harish
A 3 a 80 kanchan
A 4 b 90 pooja
A 5 b 90 saurabh
A 6 b 50 anita
B 1 a 60 nitin
B 2 a 50 kamar
B 3 a 80 dinesh
B 4 b 90 paras
B 5 b 50 lalit
B 6 b 70 hema
- результирующий набор, сгенерированный оператором ROLLUP, показывает итоговые значения для иерархии значений в выбранных столбцах.
–> WITH ROLLUP:(итоги для иерархии значений)
1 2 3 |
select class, section, sum(marks) [sum] from #tempTable group by class, section with ROLLUP |
Output:
class section sum
A a 230
A b 230
A NULL 460 -- 230 + 230 = 460
B a 190
B b 210
B NULL 400 -- 190 + 210 = 400
NULL NULL 860 -- 460 + 400 = 860
- результирующий набор, сгенерированный оператором CUBE, показывает итоговые значения для всех комбинаций значений выбранных столбцов;
–> WITH CUBE(итоги для всех комбинаций)
1 2 3 |
select class, section, sum(marks) [sum] from #tempTable group by class, section with CUBE |
Output:
class section sum
A a 230
A b 230
A NULL 460 -- 230 + 230 = 460
B a 190
B b 210
B NULL 400 -- 190 + 210 = 400
NULL NULL 860 -- 460 + 400 = 860
NULL a 420 -- 230 + 190 = 420
NULL b 440 -- 230 + 210 = 440
Агрегатные функции:
COUNT - производит подсчет строк, удовлетворяющих условию запроса
SUM - вычисляет арифметическую сумму всех значений колонки
AVG - вычисляет среднее арифметическое всех значений
MAX - определяет наибольшее из всех выбранных значений
MIN - определяет наименьшее из всех выбранных значений
Секция HAVING – фильтрующие группы.
Так же, как мы фильтровали строки в таблице, мы можем осуществлять фильтрацию по сгруппированным данным. Для этого в SQL существует операторHAVING. Возьмем предыдущий пример и добавим фильтрацию по группам.
SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product HAVING SUM(Quantity)>4000
57. Подзапросы. Коррелируемые и некоррелируемые подзапросы. Применением предикатов EXISTS ,IN, ALL, ANY.
Подзапросы – это запросы внутри других запросов.
Подзапросы с точки зрения их вычислимости без охватывающего запроса, делят на коррелированные и некоррелированные.
Коррелированный означает “зависимый от внешнего контекста”. То есть в таком запросе где-нибудь хотя бы раз употребляется ссылка на поле какой-либо текущей записи внешнего запроса. Таким образом, по ходу обработки всей конструкции на каждую запись внешнего запроса нужно перевычислять подзапрос.
С другой стороны, некоррелированные подзапросы построены исключительно на основе собственных таблиц и процедур и из внешнего контекста ничего не требуют.
Оператор EXISTS берет подзапрос, как аргумент, и оценивает его как верный, если подзапрос возвращает какие-либо записи и неверный, если тот не делает этого.
Оператор ANY и SOME берет все значения, выведенные подзапросом, и оценивает их как верные, если любое из них равняется значению столбца из внешнего запроса. Это означает, что подзапрос должен выбирать значения такого же типа как и те, которые сравниваются в основном условии.
Оператор ALL считает условие верным, если каждое значение, выбранное подзапросом, удовлетворяет условию внешнего запроса.
Если Вы хотите использовать подзапрос, который возвращает несколько строк, то необходимо использовать оператор IN. Как Вы помните, этот оператор определяет допустимый набор значений, когда он используется с подзапросом этот список формируется из значений, которые возвращает подзапрос.
Операторы SOME и ANY - взаимозаменяемы везде и там где мы используем ANY, SOME будет работать точно так же. Различие в терминологии состоит в том чтобы позволить людям использовать тот термин который наиболее однозначен. Это может создать проблему; потому что, как мы это увидим, наша интуиция может иногда вводить в заблуждение. Имеется новый способ нахождения продавца с заказчиками размещенными в их городах ( вывод для этого запроса показывается в Рисунке 13.1 ):
SELECT *
FROM Salespeople
WHERE city = ANY
(SELECT city
FROM Customers );
Оператор ANY берет все значения выведенные подзапросом, ( для этого случая - это все значения city в таблице Заказчиков ), и оценивает их как верные если любой(ANY) из их равняется значению города текущей строки внешнего запроса.
=============== SQL Execution Log ============
| SELECT * |
| FROM Salespeople |
| WHERE city = ANY |
| (SELECT city |
| FROM Customers); |
| ============================================= |
| cnum cname city comm |
| ----- -------- ---- -------- |
| 1001 Peel London 0.12 |
| 1002 Serres San Jose 0.13 |
| 1004 Motika London 0.11 |
=============================================
Рисунок 13. 1: Использование оператора ANY
Это означает, что подзапрос должен выбирать значения такого же типа как и те, которые сравниваются в основном предикате. В этом его отличие от EXISTS, который просто определяет, производит ли под- запрос результаты или нет, и фактически не использует эти результаты.
Мы можем также использовать оператор IN чтобы создать запрос аналогичный предыдущему :
SELECT *
FROM Salespeople
WHERE city IN
( SELECT city
FROM Customers );
Этот запрос будет производить вывод показанный в Рисунке 13.2.
=============== SQL Execution Log ============
| SELECT * |
| FROM Salespeople |
| WHERE city IN |
| (SELECT city |
| FROM Customers); |
| ============================================= |
| cnum cname city comm |
| ----- -------- ---- -------- |
| 1001 Peel London 0.12 |
| 1002 Serres San Jose 0.13 |
| 1004 Motika London 0.11 |
=============================================
Рисунок 13. 2: Использование IN в качестве альтернативы к ANY
select AUDITORIUM_TYPENAME from AUDITORIUM_TYPE at where 20>=all
(select AUDITORIUM_CAPACITY from AUDITORIUM aa where at.AUDITORIUM_TYPE=aa.AUDITORIUM_TYPE)
select AUDITORIUM_TYPENAME from AUDITORIUM_TYPE at where 60>=any
(select AUDITORIUM_CAPACITY from AUDITORIUM aa where at.AUDITORIUM_TYPE=aa.AUDITORIUM_TYPE)
select AUDITORIUM_TYPENAME from AUDITORIUM_TYPE where exists
(select * from AUDITORIUM where AUDITORIUM_TYPE.AUDITORIUM_TYPE=AUDITORIUM.AUDITORIUM_TYPE and AUDITORIUM.AUDITORIUM_CAPACITY>60)
58. Многотабличные SELECT-запросы. Способы соединения таблиц: INNER, CROSS, FULL, LEFT, RIGHT.
В языке SQL имеются 2 способа реализации внутреннего соединения таблиц, оба этих способа являются равноценными и обычно приводят к одному и тому же плану исполнения запроса. Однако с точки зрения реляционной алгебры они используют различные операции, и тексты запросов несколько отличаются друг от друга:
а)выборка из декартового произведения
Начнем с примеров. Пусть требуется вывести фамилии всех студентов и их оценки. Текст запроса будет выглядеть так:
SELECT students.namest, marks.mark
FROM students, marks
WHERE students.cod_st=marks.cod_st
б)операция соединения [INNER] JOIN
Тот же самый запрос, соединяющий студентов с их оценками, будет записан несколько по-другому:
SELECT students.namest, marks.mark FROM students JOIN marks ON students.cod_st=marks.cod_st
Из таблицы, получаемой при внутреннем соединении, отбраковываются все записи, для которых нет соответствующих записей одновременно в обеих соединяемых таблицах. При внешнем соединении такие несоответствующие записи сохраняются. В этом и заключается отличие внешнего соединения от внутреннего.
С помощью специальных ключевых слов LEFT OUTER, RIGHT OUTER и FULL OUTER, написанных перед JOIN, можно выполнить соответственно левое, правое и полное соединение.
В SQL-выражении запроса таблица, указанная слева от оператора JOIN, называется левой, а указанная справа от него — правой.
-При левом внешнем соединении несоответствующие записи, имеющиеся в левой таблице, сохраняются в результатной таблице, а имеющиеся в правой — удаляются. Значения столбцов из правой таблицы во всех строках, не имеющих соответствия с левой таблицей, принимают значение NULL.
-При правом внешнем соединении несоответствующие записи, имеющиеся в правой таблице, сохраняются в результатной таблице, а имеющиеся в левой — удаляются. Значения столбцов из левой таблицы во всех строках, не имеющих соответствия с правой таблицей, принимают значение NULL. Соответственно левое и правое внешние соединения различаются только порядком следования таблиц.
-При полном внешнем соединении двух таблиц результирующая таблица содержит все строки внутреннего соединения этих таблиц, а также не включенные им строки и первой, и второй таблиц (дополненные значениями NULL для отсутствующих столбцов).
Оператор перекрёстного соединения, или декартова произведения CROSS JOIN соединяет две таблицы. Тело результата логически формируется следующим образом. Каждая строка одной таблицы соединяется с каждой строкой второй таблицы, давая тем самым в результате все возможные сочетания строк двух таблиц.
Вектором (кортежем) в линейной алгебре и дискретной математике называют упорядоченный набор элементов.
59. Комбинирование результирующих наборов: UNION (ALL), INTERSECT, EXCEPT.
Можно использовать команды UNION, INTERSECT, EXCEPT для выполнения операций объединения, пересечения и разности между множествами строк.
При выборке UNION ALL двух запросов будут выведены повторные записи.
60. Операторы INSERT, DELETE, UPDATE: назначение, секции оператора, назначение секций.
update XTEACHHER set pulpit = 'XXX'
insert into Teacher (name, surname) values (‘Name’, ‘Surname’)
delete * from Teacher
61. Динамический SQL (Oracle 11.2g). Понятие раннего и позднего связывания.
Динамический sql – операторы sql, которые формируются и исполняются во время выполнения программы. Применяется для понимания кода, адаптирующегося к структуре таблиц.
Предложение EXECUTE IMMEDIATE подготавливает (делает синтаксический разбор) и сразу же выполняет динамическое SQL-предложение или анонимный PL/SQL-блок.
Раннее связывание это когда метод который будет вызван известен во время компиляции.
Позднее связывание это когда вызов метода может быть осуществлен только во время выполнения и у компилятора нет информации чтобы проверить корректность такого вызова.
62. Типы данных (на примере SQL Server 2008 или Oracle 11.2g) применяемых в базах данных, их назначение и основные характеристики.
BIGINT (тип данных SQL2003: B1GINT) Хранит целые числа со знаком и без знака в диапазоне от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. Занимает 8 байт. См. тип INT, где указаны правила свойства IDENTITY, также применимые к типуBIGINT.
CHAR[(n)], CHARACTER[(n)] (тип данных SQL2003: CHARACTER[(n)]) Хранит символьные данные фиксированной длины от 1 до 8000 символов. Все неиспользованное место по умолчанию заполняется пробелами. (Автоматическое заполнение пробелами можно отключить.) Тип занимает n байт.
CURSOR (тип данных SQL2003: отсутствует) Специальный тип данных, используемый для описания курсора в форме переменной или параметра хранимой процедуры OUTPUT. Тип нельзя использовать в инструкции CREATE TABLE. Тип CURSOR может принимать значение NULL.
FLOAT[(n)] (тип данных SQL2003: FLOAT, FLOAT (n)) Хранит значения с плавающей точкой в диапазоне от-1.79Е + 308 до 1.79Е + 308. Точность, определяемая параметром и, может изменяться в пределах от 1 до 53. Для хранения 7 цифр (n — от 1 до 24) требуется 4 байта. Значения, превышающие 7 цифр, занимают 8 байт.
INT [IDENTITY [(seed, increment)] (тип данных SQL2003: INTEGER) Хранит целые числа со знаком или без знака в диапазоне от -2 147 483 648 до 2 147 483 647. Занимает 4 байта. Все целочисленные типы данных, а также типы, хранящие десятичные дроби, поддерживают свойство IDENTITY, identity — это автоматически инкрементируемый идентификатор строки. Обращайтесь к разделу «Инструкция CREATE/ALTER TABLE» главы 3.
NCHAR(n), NATIONAL CHAR(n), NATIONAL CHARACTER(n) (тип данных SQL2003: NATIONAL СНАRACTER(n)) Хранит данные формата UNICODE фиксированной длины до 4000 символов. Для хранения требуется n*2 байт.
SMALLINT (тип данных SQL2003: SMALLINT) Хранит целые числа со знаком или без знака в диапазоне от -32 768 до 32 767. Занимает 2 байта. См. описание типа INT, где приведены правила, относящиеся к свойству IDENTITY, которые также применимы и к этому типу.
TIMESTAMP (тип данных SQL2003: TIMESTAMP) Хранит автоматически генерируемое двоичное число, обеспечивающее уникальность в текущей базе данных и, следовательно, отличающееся от типа данных TIMESTAMP стандарта ANSI. Тип TIMESTAMP занимает 8 байт. В настоящее время вместо TIMESTAMP для однозначной идентификации строк лучше применять значения типа ROWVERSION.
TINYINT Хранит целые числа без знака в диапазоне от 0 до 255 и занимает 1 байт. См. описание типа INT, где приведены правила, относящиеся к свойству IDENTITY, которые также применимы и к этому типу.
63. Таблицы базы данных. Их структура и основные характеристики. Ограничения целостности (констрейнты).
Таблица — это объект базы данных, содержащий некоторые данные.
Primary key,
Foreign key(Ограничение внешнего ключа говорит, что значения в колонке (или группе колонок) должно совпадать с значениями, которые существуют в некоторых строках другой таблицы.),
Unique (проверяет на уникальность значений в столбце),
Check (позволяет ставить ограничение на значение столбцов, синтаксис check(Название_столбца in(‘a’,’b’)) ),
Not null (запрещает содержать нулевые значения в столбце),
Default (задает значение По-умолчанию).
Ссылочная целостность – это ограничение БД, гарантирующее, что ссылки между данными являются действительно правомерными и неповрежденными.
Constraint – это поименованное ограничение целостности.
create table XTEACHHER
(
teacher char(10) primary key,
teacher_name varchar(50)unique ,
pulpit char(10)default '???',
sex char(1) check (sex in ('м','ж') )
)
64. Применение XML: преобразование реляционных данных в формат XML, преобразование XML-структур в строки таблицы, XML-столбцы таблицы, типизированные XML данные.
XML: Extensible Markup Language – расширяемый язык разметки.
Преобразование реляционных данных в xml:
select AUDITORIUM 'Номер' , AUDITORIUM_TYPE 'Тип' , Auditorium_Capacity 'Вместительность' from AUDITORIUM for xml auto ,root('Корень')
select AUDITORIUM 'Номер' , AUDITORIUM_TYPE 'Тип' , Auditorium_Capacity 'Вместительность' from AUDITORIUM for xml path('Аудитория') ,root('Корень')
Преобразование xml в строки таблицы:
declare @xmldoc varchar(2000) = '<?xml version="1.0" encoding="windows-1251"?>
<ROOT>
<X>
<AUDITORIUM>500-4</AUDITORIUM>
<AUDITORIUM_NAME>500-4</AUDITORIUM_NAME> <AUDITORIUM_CAPACITY>123</AUDITORIUM_CAPACITY>
<AUDITORIUM_TYPE>ЛК </AUDITORIUM_TYPE>
</X>
<X>
<AUDITORIUM>502-4</AUDITORIUM>
<AUDITORIUM_NAME>502-4</AUDITORIUM_NAME>
<AUDITORIUM_CAPACITY>123</AUDITORIUM_CAPACITY>
<AUDITORIUM_TYPE>ЛК </AUDITORIUM_TYPE>
</X>
<X>
<AUDITORIUM>700-4</AUDITORIUM>
<AUDITORIUM_NAME>700-4</AUDITORIUM_NAME>
<AUDITORIUM_CAPACITY>123</AUDITORIUM_CAPACITY>
<AUDITORIUM_TYPE>ЛК </AUDITORIUM_TYPE>
</X>
</ROOT>',
@hxmldoc int
exec sp_xml_preparedocument @hxmldoc output,@xmldoc
--set unique-insert AUDITORIUM on
select * from openxml(@hxmldoc,'/ROOT/X',2)
with(
AUDITORIUM char(10),
AUDITORIUM_NAME varchar(200),
AUDITORIUM_CAPACITY integer,
AUDITORIUM_TYPE char(10)
)
insert into AUDITORIUM(AUDITORIUM,AUDITORIUM_NAME,AUDITORIUM_CAPACITY,AUDITORIUM_TYPE)
select * from openxml(@hxmldoc,'/ROOT/X',2)
with(
AUDITORIUM char(10),
AUDITORIUM_NAME varchar(200),
AUDITORIUM_CAPACITY integer,
AUDITORIUM_TYPE char(10)
)
select * from AUDITORIUM
Xml – столбцы таблицы:
create XML SCHEMA COLLECTION MyXMLCollection1 as
N'<?xml version="1.0" encoding="utf-16"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns="http://tempuri.org/XMLSchema.xsd"
xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:element name="Преподаватель">
<xs:complexType>
<xs:sequence>
<xs:element name ="Паспорт">
<xs:complexType>
<xs:attribute name ="Серия" type="xs:string" use ="required"/>
<xs:attribute name ="Номер" type="xs:int" use ="required"/>
<xs:attribute name ="Личный_номер" type="xs:string" use ="required"/>
<xs:attribute name ="Дата_выдачи" type="xs:date" use ="required"/>
<xs:attribute name ="Кем_выдан" type="xs:string" use ="required"/>
<xs:attribute name ="Срок" type="xs:date" use ="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name ="ID" type="xs:string" use ="required" />
</xs:complexType>
</xs:element>
</xs:schema>'
create table t4
(
n int identity,
x xml (MyXMLCollection1)
);
insert into t4 (x) values(
'<Преподаватель ID="ID1" xmlns="http://tempuri.org/XMLSchema.xsd">
<Паспорт Серия="Серия1" Номер="1" Личный_номер="Личный_номер1" Дата_выдачи="1900-01-01" Кем_выдан="Кем_выдан1" Срок="1900-01-01" />
</Преподаватель>'
);
select * from t4
Перечислите конструкции для формирования XML-документа из реляционной таблицы?
xml path, xml auto
Назовите функцию, с помощью которой можно сформировать строки в реляционной таблице из XML-документа?
openxml
Какие существуют ограничения на применение XML-столбцов?
Ограничения: XML-столбец не может быть PRIMARY KEY, FOREGN KEY, UNIQUE, COLLATE.
Для чего используется XML-Schema?
Создание коллекции xml-схем.
Что означает: типизированный XML-столбец?
Можно создать переменные, параметры и столбцы типа xml. При необходимости можно связать коллекцию XML-схем с переменной, параметром или xml-столбцом. В данном случае экземпляр xml-данных называется типизированным. Иначе экземпляр XML-данных называется нетипизированным.
65. Временные таблицы. Реализация временных таблиц в Microsoft SQL Server 2008 и в Oracle 11.2g.
Oracle:
Временные таблицы используются в Oracle для хранения данных, которые относятся к одной сессии или одной транзакции.
Временные таблицы глобальны: созданную одним пользователем таблицу может использовать другой пользователь (если ему назначены соответствующие привилегии). Привилегии раздает владелец (тот, кто выдал CREATE).
Предложение ON COMMIT DELETE ROWS указывает, что временная таблица предназначена для транзакции. В этом случае таблица будет очищена (будут удалены все строки) после каждой фиксации транзакции.
Предложение ON COMMIT PRESERVE ROWS указывает, что временная таблица предназначена для сеанса. Она будет очищаться при завершении сеанса.
