ПБД (9) - Лекция №6 - SQL (продолжение)

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество
Перейти к навигации Перейти к поиску

...начало

Языки запросов

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. Строит по документу дерево полуструктурированных данных.

Обозначения:

  • // потомки;
  • .. родители;
  • . self.

Сокращённая запись пути до фильма:

/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 - пространство имён.
Функции

Имеется много встроенных функций. Основные:

  • сount() - подсчёт;
  • sum() - сумма;
  • min() - минимум;
  • max() - максимум;
  • name() - строка;
  • substring(str, start, size) - подстрока.
Примеры

Все потомки:

/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)}