ПБД (9) - Лекция №6 - SQL (продолжение): различия между версиями

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество
Перейти к навигации Перейти к поиску
(Новая страница: «{{Backward|l=ПБД (9) - Лекция №5 - SQL}} == Языки запросов == === SQL === ==== Синтаксис ==== ===== Представлени...»)
 
 
(не показаны 4 промежуточные версии 1 участника)
Строка 86: Строка 86:
==== XPath ====
==== XPath ====


XML Path Language. Строит по документу дерево полуструктурированных данных.
{{Википедия|XPath|XML Path Language}}. Строит по документу дерево полуструктурированных данных.
 
Обозначения:
* <code>//</code> потомки;
* <code>..</code> родители;
* <code>.</code> self.


Сокращённая запись пути до фильма:
Сокращённая запись пути до фильма:
<syntaxhighlight lang="php">
<syntaxhighlight lang="mysql">
/db/films/f/name
/db/films/f/name
</syntaxhighlight>
</syntaxhighlight>


Полная запись:
Полная запись:
<syntaxhighlight lang="php">
<syntaxhighlight lang="mysql">
/child::db/child::film/child::f
/child::db/child::film/child::f
</syntaxhighlight>
</syntaxhighlight>


Сокращённая до фильма 1995 года:
Сокращённая до фильма 1995 года:
<syntaxhighlight lang="php">
<syntaxhighlight lang="mysql">
/db/films/f/name[../@year="1995"]
/db/films/f/name[../@year="1995"]
</syntaxhighlight>
</syntaxhighlight>


Полная:
Полная:
<syntaxhighlight lang="php">
<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>
   
   
Оси:
===== Оси =====
* child - потомки. Стоит по умолчанию, потому можно не указывать;
* <code>child</code> - потомки. Стоит по умолчанию, потому можно не указывать;
* attribute - атрибуты @;
* <code>attribute</code> - атрибуты @;
* parent - родители;
* <code>parent</code> - родители;
* ancestor - все предки;
* <code>ancestor</code> - все предки;
* ancestor-or-self - все предки или я сам;
* <code>ancestor-or-self</code> - все предки или я сам;
* descendant - все потомки вне зависимости от уровня вложенности;
* <code>descendant</code> - все потомки вне зависимости от уровня вложенности;
* descendant-or-self - все потомки или я сам;
* <code>descendant-or-self</code> - все потомки или я сам;
* following - все следующие (без предков и потомков);
* <code>following</code> - все следующие (без предков и потомков);
* following-sibling - все следующие на одном уровне за текущим;
* <code>following-sibling</code> - все следующие на одном уровне за текущим;
* preceding - все предыдущие (без предков и потомков)
* <code>preceding</code> - все предыдущие (без предков и потомков)
* preceding-sibling - все предыдущие на одном уровне перед текущим;
* <code>preceding-sibling</code> - все предыдущие на одном уровне перед текущим;
* namespace - пространство имён.
* <code>namespace</code> - пространство имён.


Обозначения:
===== Функции =====
* <code>//</code> потомки;
* <code>..</code> родители;
* <code>.</code> self.


Имеется много встроенных функций. Основные:
Имеется много встроенных функций. Основные:
* count() - подсчёт;
* <code>сount()</code> - подсчёт;
* sum() - сумма;
* <code>sum()</code> - сумма;
* min() - минимум;
* <code>min()</code> - минимум;
* max() - максимум;
* <code>max()</code> - максимум;
* name() - строка;
* <code>name()</code> - строка;
* substring(строка, с какого символа, сколько символов) - подстрока.
* <code>substring(str, start, size)</code> - подстрока.


Примеры:
===== Примеры =====


Все потомки:
Все потомки:
<syntaxhighlight lang="php">
<syntaxhighlight lang="mysql">
/db//f
/db//f
</syntaxhighlight>
</syntaxhighlight>
   
   
Все элементы name:
Все элементы name:
<syntaxhighlight lang="php">
<syntaxhighlight lang="mysql">
/db//name
/db//name
</syntaxhighlight>
</syntaxhighlight>
   
   
Все вложенные через два уровня:
Все вложенные через два уровня:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="mysql">
//db/*/*/name
//db/*/*/name
</syntaxhighlight>
</syntaxhighlight>
   
   
Третий фильм:
Третий фильм:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="mysql">
//f[3]
//f[3]
</syntaxhighlight>
</syntaxhighlight>
   
   
Третий фильм, если он снят в 1950 году:
Третий фильм, если он снят в 1950 году:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="mysql">
//f[3][@year="1950"]
//f[3][@year="1950"]
</syntaxhighlight>
</syntaxhighlight>
   
   
Все фильмы, снятые в 1950, и взять из них третий:
Все фильмы, снятые в 1950, и взять из них третий:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="mysql">
//f[@year="1950"][3]
//f[@year="1950"][3]
</syntaxhighlight>
</syntaxhighlight>


Все актёры, которые работали в Ленкоме:
Все актёры, которые работали в Ленкоме:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="mysql">
//a[./pers/teatr/text()="Ленком"]
//a[./pers/teatr/text()="Ленком"]
</syntaxhighlight>
</syntaxhighlight>
   
   
Все родители для театра Ленком:
Все родители для театра Ленком:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="mysql">
//teatr[text()="Ленком"]/parent::*
//teatr[text()="Ленком"]/parent::*
</syntaxhighlight>
</syntaxhighlight>
   
   
Все актёры, у которых указано более трёх театров или более двух адресов:
Все актёры, у которых указано более трёх театров или более двух адресов:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="mysql">
//a[count(teatr)>3 OR count(//addr)>2]
//a[count(teatr)>3 OR count(//addr)>2]
</syntaxhighlight>
</syntaxhighlight>


Все фильмы, в которых снимались актёры Ивановы Иваны Ивановичи:
Все фильмы, в которых снимались актёры Ивановы Иваны Ивановичи:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="mysql">
//f[//a[pers/@fio="Иванов Иван Иванович"]/@inn=role/@ra]
//f[//a[pers/@fio="Иванов Иван Иванович"]/@inn=role/@ra]
</syntaxhighlight>
</syntaxhighlight>
 
==== XQuery ====
==== XQuery ====
   
   
Строка 194: Строка 196:
   
   
вот один:
вот один:
<syntaxhighlight lang="php">
<syntaxhighlight lang="mysql">
let $a = 10, $b = 20, $c = "hello"
let $a = 10, $b = 20, $c = "hello"
for $x in колонка
for $x in колонка
Строка 202: Строка 204:
   
   
вот другой:
вот другой:
<syntaxhighlight lang="php">
<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: Строка 215:


Возврат элемента:
Возврат элемента:
<syntaxhighlight lang="php">
<syntaxhighlight lang="mysql">
return $x
return $x
</syntaxhighlight>
</syntaxhighlight>
   
   
Возврат значения:
Возврат значения:
<syntaxhighlight lang="php">
<syntaxhighlight lang="mysql">
return data($x/pers/...)
return data($x/pers/...)
</syntaxhighlight>
</syntaxhighlight>
Строка 225: Строка 227:


Как выглядит вложенный цикл:
Как выглядит вложенный цикл:
<syntaxhighlight lang="php">
<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: Строка 237:


Объявление функции:
Объявление функции:
<syntaxhighlight lang="php">
<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: Строка 243:
      
      
Вызов функции:
Вызов функции:
<syntaxhighlight lang="php">
<syntaxhighlight lang="mysql">
return {fun(10)}
return {fun(10)}
</syntaxhighlight>
</syntaxhighlight>

Текущая версия от 11:57, 18 октября 2014

...начало

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

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