46180 (665424), страница 2

Файл №665424 46180 (Математическая логика. Язык SQL) 2 страница46180 (665424) страница 22016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 2)

Создание таблиц происходит совершенно аналогично: клик сначала правой кнопкой мыши на значке «Table», затем левой — на пункте «New Table» в контекстном меню. Выше был приведен пример алгоритма выборки из базы данных для классического языка высокого уровня. Просто представьте, сколько времени и сил заняло бы описание на нем такой структуры как БД с несколькими взаимосвязанными таблицами.

Как бы хорошо не была настроена база данных, всегда существует вероятность потери информации по независящим от администратора причинам. Для сведения подобных потерь к разумному минимуму Enterprise Manager содержит инструмент резервного копирования БД.

Чтобы выполнить резервное копирование базы вручную, нужно щелкнуть правой кнопкой мыши по названию базы и выбрать «Все задачи • > Backup Database». Далее в появившемся окне надо нажать кнопку «Аdd'», после чего выбрать каталог для сохранения и в поле «File name» ввести имя файла, в котором будет содержаться база. Имя этого файла с названием базы может быть никак не связано. После подтверждения намерения остается только дожидаться конца процесса копирования.

Для того чтобы восстановить данные из ранее сохраненного файла, необходимо иметь на SQL Server базу данных с названием, идентичным имени родительской базы. Другими словами, если вы сохраняли БД как Data_Base, то для восстановления данных необходимо создать на сервере базу с таким же названием (не путать с именем файла резервной копии).

Для восстановления информации из файла нужно нажать правой кнопкой мыши на базу, предназначенную для приема данных и выбрать «Все задачи – Restore Database». Далее в

последовательно сменяющих друг друга окнах нужно выбрать пункты «FromDevise», «Select Devise» и «Аdd» и указать каталог, в котором расположен резервный файл.

Вторая по важности и частоте использования утилита после Enterprise Manager это Query Analyzer. Она предназначена для выполнения, отладки и анализа запросов. Окно «Query Analizer» разделено на три части. Слева находится браузер объектов (Object Browser), с помощью которого можно посмотреть список всех объектов, расположенных в любой базе данных сервера, а также перечень всех функций и типов данных. Правая часть разделена на верхнюю и нижнюю, при этом верхняя половина является полем для ввода запросов, а нижняя используется для вывода результатов их работы и отладочной информации.

При отладке хранимых процедур весьма удобна возможность трассировки их выполнения: для этого необходимо кликнуть на нужной процедуре правой кнопкой мыши и в появившимся контекстном меню выбрать пункт «Debug».

Помимо выполнения процедур и запросов в Query Analyzer предусмотрена возможность оценки скорости работы. Эту функцию можно включить, если открыть меню «Query» и выбрать в нем, соответственно, пункты «Display Estimated», «Execution Plan» или «Display Execution Plan».

Оператор SELECT

Основной оператор языка SQL, предназначенный для выборки данных, - SELECT:

SELECT * FROM Table 1

Звёздочка означает все столбцы, а Table1 – имя таблицы, из которой мы эти столбцы хотим извлечь. Практическую ценность оператору SELECT придает ключевое слово WHERE, позволяющее выводить исключительно те строки таблицы, которые соответствуют условию. Предположим, у нас есть таблица с информацией о персонале (Employees), где указаны имя работника (Name) и его заработная плата (Salary). Если нам нужно увидеть данные обо всех работниках, получающих заработную плату более 30 000 рублей, мы формулируем запрос:

SELECT Name FROM Employees WHERE Salary > 30000

На практике существует необходимость запрашивать информацию одновременно из нескольких таблиц. Предположим, что у нас есть таблица Agents с информацией о торговых агентах: идентификационный номер (Agent_id), имя (Name) и дата рождения (Birth_Date). Есть еще одна таблица — Contacts, где содержатся данные о контрактах, заключенных агентами: идентификационный номер клиента (Client_id), номер агента (Agent_id), дата заключения контракта (CDate) и сумма сделки (Gross_Income).

Предположим, необходимо премировать агентов, заключавших с начала года контракты на сумму более 500 000 рублей. Запрос к базе данных будет выглядеть так:

SELECT Name, Bitth_Date FROM Agents, Contacts WHERE Agents.Agent_id = Contracts.Agent_id AND Contracts.CDate >`31.12.2004` AND CONTRACTS.Gross_Income > 500000

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

Поскольку один агент может заключить несколько больших контрактов, его данные могут быть несколько раз продублированы. Чтобы избежать этого, необходимо использовать ключевое слово DISTINCT:

SELECT DISTINCT Name, Birth_Day From …

Использование имен и вложенных запросов

В SQL-конструкциях назначение новых имен применяется, чтобы сохранить для дальнейших операций результаты, возвращаемые запросами и встроенными функциями, и сделать текст запроса более компактным за счет сокращений. Для демонстрации эффектов переназначения имен, возьмем, к примеру, таблицу Rooms с информацией о жилых комнатах в многоквартирном доме со следующими столбцами: идентификатор комнаты (Room_id), тип (Room_type), длина (Length) и ширина (Width). Предположим, мы хотим получить информацию о жилой площади всех спален и гостиных в доме. Для этого формулируем запрос:

SELECT Room_Type, Length * Width AS

Living_Space

FROM Rooms

WHERE Room_Type = `Гостиная OR Room_Type =`Спальня`

В результирующей таблице не будет данных о длине и ширине, зато появится столбец с информацией о площади, которая была вычислена непосредственно при исполнении запроса

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

SELECT DISTINCT Name, Birth_Date

FROM Agents AS A1, Contracts AS C1

WHERE A1.Agent_id = C1.Agent_id AND C1.CDate

>`31.12.2004` AND C1.Gross_Income > 500000

Дав с помощью ключевого слова АS таблицам Agents и Contacts сокращенные имена, мы сделали текст более компактным. Запрос можно сделать многоступенчатым, тогда результат вложенного запроса станет исходными данными. Тот же самый пример с агентами можно выполнить в виде вложенного запроса:

SELECT Name, Birth_Day

FROM Agents

WHERE Agent_id IN (SELECT Agent_id

FROM Contracts

WHERE CDate >`31.12.2004` AND

Gross_Income >500000

В данном случае предикат IN последовательно проверяет, имеется ли среди результатов вложенного запроса по базе контрактов идентификатор каждого из агентов. Если он есть, то в результирующую таблицу головного запроса добавляются его данные (для противоположного результата можно использовать предикат NOT IN). В большинстве случаев предпочтительнее вместо вложенных запросов применять соединение таблиц по общим столбцам (...WHERE Agents.Ag_Num = Contracts.Ag_Num...), однако иногда бывает, что все-таки без вложений не обойтись.

Объединения и внешние соединения

Выше мы воспользовались оператором OR для выборки данных о спальнях и гостиных. Можно пойти другим путем и использовать оператор UNION для объединения двух запросов:

(SELECT Room_Type, Length1 * Width1 AS

Living_Space FROM Rooms WHERE Room_Type =

`Гостиная`) UNION (SELECT Room_Type, Length1 *

Width1 AS Living_Space FROM Rooms WHERE

Room_Type = `Спальня`)

Оператор UNION строит на основе двух таблиц третью, куда попадают строки, которые есть либо в первой исходной, либо во второй, либо в обеих вместе; строки-дубликаты при этом удаляются. Иногда для подобных целей удобнее пользоваться оператором OR, однако если условия объединяемых подзапросов сложные, UNION для их составления подходит больше. Суть такого инструмента как внешнее соединение можно пояснить на следующем примере. Допустим, нам необходимо сделать выборку по контрактам, заключенным агентами в июне 2005 года. Мы можем воспользоваться для этого таким запросом:

SELECT Name, CDate, Gross_Income

FROM Agents AS A1, Contracts AS C1

WHERE A1.Agent_id = C1.Agent_id AND C1.CDate

BETWEEN `01.06.2005`AND`30.06.2005`

Он, разумеется, выдаст правильные результаты, однако наличие имени агента после обработки запроса зависит от того, заключил ли он сделку в этот период. Если необходимо, чтобы в результирующей таблице всегда присутствовали все агенты, необходимо использовать так называемое левое внешнее соединение (LEFT OUTER JOIN). Его смысл состоит в том, что все строки таблицы, указанной слева от оператора LEFT OUTER JOIN, попадают в таблицу-результат, а из таблицы справа берутся только данные, которые соответствуют условию:

SELECT Name, CDate, Gross_Income

FROM Agents LEFT OUTER JOIN Contracts ON

Agents.Agent_id = Contracts.Agent_id

AND Contracts.CDate BETWEEN `01.06.2005` AND

`30.06.2005`

Каждый агент из таблицы Agents записанной слева от LEFT OUTER JOIN, попадет в результат запроса, даже если ему нельзя будет подобрать соответствующих строк из правой таблицы (поскольку не все агенты заключали контракты в июне 2005 года). Необходимо обратить внимание, что вместо ключевого слова WHERE здесь используется слово ON. Если использовать слово WHERE, результат будет тот же самый, что и с обычным запросом. Следует также помнить, что синтаксис левого внешнего соединения может сильно различаться в разных системах.

Математические функции и средства работы с датами

Поскольку SQL ориентирован на выборку данных, а не на управление вычислениями, его математический инструментарий довольно ограничен. Впрочем, перечень доступных функций в продуктах различных разработчиков может варьироваться. Как правило, в большинстве реализаций присутствуют следующие функции: POWER (возведение в степень), SQRT (квадратный корень), АВS (модуль), LN и LOG10 (натуральный и десятичный логарифмы), ЕХР (экспоненциальная функция). Функция ROUND(х, р) округляет число х до р десятичных знаков, TRUNCATE(х, р) — усекает. Функции FLOOR(х) и CEILING(х) возвращают ближайшие к нецелому х целые числа снизу и сверху соответственно. Предположим, нам зачем-то понадобилось найти не площадь, а диагональ каждой спальни из таблицы Rooms и округлить ее до двух знаков после запятой. Запрос будет иметь следующий вид:

SELECT Room_id,

ROUND(SQRT(POWER(Length,2) +

POWER(Width,2)), 2) AS Bias

FROM Rooms

WHERE Room_Type = `Спальня`

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

В большинстве реализаций SQL присутствует предикат BETWEEN, который несколько облегчает работу с интервалами чисел, в частности с временными и календарными интервалами (мы столкнулись в предыдущем разделе в примере с выборкой контактов за июнь). В общем случае синтаксис предиката таков:

Val1 BETWEEN Low AND High

Предикат вернет TRUE, если значение Val1 будет находиться внутри диапазона, ограниченного значениями Low и High, или в противном случае False. Для простого формирования дат в диалектах SQL многих современных СУБД присутствует соответствующая функция MAKEDATE, которая вызывается с такими аргументами:

MAKEDATE(Year, Month, Day)

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

EXTRACT (YEAR FROM CURRENT_DATE)

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

MyDate + INTERVAL 15 DAYS

Группы и агрегатные функции

Иногда возникают ситуации, когда необходимо произвести группировку данных, отбросив ненужную индивидуальную информацию, зато добавив количественные оценки групп. Для этого в SQL есть оператор GROUP BY.

Допустим, что нам необходимо получить из таблицы Contracts данные относительно количества контрактов и общего объема продаж, приходящихся на одного агента. Каждая запись в таблице Contracts описывает один контракт. Одному агенту может соответствовать несколько таких записей. Следовательно, чтобы получить нужный результат, надо сгруппировать таблицу по полю «Ag_Num», содержащему индекс агента:

SELECT Agent_id, SUM(Gross_Income) AS

Gr_Income, COUNT(*) AS Contracts_Num

FROM Contracts

GROUP BY Agent_id

В результирующей таблице будет три столбца: в первом — номер агента, во втором — сумма всех заключенным им контрактов, в третьем — количество этих контрактов. Функции SUM, COUNT (а также AVG, MIN и МАХ) называются агрегатными. Их отличие от математических функций состоит в том, что аргументом может быть произвольное множество чисел. В нашем случае функция SUM складывает все значения Gross_Income для каждой отдельной группы, а COUNT(*) подсчитывает количество записей в ней. Усложним пример, чтобы увидеть использование функции AVG (вычисления среднего арифметического).

Характеристики

Тип файла
Документ
Размер
122,17 Kb
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6508
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее