Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PMO_PMS_shpory_final.docx
Скачиваний:
7
Добавлен:
17.09.2019
Размер:
457.71 Кб
Скачать

7 Вложенные подзапросы. Типы вложенных подзапросов. Способы включения вложенных подзапросов. Примеры использования вложенных подзапросов с разными способами включения.

Вложенный подзапрос - это подзапрос, заключенный в круглые скобки и вложенный в WHERE (HAVING) фразу предложения SELECT или других предложений, использующих WHERE фразу. Вложенный подзапрос может содержать в своей WHERE (HAVING) фразе другой вложенный подзапрос и т.д. Нетрудно догадаться, что вложенный подзапрос создан для того, чтобы при отборе строк таблицы, сформированной основным запросом, можно было использовать данные из других таблиц (например, при отборе блюд для меню использовать данные о наличии продуктов в кладовой пансионата).

Существуют простые и коррелированные вложенные подзапросы. Они включаются в WHERE (HAVING) фразу с помощью условий IN, EXISTS или одного из условий сравнения ( = | <> | < | <= | > | >= ). Простые вложенные подзапросы обрабатываютя системой "снизу вверх". Первым обрабатывается вложенный подзапрос самого нижнего уровня. Множество значений, полученное в результате его выполнения, используется при реализации подзапроса более высокого уровня и т.д.

Запросы с коррелированными вложенными подзапросами обрабатываются системой в обратном порядке. Сначала выбирается первая строка рабочей таблицы, сформированной основным запросом, и из нее выбираются значения тех столбцов, которые используются во вложенном подзапросе (вложенных подзапросах). Если эти значения удовлетворяют условиям вложенного подзапроса, то выбранная строка включается в результат. Затем выбирается вторая строка и т.д., пока в результат не будут включены все строки, удовлетворяющие вложенному подзапросу (последовательности вложенных подзапросов).

Подзапросы организуются в виде вложенных SELECT'ов.

Со скалярным подзапросом можно использовать операторы сравнение ("=", ">", "<", "<>" и т.д.).

При этом важно, чтобы подзапрос возвращал только одно значение.

Это очень удобно в запросах типа

#так писать нельзя, т.к. значение MIN(i) неизвестно

#до того момента, как произойдёт выборка

#т.е. уже после того, как понадобится "WHERE"

SELECT * FROM t1 WHERE i = MIN(i)

#а вот так писать можно

SELECT * FROM t1 WHERE i = (SELECT MIN(i) FROM t1)

Если подзапрос возвращает одну строку, то можно использовать кортеж (набор значений для сравнения):

Это очень удобно в запросах типа

SELECT t1.* FROM t1

WHERE (i, c) = (SELECT i, c FROM t2 WHERE i = 2 LIMIT 1)

Если подзапрос может вернуть несколько значений, то лучше ипользовать операторы IN и NOT IN вместо = и <> соответственно.

SELECT t1.* FROM t1

WHERE (i, c) IN (SELECT i, c FROM t2)

Операторы EXISTS и NOT EXISTS нужны для того, чтобы определить, вернулись ли значения из подзапроса (используются для коррелированных подзапросов).

SELECT * FROM t1

WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE i > 10000)

Коррелированные подзапрос содержат ссылки на значения внешнего запроса.

SELECT i FROM t1 WHERE j IN (SELECT k FROM t2 WHERE k = i)

Пример несколько странный получился.

Более реалистичный:

SELECT i FROM t1

WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.i1 = t1.i)

Подзапросы можно переписывать через операторы JOIN (в некоторых случаях может работать быстрее).

SELECT * FROM t1

WHERE i IN (SELECT i1 FROM t2 WHERE t2.i = 15)

#аналогично

SELECT t1.* FROM t1, t2

WHERE t1.i = t2.i1 AND t2.i = 15

* При этом могут возвращаться несколько разные результаты, если в t2.i1 содержатся неуникальные значения. В таком случае подзапрос выдаст только уникальные значения, а JOIN выдаст все. Чтобы этого избежать, нужно во втором запросе использовать оператор SELECT DISTINCT (выбрать только уникальные значения).

SELECT * FROM t1

WHERE i NOT IN (SELECT i1 FROM t2)

#аналогично

SELECT t1.*

FROM t1 LEFT JOIN t2 ON t2.i1 = t1.i

WHERE t2.i1 IS NULL (при этом в подзапросе можно заметить отсутствие условия выборки;))

3. UNION Выборка из нескольких таблиц последовательно.

UNION действует как SELECT DISTINCT, т.е. отбрасывает повторяющиеся значения. чтобы этого избежать, нужно использовать оператор UNION ALL (SELECT i, c FROM t1 ORDER BY i DESC)

UNION (SELECT i, d FROM t2 ORDER BY i)

Псевдонимы таблиц и способы их использования.

SELECT применяется для извлечения строк, выбранных из одной или нескольких таблиц. Выражение select_expression задает столбцы, в которых необходимо проводить выборку. Кроме того, оператор SELECT можно использовать для извлечения строк, вычисленных без ссылки на какую-либо таблицу. Например:

SELECT 1 + 1;

-> 2

При указании ключевых слов следует точно соблюдать порядок, указанный выше. Например, выражение HAVING должно располагаться после всех выражений GROUP BY и перед всеми выражениями ORDER BY.

Используя ключевое слово AS, выражению в SELECT можно присвоить псевдоним. Псевдоним используется в качестве имени столбца в данном выражении и может применяться в ORDER BY или HAVING. Например:

SELECT CONCAT(last_name,', ',first_name) AS full_name

FROM mytable ORDER BY full_name;

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

Выражение FROM table_references задает таблицы, из которых надлежит извлекать строки. Если указано имя более чем одной таблицы, следует выполнить объединение. Для каждой заданной таблицы по желанию можно указать псевдоним.

table_name [[AS] alias] [USE INDEX (key_list)] [IGNORE INDEX (key_list)]

В выражениях ORDER BY и GROUP BY для ссылок на столбцы, выбранные для вывода информации, можно использовать либо имена столбцов, либо их псевдонимы, либо их позиции (местоположения). Нумерация позиций столбцов начинается с 1:

SELECT college, region, seed FROM tournament

ORDER BY region, seed;

SELECT college, region AS r, seed AS s FROM tournament

ORDER BY r, s;

SELECT college, region, seed FROM tournament

ORDER BY 2, 3;

Выражение LIMIT может использоваться для ограничения количества строк, возвращенных командой SELECT. LIMIT принимает один или два числовых аргумента. Эти аргументы должны быть целочисленными константами. Если заданы два аргумента, то первый указывает на начало первой возвращаемой строки, а второй задает максимальное количество возвращаемых строк. При этом смещение начальной строки равно 0 (не 1):

SELECT * FROM table LIMIT 5,10; # возвращает строки 6-15

8 Агрегатные функции. Примеры использования всех функций без фразы GROUP BY и с GROUP BY. Использование фразы HAVING.

Агрегатная функция производит вычисление над единичным результатом от множества записей. Например, есть агрегаты для вычисления count (количества), sum (суммы), avg (среднего арифметического), max (максимального значения) и min (минимального значения) списка записей.

Функции без использования фразы GROUP BY

Без groyp by

Фраза Having предназначена для использования совместно с фразой GROUP BY для задания ограничений, указываемых с целью отбора тех групп, которые будут помещены в результирующую таблицу запроса. Хотя фраза Having и предложение WHERE имеют сходный синтаксис, их назначение различно. Предложение WHERE предназначено для фильтрации отдельных строк, используемых для группирования или помещаемых в результирующую таблицу запроса, тогда как фраза HAVING используется для фильтрации групп, помещаемых в результирующую таблицу запроса. Стандарт ISO требует, чтобы имена столбцов, используемые во фразе HAVING, обязательно присутствовали в списке фразы GROUP BY или применялись в обобщающих функциях. На практике условия поиска во фразе HAVING всегда включают, по меньшей мере, одну обобщающую функцию, в противном случае эти условия поиска должны быть помещены в предложение WHERE и применяться для отбора отдельных строк.

Фраза HAVING не является необходимой частью языка SQL — любой запрос, написанный с использованием фразы HAVING, может быть представлен в ином виде, без ее применения.

Пример 13.18. Использование фразы HAVING

Для каждого отделения компании с численностью персонала более одного человека определить количество работающих и сумму их заработной платы.

SELECT KodB, COUNT(KodS) AS C, SUM (ZP) AS SZP

FROM S

GROUP BY KodB

HAVING COUNT(KodS) > 1

ORDER BY KodB;

Этот пример аналогичен предыдущему, но здесь используются дополнительные ограничения, указывающие на то, что нас интересуют сведения только о тех отделениях компании, в которых работает больше одного человека. Подобное требование налагается на группы, поэтому в запросе следует использовать фразу HAVING. Результат выполнения запроса представлены в табл. ___

KodB C SZP

B3 3 850

B5 2 950

9 Параметрические запросы. Способы задания значений параметров. Использование параметрических запросов в хранимых процедурах. Достоинства и недостатки параметрических запросов. Примеры параметрических запросов.

Параметрический запрос - это запрос, при выполнении которого пользователю необходимо ввести значение требуемого ему параметра.

Параметром называется переменная, используемая в SQL-операторе.

Применение параметров позволяет формировать SQL-операторы непосредственно во время выполнения приложения. Так, при использовании многошагового интерфейса, при котором процесс компиляции и выполнения SQL-оператора происходит как последовательные действия, достаточно откомпилировать SQL-оператор с параметрами вместо явного указания значений полей таблицы базы данных, а затем многократно выполнять данный оператор с различными значениями параметров.

Например:

INSERT INTO TBL1 (F_ID, F2, F3) VALUES (?, ?, ?)

Параметры могут быть именованными и позиционными.

Позиционные параметры указываются символом вопросительный знак (?), называемым маркером параметров. При выполнении оператора вместо параметра в соответствующую позицию SQL-оператора приставляется значение параметра.

Параметром называется переменная, используемая в SQL-операторе.

Применение параметров позволяет формировать SQL-операторы непосредственно во время выполнения приложения. Так, при использовании многошагового интерфейса, при котором процесс компиляции и выполнения SQL-оператора происходит как последовательные действия, достаточно откомпилировать SQL-оператор с параметрами вместо явного указания значений полей таблицы базы данных, а затем многократно выполнять данный оператор с различными значениями параметров.

Например:

INSERT INTO TBL1 (F_ID, F2, F3) VALUES (?, ?, ?)

Параметры могут быть именованными и позиционными.

Позиционные параметры указываются символом вопросительный знак (?), называемым маркером параметров. При выполнении оператора вместо параметра в соответствующую позицию SQL-оператора приставляется значение параметра.

Согласно спецификации языка SQL маркеры параметров нельзя размещать в следующих местах SQL-оператора:

в списке полей оператора SELECT;

одновременно как оба операнда для бинарного оператора (например, оператора =), так как на этапе компиляции нельзя определить тип операндов, выступающих в роли параметров;

одновременно как первый и второй операнд для оператора BETWEEN (например, вместо SQL-оператора

SELECT title_id, f_sales FROM tbl1

WHERE f_sales BETWEEN 4095 AND 12000

нельзя записать

SELECT title_id, f_sales FROM tbl1

WHERE ? BETWEEN ? AND 12000 );

одновременно как первый и третий операнд для оператора BETWEEN;

одновременно как первый операнд и второй операнд для оператора IN (например, вместо SQL-оператора

SELECT f_ID, f_state FROM tbl1

WHERE f_state IN ('CA', 'CB')

нельзя записать

SELECT f_ID, f_state FROM tbl1

WHERE ? IN (?, ?) );

как операнд унарного оператора + или -.

10 Основные объекты СУБД InterBase. Типы данных. Создание таблиц. Модификация таблиц. Удаление таблиц. Примеры создания, модификации и удаления таблиц.

Типы данных - это базовые элементы любого языка программирования или любого сервера СУБД, и InterBase не исключение. Когда мы говорим, что в базе данных хранится какая-то информация, то должны всегда четко осознавать, что эта информация не может быть свалена в одну большую кучу; наоборот, данные должны быть рассортированы и разложены по "полочкам". Типы данных определяют, что можно положить на соответствующую "полочку", а что нельзя. Под "полочками" понимаются прежде всего поля таблиц в базе данных (см. главу "Таблицы. Первичные ключи и генераторы" (ч. 1)), а также переменные внутри триггеров, хранимых процедур и т. д.

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

В InterBase существует 12 типов данных, которые способны удовлетворить практически любые потребности разработчика в хранении данных. Эти типы условно подразделяются на 6 следующих групп:

для хранения целых чисел - INTEGER и SMALLINT;

для хранения вещественных чисел - FLOAT и DOUBLE PRECISION;

для чисел с фиксированной точностью - NUMERIC и DECIMAL;

для хранения даты, времени и даты/времени - DATE, TIME и TIMESTAMP;

для хранения символов - CHARACTER (сокращенно CHAR) и VARYING CHARACTER (VARCHAR);

Для хранения динамически расширяемых данных - BLOB.

Также возможно определять массивы значений элементарных типов, т.е. всех перечисленных типов, кроме BLOB.

Большинство типов данных InterBase соответствуют типам, определенным в стандарте SQL92, однако, помимо этого, есть и собственные "изюминки" - массивы элементарных типов данных и BLOB.

Массивы в InterBase могут содержать множество данных одного типа в одном поле, например можно определить массив значений типа INTEGER. Причем массивы могут иметь несколько размерностей!

Тип данных BLOB - это динамически расширяемый тип данных, название которого часто расшифровывается как Binary Large OBject - "большие двоичные объекты". Надо сказать, что BLOB - это изобретение разработчиков InterBase, которое позже распространилось и прижилось во всех современных SQL-серверах.

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