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

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


Сокращённая запись пути до фильма:
Сокращённая запись пути до фильма:
<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>
Строка 138: Строка 138:


Все потомки:
Все потомки:
<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>
Строка 194: Строка 194:
   
   
вот один:
вот один:
<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: Строка 202:
   
   
вот другой:
вот другой:
<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: Строка 213:


Возврат элемента:
Возврат элемента:
<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: Строка 225:


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


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