Удаление схемы – DROP SCHEMA

Синтаксис удаления схемы выглядит следующим образом:

DROP SCHEMAимя_схемы [RESTRICT| CASCADE]

Здесь ключевое слово RESTRICT (вызывается по умолчанию) указывает на то, что перед удалением схема должна быть пустой, иначе удаление будет отменено. Для уничтожения схемы содержащей объекты нам потребуется другой ключ –CASCADE.

14. Изменение описания таблицы командой ALTER TABLE.

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

Она позволяет:

• добавить в таблицу новый столбец;

• удалить из таблицы существующий столбец;

• добавить в таблицу ограничение на столбец или таблицу;

• удалить из таблицы ограничение на столбец или таблицу.

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

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

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

Удаление столбца из таблицы Из таблицы можно удалить столбец только в том случае, если он не используется ни в каких ограничениях. Таковыми могут быть СНЕСК,-конструкции по таблицам, индексы, а также триггеры и хранимые процедуры. Поэтому прежде чем удалить столбец необходимо удалить все ограничения, в которых этот столбец фигурирует, в том числе и относящиеся совсем к другим таблицам (например, внешние ключи или триггеры). Изменение формата столбца Стандартный синтаксис команды ALTER TABLE вообще не предполагает возможности изменения столбца. Поэтому изменение предполагает, по крайней мере, две команды ALTER TABLE. Первая - удалить столбец и вторая - добавить столбец. При выполнении этих операций следует руководствоваться замечаниями по добавлению и удалению. Следует, конечно, помнить, что удаление столбца влечет полную потерю хранящихся в нем данных. Если эти данные необходимо сохранить, то операция замены распадается на следующие:

• добавить новый столбец с тем же типом данных, что и в изменяемом столбце (ALTER TABLE ADD ...);

• скопировать данные из существующего столбца в новый (UPDATE...);

• выполнить необходимые действия по подготовке к удалению существующего столбца (удаление соответствующих ограничений);

• выполнить удаление существующего столбца (ALTER TABLE DROP...);

• создать столбец с именем удаленного и новыми характеристиками (ALTER TABLE ADD ...);

• скопировать данные из столбца-копии в столбец с измененными характеристиками (UPDATE ...=CAST(...)...);

• удалить столбец-копию (ALTER TABLE DROP ...);

• выполнить операции по восстановлению (при необходимости) группы ограничений, удаленных в процессе подготовки к удалению исходного столбца;

• воскликнуть ура, все получилось!

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

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

Команда ALTER TABLE имеет следующий синтаксис:

JU,TER TABLE table LIST_<operation:»;

coperation> ::= {ADD <col_def>

/ ACD <tconstraint>

J DROP col

/ DROP CONSTRAINT constraint.?

<COl_def> = col {<datatype> / COMPUTED [BY] {< expr>)

domain^

/DEFAULT fliteral / NUEL / USER}]

/■not null;

/<col_constraint>;

/•COLLATE collation./

< datatype> ::= {

SMALLEST / INTEGER / FLOAT / DOUBLE PRECISION;

f<array_dim>]

I {DECIMAL / NUMERIC; [{ precision [, scale7 ))

/■<array_dim>;

/ ("DATE / TIME / TIMESTAMP} [ <array_dim>;

/ (CHAR /CHARACTER / CHARACTER VARYING / VARCHAR;

[( int) I /'<array_dim>7 [CHARACTER SET charnameJ / fNCHAR / NATIONAL CHARACTER / NATIONAL CHAR}

/varying; [{ int); [ <array_dim>;

/ BLOB [ SUB_TYPE / int / subtype_name} ] /’SEGMENT SIZE int; [CHARACTER SET charname;

/ BLOB [( seglen [, subtype;);

J

<array_dim> [LlST_<dims>]

<dims> [x: ]y

< expr> = Любое допустимое в SQL выражение, дающее в результате единственное значение.

<col_constraint> ;:= [CONSTRAINT constraint; <con-straint_def>

<Constraint_def> {UNIQUE / PRIMARY KEY

/ REFERENCES othertable [(LJST_Other_COl)]}

fON DELETE {NO ACTION / (ASCADI / SET DEFAULT / SET NULL;;

fON UPDATE {NO ACTION / ( ASCADI / SET DEFAULT / SET NULL} ]

I CHECK ( <search_condition>)

<tconstraint> ;;= /'CONSTRAINT constraint;

{ /PRIMARY KEY / UNIQUE} (LIST_col)

I FOREIGN KEY (LJST_col) REFERENCES Other_table

[ON DELETE (NO ACTION / CASCADE / SET DEFAULT / SET NULL}]

[ON UPDATE /NO ACTION / CASCADE / SET DEFAULT / SET NULL}]

/ CHECK ( <search_condition>)}

<search_condition> =

{ <val> <operator> { <val> / ( <select_one>)}

I <val> [NOT] BETWEEN <val> AND <val>

/ <val> [NOT] LIKE <val> /'ESCAPE <val>]

/ <val> [NOT] IN ( <val> [ , <val> ...] / <select_list>)

/ <val> IS /нот; NULL

/ <val> {>= I <=} I [NOT] {= j < j >}

{ALL / SOME / any; (<select_list>)

/ EXISTS ( <select_expr>)

/ SINGULAR ( <select_expr>)

/ <val> [NOT] CONTAINING <val>

/ <val> [NOT] STARTING /WITH] <val> ,

/ ( <search_condition>) ■

/ NOT <search_condition>

/ <search_condition> OR <search_condition>

/ <search_condition> AND <search_condition>;

<val> = {

col f<array_dim>] / : variable / <constant> / <expr> / <function>

/ udf {[ <val> [, <val> ...]])

I NULL / USER / RDB$DB__KEY / ?

/COLLATE collation]

<constant> = / ' string' / charsetname ' string'

<function> = {

COUNT (* / fALLj <val> / DISTINCT <val>)

/ SUM ([ALL] <val> / DISTINCT <val>)

/ AVG (/ALL] <val> / DISTINCT <val>)

/ MAX (/ALL; <val> / DISTINCT <val>)

/MIN (/"ALL; <val> / DISTINCT <val>)

/ CAST ( <val> AS <datatype>)

/ UPPER ( <val>) .

/ GEN_ID ( generator, <val>)

;.ALTER TABLE

<operator> = {= /< /> /<= />= /!</!> /<> / '• = }

<select_one> = SELECT, возвращающий одну строку с одним столбцом.

<select list> = SELECT, возвращающий несколько (возможно, PI строк с одним столбцом.

<select_pxpr> = SELECT, возвращающий несколько (возможно, 0) строк с несколькими столбцами.

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

• пользователь, выдавший команду, не имеет соответствующих прав;

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

Операция DROP обеспечивает удаление указанного в ней элемента. Ее синтаксис достаточно прост и не нуждается в пояснении. В то же время необходимо отметить, что операция DROP может завершиться безуспешно, если:

• пользователь, выдавший команду, не имеет соответствующих прав;

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

• делается попытка удалить столбец, входящий в ограничения CHECK;

• делается попытка удалить столбец, используемый в вычисляемом столбце или триггере;

• делается попытка удалить столбец, входящий в ограничения CHECK, вычисляемый столбец или триггер других таблиц.

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

Добавление столбцов Пример добавления столбцов уже приводился, когда говорилось о вычисляемых столбцах (см. пример 4.10). Рассмотрим этот же пример, объединив обе команды в одну.

Пример 4.14

alter TABLE TBOOK_AUTHOR ■

add B1 varchar(60) COMPUTED BY ((select a.auname from tau-> thor a

where a.author=tbook_author.author)) ,

add В2 COMPUTED BY ((select a. booknm from tbook a where a.unikey=tbook_author.bookkey));

Добавление ограничений Приведем пример.

Пример 4.15

ALTER TABLE TBOOK_AUTHOR ADD CONSTRAINT UK__BOOK_AUTHOR UNIQUE (AUTHOR, BOOKKEY);

Удаление столбцов Рассмотрим удаление только что добавленны столбцов.

Пример 4.16

alter TABLE TBOOK_AUTHOR drop Bl, drop B2;

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

15. Язык манипулирования данными (ЯМД). Ввод, удаление и изменение данных.

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

Множество операций над данными можно классифицировать следующим образом:

1. операции селекции;

2. действия над данными: ƒ

· включение — ввод экземпляра записи в БД с установкой его связей;

· удаление — исключение экземпляра записи из БД с установкой новых связей;

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

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

Первый тип — это процедурный ЯМД.

Второй тип — это декларативный (непроцедурный) ЯМД.

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

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

Реляционные СУБД обычно включают поддержку непроцедурных языков манипулирования данными — чаще всего это бывает язык структурированных запросов SQL или язык запросов по образцу QBE.

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

Следует отметить, что язык SQL имеет сразу два компонента: язык DDL (ЯОД) для описания структуры базы данных, и язык DML (ЯМД) для выборки и обновления данных

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

Часть непроцедурного языка ЯМД, которая отвечает за извлечение данных, называется языком запросов Язык запросов можно определить как высокоуровневый узкоспециализированный язык, предназначенный для удовлетворения различных требований по выборке информации из базы данных

DELETE FROM таблица [WHERE условие];

где

таблица имя таблицы.
условие задает строки, которые необходимо удалить, и состоит из имен столбцов, выражений, констант, подзапросов и операторов сравнения.
INSERT INTO таблица [ (столбец[, столбец…] ) ] VALUES (значение[, значение…] );
       

где

таблица имя таблицы.
столбец имя столбцов таблицы, в которые вносятся изменения.
значение соответствующие значения столбцов.

16. Ограничения, налагаемые на столбцы.

Базы данных - Содержание

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

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

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

Ограничения для столбца могут указываться следующими фразами:

NOT NULL - в любой добавляемой или изменяемой строке столбец всегда должен иметь значение, отличное от NULL.

UNIQUE - все значения столбца должны быть уникальны.

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

CHECK (condition) - указываемое в скобках условие использует для сравнения значение столбца и возвращает TRUE, FALSE или UNKNOWN. Если при попытке выполнения SQL-оператора возвращаемое значение равно FALSE, то оператор выполнен не будет.

REFERENCES table (fields_list) - ограничение требует совпадения значений столбцов данной таблицы с указанными столбцами родительской таблицы.

Ограничения для таблицы могут указываться следующими фразами:

CHECK (condition) - указываемое в скобках условие использует для сравнения значение столбца и возвращает TRUE, FALSE или UNKNOWN. Если при попытке выполнения SQL-оператора возвращаемое значение равно FALSE, то оператор выполнен не будет.

FOREIGN KEY (fields_list) - это ограничение по внешнему ключу аналогично ограничению REFERENCES для столбцов и гарантирует, что все значения, указанные во внешнем ключе, будут соответствовать значениям родительского ключа, обеспечивая ссылочную целостность. Следует отметить, что типы данных столбцов, используемых в этом ограничении, должны совпадать, а типы таблиц (постоянная базовая таблица, глобальная локальная временная таблица, локальная временная таблица) родительского и внешнего ключа - соответствовать друг другу.

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

17. Ссылочная целостность.

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

  • «Ссылочная целостность в реляционной базе данных – это согласованность между связанными таблицами. Ссылочная целостность обычно поддерживается путем комбинирования первичного ключа и внешнего ключа. Для соблюдения ссылочной целостности требуется, чтобы любое поле в таблице, объявленное внешним ключом, могло содержать только значения из поля первичного ключа родительской таблицы …» [5]

18. Структура оператора SELECT.

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

В наиболее общем виде он имеет следующий формат:

SELECT [DISTINCT или ALL] <имена полей возвращаемых запросом>

FROM <имена таблиц используемых в запросе>

WHERE <условия отбора записей>

GROUP BY <имена группируемых полей>

HAVING <условия отбора>

UNION <оператор select>

PLAN <план выполнения запроса>

ORDER BY <список полей сортировки>

SELECT - ключевое слово, которое сообщает СУБД, что эта команда - запрос. Все запросы начинаются этим служебным словом с последующим пробелом. За ним может следовать способ выборки - с удалением дубликатов записей (DISTINCT) или без удаления (ALL, по умолчанию). Затем через запятую следует список полей включаемых в результат запроса. Может использоваться символ «*» (звездочка) означает, что в результирующий набор включаются все поля из исходных таблиц или из указанной таблицы, например Товары.* (из таблицы товары выбираются все поля). При необходимости поля таблиц можно переименовать, для этого используется оператор AS.

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

Если необходимо из таблицы А (таблица 6.1) выбрать только записи в необходимых полях (Фамилия, Зарплата), т.е. выполнить проекцию то можно записать следующий код (результат - таблица 7.2):

SELECT A.Фамилия, A.Зарплата FROM А

Полностью вся таблица будет получена в следующем случае:

SELECT * FROM А

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

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

Предикаты сравнения { =, <>, >, <, >=, <= }, которые имеют традиционный смысл, например, следующий код языка SQL использованный для таблицы 6.1 даст результат, приведенный в таблице 7.1:

SELECT * FROM А

WHERE Зарплата<3000

Предикат Between A and В - принимает значения между А и В. Предикат истинен, когда сравниваемое значение попадает в заданный диапазон, включая границы диапазона. Одновременно в стандарте задан и противоположный предикат Not Between A and В, который истинен тогда, когда сравниваемое значение не попадает в заданный интервал, включая его границы. Например:

SELECT * FROM А

WHERE Зарплата BETWEEN 2000 and 3000

В результате выполнения этого запроса будут возвращены все записи, у которых значения поля «Зарплата» находятся в интервале от 2000 до 3000, включительно.

Предикат вхождения во множество - IN (множество) истинен тогда, когда сравниваемое значение входит во множество заданных значений. При этом множество значений может быть задано простым перечислением или встроенным подзапросом. Одновременно существует противоположный предикат NOT IN (множество), который истинен тогда, когда сравниваемое значение не входит в заданное множество.

SELECT * FROM А

WHERE Фамилия IN(‘Иванов’, ‘Петров’)

В результирующий набор данных будут включены те записи, для которых значения поля «Фамилия» совпадут с элементами множества определенными предикатом сравнения IN, т.е. записи о сотрудниках: Иванов и Петров.

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

o символ подчеркивания (_) - для обозначения любого одиночного символа;

o символ процента (%) - для обозначения любой произвольной последовательности символов;

o остальные символы, заданные в шаблоне, обозначают самих себя.

SELECT * FROM А

WHERE Фамилия LIKE ‘П%’

В результате выполнения запроса будут получены все записи, значения поля «Фамилия» для которых совпадет с шаблоном ‘П%’, т.е. Все фамилии сотрудников начинающиеся с символа «П».

Предикат сравнения с неопределенным значением IS NULL. Понятие неопределенного значения было внесено в концепции БД позднее. Неопределенное значение интерпретируется как значение, неизвестное на данный момент времени. При сравнении неопределенных значений не действуют стандартные правила сравнения: одно неопределенное значение никогда не считается равным другому неопределенному значению. Для вы явления равенства значения некоторого поля неопределенному применяют специальные стандартные предикаты: <имя поля>IS NULL и <имя поля > IS NOT NULL.

Предикаты существования EXIST и не существования NOT EXIST. Эти предикаты относятся к встроенным подзапросам.

Раздел ORDER BY определяет список полей сортировки. Последовательность перечисления полей имеет важное значение и определяет порядок сортировки в результирующем отношении. Например, если первым полем списка будет указана Фамилия, а вторым Номер группы, то в результирующем отношении сначала будут собраны в алфавитном порядке студенты, и если найдутся однофамильцы, то они будут расположены в порядке возрастания номеров групп. Приведем простой пример сортировки записей по полю «Фамилия»:

SELECT * FROM А

ORDER BY Фамилия

В разделе GROUP BY определяется список полей группировки. При группировке записи таблиц разбиваются на группы. В группы собираются записи, имеющие одинаковые значения полей указанных в разделе GROUP BY. Данный раздел позволяет выполнять операции над группами с применением агрегатных функций указанных в таблице 21.1

Таблица 21.1 – Основные агрегатные (итоговые) функции

Функция Результат
COUNT Количество строк или непустых значений полей, которые выбрал запрос
SUM Сумма всех выбранных значений данного поля
AVG Среднеарифметическое значение всех выбранных значений данного поля
MIN Наименьшее из всех выбранных значений данного поля
MAX Наибольшее из всех выбранных значений данного поля

В разделе HAVING задаются предикаты-условия, накладываемые на каждую группу, и имеет тот же синтаксис, что и раздел WHERE. Другими словами раздел HAVING используется при группировке вместо раздела WHERE.

Агрегатные функции можно использовать без группировки, если вся таблица будет рассматриваться как одна группа и результатом запроса будет одна строка. Например, требуется определить количество экземпляров книг библиотеки, в этом случае запрос будет иметь вид:

SELECT COUNT(*) AS Количество

FROM Экземпляры;

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

SELECT COUNT(*) AS Количество

FROM Экземпляры

GROUP BY Наличие

HAVING Наличие = Да;

19. Предложение FROM оператора SELECT.

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

Общий вид оператора:

Select [предикат] список – полей From список – таблиц [отношение между таблицами] [диапазон] [сортировка]

Элемент «список – полей» оператора Select имеет следующий вид:

[имя – таблицы.]поле1 [As Alias1] [, [имя - таблицы.]поле2 [As Alias2] [¼]]

Для выбора всех полей в указанной таблице используется (*).

Выдать список всех студентов:

Select * From Student

Если извлекаются отдельные поля, они включаются в список и разделяются запятыми. Если встречается пробел, название заключается в квадратные скобки.

Составить список всех фамилий студентов с годом их поступления.

Select FIOS, YearEnter From Student

Для выбора из множества таблиц нужно указать:

- таблицы, из которых выбираются поля;

- поля, из которых выбираются данные;

- отношения между таблицами.

Имена таблиц и полей разделяются точками, например, Student.FIOS.

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

Отношения между таблицами определяются либо в предложении Where, либо Join.

Составить список студентов, обучающихся на ФИТ.

Select Student.FIOS From Student, Group Where Group.Sfacult = “ФИТ” And Group.Sgroup = Student.Sgroup

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

Выдать список студентов и время их обучения.

Select FIOS, Year(Date()) – YearEnter As [Срок обучения] From Student

Если имя вычисляемого поля не указывается, то ему автоматически назначается имя типа Expression0001. Вычисляемые поля хранятся в наборе записей, как поля доступные для чтения. Корректировать их нельзя. Чтобы вычисляемое поле получило имя, после описания поля следует указать предложение As и необходимое имя поля. Этот же подход можно использовать, чтобы переопределить имя поля.

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

From table1 [In DB1] [As Alias1] [, table2 [In DB2] [As Alias2]

Чаще всего выбираются все записи, удовлетворяющие критерию. Это соответствует предикату All, то есть запись:

Select * From Student

идентична записи:

Select All * From Student.

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

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

Отношения между таблицами

Чтобы указать отношения между таблицами можно использовать предложения:

- Join объединяет две таблицы с учетом содержимого указанных полей и типа предложения Join.

- Where применяется для фильтрации записей, возвращаемых запросом; может использоваться аналогично предложению Inner Join.

Предложение Join имеет следующий основной формат:

Table1 {Inner/Left/Right} Join Table2 On Table1.Key1 q Table2.Key2

q = {<, <=, >, >=, =, <>}

Table1 называется левой таблицей, а Table2 – правой таблицей.

Зависимость возвращаемых записей от типа предложения Join:

Тип оператора Join Записи из левой таблицы Записи из правой таблицы
Inner Только записи соответствующие правой таблице Только записи соответствующие левой таблице
Left Все записи Только записи соответствующие левой таблице
Right Только записи соответствующие правой таблице Все записи

Предложение Where можно использовать для связи двух таблиц аналогично предложению Inner Join.

Составить список ведомостей по предметам, указав предметы для которых экзамены не сдаются.

Select Predmet.Predm, Vedom.Nved From Predmet Left Join Vedom On Predmet.CodePredm = Vedom.Code.Predm

Выбор критерия фильтрации

Условия критерия фильтрации задается следующим синтаксисом:

Where логическое выражение

Существует четыре типа логических выражений (предикатов) в предложении Where: сравнение, Like, In, Between.

Предикат сравнения имеет следующий вид:

<выражение1> <операция сравнения> <выражение2>

<операция сравнения> = {=, <, >, <>, >=, <=}.

Составить список студентов, имеющих отличные оценки.

Select Student.FIOS From Student, Ekzamen Where Ekzamen.CodOcen = 5 And Ekzamen.Nzach = Student.NZach

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

<выражение> Like <шаблон>

Шаблон допускает использования групповых имен и списков символов.

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

1. Список заключается в квадратные скобки.

2. Первый и последний символ должны разделяться дефисом.

3. Диапазон символов должен задаваться в возрастающем порядке.

Шаблоны, используемые в предикате Like

Групповое имя Используется для сравнения Пример Пример результата
* или % Со множеством символов S* Smith, Sheep, Same
? Отдельный символ An? Any, And
# С отдельной цифрой 354# 3543, 3540
[список] С отдельным символом списка [c-f] c, d, e, f
[!список] С отдельным символом, не входящим в список [!c-f] A, b, g, h, ¼
Комбинация В соответствии с шаблоном A?t* Art, antique, artist

Составить список студентов, фамилии которых со второй буквы фамилии включают комбинацию символов «етр».

Select * From Student Where Fios Like “?етр*”

Предикат In позволяет сравнивать выражение с несколькими значениями. Формат:

<Выражение> In <список значений>

Составить список студентов, поступавших в институт в 2000, 2003 и 1999 году.

Select FIOS From Student Where YearEnter In (2000,2003, 1999)

Предикат Between позволяет искать выражение, имеющее значение в заданном диапазоне. Применимо к строкам, числам и датам. Формат:

<выражение> [Not] Between <значение1> And <значение2>

Перед датой используется символ #.

Выдать список студентов, имеющих положительные оценки.

Select Student.FIOS, Student.Nzach From Student, Ekzamen Where Ekzamen.CodeOcen Between 3 And 5 And Student.Nzach = Ekzamen.Nzach

Предложения Where могут работать с комбинированными условиями, которые объединяются с помощью связок And и Or.

Для сортировки значений используется предложение Order By. Для сортировки можно выбирать несколько полей. В этом случае поля разделяются запятыми. По умолчанию принята сортировка по возрастанию. Порядок сортировки можно изменить, указав после имени поля слово Desc.

Выдать список студентов по алфавиту.

Select * From Student Order By FIOS

Выдать список студентов по убыванию годов их поступления, отсортировав их по алфавиту для каждого года.

Select * From Student Order By YearEnter Desc, FIOS

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

Эти функции имеют синтаксис:

<функция>(<аргумент>)

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

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

From table1 [In DB1] [As Alias1] [, table2 [In DB2] [As Alias2]

Чаще всего выбираются все записи, удовлетворяющие критерию. Это соответствует предикату All, то есть запись:

Select * From Student

идентична записи:

Select All * From Student.

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

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

20. Предложение WHERE. Логические операторы.

Предложение WHERE содержит предикат, который может включать одно или несколько выражений и принимать одно из трех значений: TRUE, FALSE или UNKNOWN. Сравнение значения NULL с другим значением (в том числе и NULL) дает результат UNKNOWN. Другие значения сравниваются в соответствии с последовательностями сортировки для строк текста, с порядком числовых значений для числовых типов, хронологическим порядком для данных типа дата-время или по величине значения (для данных типа INTERVAL). Сравнения осуществляются с помощью операторов =, <, <=, >, >= и <> (не равно). Применение таких операторов, как * (умножение) или | (конкатенация), зависит от типа данных. В большинстве случаев вместо простых выражений можно использовать конструкторы значений строк.

B between a and c

Это выражение эквивалентно: (A<=B) AND (B<=C). Параметр A должен быть меньше C. Выражение B BETWEEN С AND A будет интерпретироваться как (C<=B) AND (B<=A), и оно имело бы значение FALSE при значении выражения (A<=B) AND (B<=C) равном TRUE, за исключением случая, когда все три величины одинаковы. Если один из параметров равен NULL, значение предиката не определено.

A IN (C, D, …)

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

A LIKE ‘строка’

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

A IS NULL

Это выражение проверяет, является ли A значением NULL, В отличие от большинства других предикатов результат данного предиката может быть только TRUE или FALSE (не UNKNOWN).

A оператор_сравнения SOME | ANY подзапрос

SOME и ANY имеют одинаковый смысл. Результатом подзапроса является набор величин. Если для какого-нибудь значения X, получаемого из подзапроса, результат операции «А оператор_сравнения X» равняется TRUE, то предикат ANY также равен TRUE.

A оператор_сравнения ALL подзапрос

Исполняется так же, как и ANY, но для всех значений X, получаемого из подзапроса, результат операции «А оператор_сравнения X» должен равняться TRUE.

EXISTS подзапрос

Если в результате подзапроса найдена хотя бы одна строка, предикат равняется TRUE, в противном случае – FALSE. Результат никогда не может быть UNKNOWN. Это выражение имеет смысл только для зависимого подзапроса.

UNIQUE подзапрос

Если подзапрос не находит идентичных строк, то значение UNIQUE равняется TRUE, в противном случае – FALSE. В этом предикате подразумевается, что идентичные строки не содержат значения NULL. В противном случае строки не идентичны.

Логические операторы AND, OR и NOT. Операторы AND и OR используются для объединения условий поиска в предложениях WHERE. Оператор NOT обращает значение условия поиска.

Оператор AND соединяет два условия и возвращает TRUE, только если оба условия выполняются. Например, этот запрос возвратит только одну строку, в которой идентификатор клиента (BusinessEntityID) начинается с числа 1, а название магазина начинается с «Bicycle»:

SELECT BusinessEntityID, Name

FROM AdventureWorks2008R2.Sales.Store

WHERE BusinessEntityID LIKE '1%' AND Name LIKE N'Bicycle%';

Оператор OR также соединяет два условия, но возвращает TRUE, если выполняется хотя бы одно из условий. Следующий запрос возвращает 349 строк, в которых либо идентификатор заказчика начинается с 1, либо название магазина начинается с «Bicycle»:

SELECT BusinessEntityID, Name

FROM AdventureWorks2008R2.Sales.Store

WHERE BusinessEntityID LIKE '1%' OR Name LIKE N'Bicycle%';

21. Квалификатор DISTINCT. Предложение ORDER BY.

Если задан квалификатор DISTINCT, строки сравниваются, и при обнаружении строки-дубликата в результате будет возвращена только одна копия строки.Предложение ORDER BY

И, наконец, предложение ORDER BY используется для сортировки выходных данных. Строки сортируются в соответствии со значениями столбцов, указанных в списке. Первый столбец имеет наивысший приоритет, второй столбец задает порядок сортировки дублируемых значений первого столбца, третий столбец вступает в действие, если совпадают значения во втором столбце, и т.д. Можно задать параметр сортировки ASC (по возрастанию, используется по умолчанию) или DESC (по убыванию) отдельно для каждого столбца. Сортировка набора символов будет осуществляться в соответствии с его упорядочивающей последовательностью. Вместо имен столбцов можно указывать целые числа. Эти числа указывают на местоположение столбца в выходных данных, так что 1 будет указывать на первый столбец, а 5 — на пятый столбец и т.д. Если выходные столбцы не имеют имен, то будут использоваться номера.

22. Использование агрегатных функций. Предложение GROUP BY.

Агрегатные функции, иногда называемые функциями множества, в качестве исходных параметров принимают группу значений, указанных в запросе (или в подзапросе) в предложении SELECT или HAVING, и вычисляют единственное значение-результат. Исходной группой значений может быть группа, определенная с помощью предложения GROUP BY, или все значения, полученные в результате запроса. (Запросы служат для получения информации из базы данных и обычно реализуются в SQL с помощью оператора SELECT. Предполагается, что пользователь знаком с основными правилами построения запроса.)

AVG – возвращает среднее значение в указанном столбце

Наши рекомендации