[МУЗЫКА] [МУЗЫКА] Здравствуйте. В прошлый раз мы научились с вами писать запросы на языке SQL. Мы начали с самых простых запросов, в конце мы обсудили запросы, которые ссылаются на несколько таблиц, которые могут содержать несколько уровней вложенности. Сейчас мы рассмотрим с вами дополнительные возможности, которые предоставляет нам СУБД для реализации функции логики приложения. Часто бывают ситуации, когда мы написали какой-то сложный запрос, выполнили его, и нам снова нужно выполнить такой же запрос, только с другими параметрами. Для того чтобы сократить ресурсы на написание запросов, мы можем использовать специальный объект, который называется представление. Что это такое? Представление — это специальный объект базы данных, который представляет собой именованный и сохраненный запрос, который определяется при помощи оператора select. Эти представления могут быть основаны на одной или нескольких таблицах, а могут также ссылаться на другие представления. Созданные представления мы можем использовать в запросах вместо имен таблиц, указывая их после ключевого слова from. Зачем нам нужны представления? Представления дают нам, во-первых, возможность гибкой настройки прав доступа. Мы можем показывать каким-то пользователям только определенные столбцы из таблиц, не давай им доступ ко всей информации, содержащейся в базе данных. Кроме того, представления позволяют разделить логику хранения данных и программного обеспечения. Что это означает? В процессе использования базы данных может потребоваться некая реорганизация таблиц. Например, мы можем захотеть нормализовать нашу таблицу, разбив ее на два. А созданные представления позволят нам не изменять запрос, который использует приложение. Кроме того, представление позволяет осуществить удобный доступ к одной или нескольким таблицам. Рассмотрим команду для создания представлений в среде MySQL. Как любой объект базы данных, представление создается команда CREATE. После этого мы можем указать алгоритм, на основе которого представления создаются. Потом мы пишем ключевое слово view, указываем имя представления, определяем имена столбцов, которые войдут в наше представление. Дальше пишем AS select_statement и пишем выборку из одной или нескольких таблиц, которые войдут в основу нашего представления, и можем указать дополнительные опции, которые мы рассмотрим на примере. Какие конструкции могут быть у представления? Первая необязательная конструкция — это алгоритм, который будет использован при доступе к представлению. Представление не хранит физически данные, оно лишь хранит поименованный запрос, поэтому выборка из данных производится в момент обращения к этому представлению. В среде MySQL есть два алгоритма, которые могут быть использованы при обращении к представлениям. Это алгоритм MERGE и алгоритм TEMPTABLE, временные таблицы. Первый можно назвать слиянием. Если мы рассмотрим первый вариант MERGE, то для получения результирующего запроса у нас склеиваются условия where, исходного запроса и представления. А если мы выбрали второй алгоритм, то тогда содержимое представления будет сначала сохранено во временной таблице, а затем к временной таблице будет применяться оператор, обращенный к представлению. Мы можем либо явно указать алгоритм для построения представления, либо оставить его неопределённым, использовав ключевое слово UNDEFINED. В таком случае, если мы выбрали слово UNDEFINED, то это означает, что MySQL сервер сам выберет, какой алгоритм использовать для создания представления. Рассмотрим, как работает алгоритм MERGE, слияние. Создадим представление, которое будет обращаться к таблице с результатами экзаменов и выбирать оттуда столбцы идентификатор студента и оценку. Обратимся к этому представлению, чтобы найти студента через идентификатор. Вы видите на экране. Каким образом будет исполнен этот запрос? У нас в представлении мы использовали выборку тех, кто учится на пять, а при выполнении запроса к представлению мы ограничивали идентификатор студента. В таком случае запрос будет исполнен, когда после ключевого слова where будут соединены оба критерия. Если мы рассмотрим пример с работой такого же представления, но с алгоритмом TEMPTABLE, то на первом шаге у нас будет сгенерирована выборка из таблицы экзаменационная ведомость студентов, которые учатся на пятёрку, а потом из неё будет определён один студент, который соответствует введенному идентификатору студента. Мы можем обращаться к представлениям так же, как мы бы обращались к таблицам, когда мы пишем запросы. Что же касается изменения, можем ли мы изменять представление? На первый взгляд, казалось бы, что нет. Ведь представления не хранят непосредственных данных, они лишь хранят поименованный запрос. Но на самом деле это не так. Представления в некотором случае могут быть модифицируемыми, то есть мы можем применять к представлениям операции вставки, изменения и удаления. В каких случаях это возможно? Это возможно лишь, если наше представление, во-первых, построено только на одной таблице. Кроме того, у нас есть однозначное соответствие между строками таблицы, на которой представление построено, и строками представления. И все поля представления являются простым перечислением полей таблицы, а не являются выражениями, которые построены на основе табличных полей. Следующая опция, которая может быть использована при создании представлений, называется CHECK OPTION, проверка. Эта опция может потребоваться только для изменяемых представлений, и она гарантирует нам, что изменение строк таблицы через представление будет происходить только тогда, когда изменяемая строка соответствует критериям, по которым представление было построено. Когда мы меняем представление, то на самом деле у нас меняются строки таблицы, на которых представление основано. Аналогично со вставкой. Если мы выбираем представление с проверкой условий, указывая CHECK OPTION, то вставка в таблицу будет происходить только тогда, когда вставляемая строка соответствует критерию построения представления. Для опции проверки есть две возможности: каскадная и локальная. Если мы выбираем локальную проверку, то будет проверяться условие where только в собственном определении представления. А если мы выберем каскадную опцию, то тогда проверка будет происходить во всех вложенных представлениях, если таковые были определены в нашем представлении. Рассмотрим пример. Создадим обновляемое представление с условием проверки. Сделаем выборку домашних телефонов из таблицы телефонов. Рассмотрим вставку в представление. Наше представление является обновляемым, так как оно построено только на одной таблице телефонов, и вставлять мы можем только домашний телефон. Если мы попробуем вставить телефон с каким-нибудь другим типом, то добавление в таблицу не будет произведено. Таким образом, мы рассмотрели с вами механизмы представлений, которые широко используются для разработки приложений баз данных.