Сделай Сам Свою Работу на 5

Обобщенный синтаксис команды выборки SELECT





 

SELECT <список операции проекции>

FROM <список операции соединения>

WHERE <предикат операции селекции>

GROUP BY <список операции группирования>

HAVING <предикат операции группирования>

ORDER BY <список операции упорядочивания>;

Рассмотрим более подробно каждую фразу команды выборки, отметив вначале следующее:

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

Ø порядок следования фраз требуется соблюдать тот же, за исключением фраз WHERE и GROUP BY, HAVING, которые допускается переставлять; фраза ORDER BY в любом случае должна быть последней;

Ø весь текст команды может размещаться на одной строке;

Ø признаком окончания команды является символ ";" (точка с запятой);

Ø внутри команд SQL могут использоваться и другие разделительные символы:

o запятая (,) – для разделения элементов списков (полей, таблиц, значений);

o квадратные скобки ([ ]) – для записи имен полей, содержащих недопустимые символы, например пробел;

o точка (.) – для записи составного имени, когда в запросе присутствуют одноименные поля из разных таблиц, то для их различения перед ними ставится имя таблицы, затем точка и далее имя поля (например, ДЕНЬ.НомерДня);



o одинарные (') или обычные (") кавычки – для ограничения текстовых констант (например, "10а" или 'красный');

o решетка (#) – для ограничения констант типа Дата/Время (например, #12.10.03# или #12:35:15#);

o звездочка (*) и вопросительный знак (?) – как символы шаблона, заменяющие соответственно любое количество символов или один символ в конструкции LIKE (в стандарте SQL им соответствуют символы % и _);

o в JET SQL нельзя использовать переменные;

Ø порядок выполнения команды следующий:

o соединение таблиц - источников данных (FROM);

o селекция записей, удовлетворяющих предикату (WHERE);

o группирование записей в соответствии со списком (GROUP BY);

o селекция групп, удовлетворяющих предикату (HAVING);

o проекция полей в соответствии со списком (SELECT):;

o упорядочивание результата в соответствии со списком (ORDER BY).

Фраза SELECT

 

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



Ø DISTINCT - аргумент, используемый для подавления дублей в выборке;

Ø ALL или TOP n, или BOTTOM n – аргумент, используемый для управления объемом выборки, где ALL означает все записи (действует по умолчанию), TOP n – оставить первые n записей в выборке, BOTTOM n – оставить последние n записей в выборке;

Ø символ * (звездочка) означает включить в проекцию все поля источника запроса;

Ø любое скалярное выражение, возвращающее значение допустимого типа;

Ø любое реляционное выражение (команда SELECT), возвращающее единственное значение (таблица из одной строки и одного столбца).

Таким образом, кроме имен полей таблиц – источников запроса, в список проекции могут входить и любые правильно сконструированные скалярные выражения, которые реализуют вычисления по горизонтали и представление результатов вычислений по вертикали (агрегатной функции). Причем аргументами в этих выражениях могут быть такие элементы, как поля таблиц – источников запроса, функции СУБД и собственные функции пользователя, элементы управления форм, константы и переменные модулей VBA. Если требуется какому-либо полю запроса присвоить собственное имя, то следует использовать фразу AS <Имя> после этого поля в списке операции проекции.

Примеры списков операции проекции при выполнении запроса на выборку из таблиц БД РАСПИСАНИЕ (рис. 2):

SELECT DISTINCT НомерАуд FROM расписание; ' запрос выбирает список аудиторий, используемых в расписании, фраза DISTINCT подавляет все дубли в списке;



SELECT TOP 5 НомерГруппы, ШифрСпец, КоличКоммерчСтуд, КоличКоммерчСтуд / КоличСтудентов * 100 AS ПроцентКоммСтуд FROM ГРУППА; 'запрос выбирает первые 5 записей из таблицы ГРУППА и вычисляет процент коммерческих студентов, новое поле получает имя ПроцентКоммСтуд;

SELECT BOTTOM 10 НомерГруппы, КоличСтудентов FROM ГРУППА ORDER BY КоличСтудентов; ' запрос выбирает последние 10 записей из списка групп, упорядоченного по возрастанию количества студентов в группе, то есть 10 групп с наибольшим количеством студентов;

SELECT SUM (КоличЖен) AS ВсегоЖенщин, SUM (КоличЖен) / SUM (КоличСтудентов) * 100 AS Впроцентах FROM ГРУППА; ' запрос вычисляет общее количество студенток во всех группах в абсолютном и процентном исчислении; для вычисления использована агрегатная функция SUM;

SELECT НомерГруппы, КоличКоммерчСтуд / ( SELECT SUM (КоличКоммерчСтуд ) ) * 100, "%" FROM ГРУППА; ' запрос вычисляет для каждой группы процент коммерческих студентов от общего их числа в институте; для вычисления общего числа коммерческих студентов в институте использованы вложенный запрос SELECT и агрегатная функция SUM; единица измерения % записана в виде текстовой константы;

SELECT COUNT (*) FROM ДИСЦИПЛИНА; ' запрос вычисляет общее количество записей в таблице ДИСЦИПЛИНА, для вычисления использована агрегатная функция COUNT.

Фраза FROM

 

После слова FROM содержится список таблиц или запросов (далее будем говорить просто таблица), из которых требуется произвести выборку данных. Список может содержать:

Ø имя одной единственной таблицы, как в вышеприведенных примерах;

Ø несколько таблиц, разделенных запятой (означает их декартово произведение);

Ø соединение (JOIN) нескольких таблиц, которое может быть внутренним (INNER) или внешним, последнее, в свою очередь, может быть левым (LEFT) или правым (RIGHT); записываются соответственно: INNER JOIN, LEFT JOIN, RIGHT JOIN.

При использовании нескольких таблиц во фразе FROM может возникнуть конфликт имен полей, совпадающих в разных таблицах и используемых в какой-либо части запроса. В этом случае к имени поля следует добавить приставку – имя таблицы и разделить их точкой, например ГРУППА.№Группы. Для сокращения записи таких составных имен таблице можно присвоить псевдоним, записав его через пробел после имени таблицы во фразе FROM, например FROM РАСПИСАНИЕ РС, ПРЕПОДАВАТЕЛЬ ПР. Здесь РС и ПР - псевдонимы, тогда обращаться к полям этих таблиц можно по псевдониму, например ПР.ШифрПрепод или РС.ШифрПрепод.

Полный синтаксис операции соединения в SQL выглядит следующим образом:

Группа Г INNER JOIN РАСПИСАНИЕ Р ON Г.НомерГруппы = Р.НомерГруппы

В SQL реализуется так называемое тета-соединение, то есть вместо знака равенства можно использовать любой другой знак сравнения >, <, >=, <=, <>.

Замечание: язык QBE поддерживает только эквисоединение, то есть =.

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

SELECT НомерГруппы, А.НомерА, Вместимость

FROM АУДИТОРИЯ А INNER JOIN РАСПИСАНИЕ Р ON А.НомерА = Р.НомерА;

Здесь потребовалось выполнить соединение таблиц АУДИТОРИЯ и РАСПИСАНИЕ, в которых размещены нужные поля. Очевидно, что в результате получим дублированные записи, если какая-либо группа занимается несколько раз в одной и той же аудитории. Подавить дубли можно с помощью ключевого слова DISTINCT (смотри примеры выше).

Еще пример. Получить список всех возможных пар занятий, проходящих в течение недели, упорядоченный по дням и времени начала и окончания пары:

SELECT НазваниеДня, ВремяНач, ВремяОконч

FROM ПАРА, ДЕНЬ

ORDER BY НомерДня, ВремяНач;

Здесь во фразе FROM записана операция декартова произведения (ПАРА Ä ДЕНЬ), во фразе ORDER BY указаны поля упорядочивания. В результате получим часть содержимого таблицы ЗАНЯТИЕ.

Фраза WHERE

 

После слова WHERE содержится операция селекции, то есть здесь записывается предикат, истинное значение которого определяет множество записей, включаемых в результат запроса или, проще сказать, условие отбора. Предикат может принимать одно из трех значений: "Истина" (True), "Ложь" (False) или "Неизвестно" (Null) и имеет несколько вариантов применения, а именно:

Ø простое сравнение с использованием знаков сравнения: <, >, =, <=, <> и логических операций: AND, OR, NOT (Рост < 165 OR Рост >= 185);

Ø А BETWEEN Min AND Max (Min <= А >= Max);

Ø А LIKE <Строка> с использованием символов шаблона (*, ?, [], !, -, #), где:

o * (звездочка) – любая цепочка символов (*ов – окончание "ов");

o ? – любой один символ (агро? – оканчивается на любой знак);

o [строка] – любой один символ, заключенный в скобки (ст[ое]н – "стон" или "стен");

o [!строка] – любой один символ, кроме заключенных в скобки (ст[!ое]н – "стан", "стин", но не "стон" или "стен");

o [а-я] – любой один символ из диапазона "а-я" (на[в-з]р – "нагар", "навар", "назар";

Ø А IN (Зн1, Зн2, …, ЗнN) – А принадлежит множеству значений Знi, i =1, 2, …,N;

Ø A IS NULL – пустое или не пустое (TRUE или FALSE);

Ø А q SOME\ ANY (<подзапрос>) - А q любому из подзапроса (q - знак сравнения) (квантор существования - $);

Ø А q ALL )<подзапрос>) - А q каждому из подзапроса (квантор общности - ");

Ø EXISTS (<подзапрос>) - в подзапросе есть хотя бы одна запись (строка).

Примеры

1. Список свободных аудиторий:

SELECT НомерАуд FROM АУДИТОРИЯ

WHERE НомерАуд <> ALL (SELECT НомерАуд FROM РАСПИСАНИЕ);.

2. Список дисциплин, в названии которых встречается строка "математ":

SELECT НазваниеДисц FROM ДИСЦИПЛИНА

WHERE НазваниеДисц LIKE "*математ*";.

3. Расписание группы 444 на понедельник:

SELECT ВремНач, НомерАуд, ИмяПрепод, НазвДисц

FROM ПРЕПОДАВАТЕЛЬ ПР INNER JOIN

(ПАРА П INNER JOIN ((ДЕНЬ Д INNER JOIN

ЗАНЯТИЕ З ON Д.НомерДня = З. НомерДня)

INNER JOIN (ДИСЦИПЛИНА ДС INNER JOIN

РАСПИСАНИЕ Р ON

ДС.ШифрДисц = Р.ШифрДисц)

ON З.НомерЗан = Р.НомерЗан)

ON П.НомерПары = З.НомерПары)

ON П.ШифрПрепод = Р.ШифрПрепод

WHERE(НомерГруппы="444") AND (НазваниеДня="Пн");.

Фраза GROUP BY

 

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

Примеры

4. Количество часов в неделю у каждого преподавателя:

SELECT ИмяПрепод, COUNT(ИмяПрепод) * 2 AS КолЧасов

FROM ПРЕПОДАВАТЕЛЬ П INNER JOIN РАСПИСАНИЕ Р ON П. ШифрПрепод=Р.ШифрПрепод

GROUP BY ИмяПрепод;

Здесь для каждого одного и того же значения поля ИмяПрепод формируется группа и для нее подсчитывается количество записей, которое умножается на 2, так как каждое занятие длится 2 часа.

5. Количество студентов, обучающихся на каждой специальности:

SELECT ШифрСпец, SUM(КоличСтудентов) AS ВсегоСтудентов

FROM ГРУППА

GROUP BY ШифрСпец;

 

Фраза HAVING

 

Фраза HAVINGимеет тот же смысл, что и фраза WHERE, но только для групп. Эта фраза имеет смысл только внутри фразы GROUP BY.

Примеры

6. Количество коммерческих студентов на каждой специальности факультета вычислительной техники (ФВТ):

SELECT ШифрСпец, SUM(КоличСтудентов) AS ВсегоСтудентов

FROM ГРУППА

GROUP BY ШифрСпецк

HAVING ШифрФак = "ФВТ";.

Здесь из всего списка специальностей выбираются только специальности ФВТ.

7. Количество занятий в расписании по видам занятий: лекции и лабораторные работы в группе 2030:

SELECT ШифрВидЗан, COUNT(ШифрВидЗан) AS ВсегоЗанятий

FROM РАСПИСАНИЕ

WHERE НомерГруппы = "2030"

GROUP BY ШифрВидЗан

HAVING ШифрВидЗан = "Лк" OR ШифрВидЗан = "Лб";

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

Фраза ORDER BY

 

Эта фраза определяет порядок представления результата. Она может включать любое количество уровней упорядочивания. Список упорядочивания состоит из скалярных выражений, разделенных запятой. Для определения направления упорядочивания используются фразы ASC(ending) (по возрастанию – действует по умолчанию) или DESC(ending) (по убыванию).

Примеры

8. Получить список первых 10 групп с самым большим количеством юношей:

SELECT TOP 10 НомерГруппы, КоличМуж FROM ГРУППА ORDER BY КоличМуж;.

9. Получить полную информацию о группах, упорядоченную по убыванию процента девушек в них:

SELECT НомерГруппы,ШифрСпец, КоличСтудентов, КоличКоммерчСтуд, КоличМуж, КоличЖен, КоличЖен / КоличСтудентов *100 AS ПроцДев. Староста, ШифрФак FROM ГРУППА ORDER BY КоличЖен / КоличСтудентов *100;

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.