
- •Введение Тема 1.1. Понятие и классификация автоматизированных информационных систем
- •Тема 1.2 Жизненный цикл аис и модели жизненного цикла аис Жизненный цикл аис
- •Модели жизненного цикла аис
- •Тема 1.3. Методология и технология проектирования аис. Типовое проектирование аис
- •Тема 2.1.Этапы анализа предметной области
- •Тема 2.2 Методологии описания предметной области
- •Тема 2.3 Системы автоматизированного проектирования аис
- •I Этапы развития саsе-систем
- •II Классификация саsе-средств
- •Тема 3.1 Основы современных систем управления базами данных. Критерии выбора субд при создании аис
- •Основные технические характеристики субд
- •Тема 3.2 Базовые понятия реляционных баз данных. Проектирование реляционных баз данных с использованием нормализации
- •Тема 3.4. Язык структурных запросов MySql. Установка MySql 5
- •Тема 3.5. Создание данных и таблиц. Типы данных. Удаление баз и таблиц. Редактирование структуры таблиц.
- •10.4. Преобразование таблицы
- •Тема 3.6. Добавление данных. Удаление данных. Обновление данных.
- •Тема 3.7. Выборка данных. Однотабличные запросы.
- •Тема 3.8 MySql. Выборка данных. Многотабличные запросы
- •Тема 3.9 MySql. Работа с функциями. Поиск данных.
- •Возможные решения
- •Тип столбца Null
- •Задания
- •Возможные решения
- •Строковые функции
- •Ascii(строка) ord(строка)
- •Concat(строка1, строка2, ...)
- •Concat_ws(разделитель, строка1, строка2, ...)
- •Conv(n, основание_начальное, основание_конечное)
- •Elt(n, строка1, строка2, строкаЗ, ...)
- •Field(строка, строка1, строка2, строка3, ...)
- •Find_in_set(строка, список_строк)
- •Substring_index(строка, разделитель, количество)
- •Trim([[both | leading | trailing] [удаляемая_строка] from] строка)
- •Uncompress(строка_для_распаковки)
- •Unhex(строка)
- •Архитектура odbc
- •Функции odbc api
- •Соотношение стандарта odbc и стандарта интерфейса уровня вызовов (cli)
- •Создание источника данных
- •Утилита odbc
- •Создание источника данных с использованием odbc api
- •Коды возврата
- •Тема 4.3 Разработка клиентского программного обеспечения Тема 4.5 Основные элементы клиентских программ (интерфейс пользователя, справочная система, инсталляционный пакет и т.Д.)
- •Разработка функциональных требований к проекту программного продукта
- •Разработка внешнего дизайна
- •Основные свойства пользовательского интерфейса
- •Естественность интерфейса
- •Согласованность интерфейса
- •Дружественность интерфейса (принцип «прощения» пользователя)
- •Принцип «обратной связи»
- •Простота интерфейса
- •Гибкость интерфейса
- •1. Фиксированная
- •Косметическая.
- •Тема 5.1 Этапы и виды технологических процнссов обработки информации. Тех.Процесс преобразования информации
- •Понятие информационной технологии
- •Технологический процесс преобразования информации
- •Тема 5.4 Методы и средства сбора и передачи данных
- •Тема 5.5 Резервное копирование базы данных и последующее восстановление Резервное копирование базы данных и последующее восстановление
- •Модели восстановления базы данных
- •Тема 5.6 Типы методов резервирования Типы методов резервирования
- •Тема 5.7 Планирование стратегии резервирования
- •Тема 5.8 Экспортирование структур баз данных
- •Тема 5.9 Восстановление информации в базах данных
Тема 3.7. Выборка данных. Однотабличные запросы.
Выборка данных
В данной главе описывается оператор select, позволяющий извлекать данные из таблицы базы данных. Упрощенный синтаксис оператора select выглядит следующим образом:
SELECT select_expr FROM tb1
Каждый запрос начинается с ключевого слова select, после которого следует список полей разделенных запятыми select_expr, которые будут возвращены в результате запроса. Ключевое слово from, указывающее, из какой таблицы извлекаются данные, остаются необязательным и может быть опущено.
Результатом запроса select всегда является таблица, которая ничем не отличается от таблиц, расположенных в базе данных, и называется результирующей таблицей. Более того, как будет показано далее, результаты запроса, выполненного при помощи запроса select, могут быть использованы для создания новой таблицы. Если результаты двух запросов к разным таблицам имеют одинаковый формат, их можно объединить в одну таблицу.
Изменение количества и порядка следования столбцов
Рассмотрим запросы на выборку данных на примере таблицы catalogs (листинг 4.24). Таблица имеет два поля: первичный ключ id_catalog и название каталога name. Выбрать все записи таблицы tbl можно при помощи запроса, представленного в листинге 7.1
Если требуется вывести все столбцы таблицы, необязательно перечислять их имена после ключевого слова select, достаточно заменить этот список символом "*" (все столбцы).
К списку столбцов в операторе select прибегают в том случае, если необходимо изменить порядок следования столбцов в результирующей таблице или выбрать только часть столбцов.
В листинге 7.3 в запросе к таблице catalogs изменяется порядок следования столбцов, а в запросе к таблице orders из пяти столбцов таблицы извлекаются только три.
В списке select_expr наряду с именем столбца допустимо использование констант, например, числа 5 и строки comments. В этом случае каждая строка результирующий таблицы содержит поля 5 и comments (листинг 7.4).
Условия
Ситуация, когда необходимо изменить количество выводимых строк, ветре гораздо чаще, чем когда требуется изменить число и порядок выводимых сто Для ввода в SQL-запрос такого рода ограничений в операторе select предназначено специальное ключевое слово where, после которого следует логическое условие. Если запись удовлетворяет такому условию, она попадает в результат выборки, в противном случае такая запись отбрасывается.
Так, в листинге 7.5 приводится пример запроса, извлекающего из таблицы с записи, чей первичный ключ id_catalog больше (оператор ">") 2.
Условие может быть составным и объединяться при помощи логических операторов. В листинге 7.6 используется составное условие: первичный ключ должен быть больше двух и меньше или равен 4. Для объединения этих двух условий используется оператор and (И).
Как видно из листинга 7.6, в результирующей таблице возвращаются записи в диапазоне от 3 до 4. Такого же эффекта можно добиться применением конструкции between min and max, возвращающей записи, значения столбца id_catalog для которых лежат в диапазоне от min до max (листинг 7.7)
Существует конструкция, противоположенная конструкции between— not between которая возвращает записи, не попадающие в интервал между min и max (листинг 7.8).
Иногда требуется извлечь записи, удовлетворяющие не диапазону, а списку, например, записи с id_catalog из списка (1,2,5), как показано в листинге 7.9. Для этого предназначена конструкция in.
В конструкции where могут использоваться не только числовые столбцы. В листинге 7.10 из таблицы catalogs извлекается запись, соответствующая каталогу "Процессоры".
Как видно из листинга 7.10, сравнение строк в MySQL не зависит от регистра.
В листинге 7.11 из таблицы orders извлекаются записи, соответствующие сделкам, осуществленным за февраль 2005 года.
В качестве логических выражений могут выступать и константы. Любое число, отличное от нуля, считается истинным выражением, т. е. удовлетворяющим запросу, а — ложью, т. е. не удовлетворяющим запросу.
Как видно из листинга 7.12, если первый запрос аналогичен select * from catalogs. то второй запрос всегда возвращает пустую таблицу.
Сортировка
Как видно из листингов, результат выборки представляет собой записи, которые располагаются в порядке, в котором они хранятся в базе данных. Однако часто требуете» отсортировать значения по одному из столбцов. Это осуществляется при помощи конструкции order by, которая следует после выражения select. После конструкции order by указывается столбец, по которому следует сортировать данные.
Как видно из листинга 7.13, первый запрос сортирует результат выборки по полю id_catalog, а второй по полю name.
Сортировку записей можно производить и по нескольким столбцам. Пусть требуется извлечь из таблицы products записи, соответствующие товарным позициям, количество которых на складе count от 4 до 8 с сортировкой по полю count. Для краткости выведем только столбцы count и mark (оценка товарной позиции).
Как видно из листинга 7.14, сортировка по полю count прошла успешно, однако оценки mark во втором столбце расположены в хаотическом порядке. Для сортировки результатов по двум столбцам их следует указать сразу после ключевого слова order by через запятую (листинг 7.15). Записи сортируются по полю count и, если встречается несколько записей с совпадающим полем count, сортируются по полю mark. Число столбцов, следующих за конструкцией order by, не ограничено.
По умолчанию сортировка производится в прямом порядке, записи располагаются начиная с наименьшего значения и заканчивая наибольшим.
Изменить порядок сортировки на обратный можно при помощи ключевого слова desc (листинг 7.17).
Для прямой сортировки также существует ключевое слово asc, но поскольку по умолчанию записи сортируются в прямом порядке, данное ключевое слово часто опускают.
Ограничение выборки
Результат выборки может содержать сотни и тысячи записей. Их вывод и обработка занимают значительное время и серьезно загружают сервер базы данных. Поэтому информацию часто разбивают на страницы и предоставляют ее пользователю порциями. Извлечение только части запроса требует меньше времени и вычислений, кроме того, пользователю часто бывает достаточно просмотреть первые несколько записей. Постраничная навигация используется при помощи ключевого слова limit, за которым следует число выводимых записей. В листинге 7.18 извлекаются первые пять записей, при этом одновременно осуществляется обратная сортировка по полю count.
Листинг 7.18 Использование ключевого слова LIMIT
Для того чтобы извлечь следующие пять записей, используется ключевое слово limit c двумя цифрами, первая указывает позицию, начиная с которой необходимо вернуть результат, а вторая цифра — это число извлекаемых записей (листинг 7.19).
Для извлечения следующих 5 записей необходимо использовать конструкцию
LIMIT 10, 5.
Использование функций
При выполнении выборки из базы данных часто требуется выполнять специфические задачи, для решения которых удобно воспользоваться встроенными функциями MySQL. Каждая функция имеет уникальное имя и может иметь несколько аргументов (в том числе и ни одного), которые перечисляются через запятую в круглых скобках вслед за названием. Если аргументы у функции отсутствуют, круглые скобки все равно следует указывать, например, now (). Отличительной чертой MySQL является то, что при использовании функций пробелы между именем функции и круглыми скобками недопустимы, т. е. написание now () правильное, a now () уже нет. Результат функции подставляется в место вызова функции.
В листинге 7.20 приведен пример использования функции version(), которая возвращает версию сервера MySQL.
Как видно из листинга 7.20, для использования функции version о не требуется применение ключевого слова from, т. к. параметры таблицы не нужны. Однако использование его не возбраняется (листинг 7.21).
В этом случае результат функции version () выступает в качестве строковой константы (см. листинг 7.4) при выборке из таблицы catalogs.
Для того чтобы исключить повторение результата по числу строк, в таблице в MySQL применяется таблица dual, на самом деле не существующая, но которая может быть использована в предложении from.
Чаще функция принимает параметры, например, имена столбцов. Функция count()возвращает число записей в таблице и принимает в качестве аргумента имя столбца. Функция возвращает число строк в таблице, значения столбца для которых отличны от NULL.
В качестве параметра функции наряду с именами столбцов может выступать символ звездочка "*". Одной из особенностей использования функций является то, что название столбца в результирующей таблицы совпадает с названием функции и ее параметрами. Часто это неудобно, особенно в прикладных программах, где после выполнения запроса обращение к результату происходит по имени столбца. В select-запросе столбцу можно назначить новое имя, для этого предназначен оператор as. В листинге 7.24 результату функции count () присваивается новый псевдоним total.
Новое имя можно использовать в других частях SQL-запроса, в выражениях where и order by.
В качестве дополнительного примера можно привести функции min () и мах (), возвращающие минимальное и максимальное значения столбца, имя которого передано в качестве параметра
Однако использование функций min () и max () в выражении where приведет к ошибке. В листинге 7.26 показана попытка извлечения записи из таблицы catalogs с максимальным значением поля id_catalog.
Решение поставленной выше задачи следует искать с привлечением выражения order by. В листинге 7.27 первый запрос извлекает запись с наименьшим значением поля id_catalog, а второй — с наибольшим.
СУБД MySQL имеет большое число встроенных функций.
Группировка записей
Пусть необходимо определить первичные ключи, соответствующие каталогам id_catalog, в которых есть хоть одна товарная позиция. Для этого достаточно осуществить запрос к таблице products, который извлечет поле id catalog (листинг 7.28).
Как видно из листинга 7.28, результат не совсем удобен для восприятия. Было бы лучше, если бы запрос вернул уникальные значения столбца id_catalog. Для этого перед именем столбца можно использовать ключевое слово distinct, которое предписывает MySQL извлекать только уникальные значения.
Как показано в листинге 7.29, результат запроса не содержит ни одного повторяющегося значения. Использование ключевого слова distinct допускается совместно с функцией count(). В листинге 7.30 первый запрос возвращает общее число записей в таблице products, а второй — число уникальных значений id_catalog.
Для ключевого слова distinct имеется противоположное слово all, которое предписывает извлечение всех значений столбца, в том числе и повторяющихся. Поскольку такое поведение установлено по умолчанию, ключевое слово all часто опускают.
Для извлечения уникальных записей чаще прибегают к конструкции group by, за которой указывается имя столбца, по которому группируется результат.
Однако, в отличие от ключевого слова distinct, использование функции count () совместно с group by приводит не к подсчету уникальных значений id_catalog, а к выводу числа записей, соответствующих каждому из уникальных значений id_cataiog.
Как видно из листинга 7.32, каталог с первичным ключом id_catalog = 1 содержит 9 товарных позиций, с id_catalog = 2 — 6 и т. д.
При использовании конструкции group by точно так же возможно использование условия where.
Чаще при составлении условий требуется ограничить выборку по результату функции, например, выбрать каталоги, где число товарных позиций больше пяти. Использование для этих целей конструкции where приводит к ошибке.
Для решения этой проблемы вместо ключевого слова where используется ключевое слово having, которое располагается вслед за конструкцией group by.
В условии having можно использовать все столбцы результирующей таблицы, не только вычисляемые, например, в листинге 7.36 приводится пример запроса, извлекающего уникальные значения столбца id_catalog, больше двух
Отличие запросов, представленных в листингах 7.33 и 7.36, заключается в том, что в случае использования ключевого слова where сначала производится выборка из таблицы с применением условия и лишь затем группировка результата, а в случае использования ключевого слова having сначала происходит группировка таблицы и лишь затем выборка с применением условия.
Допускается использование условия having без группировки group by.
В этом случае каждая строка таблицы рассматривается как отдельная группа.
Объединение таблиц
Как было сказано выше, оператор select возвращает результат в виде таблицы. Если формат результирующих таблиц (число, порядок следования и тип столбцов) совпадает, то возможно объединение результатов выполнения двух операторов select в одну результирующую таблицу. Это достигается использованием оператора union.
Пусть имеются два запроса, представленные в листинге 7.38.
Объединить результаты из этих двух таблиц можно, соединив два запроса select при помощи ключевого слова union, как это продемонстрировано в листинге 7.39.
Во втором запросе select, производящем выборку из таблицы orders, к значению первичного ключа id_orders добавляется значение 5, таким образом, все значения в результирующей таблице становятся уникальными. Однако если результирующая таблица содержит повторяющиеся строки, СУБД MySQL автоматически отбрасывает дубликаты (листинг 7.40)
Как видно из листинга 7.40, вместо десяти записей выводится только пять. Изменить поведение по умолчанию можно при помощи ключевого слова all, которое добавляется после оператора union. Использование union all требует, чтобы возвращались все строки из обеих результирующих таблиц.
Для формы union all существует противоположенный оператор union distinct, ho т. к. оператор union по умолчанию отбрасывает не уникальные столбцы, ключевое слово distinct часто опускают.
Сохранение результатов во внешний файл
Результирующую таблицу, получаемую в результате выполнения оператора select, можно сохранить в текстовый файл. Это позволяет более внимательно изучить результаты, подвергнуть их дальнейшей обработки при помощи внешней программы или вставить их в таблицу при помощи оператора load data infile.
Для сохранения результатов в текстовом файле предназначен оператор select в форме select into outfile ' file_name'. Эта разновидность команды осуществляет запись выбранных строк в файл, указанный в file_name.
Выполнение SQL-запроса, показанного в листинге 7.42, приведет к созданию файла text.sql в директории C:/mysqI5/data/shop.
Важной деталью при составлении запроса, сохраняющего результат SELECT-запроса во внешнем текстовом файле, является то, что предложение into outfile располагаeся до ключевого слова from. Открытие данного файла в текстовом редакторе Notepad) Windows приведет к тому, что перевод строк не производится, а вместо символа перевода строки присутствует квадратик, которым обозначаются нечитаемые символы. Здесь, так же как и в случае оператора load data infile, по умолчанию принят UNIX-формат, т. е. перевод строк осуществляется только символом передачи строки \n, без добавления символа перевод каретки /r/n который требует windows.
Точно так же, как и для оператора load data infile, формат текстового файла задается при помощи ключевых слов:
Ключевое слово lines позволяет задать символ начала и конца строки при помощи инструкций starting by и terminated by соответственно. Для того чтобы строка начиналась со слова "table ", а заканчивалась переводом строки в стиле Windows —\r\n необходимо выполнить запрос, представленный в листинге 7.43.
В результате будет создан файл следующего содержания:
Конструкция order by id_catalog обеспечивает сортировку по первому полю таблицы catalogs.
Ключевое слово fields позволяет задать порядок обработки полей, совместно с ним применяются следующие конструкции:
Выполнение запроса из листинга 7.44 приводит к созданию файла text.sql следующего содержания: