Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Агрегирование данных при выборке
Функции: COUNT – подсчитывает количество строк, удовлетворяющих условиям запроса SUM – подсчитывает сумму значений указанного выражения по строкам, удовлетворяющим условиям запроса AVG – подсчитывает среднее значение указанного выражения по строкам, удовлетворяющим условиям запроса MAX, MIN – подсчитывают соответственно максимальное и минимальное значения указанного выражения по строкам, удовлетворяющим условиям запроса select COUNT (*) FROM TREADER select COUNT (DISTINCT READER) FROM TBOOK_READER select SUM (PRICE) FROM NAKLS where NAKLS.NUM > 36 Пример: Выборка списка читателей и взятых ими книг SELECT A.RDNUMB, A.RDNAME, B.BOOKNM FROM TREADER A, TBOOK B, TBOOK_READER AB where AB.READER = A.UNIKEY AND AB.BOOKKEY = B.UNIKEY B таблице TBOOK и TREADER ключи имеют одинаковое название UNIKEY. Представления Представление (View) – это виртуальная таблица, созданная на основе запроса к обычным таблицам. Представление реализуется как запрос, хранящийся на сервере и выполняющийся всякий раз, когда происходит обращение к представлению. Представления дают возможность создавать уровни организации данных, позволяющие отделить реализацию хранения данных от их вида. Например, можно создать представление, которое выбирает данные из нескольких таблиц. Если клиенты используют это представление, а не напрямую обращаются к лежащим в его основе таблицам, то у разработчика БД появляется возможность менять запрос (например, с целью оптимизации), что не будет замечать клиент – для него это будет все то же представление. Представления позволяют организовать данные в более удобном и простом виде. Такая проблема может возникнуть, когда число таблиц в базе данных достаточно большое, а взаимосвязи между ними сложные. Представление в этом случае позволяет исключить часть данных, не нужных конкретному клиенту базы данных. Для создания и удаления представлений существуют команды DDL. Чтобы создать представление необходимо использовать предложение: CREATE VIEW viewname [(view_column [, view_column...])] AS, которое выбирает данные, включаемые в представление. Необязательный параметр WITH CHECK_OPTION позволяет проверять каждую строку данных модифицируемого представления на условие «попадания» в представление. Пример: CREATE VIEW MyView AS SELECT NAME, PRICE FROM Table_example; Число записей в представлении MyView будет равно числу записей в таблице Table_example.
Рассмотрим пример: Создадим представление, которое показывает, сколько произведений есть у каждого мудреца. Н а рисунке 39 представлена реляционная диаграмма для вышеприведенного примера
0,N 1,1
Рис. 39 Реляционная диаграмма Тогда соответствующее данной реляционной диаграмме представление имеет вид: CREATE VIEW WiseBookCount (WISEMEN, HOW_WISEBOOKS) AS SELECT M.WISEMEN_NAME, COUNT(B.BOOK) FROM WISEMEN M, WISEBOOK B WHERE (M.ID_WISEMEN=B.ID_WISEMEN) GROUP BY M.WISEMEN_NAME В представлениях нельзя использовать ORDER BY, а также наборы данных, получаемые в результате выполнения хранимых процедур. Для извлечения данных из представления используются предложения SELECT. SELECT * FROM WiseBookCount ORDER BY HOW_WISEBOOKS Установление того, какое поле, возвращаемое запросом (в представлении) соответствует какому полю представления, осуществляется по порядковому номеру – первое поле запроса отобразится в первое поле представления, второе – во второе и т. д. Для вывода списка мудрецов, чье имя начинается с буквы «К» можно использовать следующее представление: CREATE VIEW WiseMen (WISEMEN) AS SELECT M.WISEMEN_NAME FROM WISEMEN M WHERE M.WISEMEN_NAME LIKE ‘K%’; В представлениях необходимо использовать явное именование полей (с указанием таблицы). Новые встроенные функции В СУБД Firebird добавлены новые встроенные функции из стандарта SQL-99 — CASE, COALESCE и NULLIF. CASE является базовой для этого ряда функций и реализует условную выборку значений из таблиц, например: SELECT CASE O.TYPE WHEN 0 THEN ‘Доход’ ELSE ‘Расход’ END FROM OPERATIONS O или так SELECT CASE WHEN (O.TYPE = 0) THEN ‘Доход’ ELSE ‘Расход’ END FROM OPERATIONS O Следует отметить, что у функции CASE может быть любое количество аргументов, т.е. Она не ограничивается только простейшей проверкой типа ‘ЕСЛИ-ИНАЧЕ’, например: SELECT CASE O.TYPE WHEN 0 THEN ‘Доход’ WHEN 1 THEN ‘Расход’ ELSE ‘—-’ END FROM OPERATIONS O Функция COALESCE является упрощением CASE для проверки на NULL SELECT COALESCE(O.STATUS, ‘—-’) FROM OPERATIONS O Результатом COALESCE будет являться первый аргумент, если он не NULL, или второй аргумент в противном случае. Функция NULLIF также является упрощением CASE, но для иного случая SELECT NULLIF(O.STATUS1, O.STATUS2) FROM OPERATIONS O Результатом NULLIF будет являться NULL, если оба аргумента равны, или первый аргумент в противном случае.
Диалект базы данных Выбор диалекта базы данных для СУБД Firebird очень важен. Диалект 1 и Диалект 3 отличаются друг от друга следующими принципиальными особенностями: Диалект 3 позволяет использовать расширенный набор типов данных, таких как типы для работы с большими целыми числами (ВigInt – 64 разряда), типы для работы с датой и временем DATE и TIME. Диалект 3 различает регистр идентификаторов, если идентификатор заключён в двойные кавычки. Table1 и TABLE1 в обоих диалектах будут равнозначны, а вот “Table1” и “TABLE1” (TABLE1) сервер будет интерпретировать как разные идентификаторы. Диалект 3 не поддерживает неявное приведение типов данных (как в диалекте 1). Это означает, что в Диалекте 1 выражение ‘25’+5 будет корректным, и в результате мы получим 30. В Диалекте 3 это выражение вызовет ошибку несоответствия типов. В Диалекте 3 двойные кавычки применяются только для обозначения идентификаторов (названия таблиц), а одинарные – для строковых констант. В Диалекте 1 строковые константы можно заключать как в одиночные, так и в двойные кавычки. В Диалекте 3 используются новые ключевые слова (зарезервированные слова): COLUMN, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, DAY, EXTRACT, HOUR, MINUTE, MONTH, SECOND, TIME, TIMESTAMP, WEEKDAY, YEAR, YEARDAY. Арифметические операции в диалекте 3 взяты из стандарта SQL-92. Например, деление целого на целое в диалекте 3 возвращает усечённое целое, в то время как в диалекте 1 оно вернёт число с плавающей точкой двойной точности. Генераторы в диалекте 3 могут иметь тип bigint (64-битовые целые числа), а в диалекте 1 генераторы – 32-битовые целые. Сам сервер не имеет диалекта – диалект базы данных является атрибутом базы данных. Он является интерфейсом клиента, который определяет, какой набор возможностей запрашивается у базы данных. Выбор диалекта, в котором будет создаваться база данных, важен по той причине, что переход между разными диалектами – занятие достаточно нетривиальное и трудоёмкое. Иными словами, если есть возможность, то лучше сразу выбрать верный диалект. В общем случае при выборе диалекта следует руководствоваться следующими правилами: выбираем Диалект 3, если проектируется база данных для приложения, которое будет использовать только современные библиотеки прямого доступа к InterBase/FireBird, которые полностью поддерживают Диалект 3. выбираем Диалект 1, если важна совместимость с более ранними библиотеками доступа к InterBase/FireBird, такими как BDE. Может возникнуть вопрос, почему диалекты бывают 1 и 3, а где же 2? Диалект 2 действительно существует, но используется в качестве промежуточного этапа при миграции с Диалекта 1 на Диалект 3. Типы с фиксированной точкой Firebird предоставляет два типа данных чисел с фиксированной точкой NUMERIC и DECIMAL. Каждый тип объявляется как TYPE (P, S), где Р определяет точность (количество значащих цифр), а S – масштаб (количество цифр справа от символа десятичной точки). Типы NUMERIC и DECIMAL, как они реализованы в FIREBIRD, являются идентичными, за исключением случая, когда точность меньше пяти. NUMERIC не соответствует стандарту SQL-92. FIREBIRD хранит масштабированное число как тип SMALLINT (16 бит), INTEGER (32 бита) или BIGINT (64 бита) в соответствии с объявленным масштабом (размером точности). Его объявленная точность сохраняется вместе с объявленным масштабом в виде отрицательного множителя масштаба, представляющего степень числа 10. Когда к числу происходит обращение для вывода или для расчётов, оно получается произведением хранимого целого на 10 множитель масштаба.
Например, для столбца, объявленного как NUMERI (4, 3), FIREBIRD сохраняет число в виде SMALLINT. Если вы вводите число 7.2345, FIREBIRD без сообщения округляет самую правую цифру (4) и сохраняет 16-битовое целое 7235 и множитель масштаба -3. Это число будет найдено как 7.235 (7235*10-3). Числа в формате NUMERIC с точностью меньше 5 хранятся как SMALLINT (16 разрядов). Числа в формате DECIMAL с точностью меньше 5 хранятся как INTEGER (32 разряда). Кроме того, числа в Диалекте 1 с точностью 10 – 18 хранятся как DOUBLE PRECISION, а в Диалекте 3 – как BIGINT. При выполнении деления типов с фиксированной точкой диалекты 1 и 3 ведут себя по-разному. В Диалекте 3, когда оба операнда при операции деления являются типами с фиксированной точкой, FIREBIRD суммирует масштабы обоих операндов для определения масштаба результата (частного). В Диалекте 1 деление всегда создаёт частное типа DOUBLE PRECISION. Примеры. В диалекте 3 частное от деления DECIMAL (12.3) на DECIMAL (9,2) будет DECIMAL (18,5). (Масштабы суммируются.) 11223344.556 / 1234567.89 = 9.09090 В диалекте 1 первое число трактуется как число DOUBLE PRECISION (точность 12). Частное тоже имеет тип DOUBLE PRECISION. Результат 9.09090917308727 (по причине ошибок, присущих типам с плавающей точкой). Следующие операции деления в Диалекте 3 дают различные результаты: 1 / 3.00 = 0.33 типа NUMERIC (18, 2) потому что сумма масштабов равна 0+2 = 2 типа типа Integer Numeric (18,2) 1.00 / 3.00 = 0, 3333 типа NUMERIC (18, 4) потому что сумма масштабов равна 2+2 = 4 NUMERIC(18,2) При выполнении умножения операндов с фиксированной точкой масштаб результата равен сумме масштабов операндов. 123.123 результат имеет масштаб 5 (2+3)´12.12 NUMERIC(9,2) NUMERIC(9,3) = 1492.25076 В Диалекте 3 точность умножения чисел с фиксированной точкой будет равна 18. В Диалекте 4 если точность результата равна > 9, то результатом будет DOUBLE PRECISION. При сложении и вычитании масштаб результата равен максимальному масштабу операндов. 12.12 + 123.123 = 135.243 будет иметь масштаб 3, а 12.12 – 123.123 = – 111.003 В Диалекте 3 результат любого сложения или вычитания имеет тип NUMERIC(18, n). В Диалекте 1 он имеет тип (9, n), где n – максимальный масштаб операнда.
|
|||||||||||
Последнее изменение этой страницы: 2017-01-25; просмотров: 103; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.160.14 (0.023 с.) |