Функции основные возможности языка sql. Функциональные возможности языка SQL. Выборка данных с использование предложения Select

2. описатели свободной и занятой памяти в страницах отношений. Эта информация необходима для поиска свободного места при занесении кортежа

3. связывание страниц одного компонента. Если в одном файле содержится несколько страниц отношений, то эти страницы надо както увязать. Использование ссылок и указателей проблематично, поэтому вводят управляющие структуры - связывание страниц. Использует косвенное индексирование страниц одного отношения на основе В-деревьев.

Язык SQL. Функции и основные возможности

1. Возможность в запросе группировать кортежи отношений результата по указанным полям в соответствии с условиями выборки на всю группу целиком.

2. В SQL не обязательно удалять кортежи-дубликаты как в результате, так и в промежуточном кортеже. Результатом выполнения запроса SQL является мультимножественный кортеж. В СУБД System R были реализованы все теоретикомножественные операторы.

В System R реализованы 4 оператора манипулирования данными и 2 оператора создания представления.

Также дополнительные операторы позволяют вносить изменения в структуру таблицы.

Определение ограничения целостности и тригеров

В System R средства поддержки целостности БД – это asserHon (исключения) – логическое выражение, вып-е над всей БД, ложность которого говорила о нецелостности БД. Ограничения целостности делились на 2 класса:

1. проверяемый после выполнения оператора манипулирования(транзакции)

2. по требованию специального оператора INFORCE INTEGRITY

Типы предикатов отличались для этих групп. В System R был впервые реализован механизм триггеров, которые служили для автоматического поддержания целостности БД. При определении триггера задавалось условие его применения, и при условии true триггер срабатывал.

Представление БД

Для определения представлений используется аппарат операторов выборки.

Определение управляющих структур

Определение управляющих структур представляет индексы и связи. В SQL появилось четкое представление того, как представлять индексы и связи.

Основные операторы:

GRANT – «Разрешить

REVOKE – «собрать» права

Точки сохранения и отката транзакций. Встроенный SQL

Встроенный SQL – это специальные операторы, поддерживающие возможность выполнения SQL операторов в традиционных языках программирования.

ESQL/C – язык С с возможностью написания запросов.

Основная проблема со встраиванием – проблема сопряженности декларированных и процедурных языков программирования.

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

Основные операторы над курсорами: OPEN CURSOR

Динамический SQL

Механизм, позволяющий выполнять операторы SQL на этапе компиляции.

1. Ограничение уникальности (не более одного первичного ключа)

3. Проверочное ограничение (специфицирует условие, которому должна удовлетворять каждая строка таблицы)

Определение представлений.

Механизм представлений view является мощным средством SQL, позволяющим скрыть от пользователя реальную структуру БД, за счёт по сути хранимого в базе запроса с именованными столбцами.

Для пользования view (или представления)ничем не отличается от базовой таблицы. Представление реально накладывается на таблицу всякий раз в момент выполнения.

Стандарт SQL-89, механизм представлений определяется следующим образом:

::=

CREATE VIEW

[()] AS

< view column list>::= [{}]

Представляется некая таблица, являющаяся изменяемой, т.е. к ней применяются операторы DELETE или UPDATE только в том случае, если выполняются следующие операции запросов:

1. не указано ключевое слово DISTINCT

2. каждое арифметическое выражение в списке выборки представляет собой одну спецификацию столбца

3. в разделе FROM указана одна таблица

4. в разделе WHERE нет подзапросов

5. нет разделов GROUP BY HAVING

Требование WITH CHECK OPTION имеет смысл случае изменяемого представления с разделом WHERE. Это требование запрещает появление в базовой таблице строк, которые не видны в представлении (т.е. те строки, которые не удовлетворяют условию WHERE в запросах).

Определение привилегий.

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

Привилегии определяются следующим образом:

< privilege definition >::=

GRAND ON

TO

[ g ,grante 3… ] ::= ALL PRIVILEGES | [{,}..]

::= SELECT | UPTDATE | INSERT | DELETE | REFERENCES []

::= PUBLICK |

Средства манипулирования данными.

Структура запросов.

::= []

::= | UNION

::= | ()

::=(SELECT

)

INTO

::= SELECT

::= [] [] [] []

Язык SQL подразумевает 3 типа конструкций SELECT:

1. cursor specification

2. select statement

3. subquery

table expression – основа всех синтаксических конструкций.

1. Спецификация курсора – курсор конструктора SQL, позволяет получить построчный доступ к результатам выполнения запроса в БД. К табличным выражениям, участвующим в спецификации курсора, особых требований не предъявляется.

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

План

Введение………………………………………………...…………………………3

Глава I. Теоретические сведения о языке запросов SQL……………...………..4

1.1. Понятие о реляционной базе данных…………………………..…………4

1.2. Понятие о SQL-языке…………………………………………...………...10

1.3. Интерактивный и вложенный SQL……………………………...……….12

1.4. Субподразделения SQL……………………………………………...……13

1.5. Типы данных………………………………………………………...…….13

1.6. SQL-несогласованности……………………………………………...…...16

Глава II. Использование языка SQL для извлечения информации………...…18

2.1. Создание запроса………………………………………………………...….18

2.2. Команда SELECT……………………………………………………...…….19

2.3. Команда DISTINCT..……………………………………………………......22

2.4. Предложения команд……………………………………………………….24

Заключение…………………………………………………………………...…..27

Список использованной литературы……………………………………..…….28

Введение

Большинство современных СУБД построено на реляционной модели данных. Для получения информации из отношений (таблиц) базы данных в качестве языка манипулирования данными в теоретическом плане используются три абстрактных языка: язык реляционной алгебры; язык реляционного исчисления на кортежах; язык реляционного исчисления на доменах.

В качестве практического языка работы с данными в середине 70-х годов фирмой IBM разработан язык структурных запросов SQL, ставший впоследствии стандартом de-facto при работе с базами данных. Наметившееся в настоящее время переход к крупным корпоративным СУБД типа Oracle, Informix, Sybase, DB2, Progress делает актуальным изучение языка SQL как в практическом плане, так и чисто теоретически, поскольку в основе элементов языка SQL лежат положения теории отношений, теории множеств и логики.

Цель курсовой работы - анализ возможностей языка SQL.

Для достижения поставленной цели необходимо решить следующие задачи:

· Изучить литературу по теме;

· Рассмотреть структуру SQL;

· Определить спецификацию и стандарты языка;

· Изучить применение SQL для извлечения информации.

Глава I . Теоретические сведения о языке запросов SQL

1.1. Понятие о реляционной базе данных

SQL (обычно произносится как "Sequel") символизирует собой Структурированный Язык Запросов. Это - язык, который дает возможность работать в реляционных базах данных, которые являются наборами связанной информации сохраняемой в таблицах.

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

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

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

Стандарт SQL определяется ANSI (Американским Национальным Институтом Стандартов) и в данное время также принимается ISO (Международной организацией по стандартизации). Однако, большинство коммерческих программ баз данных расширяют SQL без уведомления ANSI, добавляя разные другие особенности в этот язык, которые, как они считают, будут весьма полезны. Иногда они несколько нарушают стандарт языка, хотя хорошие идеи имеют тенденцию развиваться и вскоре становиться стандартами "рынка" сами по себе в силу полезности своих качеств.

Реляционная база данных - это тело связанной информации, сохраняемой в двумерных таблицах. Напоминает адресную или телефонную книгу. В книге имеется большое количество входов, каждый из которых соответствует определенной особенности. Для каждой такой особенности, может быть несколько независимых фрагментов данных, например имя, телефонный номер, и адрес. Предположим, что вы должны сформатировать эту адресную книгу в виде таблицы со строками и столбцами. Каждая строка (называемая также записью) будет соответствовать определенной особенности; каждый столбец будет содержать значение для каждого типа данных - имени, телефонного номера, и адреса представляемого в каждой строке. Адресная книга могла бы выглядеть следующим образом:

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

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

Много мощных функций можно выполнить извлекая информацию из этих таблиц согласно указанным параметрам, особенно когда эти параметры включают в себя фрагменты информации связанные в различных таблицах друг с другом. Например, возьмем - докторов. Предположим доктор Halben захотел получить номера телефонов всех своих пациентов. Чтобы извлечь эту информацию, он мог бы связать таблицу с номерами телефонов пациентов (по адресной книге) с таблицей, которая бы указывала, какой из пациентов - его. Хотя, в этом простом примере, он мог бы держать это в голове и сразу получать номера телефонов пациентов Grillet и Brock, эти таблицы могут быть слишком большими и слишком сложными. Программы реляционной базы данных разрабатывались для того чтобы обрабатывать большие и сложные совокупности данных такого типа, что очевидно является более универсальным методом в деловом мире. Даже если бы база данных больницы содержала сотни или тысячи имен - как это вероятно и бывает на практике - одна команда SQL могла бы выдать доктору Halben информацию в которой он нуждался почти немедленно.

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

Рассмотрим вторую таблицу. Иногда необходимо видеть эту информацию упорядоченной в алфавитном порядке по именам, иногда в возрастающем или убывающем порядке, а иногда сгруппированной по отношению к какому-нибудь доктору. Наложение порядка набора в строках будет сталкиваться со способностью заказчика изменять его, поэтому строки всегда рассматриваются как неупорядоченные. По этой причине, вы не можете просто сказать: " Мы хотим посмотреть пятую строку таблицы. " Пренебрегая порядком, в котором данные вводились или любым другим критерием, мы определим, не ту строку, хотя она и будет пятой. Строки таблицы, которые рассматриваются, не будут в какой-либо определенной последовательности.

По этим и другим причинам, вы должны иметь столбец в вашей таблице который бы уникально идентифицировал каждую строку. Обычно, этот столбец содержит номер - например, номер пациента назначаемый каждому пациенту. Конечно, вы могли бы использовать имя пациентов, но возможно, что имеется несколько Mary Smiths; и в этом случае, вы не будете иметь другого способа, чтобы отличить этих пациентов друг от друга.

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

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

В отличие от строк, столбцы таблицы (также называемые полями) упорядочиваются и именуются. Таким образом, в нашей таблице адресной книги, возможно указать на " адрес столбца " или на " столбец 3 ". Конечно, это означает, что каждый столбец данной таблицы должен иметь уникальное имя чтобы избежать неоднозначности. Лучше всего если эти имена указывают на содержание поля.

Таблицы 1.1, 1.2, и 1.3 составляют реляционную базу данных, которая является минимально достаточной, чтобы легко ее отслеживать, и достаточно полной, чтобы иллюстрировать главные понятия и практику использования SQL.

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

Таблица 1.1 - Продавцы

Таблица 1.2 - Заказчики

Таблица 1.3 - Порядки

Например, поле snum в таблице Заказчиков указывает, какому продавцу назначен данный заказчик. Номер поля snum связан с таблицей Продавцов, которая дает информацию об этих продавцах. Очевидно, что продавец которому назначены заказчики должен уже существовать - то есть, значение snum из таблицы Заказчиков должно также быть представлено в таблице Продавцов. Если это так, то говорят, что " система находится в состоя нии справочной целостности "

Рассмотрим эти три таблицы и значения их полей.

Здесь показаны столбцы Таблицы 1.1

Таблица 1.2 содержит следующие столбцы:

И имеются столбцы в Таблице 1.3:

1.2. Понятие о SQL -языке

SQL это язык, ориентированный специально на реляционные базы данных. Он устраняет много работы, которую вы должны были бы сделать, если бы вы использовали универсальный язык программирования, например C. Чтобы сформировать реляционную базу данных на C, вам необходимо было бы начать с самого начала. Вы должны были бы определить объект - называемый таблицей, которая могла бы расти, чтобы иметь любое число строк, а затем создавать постепенно процедуры для помещения значений в нее и извлечения из них. Если бы вы захотели найти некоторые определенные строки, вам необходимо было бы выполнить по шагам процедуру, подобную следующей:

Рассмотрите строку таблицы.

Выполните проверку - является ли эта строка одной из строк которая вам нужна.

Если это так, сохраните ее где-нибудь пока вся таблица не будет проверена.

Проверьте имеются ли другие строки в таблице.

Если имеются, возвратитесь на шаг 1.

Если строк больше нет, вывести все значения сохраненные в шаге 3.

(Конечно, это не фактический набор C команд, а только логика шагов которые должны были бы быть включены в реальную программу). SQL сэкономит все это. Команды в SQL могут работать со всеми группами таблиц как с единым объектом и могут обрабатывать любое количество информации извлеченной или полученной из их, в виде единого модуля.

Стандарт SQL определяется с помощью кода ANSI (Американский Национальный Институт Стандартов). SQL не изобретался ANSI. Это по существу изобретение IBM. После того как появился ряд конкурирующих программ SQL на рынке, ANSI определил стандарт к которому они должны быть приведены (определение таких стандартов и является функцией ANSI).

Однако после этого, появились некоторые проблемы. Возникли они в результате стандартизации ANSI в виде некоторых ограничений. Так как не всегда ANSI определяет то что является наиболее полезным, то программы пытаются соответствовать стандарту ANSI не позволяя ему ограничивать их слишком сильно. Это, в свою очередь, ведет к случайным несогласованностям. Программы Баз Данных обычно дают ANSI SQL дополнительные особенности и часто ослабляют многие ограничения из большинства из них.

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

Команды, или предложения, являются инструкциями, которыми мы обращаемся к SQL базе данных. Команды состоят из одной или более отдельных логических частей называемых предложениями. Предложения начинаются ключевым словом для которого они являются проименованными, и состоят из ключевых слов и аргументов. Например предложения с которыми мы можем сталкиваться - это " FROM Salespeople " и " WHERE city = "London".

Аргументы завершают или изменяют значение предложения. В примерах выше, Salespeople - аргумент, а FROM - ключевое слово предложения FROM.

Аналогично, " city = "London" " - агрумент предложения WHERE. Объекты - структуры в базе данных которым даны имена и сохраняются в памяти.

Они включают в себя базовые таблицы, представления (два типа таблиц), и индексы.

1.3. Интерактивный и вложенный SQL

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

Вложенный SQL состоит из команд SQL помещенных внутри программ, которые обычно написаны на некотором другом языке (типа КОБОЛА или Паскаля).

Это делает эти программы более мощными и эффективным. Однако, допуская эти языки, приходится иметь дело с структурой SQL и стилем управления данных который требует некоторых расширений к интерактивному SQL. Передача SQL команд во вложенный SQL является выдаваемой ("passed off") для переменных или параметров используемых программой в которую они были вложены.

1.4. Субподразделения SQL

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

К сожалению, эти термины не используются повсеместно во всех реализациях. Они подчеркиваются ANSI и полезны на концептуальном уровне, но большинство SQL программ практически не обрабатывают их отдельно, так что они по существу становятся функциональными категориями команд SQL.

DDL (Язык Определения Данных) - так называемый Язык Описания Схемы в ANSI, состоит из команд, которые создают объекты (таблицы, индексы, просмотры, и так далее) в базе данных.

DML (Язык Манипулирования Данными) - это набор команд которые определяют какие значения представлены в таблицах в любой момент времени.

DCD (Язык Управления Данными) состоит из средств которые определяют, разрешить ли пользователю выполнять определенные действия или нет. Они являются составными частями DDL в ANSI. Это не различные языки, а разделы команд SQL сгруппированных по их функциям.

1.5. Типы данных

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

В SQL, это делается с помощью назначения каждому полю - типа данных который указывает на тип значения, которое это поле может содержать.

Все значения в данном поле должны иметь одинаковый тип. В таблице Заказчиков, например, cname и city - содержат строки текста для оценки, snum, и cnum - это уже номера. По этой причине, вы не можете ввести значение Highest (Наивысший) или значение None (Никакой) в поле rating, которое имеет числовой тип данных. Это ограничение удачно, так как оно налагает некоторую структурность на ваши данные. Вы часто будете сравнивать некоторые или все значения в данном поле, поэтому вы можете выполнять действие только на определенных строках, а не на всех. Вы не могли бы сделать этого, если бы значения полей имели смешанный тип данных.

К сожалению, определение этих типов данных является основной областью, в которой большинство коммерческих программ баз данных и официальный стандарт SQL, не всегда совпадают. ANSI SQL стандарт распознает только текст и тип номера, в то время как большинство коммерческих программ используют другие специальные типы. Такие как, DATA (ДАТА) и TIME (ВРЕМЯ) - фактически почти стандартные типы (хотя точный формат их меняется). Некоторые пакеты также поддерживают такие типы, как например MONEY (ДЕНЬГИ) и BINARY (ДВОИЧНЫЕ). (MONEY - это специальная система исчисления используемая компьютерами. Вся информация в компьютере передается двоичными числами и затем преобразовываются в другие системы, что бы мы могли легко использовать их и понимать).

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

Сложность числовых типов ANSI можно, по крайней мере частично, объяснить усилием сделать вложенный SQL, совместимым с рядом других языков.

Два типа чисел ANSI, INTEGER (ЦЕЛОЕ ЧИСЛО) и DECIMAL (ДЕСЯТИЧНОЕ ЧИСЛО) (которые можно сокращать как INT и DEC, соответственно), будут адекватны для наших целей, также как и для целей большинства практических деловых прикладных программ. Естественно, что тип ЦЕЛОЕ можно представить как ДЕСЯТИЧНОЕ ЧИСЛО, которое не содержит никаких цифр справа от десятичной точки.

Тип для текста - CHAR (или СИМВОЛ), который относится к строке текста. Поле типа CHAR имеет определенную длину, которая определяется максимальным числом символов, которые могут быть введены в это поле.

Больше всего реализаций также имеют нестандартный тип называемый VARCHAR (ПЕРЕМЕННОЕ ЧИСЛО СИМВОЛОВ), который является текстовой строкой которая может иметь любую длину до определенного реализацией максимума (обычно 254 символа). CHARACTER и VARCHAR значения включаются в одиночные кавычки как "текст". Различие между CHAR и VARCHAR в том, что CHAR должен резервировать достаточное количество памяти для максимальной длины строки, а VARCHAR распределяет память так как это необходимо.

Символьные типы состоят из всех печатных символов, включая числа.

Однако, номер 1 не то же что символ "1". Символ "1" - только другой печатный фрагмент текста, не определяемый системой как наличие числового значения 1.

Например 1 + 1 = 2, но "1" + "1" не равняется "2".

Символьные значения сохраняются в компьютере как двоичные значения, но показываются пользователю как печатный текст. Преобразование следует за форматом определяемым системой, которую вы используете. Этот формат преобразования будет одним из двух стандартных типов (возможно с расширениями) используемых в компьютерных системах: в ASCII коде (используемом во всех персональных и малых компьютерах) и EBCDIC коде (Расширенном Двоично-Десятичном Коде Обмена Информации) (используемом в больших компьютерах). Определенные операции, такие как упорядочивание в алфавитном порядке значений поля, будет изменяться вместе с форматом.

1.6. SQL несогласованности

Имеются самостоятельные несогласованности внутри продуктов мира SQL. SQL появился из коммерческого мира баз данных как инструмент, и был позже превращен в стандарт ANSI. К сожалению, ANSI не всегда определяет наибольшую пользу, поэтому программы пытаются соответствовать стандарту ANSI не позволяя ему ограничивать их слишком сильно. ANSI - вид минимального стандарта - вы можете делать больше чем он это позволяет, но вы должны быть способны получить те же самые результаты что и при выполнении той же самой задачи.

SQL обычно находится в компьютерных системах которые имеют больше чем одного пользователя, и следовательно должны делать различие между ними. Обычно, в такой системе, каждый пользователь имеет некий вид кода проверки прав который идентифицирует его или ее (терминология изменяется). В начале сеанса с компьютером, пользователь входит в систему (регистрируется), сообщая компьютеру, кто этот пользователь, идентифицированный с помощью определенного ID(Идентификатора). Любое количество людей использующих тот же самый ID доступа, являются отдельными пользователями; и аналогично, один человек может представлять большое количество пользователей (в разное время), используя различные доступные Идентификаторы.

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

Специальное значение - USER (ПОЛЬЗОВАТЕЛЬ) может использоваться как аргумент в команде. Оно указывает на доступный Идентификатор пользователя, выдавшего команду.

Выводы по главе I :

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

Также было дано понятие SQL-языку, его некоторые условные обозначения и термины, рассмотрена его структура, использование SQL-языка, предоставление данных и их определение (и некоторые несогласованности появляющиеся при этом).

Глава II . Использование языка SQL для извлечения информации из таблиц

2.1. Создание запроса

SQL символизирует собой Структурированный Язык Запросов. Запросы - вероятно наиболее часто используемый аспект SQL. Фактически, для категории SQL пользователей, маловероятно чтобы кто-либо использовал этот язык для чего-то другого. По этой причине, мы будем начинать наше обсуждение SQL с обсуждения запроса и как он выполняется на этом языке.

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

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

Все запросы в SQL состоят из одиночной команды. Структура этой команды обманчиво проста, потому что вы должны расширять ее так чтобы выполнить высоко сложные оценки и обработки данных. Эта команда называется - SELECT (ВЫБОР).

2.2. К оманда SELECT

В самой простой форме, команда SELECT просто инструктирует базу данных чтобы извлечь информацию из таблицы. Например, можно вывести таблицу Продавцов, напечатав следующее:

SELECT snum, sname, sity, comm

FROM Salespeople;

Вывод для этого запроса показывается в таблице 2.1.

Таблица 2.1 - Команда SELECT

SQL Execution Log

SELECT snum, sname, sity, comm FROM Salespeople;

Другими словами, эта команда просто выводит все данные из таблицы. Большинство программ будут также давать заголовки столбца как выше, а некоторые позволяют детальное форматирование вывода, но это уже вне стандартной спецификации.

Имеется объяснение каждой части этой команды:

SELECT - ключевое слово, которое сообщает базе данных что эта команда - запрос. Все запросы начинаются этим словом, сопровождаемым пробелом.

Snum, sname - это - список столбцов из таблицы которые выбираются запросом. Любые столбцы не перечисленные здесь не будут включены в вывод команды. Это, конечно, не значит что они будут удалены или их информация будет стерта из таблиц, потому что запрос не воздействует на информацию в таблицах; он только показывает данные.

FROM FROM - ключевое слово, подобно SELECT, которое должно Salespeople быть представлено в каждом запросе. Оно сопровождается пробелом и затем именем таблицы используемой в качестве источника информации. В данном случае - это таблица Продавцов (Salespeople).

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

В некоторых системах наклонная черта влево (\) в строке, является индикатором конца команды.

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

Использование возврата (Клавиша ENTER) является произвольным. Нужно точно установить, как удобнее составить запрос, в несколько строк или в одну строку, следующим образом:

SELECT snum, sname, city, comm FROM Salespeople;

С тех пор как SQL использует точку с запятой чтобы указывать конец команды, большинство программ SQL обрабатывают возврат (через нажим Возврат или клавишу ENTER) как пробел. Это - хорошая идея, чтобы использовать возвраты и выравнивание, чтобы сделать ваши команды более легкими для чтения и более правильными.

Звездочка (*) может применяться для вывода полного списка столбцов следующим образом:

FROM Salespeople;

Это приведет к тому же результату что и предыдущая команда.

В общем случае, команда SELECT начинается с ключевого слова SELECT, сопровождаемого пробелом. После этого должен следовать список имен столбцов которые вы хотите видеть, отделяемые запятыми. Чтобы увидеть все столбцы таблицы, можно заменить этот список звездочкой (*). Ключевое слово FROM следующее далее, сопровождается пробелом и именем таблицы запрос к которой делается. В заключение, точка с запятой (;) должна использоваться чтобы закончить запрос и указать что команда готова к выполнению.

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

SELECT sname, comm

FROM Salespeople;

будет производить вывод показанный в Таблице 2.2:

Таблица 2.2 - Выбор определенных столбцов

SQL Execution Log

SELECT snum, comm FROM Salespeople;

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

Даже если столбцы таблицы, по определению, упорядочены, это не означает что они будут восстанавливаться в том же порядке. Конечно, звездочка (*) покажет все столбцы в их естественном порядке, но если они будут указаны отдельно, мы можем получить их в нужном порядке. Рассмотрим таблицу Порядков, содержащую дату приобретения (odate), номер продавца (snum), номер порядка (onum), и суммы приобретения (amt):

SELECT odate, snum, onum, amt

Вывод этого запроса показан в Таблице 2.3.

Таблица 2.3 - Реконструкция столбцов

SQL Execution Log

SELECT odate, snum, onum, amt FROM Orders;

Структура информации в таблицах - это просто основа для активной перестройки структуры в SQL.

2.3. Команда DISTINCT

Команда DISTINCT (ОТЛИЧИЕ) - аргумент, который способен устранять двойные значения из предложения SELECT. Предположим, что нам нужно, знать какие продавцы в настоящее время имеют свои порядки в таблице Порядков. Под порядком понимается запись в таблицу Порядков, регистрирующую приобретения сделанные в определенный день определенным заказчиком у определенного продавца на определенную сумму. Нам не нужно знать, сколько порядков имеет каждый; нам нужен только список номеров продавцов (snum). Поэтому можно ввести:

для получения вывода показанного в Таблице 2.4.

Таблица 2.4 - SELECT с дублированием номеров продавцов

SQL Execution Log

SELECT snum FROM Orders;

Для получения списка без дубликатов, для удобочитаемости, можно ввести следующее:

SELECT DISTINCT snum

Вывод для этого запроса показан в Таблице 2.5.

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

DISTINCT может указываться только один раз в данном предложении SELECT. Если предложение выбирает многочисленные поля,

Таблица 2.5 - SELECT без дублирования

SQL Execution Log

SELECT DISTINCT snum FROM Orders;

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

Вместо DISTINCT, можно указать - ALL. Это будет иметь противоположный эффект, дублирование строк вывода сохранится. Так как это - тот же самый случай, когда не указывается ни DISTINCT ни ALL, то ALL - по существу скорее пояснительный, а не действующий аргумент.

2.4. Предложения команд

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

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

SELECT sname, city

FROM Salespeople;

WHERE city = "LONDON";

Когда предложение WHERE представлено, программа базы данных просматривает всю таблицу по одной строке и исследует каждую строку чтобы определить верно ли утверждение. Следовательно, для записи Peel, программа рассмотрит текущее значение столбца city, определит что оно равно "London", и включит эту строку в вывод. Запись для Serres не будет включена, и так далее.

Вывод для вышеупомянутого запроса показан в Таблице 2.6.

Таблица 2.6 - SELECT c предложением WHERE

SQL Execution Log

SELECT sname, city FROM Salespeople WHERE city = "London"

Попробуем пример с числовым полем в предложении WHERE. Поле rating таблицы Заказчиков предназначено чтобы разделять заказчиков на группы основанные на некоторых критериях которые могут быть получены в итоге через этот номер. Возможно это - форма оценки кредита или оценки основанной на томе предыдущих приобретений. Такие числовые коды могут быть полезны в реляционных базах данных как способ подведения итогов сложной информации. Можно выбрать всех заказчиков с рейтингом 100, следующим образом:

WHERE rating = 100;

Одиночные кавычки не используются здесь потому, что оценка - это числовое поле. Результаты запроса показаны в Таблице 2.7.

Можно использовать номера столбцов, устранять дубликаты, или переупорядочивать столбцы в команде SELECT которая использует WHERE. Однако можно изменять порядок столбцов для имен только в предложении SELECT, но не в предложении WHERE.

Таблица 2.7 - SELECT с числовым полем в предикате

SQL Execution Log

SELECT * FROM Customers WHERE rating = 100;

В ыводы по главе II :

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

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

Заключение

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

Язык SQL обычно используется вместе с универсальными языками программирования Си, Паскаль и др., или языками управления базами данных Fox, dBASE IV и др.

Список использованной литературы

1. Ф. Андон, В. Резниченко Язык запросов SQL: Учебный курс. - СПб: Питер, 2006.

2. К. Дейт Руководство по реляционной СУБД DB2. - М.: Финансы и статистика, 1988. - 320 с.

3. В.В. Кириллов Основы проектирования реляционных баз данных. Учебное пособие. - СПб.: ИТМО, 1994. - 90 с.

4. М. Мейер Теория реляционных баз данных. - М.: Мир, 1987. - 608 с.

5. Распределенные СУБД. Informix. Ч.1. Основы работы с базами данных. - Методические указания для выполнения лабораторных работ / В.М. Стасышин - Новосибирск: НГТУ, 1995.

6. Дж. Ульман Базы данных на Паскале. - М.: Машиностроение, 1990. - 386 с.

Подобные документы

    Общие данные об основных операторах языка SQL. Интерактивный режим работы. Использование языка SQL для выбора информации из таблиц, для вставки, редактирования и удаления данных в них. Связь между операциями реляционной алгебры и операторами языка SQL.

    реферат , добавлен 06.02.2015

    Понятие и общая характеристика языка программирования РНР, принципы и этапы его работы, синтаксис и ассоциируемые массивы. Обработка исключений в языке Java. Работа с базами данных с помощью JDBC. Изучение порядка разработки графического интерфейса.

    презентация , добавлен 13.06.2014

    Понятие реляционной модели данных, целостность ее сущности и ссылок. Основные этапы создания базы данных, связывание таблиц на схеме данных. Проектирование базы данных книжного каталога "Books" с помощью СУБД Microsoft Access и языка запросов SQL.

    курсовая работа , добавлен 25.11.2010

    Общие сведения об истории создания и стандартах SQL: международный стандарт 1989 г., 1992 г. (SQL2), стандарт SQL: 1999 (SQL3). Интерактивный и вложенный SQL. Cубподразделения SQL. Структурированный язык запросов для создания и изменения таблиц.

    реферат , добавлен 14.10.2011

    Язык структурированных запросов SQL (Structured Query Language) и его место в сфере доступа к информации в реляционных базах данных. Структура и основные типы данных языка. Синтаксис и семантика главных операторов SQL, последние стандарты языка.

    реферат , добавлен 29.03.2012

    Теоретические сведения и основные понятия баз данных. Системы управления базами данных: состав, структура, безопасность, режимы работы, объекты. Работа с базами данных в OpenOffice.Org BASE: создание таблиц, связей, запросов с помощью мастера запросов.

    курсовая работа , добавлен 28.04.2011

    Различия между существующими диалектами SQL. Стандартизация языка SQL. Концепция баз данных. Эффективность организации данных. Структура языка SQL. Приближенные числовые типы. Интервальный тип данных. Обработка сложно структурированной информации.

    курсовая работа , добавлен 29.05.2014

    Общие сведения о системах управления базами данных MS Access. Использование языка QBE для создания запросов на выборку данных. Параметрические и перекрестные запросы. Запросы с автоподстановкой, на выборку дубликатов и записей, не имеющих соответствия.

    курсовая работа , добавлен 03.06.2015

    Проектирование реляционной базы данных с помощью прикладного программного средства MS ACCESS. Описания особенностей использования запросов для извлечения, изменения и удаления информации из базы данных. Характеристика структуры интерфейса пользователя.

    курсовая работа , добавлен 19.11.2012

    Анализ предметной области с использованием моделей методологии ARIS и разработка ER-диаграммы. Описание входной и выходной информации для проектирования реляционной базы данных. Разработка управляющих запросов и связей между ними с помощью языка SQL.

  • Перевод
  • Tutorial
Надо “ SELECT * WHERE a=b FROM c ” или “ SELECT WHERE a=b FROM c ON * ” ?

Если вы похожи на меня, то согласитесь: SQL - это одна из тех штук, которые на первый взгляд кажутся легкими (читается как будто по-английски!), но почему-то приходится гуглить каждый простой запрос, чтобы найти правильный синтаксис.


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


SELECT members.firstname || " " || members.lastname AS "Full Name" FROM borrowings INNER JOIN members ON members.memberid=borrowings.memberid INNER JOIN books ON books.bookid=borrowings.bookid WHERE borrowings.bookid IN (SELECT bookid FROM books WHERE stock>(SELECT avg(stock) FROM books)) GROUP BY members.firstname, members.lastname;

Буэ! Такое спугнет любого новичка, или даже разработчика среднего уровня, если он видит SQL впервые. Но не все так плохо.


Легко запомнить то, что интуитивно понятно, и с помощью этого руководства я надеюсь снизить порог входа в SQL для новичков, а уже опытным предложить по-новому взглянуть на SQL.


Не смотря на то, что синтаксис SQL почти не отличается в разных базах данных, в этой статье для запросов используется PostgreSQL. Некоторые примеры будут работать в MySQL и других базах.

1. Три волшебных слова

В SQL много ключевых слов, но SELECT , FROM и WHERE присутствуют практически в каждом запросе. Чуть позже вы поймете, что эти три слова представляют собой самые фундаментальные аспекты построения запросов к базе, а другие, более сложные запросы, являются всего лишь надстройками над ними.

2. Наша база

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







У нас есть книжная библиотека и люди. Также есть специальная таблица для учета выданных книг.

  • В таблице "books" хранится информация о заголовке, авторе, дате публикации и наличии книги. Все просто.
  • В таблице “members” - имена и фамилии всех записавшихся в библиотеку людей.
  • В таблице “borrowings” хранится информация о взятых из библиотеки книгах. Колонка bookid относится к идентификатору взятой книги в таблице “books”, а колонка memberid относится к соответствующему человеку из таблицы “members”. У нас также есть дата выдачи и дата, когда книгу нужно вернуть.

3. Простой запрос

Давайте начнем с простого запроса: нам нужны имена и идентификаторы (id) всех книг, написанных автором “Dan Brown”


Запрос будет таким:


SELECT bookid AS "id", title FROM books WHERE author="Dan Brown";

А результат таким:


id title
2 The Lost Symbol
4 Inferno

Довольно просто. Давайте разберем запрос чтобы понять, что происходит.

3.1 FROM - откуда берем данные

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


FROM указывает на таблицу, по которой нужно делать запрос. Это может быть уже существующая таблица (как в примере выше), или таблица, создаваемая на лету через соединения или подзапросы.

3.2 WHERE - какие данные показываем

WHERE просто-напросто ведет себя как фильтр строк , которые мы хотим вывести. В нашем случае мы хотим видеть только те строки, где значение в колонке author - это “Dan Brown”.

3.3 SELECT - как показываем данные

Теперь, когда у нас есть все нужные нам колонки из нужной нам таблицы, нужно решить, как именно показывать эти данные. В нашем случае нужны только названия и идентификаторы книг, так что именно это мы и выберем с помощью SELECT . Заодно можно переименовать колонку используя AS .


Весь запрос можно визуализировать с помощью простой диаграммы:


4. Соединения (джойны)

Теперь мы хотим увидеть названия (не обязательно уникальные) всех книг Дэна Брауна, которые были взяты из библиотеки, и когда эти книги нужно вернуть:


SELECT books.title AS "Title", borrowings.returndate AS "Return Date" FROM borrowings JOIN books ON borrowings.bookid=books.bookid WHERE books.author="Dan Brown";

Результат:


Title Return Date
The Lost Symbol 2016-03-23 00:00:00
Inferno 2016-04-13 00:00:00
The Lost Symbol 2016-04-19 00:00:00

По большей части запрос похож на предыдущий за исключением секции FROM . Это означает, что мы запрашиваем данные из другой таблицы . Мы не обращаемся ни к таблице “books”, ни к таблице “borrowings”. Вместо этого мы обращаемся к новой таблице , которая создалась соединением этих двух таблиц.


borrowings JOIN books ON borrowings.bookid=books.bookid - это, считай, новая таблица, которая была сформирована комбинированием всех записей из таблиц "books" и "borrowings", в которых значения bookid совпадают. Результатом такого слияния будет:



А потом мы делаем запрос к этой таблице так же, как в примере выше. Это значит, что при соединении таблиц нужно заботиться только о том, как провести это соединение. А потом запрос становится таким же понятным, как в случае с «простым запросом» из пункта 3.


Давайте попробуем чуть более сложное соединение с двумя таблицами.


Теперь мы хотим получить имена и фамилии людей, которые взяли из библиотеки книги автора “Dan Brown”.


На этот раз давайте пойдем снизу вверх:


Шаг Step 1 - откуда берем данные? Чтобы получить нужный нам результат, нужно соединить таблицы “member” и “books” с таблицей “borrowings”. Секция JOIN будет выглядеть так:


borrowings JOIN books ON borrowings.bookid=books.bookid JOIN members ON members.memberid=borrowings.memberid

Результат соединения можно увидеть по ссылке .


Шаг 2 - какие данные показываем? Нас интересуют только те данные, где автор книги - “Dan Brown”


WHERE books.author="Dan Brown"

Шаг 3 - как показываем данные? Теперь, когда данные получены, нужно просто вывести имя и фамилию тех, кто взял книги:


SELECT members.firstname AS "First Name", members.lastname AS "Last Name"

Супер! Осталось лишь объединить три составные части и сделать нужный нам запрос:


SELECT members.firstname AS "First Name", members.lastname AS "Last Name" FROM borrowings JOIN books ON borrowings.bookid=books.bookid JOIN members ON members.memberid=borrowings.memberid WHERE books.author="Dan Brown";

Что даст нам:


First Name Last Name
Mike Willis
Ellen Horton
Ellen Horton

Отлично! Но имена повторяются (они не уникальны). Мы скоро это исправим.

5. Агрегирование

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


Давайте продолжим наш пример, в котором появляются повторяющиеся имена. Видно, что Ellen Horton взяла больше одной книги, но это не самый лучший способ показать эту информацию. Можно сделать другой запрос:


SELECT members.firstname AS "First Name", members.lastname AS "Last Name", count(*) AS "Number of books borrowed" FROM borrowings JOIN books ON borrowings.bookid=books.bookid JOIN members ON members.memberid=borrowings.memberid WHERE books.author="Dan Brown" GROUP BY members.firstname, members.lastname;

Что даст нам нужный результат:


First Name Last Name Number of books borrowed
Mike Willis 1
Ellen Horton 2

Почти все агрегации идут вместе с выражением GROUP BY . Эта штука превращает таблицу, которую можно было бы получить запросом, в группы таблиц. Каждая группа соответствует уникальному значению (или группе значений) колонки, которую мы указали в GROUP BY . В нашем примере мы конвертируем результат из прошлого упражнения в группу строк. Мы также проводим агрегирование с count , которая конвертирует несколько строк в целое значение (в нашем случае это количество строк). Потом это значение приписывается каждой группе.


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



Можно прийти к логическому выводу, что все поля в результате должны быть или указаны в GROUP BY , или по ним должно производиться агрегирование. Потому что все другие поля могут отличаться друг от друга в разных строках, и если выбирать их SELECT "ом, то непонятно, какие из возможных значений нужно брать.


В примере выше функция count обрабатывала все строки (так как мы считали количество строк). Другие функции вроде sum или max обрабатывают только указанные строки. Например, если мы хотим узнать количество книг, написанных каждым автором, то нужен такой запрос:


SELECT author, sum(stock) FROM books GROUP BY author;

Результат:


author sum
Robin Sharma 4
Dan Brown 6
John Green 3
Amish Tripathi 2

Здесь функция sum обрабатывает только колонку stock и считает сумму всех значений в каждой группе.

6. Подзапросы


Подзапросы это обычные SQL-запросы, встроенные в более крупные запросы. Они делятся на три вида по типу возвращаемого результата.

6.1 Двумерная таблица

Есть запросы, которые возвращают несколько колонок. Хороший пример это запрос из прошлого упражнения по агрегированию. Будучи подзапросом, он просто вернет еще одну таблицу, по которой можно делать новые запросы. Продолжая предыдущее упражнение, если мы хотим узнать количество книг, написанных автором “Robin Sharma”, то один из возможных способов - использовать подзапросы:


SELECT * FROM (SELECT author, sum(stock) FROM books GROUP BY author) AS results WHERE author="Robin Sharma";

Результат:



Можно записать как: ["Robin Sharma", "Dan Brown"]


2. Теперь используем этот результат в новом запросе:


SELECT title, bookid FROM books WHERE author IN (SELECT author FROM (SELECT author, sum(stock) FROM books GROUP BY author) AS results WHERE sum > 3);

Результат:


title bookid
The Lost Symbol 2
Who Will Cry When You Die? 3
Inferno 4

Это то же самое, что:


SELECT title, bookid FROM books WHERE author IN ("Robin Sharma", "Dan Brown");

6.3 Отдельные значения

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


Давайте, к примеру, получим информацию о всех книгах, количество которых в библиотеке превышает среднее значение в данный момент.


Среднее количество можно получить таким образом:


select avg(stock) from books;

Что дает нам:


7. Операции записи

Большинство операций записи в базе данных довольно просты, если сравнивать с более сложными операциями чтения.

7.1 Update

Синтаксис запроса UPDATE семантически совпадает с запросом на чтение. Единственное отличие в том, что вместо выбора колонок SELECT "ом, мы задаем знаения SET "ом.


Если все книги Дэна Брауна потерялись, то нужно обнулить значение количества. Запрос для этого будет таким:


UPDATE books SET stock=0 WHERE author="Dan Brown";

WHERE делает то же самое, что раньше: выбирает строки. Вместо SELECT , который использовался при чтении, мы теперь используем SET . Однако, теперь нужно указать не только имя колонки, но и новое значение для этой колонки в выбранных строках.


7.2 Delete

Запрос DELETE это просто запрос SELECT или UPDATE без названий колонок. Серьезно. Как и в случае с SELECT и UPDATE , блок WHERE остается таким же: он выбирает строки, которые нужно удалить. Операция удаления уничтожает всю строку, так что не имеет смысла указывать отдельные колонки. Так что, если мы решим не обнулять количество книг Дэна Брауна, а вообще удалить все записи, то можно сделать такой запрос:


DELETE FROM books WHERE author="Dan Brown";

7.3 Insert

Пожалуй, единственное, что отличается от других типов запросов, это INSERT . Формат такой:


INSERT INTO x (a,b,c) VALUES (x, y, z);

Где a , b , c это названия колонок, а x , y и z это значения, которые нужно вставить в эти колонки, в том же порядке. Вот, в принципе, и все.


Взглянем на конкретный пример. Вот запрос с INSERT , который заполняет всю таблицу "books":


INSERT INTO books (bookid,title,author,published,stock) VALUES (1,"Scion of Ikshvaku","Amish Tripathi","06-22-2015",2), (2,"The Lost Symbol","Dan Brown","07-22-2010",3), (3,"Who Will Cry When You Die?","Robin Sharma","06-15-2006",4), (4,"Inferno","Dan Brown","05-05-2014",3), (5,"The Fault in our Stars","John Green","01-03-2015",3);

8. Проверка

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


Вот он в более удобном для чтения виде:


SELECT members.firstname || " " || members.lastname AS "Full Name" FROM borrowings INNER JOIN members ON members.memberid=borrowings.memberid INNER JOIN books ON books.bookid=borrowings.bookid WHERE borrowings.bookid IN (SELECT bookid FROM books WHERE stock> (SELECT avg(stock) FROM books)) GROUP BY members.firstname, members.lastname;

Этот запрос выводит список людей, которые взяли из библиотеки книгу, у которой общее количество выше среднего значения.


Результат:


Full Name
Lida Tyler

Надеюсь, вам удалось разобраться без проблем. Но если нет, то буду рад вашим комментариям и отзывам, чтобы я мог улучшить этот пост.

Теги: Добавить метки

Язык SQLсчитают декларативным в отличие от языков на которых пишутся программы – это значит что язык SQL описывает что нужно сделать, а не каким образом. Существует две формы языка SQL:

· Интерактивный режим (используется для создания вопросов пользователя и получения результатов в интерактивном режиме).

· Встроенный режим (состоит из команд SQL встроенных внутрь программ написанных на другом языке программирования.)

Основу языка SQLсоставляют операторы, распределенные между 3 компонентами этого языка:

1. Язык манипулирования данными – предназначен для поддержки БД и включает операторы добавления, изменения, удаления и выборки данных.

2. Язык определения данных – предназначен для создания изменения, удаления таблиц и всей БД в целом.

3. Язык управления данных – предназначен для обеспечения защиты от различного рода повреждений (СУБД гарантирует некоторую защиту автоматически).

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

Ключевые слова в выражениях на SQL могут прописываться как строчными, так и прописным, и буквами в одну или несколько строк. Каждый запрос должен заканчиваться «;». Зарезервированные слова не могут использоваться в качестве названия объектов БД.

Выборка данных с использование предложения Select.

Selectсписок_столбцовfromимя_таблицы.

Select * from товар where prise< 50000;

В конструкции whereмогут применятся следующие операторы:

2. IsNULL – выбираются все строки не имеющие значения в указанном поле. select * fromTovarwheresrok_godisnull.

3. Between – позволяет проверить вхождение какого-либо значения в диапазон определяемый граничными значениями. select * fromTovarwherepricebetween 100000 and 1000000.

4. In – проверяет вхождение какого-либо значения в список значений. Список значений указывается в круглых скобках, значения перечисляются через запятую.select * fromTovarwhereprice in(20000, 30000, 50000).

5. Like – соответствие – просматривает строковые значения с целью определения входит ли заданная в операторе likeстрока в символьную строку проверяемого поля. select * fromTovarwherenamelike‘ирис’; в операторе Likeмогут использоваться следующие символы для указания шаблона искомой строки:

А) ? – замещает любой ОДИН символ

Б) * - допускает в указанном месте наличие любой последовательности символов.

Сортировка данных в таблице

Selectspisokfromimya_tabl orderbyимя_столбца . Если сортировка производится по нескольким столбцам, то их указываем через запятую. Ask – повозрастанию, desc – поубыванию. Select * fromTovarorderbyprice

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

Selectсписок_столбцовfromимя_таблицыgroupbyстолбец_группировка.

Select avg (price) from Tovar group by kod_proiz;

Selectсписок_столбцовfromимя_таблицыgroupbyстолбец_группировкаhavingусловие; (группировка по условию).

Предложение havingопределяет критерии, по которому следует включать данные в группы. В условии, которое задается в предложение, havingуказывают только поля или выражение, которые на выходе имеют единственное значение для каждой выводимой группы.

Select avg (price) from Tovar group by kod_proizv having kod_proizv=1 or kod_proizv=2;

Sportsman
Id
Fio
Pol
vozrASt
Club
sport

Select fio, sport, club from sportsman;

Select * from sportsman where vozrast<18;

Select * from sportsman where pol like ‘ж*’;

Select * from sportsman where club like ‘спартак’;

Select * from sportsman where vozrast between 18 and 25;

Select avg(vozrast) from sportsman where sport like ‘волейбол’;

Select count(fio) from sportsman group by club;

Select * from sportsman where vozrast>25;

Select count(fio) from sportsman group by club having vozrast>25;

Вложенныезапросы

Select * from Tovar where kod_proiz in (select id from proizv where name like’А%’);

Select avg(price) from Tovar where kod_proiz in (select id from proizv where country like ‘Франция’);

Выполнение запросов во вложенном запросе начинается с наиболее вложенного, т.е. первый простейший запрос будет выполняться в последнюю очередь. Помимо вложенных запросов имеется другой способ объединения запросов при помощи оператора union в отличии от вложенных запросов union объединяет независимые запросы, т.е. они выполняются независимо друг от друга, а уже их вывод объединяется. Когда два или более запросов подвергаются объединению их столбцы вывода должны быть совместимы для объединения, т.е. каждый запрос должен указывать одинаковое количество столбцов, они должны быть перечислены в одинаковой последовательности и каждый должен иметь тип совместимый с каждым. Нельзя использовать union во вложенных запросах, а также нельзя использовать агрегирующие функции в запросах объединенных union.

Select name, price, kol from Tovar where price > 50000

select name, price,kol from Tovar where kod_proizv in (select id from proizv where country like ‘Франция’);

Манипулирование данными

К операторам манипулирования данными относятся вставка(insert), обновление (update) и удаление (delete).

Вставка записи.

Insertintoимя_таблицы[(поле1, … , полеn)] values (значение1, … , значение n);

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

Insert into Tovar values (1,’шоколад’, 100, 10500, ‘1 год’, 2);

Insertinto Tovar (id,name, price,kod_proizv values (2,”bhbc”,500,1));

Updateимя_таблицыsetзначения_столбца=значение ;

updateприменется ко всем записяи если нету where, если whereприсутствует то updasteприменяется к записям удовлетворяющим условиям.

Update Tovar set kol=kol+100;

Update Tovar set price=price*2 where kod_proizin(select id from proizvwhere country like ‘Франция’);

Delete from имя_таблицы;

Если условие отсутствует, то из таблицы удаляются все записи.

Delete from Tovar where srok_god is NULL;

Delete from proiz where license like ‘%2012’;

Организация данных в InterBase. Работа с доменами и таблицами.

Типы данных SQL:

Символьные типы данных:

1. char– один символ

2. char(n) –символьная строка фиксированной длины, где n – длина строки. Для хранения таких данных всегда отводится n байт вне зависимости от реальной длины.

3. varchar(n) – символьная строка переменной длины, для хранения данных этого типа отводится число байт соответствующее реальной длине строки.

Целочисленные данные:

1.integer/int – (-2147483647 - +2147483648) для хранения целочисленных данных отводится, как правило, 4 байта с указанным диапазоном значений.

2. smallint – (-32767 - +32768) короткое целое для хранения которого отводится 2 байта.

Вещественные типы данны:

1. float- вещественный тип данных для хранения которого отводится 8 байт.

2. smallfloat – для хранения данных отводится 4 байта.

4. decimal(p,n)–аналогичен floatр – количество значащих цифр, n – количество цифр после запятой.

Денежные типы данных:

1.money(p,n) – аналогичен типу данных decimal(p,n).Вводится только потому в некоторых СУБД, что для него используют специальные методы форматирования.

Дата и время:

1. date – для хранения даты.

2. time – для хранения времени.

3. interval – для хранения временного интервала.

4. datetime – для хранения моментов времени (год, месяц, число, часы, минуты, секунды, доли секунд).

Двоичные типы данных – позволяет хранить данные любого объема в двоичном коде:

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

Создание БД при помощи SQL запросов.

Create database имя_БД;

Пример: create database shop;

Drop database имя_БД;

Пример: Drop database shop;

Работастаблицами

Createtableимя_таблицы (имя_полятип_поля , …);

Create table proizvod (id int primary key, name varchar (20) not null, address varchar (30) not null, telvarchar (15) not null, country varchar (20) not null, license datetime);

Create table Tovar (id int primary key, name varchar (20) not null, kolsmallint not null, price int not null, srok_godvarchar(40) not null, kod_proizvint references proizvod (id));

Notnull – если указана эта конструкция, то элементы столбца всегда должны иметь определенное значение (не null)

Unique – значение каждого элемента столбца должно быть уникальным

Primarykey – столбец является первичным ключом

Параметры Unique и Primarykey являются взаимоисключаемыми.

Referencesимя_таблицы (имя_столбца) – данный столбец является внешним ключом, указывается имя таблицы и столбец на который он ссылается.

Удаление таблицы

Droptable<имя_таблицы>;

Пример: droptableTovar – удаление таблицы «товар»

Модификация таблицы

Добавление столбцов в таблицу:

Altertable<имя_таблицы>

ADD (<имя_столбца>тип_данных , …);

Alter table Tovar

Add (sostavvarchar (100) not null, opt_priceint not null);

Удаление столбцов из таблицы:

Altertable<имя_таблицы>

Drop (имя_строки1б имя_строки2, …);

Alter table Tovar

Drop (sostav, opt_price);

Изменение столбцов в таблице

Altertable<имя_таблицы>

Modify (имя_столбцатип_данных , …);

Modify (srok_goddatetime not null);

Функциональные возможности языка SQL

Основные функциональные возможности языка SQL приведены ниже.

Определение данных. Эта функция SQLпредставляет собой описание структуры поддерживаемых данных и организацию реляционных отношений (таблиц). Для ее реализации предназначены операторы создания базы данных, создания таблиц и доступа к данным.

Создание базы данных . Для создания новой базы данных используется оператор CREATE DATABASE. В структуре оператора указывается имя создаваемой базы данных.

Создание таблиц. Базовая таблица создается с помощью оператора CREATE TABLE. В этом операторе указываются имена полей, типы данных для них, длина (для некоторых типов данных). В SQL используются следующие типы данных:

INTEGER – целое число;

CHAR – символьное значение;

VARCHAR – символьное значение, сохраняются только непустые символы;

DECIMAL – десятичное число;

FLOAT – число с плавающей запятой;

DOUBLE PRECISION – удвоенная точность с плавающей точкой;

DATETIME – дата и время;

BOOL – булевое значение.

В операторе создания таблицы указываются ограничения на значения столбцов и на таблицу. Возможные ограничения показаны в табл. 4.8

Таблица 4.8 Ограничения на определяемые данные

Для реляционной модели данных существенным является указания внешнего ключа(FOREIGNKEY). При объявлении внешних ключей необходимо наложить соответствующие ограничения на столбец, например, NOT NULL.

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

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

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

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

Модификация данных предполагает изменения значений в одном или нескольких столбцах таблицы и выполняется с помощью оператора UPDATE. Пример:

SET сумма=сумма+1000.00

WHERE сумма>0

Удаление строк из таблицы осуществляется с помощью оператора DELETE. Синтаксис оператора имеет вид:

FROM таблица

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

Обеспечение целостности данных. Язык SQL позволяет определить достаточно сложные ограничения целостности, удовлетворение которым будет проверяться при всех модификациях базы данных. Контроль за результатами транзакций, обработка возникающих ошибок и координирование параллельной работы с базой данных нескольких приложений или пользователей обеспечивается операторами COMMIT(фиксирует удачное окончание текущей транзакции и начало новой) и ROLLBACK (необходимость отката – автоматического восстановления состояния базы данных на начало транзакции)

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

В SQL можно создавать вложенные последовательности запросов (подзапросы). Существуют определенные типы запросов, которые лучше реализовывать с помощью подзапросов. К таким запросам относятся так называемые проверки существования. Предположим, что требуется получить данные о студентах, которые не имеют оценку «семь баллов». Если будет возвращено пустое множество, то это означает лишь одно – у каждого студента есть, по крайней мере, одна такая оценка.

Связывание таблиц . Операторы языка SQL позволяют извлекать данные более чем из одной таблицы. Одна из возможностей сделать это заключается в связывании таблиц по одному общему полю.

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

Можно использовать другие типы связывания таблиц: оператор INTER JOIN (внутреннее соединение) обеспечивает присутствие в результирующем наборе записей, совпадающие значения в связанных полях. Внешние соединения (OUTER JOIN) позволяют включить в результат запроса все строки из одной таблицы и соответствующие им строки из другой

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

Доступ к данным в многопользовательской среде регулируется с помощью операторов GRANT и REVOKE. В каждом операторе необходимо указать пользователя, объект (таблицу, представление), по отношению к которому задаются полномочия, и сами полномочия. Например, оператор GRANT задает пользователю Х возможность производить выборку данных из таблицы ТОВАР:

GRANT SELECT ON ТОВАР TO X

Оператор REVOKE аннулирует все предоставленные ранее полномочия.

Встраивание SQL в прикладные программы . Реальные приложения обычно написаны на других языках, генерирующих код на языке SQL и передающих их в СУБД в виде текста в формате ASCII.

Стандартом фирмы IBM для SQL-продуктов регламентировано использование встроенного языка SQL. При написании прикладной программы ее текст представляет собой смесь команд основного языка программирования (например, C, Pascal, Cobol, Fortran, Assembler) и команд SQL со специальным префиксом, например. ExecSQL. Структура SQL-предложений расширена для размещения переменных основного языка в SQL-конструкции.



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

Диалекты языка SQL

В современных реляционных СУБД для описания и манипулирования данными используются диалекты языка SQL. Подмножество языка SQL, позволяющее создавать и описывать БД, называется DDL (Data Definition Language).

Первоначально язык SQL назывался SEQUEL(Structured English Query Language), потом SEQUEL/2, а затем просто – SQL. Сегодня язык SQL –фактический стандарт для реляционных СУБД.

Первый стандарт языка появился в 1989 г. – SQL-89 и поддерживался практически всеми коммерческими реляционными СУБД. Он имел общий характер и допускал широкое толкование. Достоинствами SQL-89 можно считать стандартизацию синтаксиса и семантики операторов выборки и манипулирования данными, а также фиксацию средств ограничения целостности базы данных. Однако в нем отсутствовал такой важный раздел как манипулирование схемой базы данных. Неполнота стандарта SQL-89 привела к появлению в 1992г. следующей версии языка SQL.

SQL2 (или SQL-92) охватывает практически все необходимые проблемы: манипулирование схемой базы данных, управление транзакциями и сессиями, поддерживает архитектуры клиент-сервер или средства разработки приложений.

Дальнейшим шагом развития языка является вариант SQL 3. Эта версия языка дополняется механизмом триггеров, определением произвольного типа данных, объектным расширением.

В настоящее время существует три уровня языка: начальный, промежуточный и полный. Многие производители своих СУБД применяют собственные реализации SQL, основанные как минимум на начальном уровне соответствующего стандарта ANSI, и содержащие некоторые расширения, специфические для той или иной СУБД. В табл. 4.9 приведены примеры диалектов SQL.

Таблица 4.9 Диалекты языка SQL

СУБД Язык запросов
СУБД System R SQL
DB2 SQL
Access SQL
SYBASE SQL Anywhere Watcom-SQL
SYBASE SQL Server Transact_SQL
My SQL SQL
Oracle PL/SQL

В объектно-ориентированных БД используется язык объектных запросов OQL (Object Query Language). За основу языка OQL была взята команда SELECT языка SQL2 и добавлены возможность направлять запрос к объекту или коллекции объектов, а также возможность вызывать методы в рамках одного запроса.

Совместимость многих используемых диалектов SQL обусловливает совместимость СУБД. Так, СУБД SYBASE SQL Anywhere максимально, насколько это возможно для СУБД такого класса, совместима с СУБД SYBASE SQL Server. Одной из сторон такой совместимости является поддержка в SYBASE SQL Anywhere такого диалекта языка SQL как Transact-SQL . Этот диалект используется в SYBASE SQL Server и может применяться в SYBASE SQL Anywhere наряду с собственным диалектом языка SQL - Watcom-SQL .

Контрольные вопросы

1. Как можно классифицировать СУБД?

2. Какие модели баз данных существуют?

3. Что является основными элементами инфологических моделей?

4. Какие типы связей между сущностями существуют?

5. Что такое ER-диаграммы и для чего они используются?

6. Что позволяет делать процедура нормализации таблиц?

7. Назовите языковые и программные средства СУБД?

8. К каому типу относится СУБД MS Access?

9. Назовите основные объекты СУБД MS Access?

10. Для чего используются основные операторы языка SQL?