- •Технология организации баз данных и знаний
- •Методические указания к выполнению лабораторных работ
- •Методические указания к выполнению лабораторных работ
- •Предисловие
- •Библиографический список
- •Лабораторная работа № 1 Тема №1. ИнсталляцияMySqLи создание локального сервера
- •1. Цель работы
- •2. Основные технические возможности
- •3. Описание установки
- •4. Порядок выполнения работы
- •5. Содержание отчета
- •Лабораторная работа № 1
- •6. Содержание отчета
- •Лабораторная работа № 2 Тема №1. Создание баз и таблиц данных
- •1. Цель работы
- •2. Основные сведения
- •3. Программа работы
- •4. Указания к выполнению работы
- •3. Программа работы
- •00 Проверка моего домена с именем Moy.Loc
- •4. Указания к выполнению работы
- •5. Содержание отчета
- •3. Указания к выполнению работы
- •Задание 2: Разработать html-форму с методом Post
- •Тема №2. Передача значений переменным в сценариях php. Использование возможностей метода get без html-формы для передачи значений переменных в сценариях php
- •Тема №3. Создание формы и рнр-сценария в одном файле
- •Задание 1: Получение данных из текстового поля
- •I курсив
- •Тема №4. Использование чисел. Управляющие структуры
- •Тема №5. Использование управляющей структурыswitch
- •Тема № 6. Использование регулярных выражений в сценариях рнр
- •Проверка ошибок
- •Задание 1. Вывод информации о ошибочно заполненных полях формы
- •Задание 2. Использование функций пользователя для контроля полей формы
- •Задание 3. Проверка ограничений в текстовом поле.Lab6_0_2.Php
- •Задание 4. Специфика имени пользователя. Lab6_0_3.Php
- •Задание 5. Специфика имени пользователя с помощью JavaScript. Lab6_0_4.Php
- •Тема №7. Работа с массивами
- •Задание 1. Означивание массива и вывод на экран. Lab7_0.Php.
- •Задание 4. Сортировка массива.Lab7_3.Php.
- •Тема №8. Функции в сценариях рнр
- •Задание 1. Вложенные функции.Lab8_0_0.Php
- •Задание 2. Объявление функций внутри других функций.Lab8_0.Php
- •Задание 3. Возврат значений функцией.Lab8_1.Php
- •Задание 4. Возврат нескольких значений функцией.Lab8_2.Php
- •Задание 5. Возвращение функцией нескольких величин.Lab8_3.Php
- •Задание 6. Рекурсивные функции .Lab8_4.Php
- •Задание 7. Функции-переменные.Lab8_5.Php
- •Задание 8. Построение библиотек функций.Lab8_6_0.Php.
- •Задание 9. Построение шаблона сайта.Lab8_7_0.Php.
- •Тема №9. Использование файлов для хранения данных в сценариях рнр
- •Создание сценария загрузки.
- •Задание 3. Сохранение пользовательских данных в текстовом файлеLab9_5.Php
- •Задание 4. Сохранение пользовательских данных в текстовом файлеLab9_6_0.Php
- •Тема № 10. Работа с каталогами в сценариях рнр
- •Тема №11. Создание панели управления файлами
- •Задание 1. Разработать форму и сопутствующее ей приложение для панели управления файлами.
- •Тема № 12.Работа с базой через монтторMySql и PhpMyAdmin
- •Задание 1. Создать базу данных через командную строку
- •Задание 3. Вставка данных в базу данных
- •Задание 4. Создание командных файлов и файлов сценариев для вставки данных в базу данных.
- •Тема № 13. Извлечение данных из базы данных
- •Задание 1. Оператор выборки данныхSelect
- •Задание 2. Извлечение данных по определенному критерию
- •Задание 3. Извлечение данных из нескольких таблиц
- •Задание 4. Поиск несоответствующих строк
- •Задание 5. Использование псевдонимов имен таблиц (as)
- •Задание 6. Извлечение данных в определенном порядке
- •Задание 7. Группировка и агрегирование данных
- •Задание 8. Обновление записей в базе данных (update)
- •Задание 10. Удаление записей, таблиц и базы данных (delete)
- •Тема № 14.Php и MySql. Доступ к базе данных MySql из Web с помощью рнр
- •Задание 1. Изучение работы архитектуры Web-баз данных
- •Задание 2. Проверка и фильтрация данных, исходящих от пользователя. Использование объектно-ориентированного синтаксисаPhp
- •Задание 3. Внесение новой информации в базу данных. Проверка и фильтрация данных, исходящих от администратора
- •Задание 4. Создание и удаление баз данных
- •Содержание
Задание 3. Извлечение данных из нескольких таблиц
Часто для получения ответа от базы данных на заданный вопрос могут потребоваться данные нескольких таблиц. Например, если необходимо узнать, кто из клиентов осуществлял в этом месяце заказы, придется просмотреть таблицы Customers (Клиент) и Orders (Заказ). Если нужно узнать, что конкретно они заказали, нельзя обойти вниманием и таблицу Order_Items (Покупка).
Примечание. Эти данные находятся в разных таблицах, поскольку относятся к разным реальным объектам. Это один из принципов хорошей разработки базы данных.
Для объединения этой информации в SQL потребуется выполнить операцию, называемую соединением (join). Подразумевается соединение двух и больше таблиц с тем, чтобы сохранялись отношения между данными. Если, например, необходимо посмотреть, какие заказы сделал клиент Ян Дрибас, то сначала потребуется просмотреть таблицу Customers и найти в ней CustomerlD для клиента, после чего — таблицу Orders на предмет заказов, сделанных этим CustomerlD.
Хотя на первый взгляд операция соединения достаточно проста, на самом деле это один из наиболее сложных и тонких разделов SQL. В MySQL существует несколько разных типов соединения, каждый из которых предназначен для определенной цели.
Простое соединение двух таблиц
Начнем с поиска Ян Дрибас, которого мы уже упоминали:
Рис. 3.236. Результат запроса с использованием соединения таблиц.
Здесь стоит отметить несколько моментов.
Во-первых, для ответа на этот запрос необходима информация из двух таблиц, поэтому в списке перечислены обе.
Также мы определили тип соединения, возможно даже не зная его. Запятая между названиями таблиц эквивалентна словам INNER JOIN (внутреннее соединение) или CROSS JOIN (перекрестное соединение). Такой тип соединения еще называют полным объединением или Декартовым произведением таблиц. Это означает: "Возьми указанные таблицы и сделай из них одну большую. В большой таблице должна быть строка для любой возможной комбинации строк из каждой таблицы, указанной в списке, имеют они смысл или нет". Другими словами, получаем таблицу, в которой каждая строка таблицы Customers сопоставляется каждой строке таблицы Orders независимо от того, какой клиент сделал какой заказ.
В большинстве случаев смысла в этом немного. Как правило, нам нужны строки, которые в самом деле совпадают, т.е. когда конкретные заказы совпадают с теми клиентами, которые их производили.
Это достигается путем помещения в конструкцию WHERE условия соединения. Это особый тип условного оператора, который объясняет, какие атрибуты показывают отношения между двумя таблицами. В данном случае наше условие соединения было таким:
customers.customerid = orders.customerid
что предписывает MySQL выводить в таблицу с результатами только соответствия Customerid из таблицы Customers с CustomerlD из таблицы Orders.
Внеся это условие в запрос, мы получили объединение другого типа — соединение по равенству (equi-join - эквисоединение).
Обратите внимание на точечную нотацию, которой мы воспользовались для уточнения конкретного столбца конкретной таблицы. Так, customers.customerid относится к столбцу customerid из таблицы Customers, a orders.customerid — к столбцу customerid из таблицы Orders.
Точечная нотация необходима, когда имена столбцов неоднозначны, что случается, если одни и те же имена встречается в нескольких таблицах.
Как расширение его можно использовать для различения имен столбцов из разных баз данных. В нашем примере обозначение выглядит как table.column (таблица.столбец). Можно указать и иначе — database.table.column (база_данных.таблица.столбец), например, для проверки условия наподобие
books.orders.customerid = other_db.orders.customerid
С другой стороны, точечную нотацию можно применять и для всех ссылок на столбцы в запросе. Это частенько избавляет от лишней головной боли, особенно когда запросы становятся все более сложными. MySQL этого не требует, но удобочитабельные запросы — это не так уж и плохо. Если вы заметили, мы придерживаемся этого принципа во всех наших примерах, взять хотя бы вот такое условие customers.name = 'Ян Дрибас'.
Столбец name присутствует только в таблице customers, поэтому его необязательно указывать, но так, в общем-то, понятнее.
Соединение трех и более таблиц
Объединение более двух таблиц не сложнее объединения двух. Главное правило таково — таблицы нужно объединять попарно, учитывая условия объединения. Это можно представить в виде отношений данных между первой таблицей, второй и третьей.
Например, если требуется узнать, кто из клиентов заказал книги по Java, необходимо отследить эти отношения в рамках небольшого количества таблиц.
Необходимо будет найти клиентов, разместивших, по крайней мере, один заказ, который выражен в orderjtems книгой по Java. Из таблицы Customers перебираемся в таблицу Orders, используя customerid, как и в предыдущих случаях. Из таблицы Orders в таблицу Order_Items, используя orderid. Из Order_Items — в таблицу Books за нужной книгой, руководствуясь номером ISBN. После того как все связи установлены, можем запросить книги со словом Java в названии и получить в результате имена клиентов, которые купили какую-либо из этих книг.
Посмотрим на запрос, который приведет все это в исполнение:
select customers . name
from customers, orders, order_items, books
where customers.customerid = orders.customerid
and orders.orderid = order_items.orderid
and order_items.isbn = books.isbn
and books.title like '%Java%';
Этот запрос выдаст следующий результат:
Рис. 3.237. Результат запроса с использованием соединения таблиц.
В то же время запрос вида (рис. 3.238) даст пустой результат (Empty set):
Рис. 3.238. Результат запроса с неточным указанием аргумента поиска .
Обратите внимание, что были отслежены данные из четырех разных таблиц, а чтобы сделать это с помощью соединения по равенству, понадобились три разных условия объединения. Обычно каждой паре таблиц требуется одно условие соединения, таким образом, количество условий соединения на единицу меньше количества объединяемых таблиц. Это правило большого пальца может пригодиться при отладке запросов, которые работают неустойчиво. Проверьте свои условия объединения и убедитесь в том, что вы все время следовали намеченному пути, от того, что вы уже знаете — к тому, что нужно узнать.