Функции и основные возможности языка SQL. Основы администрирования SQL Server

18.04.2019 Программы и сервисы

Функциональные возможности языка 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?

Язык 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);

  • Перевод
  • 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.

Команда Назначение
Команды определения данных
CREATE TABLE Создает структуру таблицы
DROP TABLE Удаляет таблицу
ALTER TABLE Изменяет описание структуры таблицы
CREATE VIEW Создает представление
INSERT Добавляет новые записи в таблицу
DELETE Удаляет записи из таблицы
UPDATE Обновляет данные таблицы
Команда извлечения данных
SELECT Извлекает данные из базы данных
COMMIT Сообщает об успешном окончании транзакции
ROLLBACK Сообщает о неуспешном окончании транзакции
Команды управления доступом
GRANT Предоставляет пользователю определенные права доступа
REVOKE Отменяет определенные права доступа
Команды встроенного SQL
DECLARE, OPEN, FETCH, CLOSE Реализуют обращения к базе данных из прикладных программ.

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

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

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

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

Транзакция либо успешно выполняется, и тогда СУБД фиксирует произведенные изменения базы данных, на внешнем носителе; либо отменяется, и тогда все произведенные изменения СУБД ликвидирует. Таким образом, принцип транзакции «либо все, либо ничего». Примером транзакции может служить перевод денег клиентом банка из одного филиала в другой. Необходимо как единое целое осуществить два действия: списать деньги со счета в одном филиале и занести деньги на счет в другом филиале.

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

Команды COMMIT и ROLLBACK используются в основном в программном режиме, хотя возможно их использование и в интерактивном режиме.

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

Права – это те действия с объектом, которые может выполнять пользователь. Права могут меняться с течением времени: старые могут отменяться, новые – добавляться. Предусмотрены следующие права:

· INSERT – право добавлять данные в таблицу;

· UPDATE – право изменять данные таблицы;

· DELETE – право удалять данные из таблицы;

· REFERENCES – право определять первичный ключ.

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

К встроенным относятся команды, предназначенные для реализации обращения к базе данных из прикладных программ, написанных на определенном языке программирования. Для пересылки данных из базы данных в прикладную программу используется временная таблица, называемая SQL-курсором . Команды DECLARE, OPEN, FETCH, CLOSE позволяют управлять SQL-курсором.

Знания и их виды.

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

Знания – это единственный ресурс, который не поддается быстрому воспроизводству конкурентами, что позволяет компании, владеющими ими, получать уникальные преимущества.

В общем случае существует много определений знаний. Некоторые из них приведены ниже:

Знание - это форма существования и систематизации результатов познавательной деятельности человека.

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

Знание в широком смысле - совокупность понятий, теоретических построений и представлений.

Знание в узком смысле - данные, информация.

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

Данные – не подвергшиеся обработке сведения, факты, измерения, сигналы, имеющие отношение к событиям. Они являются «сырым» материалом для дальнейших преобразований.

Информация – совокупность фактов, явлений, событий, представляющий интерес, подлежащих регистрации и обработке. Другими словами- это обработаны, осмысленные данные

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

Мудрость - оценка понимания знаний, правильное применение накопленных знаний, учитывая реалии и ограничений . Мудрость дает ответ на вопрос «Почему?».

Классификация видов и форм знания в настоящее время является во многом дискуссионной. Приведем некоторые виды.

Знания могут быть:

декларативные

процедурные

Декларативные знания содержат в себе лишь представление о структуре неких понятий. Эти знания приближены к данным, фактам. Например: высшее учебное заведение есть совокупность факультетов, а каждый факультет в свою очередь есть совокупность кафедр.

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

Знания могут быть

научными

вненаучными.

Научные знания могут быть

эмпирическими (на основе опыта или наблюдения)

теоретическими (на основе анализа абстрактных моделей).

Вненаучные знания могут быть:

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

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

псевдонаучными - представляют собой интеллектуальную активность, спекулирующую на совокупности популярных теорий, например, истории о древних астронавтах, о снежном человеке, о чудовище из озера Лох-Несс;

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

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

Знания могут быть

неявные, (скрытые) знания

формализованные (явные) знания;

Неявные знания:

знания людей,

Формализованные (явные) знания:

знания в документах,

знания на компакт дисках,

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

знания в Интернете и др.

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

Базы знаний.

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

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

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

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

Общую структуру экспертной системы можно представить (Рис 9.2)


Рис. 18. Общая структура экспертной системы

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

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

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, позволяет получить построчный доступ к результатам выполнения запроса в БД. К табличным выражениям, участвующим в спецификации курсора, особых требований не предъявляется.