Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ekzamen_33_33_33_21-40.doc
Скачиваний:
5
Добавлен:
29.09.2019
Размер:
814.08 Кб
Скачать

Специальные атрибуты count

Функция COUNT несколько отличается от всех. Она считает число значений в данном столбце, или число строк в таблице. Когда она считает значения столбца, она используется с DISTINCT чтобы производить счет чисел различных значений в данном поле. Мы могли бы использовать ее, например, чтобы сосчитать номера продавцов в настоящее врем описанных в таблице Порядков ( вывод показывается в Рисунке 6.3 ):

SELECT COUNT ( DISTINCT snum )

FROM Orders;

Использование distinct

Обратите внимание в вышеупомянутом примере, что DISTINCT, сопровождаемый именем пол с которым он применяется, помещен в круглые скобки, но не сразу после SELECT, как раньше. Этого использования DISTINCT с COUNT применяемого к индивидуальным столбцам, требует стандарт ANSI, но большое количество программ не предъявляют к ним такого требования.

=============== SQL Execution Log ============

| |

| SELECT COUNT (DISTINCT snum) |

| FROM Orders; |

| ==============================================|

| |

| ------- |

| 5 |

| |

| |

===============================================

Рисунок 6.3: Подсчет значений пол  Вы можете выбирать многочисленные счета( COUNT ) из полей с помощью DISTINCT в одиночном запросе который, как мы видели в Главе 3, не выполнялись когда вы выбирали строки с помощью DISTINCT. DISTINCT может использоваться таким образом, с любой функцией агрегата, но наиболее часто он используется с COUNT. С MAX и MIN, это просто не будет иметь никакого эффекта, а SUM и AVG, вы обычно применяете для включения повторяемых значений, так как они законно эффективнее общих и средних значений всех столбцов.

38.Витяг даних з кількох таблиць. Приклади використання inner join, left(right) outer join, exists, any. Выборка из нескольких таблиц.

Очень часто возникает ситуация, когда выборку данных надо производить из отношения, которое является результатом слияния (join) двух других отношений. Например, нам нужно получить из базы данных publications информацию о всех печатных изданиях в виде следующей таблицы:

------------------------------------------------

|название_книги | год_выпуска | издательство |

------------------------------------------------

| | | |

| | | |

Для этого СУБД предварительно должна выполнить слияние таблиц titles и publishers, а только затем произвести выборку из полученного отношения.

Для выполнения операции такого рода в операторе SELECT после ключевого слова FROM указывается список таблиц, по которым произвоится поиск данных. После ключевого слова WHERE указывается условие, по которому производится слияние. Для того, чтобы выполнить данный запрос, нужно дать команду:

    SELECT titles.title,titles.yearpub,publishers.publisher

        FROM titles,publishers

        WHERE titles.pub_id=publishers.pub_id;

А вот пример, где одновременно задаются условия и слияния, и выборки (результат предыдущего запроса ограничивается изданиями после 1996 года):

    SELECT titles.title,titles.yearpub,publishers.publisher

        FROM titles,publishers

        WHERE titles.pub_id=publishers.pub_id AND

              titles.yearpub>1996;

Следует обратить внимание на то, что когда в разных таблицах присутствуют одноименные поля, то для устранения неоднозначности перед именем поля указывается имя таблицы и знак "." (точка). (Хорошее правило: имя таблицы указывать всегда!)

Естественно, имеется возможность производить слияние и более чем двух таблиц. Например, чтобы дополнить описанную выше выборку именами авторов книг необходимо составить оператор следующего вида:

SELECT authors.author,titles.title,titles.yearpub,publishers.publisher

FROM titles,publishers,titleauthors

WHERE titleauthors.au_id=authors.au_id AND

titleauthors.title_id=titles.title_id AND

titles.pub_id=publishers.pub_id AND

titles.yearpub > 1996;

INNER JOIN - возвращает строки, когда есть хотя бы одно совпадение в обеих таблицах.

Концепция использования операции JOIN в MySQL. И так, пускай у нас есть две таблицы. Таблица Table A с лева и таблица Table B с права и в каждой из них есть 4 записи:

id name       id  name

-- ----       --  ----

1  Pirate     1   Rutabaga

2  Monkey     2   Pirate

3  Ninja      3   Darth Vader

4  Spaghetti  4   Ninja

Давайте попоробуем использовать операцию JOIN на этих двух таблицах. И так, первый пример Inner join, оставит нам только то, что есть в Table A и Table B:

?

SELECT * FROM TableA INNER JOIN TableB

ON TableA.name = TableB.name

 

id  name       id   name

--  ----       --   ----

1   Pirate     2    Pirate

3   Ninja      4    Ninja

Full outer join - обьединение таблицы Table A с Table B:

?

SELECT * FROM TableA

FULL OUTER JOIN TableB

ON TableA.name = TableB.name

 

id    name       id    name

--    ----       --    ----

1     Pirate     2     Pirate

2     Monkey     null  null

3     Ninja      4     Ninja

4     Spaghetti  null  null

null  null       1     Rutabaga      

null  null       3     Darth Vader

Left outer join - результатом будут все записи из таблицы Table A и в таблице Table B остануться только общие записи, вместо всех остальных будет null:

?

SELECT * FROM TableA

LEFT OUTER JOIN TableB

ON TableA.name = TableB.name

 

id  name       id    name

--  ----       --    ----

1   Pirate     2     Pirate

2   Monkey     null  null

3   Ninja      4     Ninja

4   Spaghetti  null  null

Для того, что бы получить все записи из Table A которых нет в Table B мы так же будем использовать Left outer join исключая те значения которые нам не ныжны:

?

SELECT * FROM TableA

LEFT OUTER JOIN TableB

ON TableA.name = TableB.name

WHERE TableB.id IS null

 

id  name       id     name

--  ----       --     ----

2   Monkey     null   null

4   Spaghetti  null   null

Для того, что бы получить набор уникальных значений для Table A и Table B будем использовать full outer join с исключениями:

?

SELECT * FROM TableA

FULL OUTER JOIN TableB

ON TableA.name = TableB.name

WHERE TableA.id IS null

OR TableB.id IS null

 

id    name       id    name

--    ----       --    ----

2     Monkey     null  null

4     Spaghetti  null  null

null  null       1     Rutabaga

null  null       3     Darth Vader

EXISTS - это оператор, который производит верное или неверное значение, другими словами, выражение Бул ( см. Главу 4 для обзора этого термина ).  Это означает что он может работать автономно в предикате или в комбинации с другими выражениями Бул использующими Булевые операторы AND, OR, и NOT. Он берет подзапрос как аргумент и оценивает его как верный если тот производит любой вывод или как неверный если тот не делает этого. Этим он отличается от других операторов предиката, в которых он не может быть неизвестным. Например, мы можем решить, извлекать ли нам некоторые данные из таблицы Заказчиков если, и только если, один или более заказчиков в этой таблице находятся в San Jose ( вывод для этого запроса показывается в Рисунке 12.1 ):

SELECT cnum, cname, city

FROM Customers

WHERE EXISTS

( SELECT *

FROM Customers

WHERE city = " San Jose' );

Внутренний запрос выбирает все данные для всех заказчиков в San Jose. Оператор EXISTS во внешнем предикате отмечает, что некоторый вывод был произведен подзапросом, и поскольку выражение EXISTS было полным предикатом, делает предикат верным. Подзапрос( не соотнесенный ) был выполнен только один раз для всего внешнего запроса, и следова-

=============== SQL Execution Log ============

| |

| SELECT snum, sname, city |

| FROM Customers |

| WHERE EXISTS |

| (SELECT * |

| FROM Customers |

| WHERE city = 'San Jose'); |

| ============================================= |

| cnum cname city |

| ----- -------- ---- |

| 2001 Hoffman London |

| 2002 Giovanni Rome |

| 2003 Liu San Jose |

| 2004 Grass Berlin |

| 2006 Clemens London |

| 2008 Cisneros San Jose |

| 2007 Pereira Rome |

=============================================

Рисунок 12.1 Использование оператора EXISTS  тельно имеет одно значение во всех случаях. Поэтому EXISTS, когда используется этим способом, делает предикат верным или неверным для всех строк сразу, что это не так уж полезно для извлечения определенной информации.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]