Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD-2007-0.doc
Скачиваний:
9
Добавлен:
01.03.2025
Размер:
3 Мб
Скачать
☆

7.6. Оператор выбора select (MySql)

Язык запросов (Data Query Language) в SQL состоит из единственного оператора SELECT. Этот единственный оператор поиска реализует все операции реляционной алгебры. Однако писать грамотные запросы на языке SQL сначала совсем не просто. Один и тот же запрос может быть реализован несколькими способами, и, будучи все правильными, они, тем не менее, могут существенно отличаться по времени исполнения, и это особенно важно для больших баз данных.

Синтаксис оператора SELECT имеет следующий вид:

SELECT [ALL | DISTINCT] {* | <Cписок полей>}

FROM <Список таблиц>

[WHERE <Предикат-условие выборки или соединения>]

[GROUP BY <Список полей результата>]

[HAVING <Предикат-условие для группы>]

[ORDER BY Поле [ASC|DESC], [Поле [ASC|DESC]]]

SELECT — ключевое слово, которое сообщает СУБД, что данная команда — запрос. Все запросы начинаются этим словом с последующим пробелом. За ним может следовать способ выборки — с удалением дубликатов (DISTINCT) или без удаления (ALL, это слово подразумевается по умолчанию). Затем следует список перечисленных через запятую столбцов, которые выбираются запросом из таблиц, или символ * (звездочка) для выбора всей строки. Столбцы, не перечисленные здесь, не будут включены в результирующее отношение, соответствующее выполнению команды. Это, конечно, не значит, что они будут удалены или их информация будет стерта из таблиц, потому что запрос не воздействует на информацию в таблицах — он только показывает данные.

Ключевое слово ALL означает, что в результирующий набор строк включаются все строки, удовлетворяющие условиям запроса. Значит, в результирующий набор могут попасть одинаковые строки. И это ‑ нарушение принципов теории отношений (в отличие от реляционной алгебры, где по умолчанию предполагается отсутствие дубликатов в каждом результирующем отношении). Тем не менее, флаг ALL подразумевается по умолчанию.

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

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

Каждому выражению в списке возвращаемых столбцов может быть присвоен псевдоним с помощью предложения AS. Псевдоним отдельного столбца (т.е. другое наименование столбца в списке вывода) может упоминаться в любой части инструкции SELECT (за исключением предложения WHERE). Это особенно удобно тогда, когда необходимо указать для выводимых колонок списка вывода имена, отличные от названий столбцов таблицы. Так, например, если надо, чтобы данные из столбцов Fam и Name (это имена столбцов в таблице) выводились в выводном списке под русифицированными именами Фамилия и Имя, требуется начать инструкцию следующим образом:

SELECT Fam AS “Фамилия”, Name AS “Имя”, …

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

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

Все последующие предложения оператора SELECT являются необязательными.

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

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

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

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

По умолчанию столбцы сортируются по возрастанию, т.е. флаг ASC указывать не обязательно. Для сортировки по убыванию предназначен флаг DESC.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]