ПБД (9) - Лекция №6 - SQL (продолжение): различия между версиями
(Новая страница: «{{Backward|l=ПБД (9) - Лекция №5 - SQL}} == Языки запросов == === SQL === ==== Синтаксис ==== ===== Представлени...») |
ILobster (обсуждение | вклад) м (синтаксис mysql) |
||
Строка 89: | Строка 89: | ||
Сокращённая запись пути до фильма: | Сокращённая запись пути до фильма: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
/db/films/f/name | /db/films/f/name | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Полная запись: | Полная запись: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
/child::db/child::film/child::f | /child::db/child::film/child::f | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Сокращённая до фильма 1995 года: | Сокращённая до фильма 1995 года: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
/db/films/f/name[../@year="1995"] | /db/films/f/name[../@year="1995"] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Полная: | Полная: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
/child::db/child::film/child::f/child::name[parent(::)/attribute::year="1995"] | /child::db/child::film/child::f/child::name[parent(::)/attribute::year="1995"] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 138: | Строка 138: | ||
Все потомки: | Все потомки: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
/db//f | /db//f | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Все элементы name: | Все элементы name: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
/db//name | /db//name | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Все вложенные через два уровня: | Все вложенные через два уровня: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
//db/*/*/name | //db/*/*/name | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Третий фильм: | Третий фильм: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
//f[3] | //f[3] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Третий фильм, если он снят в 1950 году: | Третий фильм, если он снят в 1950 году: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
//f[3][@year="1950"] | //f[3][@year="1950"] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Все фильмы, снятые в 1950, и взять из них третий: | Все фильмы, снятые в 1950, и взять из них третий: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
//f[@year="1950"][3] | //f[@year="1950"][3] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Все актёры, которые работали в Ленкоме: | Все актёры, которые работали в Ленкоме: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
//a[./pers/teatr/text()="Ленком"] | //a[./pers/teatr/text()="Ленком"] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Все родители для театра Ленком: | Все родители для театра Ленком: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
//teatr[text()="Ленком"]/parent::* | //teatr[text()="Ленком"]/parent::* | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Все актёры, у которых указано более трёх театров или более двух адресов: | Все актёры, у которых указано более трёх театров или более двух адресов: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
//a[count(teatr)>3 OR count(//addr)>2] | //a[count(teatr)>3 OR count(//addr)>2] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Все фильмы, в которых снимались актёры Ивановы Иваны Ивановичи: | Все фильмы, в которых снимались актёры Ивановы Иваны Ивановичи: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
//f[//a[pers/@fio="Иванов Иван Иванович"]/@inn=role/@ra] | //f[//a[pers/@fio="Иванов Иван Иванович"]/@inn=role/@ra] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 194: | Строка 194: | ||
вот один: | вот один: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
let $a = 10, $b = 20, $c = "hello" | let $a = 10, $b = 20, $c = "hello" | ||
for $x in колонка | for $x in колонка | ||
Строка 202: | Строка 202: | ||
вот другой: | вот другой: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
for $x in document("filename.xml")/db//a | for $x in document("filename.xml")/db//a | ||
let $c = $x/count(pers/teatr) | let $c = $x/count(pers/teatr) | ||
Строка 213: | Строка 213: | ||
Возврат элемента: | Возврат элемента: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
return $x | return $x | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Возврат значения: | Возврат значения: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
return data($x/pers/...) | return data($x/pers/...) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 225: | Строка 225: | ||
Как выглядит вложенный цикл: | Как выглядит вложенный цикл: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
for $x in document("filename.xml")//a, | for $x in document("filename.xml")//a, | ||
$y in $x//teatr | $y in $x//teatr | ||
Строка 235: | Строка 235: | ||
Объявление функции: | Объявление функции: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
declare function fun($var as XS:integer) as element(act)* | declare function fun($var as XS:integer) as element(act)* | ||
{return element act {$var}} | {return element act {$var}} | ||
Строка 241: | Строка 241: | ||
Вызов функции: | Вызов функции: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mysql"> | ||
return {fun(10)} | return {fun(10)} | ||
</syntaxhighlight> | </syntaxhighlight> |
Версия от 18:04, 24 октября 2012
...начало
Языки запросов
SQL
Синтаксис
Представления
CREATE VIEW(поле1, поле2, поле3) AS
SELECT name, year, stud
FROM film;
Обновляемые представления - позволяют не только SELECT, но и изменение данных в таблице. Должно быть на основе одной таблицы и содержать обязательные поля.
Примеры
-- чёрно-белые фильмы с группировкой, условием отбора и сортировкой
SELECT name, max(year), stud
FROM film
WHERE type = 'bw' GROUP BY name -- группировка
HAVING min(year) > 1930 -- условия отбора групп
ORDER BY name DESC; -- сортировка
-- объединение
SELECT ...
UNION [ALL] ...
SELECT ...
-- пересечение
SELECT ...
INTERSECT [ALL] ...
SELECT ...
-- разность
SELECT ...
EXCEPT [ALL] ...
SELECT ...
-- без повторений
SELECT DISTINCT name
FROM film;
Языкы запросов к XML-документам
Пример XML-документа:
<?xml ... ?>
<db>
<films>
<f fid="f1" year=1995>
<name>Собачье сердце</name>
<role ra="11">Профессор</role>
<role ra="22">Пёс</role>
<stud>МФ</stud>
</f>
<f fid="f2" year=1993>
<name>Терминатор</name>
<role ra="3">Терминатор</role>
<stud>WB</stud>
<stud>F20</stud>
</f>
</films>
<acts>
<a inn="11">
<pers fio="Иванов Иван Иванович">
<addr>Москва, Ленина, 1</addr>
<teatr>Ленком</teatr>
<teatr>Большой театр</teatr>
<stud>
<name>Мосфильм</name>
<addr>Москва, Комсомола, 2</addr>
</stud>
</pers>
</a>
</acts>
</db>
XPath
XML Path Language. Строит по документу дерево полуструктурированных данных.
Сокращённая запись пути до фильма:
/db/films/f/name
Полная запись:
/child::db/child::film/child::f
Сокращённая до фильма 1995 года:
/db/films/f/name[../@year="1995"]
Полная:
/child::db/child::film/child::f/child::name[parent(::)/attribute::year="1995"]
Оси:
- child - потомки. Стоит по умолчанию, потому можно не указывать;
- attribute - атрибуты @;
- parent - родители;
- ancestor - все предки;
- ancestor-or-self - все предки или я сам;
- descendant - все потомки вне зависимости от уровня вложенности;
- descendant-or-self - все потомки или я сам;
- following - все следующие (без предков и потомков);
- following-sibling - все следующие на одном уровне за текущим;
- preceding - все предыдущие (без предков и потомков)
- preceding-sibling - все предыдущие на одном уровне перед текущим;
- namespace - пространство имён.
Обозначения:
//
потомки;..
родители;.
self.
Имеется много встроенных функций. Основные:
- count() - подсчёт;
- sum() - сумма;
- min() - минимум;
- max() - максимум;
- name() - строка;
- substring(строка, с какого символа, сколько символов) - подстрока.
Примеры:
Все потомки:
/db//f
Все элементы name:
/db//name
Все вложенные через два уровня:
//db/*/*/name
Третий фильм:
//f[3]
Третий фильм, если он снят в 1950 году:
//f[3][@year="1950"]
Все фильмы, снятые в 1950, и взять из них третий:
//f[@year="1950"][3]
Все актёры, которые работали в Ленкоме:
//a[./pers/teatr/text()="Ленком"]
Все родители для театра Ленком:
//teatr[text()="Ленком"]/parent::*
Все актёры, у которых указано более трёх театров или более двух адресов:
//a[count(teatr)>3 OR count(//addr)>2]
Все фильмы, в которых снимались актёры Ивановы Иваны Ивановичи:
//f[//a[pers/@fio="Иванов Иван Иванович"]/@inn=role/@ra]
XQuery
Всё ещё сложнее, чем в XPath - он его расширил. Есть условия, функции, вложенные циклы.
Примеры:
вот один:
let $a = 10, $b = 20, $c = "hello"
for $x in колонка
return $x
return <a>{$x}</a>
вот другой:
for $x in document("filename.xml")/db//a
let $c = $x/count(pers/teatr)
where $c > 2 and $a/pers/addr != "Москва"
return {$x, $c}
return <act fio={$x/pers/@fio}>
Формат вывода
Возврат элемента:
return $x
Возврат значения:
return data($x/pers/...)
Вложенные циклы
Как выглядит вложенный цикл:
for $x in document("filename.xml")//a,
$y in $x//teatr
return <newel>{$a/@inn $y/text()}</newel>
order by $y/text()
Функции
Объявление функции:
declare function fun($var as XS:integer) as element(act)*
{return element act {$var}}
Вызов функции:
return {fun(10)}