sql лекц 43 стр 1. Подготовка к изучению. Программы для работы
Скачать 0.66 Mb.
|
ПрактикаЗадания, приведенные в этой книге, соответствуют тестовым заданиям бесплатного онлайн-курса «SQL для непрограммистов». Вы можете воспользоваться соответствующими тестами курса, чтобы убедиться, что вы выполнили все задания правильно. При желании после выполнения всех тестовых заданий вы можете получить электронный сертификат об окончании курса (предоставляется за отдельную плату). Для выполнения задания скачайте учебную базу данных «Учёт расходов», запустите программу SQLite Database Browser и откройте скачанную базу данных. Внимательно прочитайте задание, составьте запрос и выполните его в программе. Убедитесь, что ре- зультат запроса соответствует условиям задания. Если получился не тот результат, который вы ожида- ли, исправьте запрос и выполните его снова. Ссылка на тест этого задания в курсе «SQL для непрограммистов»: Запросы SELECT – тест Составьте запрос, возвращающий все поля всех записей таблицыCategories. Составьте запрос, возвращающий перечень названий всех товаров, покоторым ведётся детализированный учётрасходов. Составьте запрос, возвращающий названия и описание всех категорий расхо- дов. Составьте запрос, возвращающий описание категории с номером1. Составьте запрос, возвращающий название и описание категории с номером2. Запросы к нескольким таблицамВ предыдущей главе нам пришлось выполнить два запроса, чтобы а) увидеть все задачи, входящие в первый по номеру список и б) узнать название этого списка. Так получилось, потому что к этому моменту мы знаем, как использовать запросы SELECT для выбора записей только из одной таблицы. Информация о задачах хра- нится в одной таблице (Tasks), а названия списков задач — в другой (Tasklists). Можно ли объединить эти два запроса в один, обратившись сразу к двум таблицам? Конечно, можно! Введите и выполните такой запрос и посмотрите на результат: select Tasklist, Task, Description from Tasks, Tasklists where Tasks.Tasklist_ID=Tasklists.Tasklist_ID and Tasks.Tasklist_ID=1 Теперь в результатах запроса мы видим и название списка задач, и сами задачи. В этом запросе появилось три новых элемента. Давайте рассмотрим их подробнее. Во–первых обобщённая структура запроса теперь выглядит так: SELECT {список полей} FROM {список таблиц} WHERE {условие отбора} Там, где мы раньше использовали имя одной таблицы, можно использовать целый список таблиц. Имена таблиц в этом списке разделяются запятой: … from Tasks, Tasklists … Во–вторых, поскольку в двух наших таблицах присутствуют поля с одинаковыми име- нами Tasklist_ID, каждый раз при использовании этого имени нам пришлось дополни- тельно сообщать движку базы данных, какую из таблиц мы имеем в виду. Для этого использовано расширенное имя поля, которое состоит из имени таблицы и собствен- но имени поля, разделённых точкой: … where Tasks.Tasklist_ID = Tasklists.Tasklist_ID… Если бы мы не указали принадлежность каждого из полей определённой таблице, движок вернул бы нам сообщение об ошибке примерно такого содержания: «не могу понять, к какой таблице относится поле Tasklist_ID». В-третьих, в этом запросе мы использовали условие, составленное из двух проверок: Tasks.Tasklist_ID=Tasklists.Tasklist_ID and Tasks.Tasklist_ID=1 Эти две проверки соединены ещё одним ключевым словом — AND (и). Оно означает, что для отбора записей должны быть выполнены оба условия: в таблицах Tasklists и Tasks должны совпадать значения полей Tasklist_ID значение этого поля в таблице Tasks должно быть равно 1. Этот запрос уже далеко не такой простой, как те, что мы использовали раньше. Что - бы лучше понять, как работают условия отбора, давайте попробуем выполнить его без условия WHERE: select Tasklist, Task, Description from Tasks, Tasklists Результат запроса состоит аж из 40 строк! И посмотрите: задача «Развернуть сайт» появилась в результатах запроса четыре раза, потому что при обработке запроса движок «включил» её в каждый из четырёх списков. То же самое произошло со все- ми задачами. А поскольку списков у нас четыре, а задач десять, в результате и полу- чилось 4 × 10 = 40 строк. Почему так получилось? Дело в том, что наша база данных на самом деле не знает, к какому списку относится какая задача. Хоть мы и дали одинаковые названия полям Tasklist_ID в двух таблицах, это сделано только для нашего удобства. Имена полей могли быть и разными. Чтобы связать список задач в таблице Tasklists с задачами из таблицы Tasks, мы должны явно сообщить в запросе, что таблицы связаны именно по этим полям. Для этого и служит первая часть условия: where Tasks.Tasklist_ID = Tasklists.Tasklist_ID Если мы выполним запрос, добавив к нему только это условие, то движок базы дан- ных отберёт из этих сорока строк только те комбинации записей таблиц Tasks и Tasklists, в которых значения полей Tasklist_ID совпадают: select Tasklist, Task, Description from Tasks, Tasklists where Tasks.Tasklist_ID=Tasklists.Tasklist_ID Теперь количество строк в результате запроса совпадает с количеством записей та- блицы Tasks, и каждой задаче поставлен в соответствие только один список. Обратите внимание: полю Tasklist_ID, которое мы использовали в условии отбора, совсем не обязательно присутствовать в списке возвращаемых полей. Что происходит, когда мы добавляем к запросу второе условие? and Tasks.Tasklist_ID=1 Как вы, наверное, уже поняли, оно дополнительно отфильтровывает из результата предыдущего запроса только те строки, при формировании которых использовались записи таблицы Tasks, в которых значение поля Tasklist_ID равно 1. В предыдущей главе я обещал вам, что можно избежать запоминания номеров запи- сей в запросе. Наверное, вы и сами уже догадались, что в качестве условия отбора записей можно использовать поле Tasklists.Tasklist (название списка) вместо поля Tasks.Tasklist_ID (номер списка): select Tasklist, Task, Description from Tasks, Tasklists where Tasks.Tasklist_ID=Tasklists.Tasklist_ID and Tasklists.Tasklist='Ремонт в ванной' Если в запросе SQL используется строка, то она должна быть обрамлена одинарны- ми кавычками: and Tasklists.Tasklist='Ремонт в ванной' Таблиц в списке может быть и больше двух, и в большинстве случаев каждая из перечисленных таблиц должна упоминаться хотя бы в одном условии, связывающем её с другими таблицами. Следующий запрос выбирает данные из трёх таблиц, до- бавляя к к каждой задаче информацию о том, в какой список она входит, а также к ка- кой категории дел относится этот список: select Category, Tasklist, Task, Description from Categories, Tasks, Tasklists where Tasks.Tasklist_ID=Tasklists.Tasklist_ID and Tasklists.Category_ID=Categories.Category_ID |