
{"id":192,"date":"2008-11-23T01:18:30","date_gmt":"2008-11-23T00:18:30","guid":{"rendered":"http:\/\/dasini.net\/blog\/?p=192"},"modified":"2008-11-28T10:47:29","modified_gmt":"2008-11-28T09:47:29","slug":"mysql-5-les-vues-part-17","status":"publish","type":"post","link":"https:\/\/dasini.net\/blog\/2008\/11\/23\/mysql-5-les-vues-part-17\/","title":{"rendered":"MySQL 5 : Les vues &#8212; (part 1\/7)"},"content":{"rendered":"<p><!-- \t \t --><\/p>\n<p>Le langage SQL acronyme de  <strong>S<\/strong>tructured <strong>Q<\/strong>uery <strong>L<\/strong>anguage (Langage Structur\u00e9 de Requ\u00eates), a \u00e9t\u00e9 con\u00e7u pour g\u00e9rer les donn\u00e9es dans un SGBDR. A l&rsquo;aide des DML (<strong>D<\/strong>ata <strong>M<\/strong>anipulation <strong>L<\/strong>anguage ie les requ\u00eates SELECT, INSERT, UPDATE, DELETE) il est possible de manipuler ces donn\u00e9es qui sont stock\u00e9es dans des tables. SQL nous propose une autre interface pour acc\u00e9der \u00e0 cette information: les <strong>vues<\/strong>.<\/p>\n<p>Dans cet article, nous verrons comment cr\u00e9er et se servir des vues, puis avec quelques exemples pratiques, nous allons voir comment les utiliser le mieux possible.<\/p>\n<h2>Qu&rsquo;est ce qu&rsquo;une vue ?<\/h2>\n<p>Les vues sont des tables virtuelles issues de l&rsquo;assemblage d&rsquo;autres tables en fonction de crit\u00e8res. Techniquement les vues sont cr\u00e9\u00e9es \u00e0 l&rsquo;aide d&rsquo;une requ\u00eate SELECT. Elles ne  stockent pas les donn\u00e9es quelles contiennent mais conservent juste la requ\u00eate permettant de les cr\u00e9er.<\/p>\n<p>La requ\u00eate SELECT qui g\u00e9n\u00e8re la vue r\u00e9f\u00e9rence une ou plusieurs tables. La vue peut donc \u00eatre, par exemple, une jointure entre diff\u00e9rentes tables, l&rsquo;agr\u00e9gation ou l&rsquo;extraction de certaines colonnes d&rsquo;une table. Elle peut \u00e9galement \u00eatre cr\u00e9\u00e9e \u00e0 partir d&rsquo;une autre vue.<\/p>\n<p>Les vues sont souvent en lecture seule et ne permettent donc que de lire des donn\u00e9es. Cependant MySQL permet la cr\u00e9ation de vues modifiables sous certaines conditions :<\/p>\n<ul>\n<li>La requ\u00eate qui g\u00e9n\u00e8re la vue \tdoit permettre \u00e0 MySQL de retrouver la trace de l&rsquo;enregistrement \u00e0 \tmodifier dans la ou les tables sous-jacentes ainsi que celle de \ttoutes les valeurs de chaque colonne. La requ\u00eate SELECT cr\u00e9ant la \tvue ne doit donc pas contenir de clause DISTINCT, GROUP BY, \tHAVING&#8230; et autres fonctions d&rsquo;agr\u00e9gation. La liste compl\u00e8te est  \tdisponible dans la documentation de MySQL.<\/li>\n<li>L&rsquo;autre condition est que sa \tclause ALGORITHM ne doit pas \u00eatre de valeur TEMPTABLE. Nous \treviendrons sur ce point.<\/li>\n<\/ul>\n<h2>A quoi servent les vues ?<\/h2>\n<p>Les vues peuvent \u00eatre utilis\u00e9es pour diff\u00e9rentes raisons, elles permettent de :<\/p>\n<ul>\n<li>Contr\u00f4ler l&rsquo;int\u00e9grit\u00e9 en \trestreignant l&rsquo;acc\u00e8s aux donn\u00e9es pour am\u00e9liorer la \tconfidentialit\u00e9\n<ul>\n<li>Partitionnement vertical et\/ou \t\thorizontal pour cacher des champs aux utilisateurs, ce qui permet \t\tde personnaliser l&rsquo;affichage des informations suivant le type \t\td&rsquo;utilisateur.<\/li>\n<\/ul>\n<\/li>\n<li>Masquer la complexit\u00e9 du sch\u00e9ma\n<ul>\n<li>Ind\u00e9pendance logique des \t\tdonn\u00e9es, utile pour donner aux utilisateurs l&rsquo;acc\u00e8s \u00e0 un \t\tensemble de relations repr\u00e9sent\u00e9es sous la forme d&rsquo;une table. Les \t\tdonn\u00e9es de la vue sont alors des champs de diff\u00e9rentes tables \t\tregroup\u00e9es, ou des r\u00e9sultats d&rsquo;op\u00e9rations sur ces champs.<\/li>\n<\/ul>\n<\/li>\n<li>Modifier automatiquement des \tdonn\u00e9es s\u00e9lectionn\u00e9es (sum(), avg(), max(),&#8230;)\n<ul>\n<li>Manipuler des valeurs calcul\u00e9es \t\t\u00e0 partir d&rsquo;autres valeurs du sch\u00e9ma.<\/li>\n<\/ul>\n<\/li>\n<li>Conserver la structure d&rsquo;une table \tsi elle doit \u00eatre modifi\u00e9e\n<ul>\n<li>Le sch\u00e9ma peut ainsi \u00eatre \t\tmodifi\u00e9 sans qu&rsquo;il ne soit n\u00e9cessaire de changer les requ\u00eates du \t\tc\u00f4t\u00e9 applicatif.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Les droits n\u00e9cessaires<\/h2>\n<p>Pour cr\u00e9er une vue l&rsquo;utilisateur doit avoir le droit <strong>CREATE VIEW<\/strong>. Il faut \u00e9galement avoir la permission de s\u00e9lectionner toutes les colonnes qui apparaissent dans la commande <strong>SELECT<\/strong> sp\u00e9cifiant ce qu&rsquo;est la vue.<\/p>\n<p>De plus si la clause <strong>REPLACE <\/strong>est utilis\u00e9e, le droit <strong>DROP <\/strong>est \u00e9galement n\u00e9cessaire.<\/p>\n<p>Le droit <strong>SHOW VIEW<\/strong> donne la possibilit\u00e9 d&rsquo;ex\u00e9cuter la commande <strong>SHOW CREATE VIEW<\/strong>. Cette commande permet d&rsquo;obtenir les informations de cr\u00e9ation d&rsquo;une vue. Une autre fa\u00e7on d&rsquo;obtenir ces informations est d&rsquo;interroger la table <strong>view<\/strong> du sch\u00e9ma <strong>information_schema<\/strong>. Cette information sera exhaustive seulement pour les vues que vous avez cr\u00e9\u00e9es.<\/p>\n<pre>GRANT SELECT, DROP, CREATE VIEW, SHOW VIEW ON `projet`.* TO 'secretaire'@'localhost';<\/pre>\n<p><em>(<a title=\"MySQL 5 : Les vues -- (part 2\/7)\" href=\"http:\/\/dasini.net\/blog\/2008\/11\/26\/mysql-5-les-vues-part-27\/\">\u00e0 suivre&#8230; syntaxe d&rsquo;une vue<\/a>)<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le langage SQL acronyme de Structured Query Language (Langage Structur\u00e9 de Requ\u00eates), a \u00e9t\u00e9 con\u00e7u pour g\u00e9rer les donn\u00e9es dans un SGBDR. A l&rsquo;aide des DML (Data Manipulation Language ie les requ\u00eates SELECT, INSERT, UPDATE, DELETE) il est possible de manipuler ces donn\u00e9es qui sont stock\u00e9es dans des tables. SQL nous propose une autre interface pour acc\u00e9der \u00e0 cette information: les vues.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"categories":[8],"tags":[241,13],"class_list":["post-192","post","type-post","status-publish","format-standard","hentry","category-mysql","tag-mysql","tag-vues"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9LfWW-36","jetpack-related-posts":[{"id":209,"url":"https:\/\/dasini.net\/blog\/2008\/11\/26\/mysql-5-les-vues-part-27\/","url_meta":{"origin":192,"position":0},"title":"MySQL 5 : Les vues &#8212; (part 2\/7)","author":"Olivier DASINI","date":"26 novembre 2008","format":false,"excerpt":"Syntaxe d'une vue CREATE VIEW La commande MySQL pour cr\u00e9er une vue est assez proche de la syntaxe du standard SQL. CREATE VIEW nom_de_la_vue AS requ\u00eate_select","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":350,"url":"https:\/\/dasini.net\/blog\/2008\/12\/19\/mysql-5-les-vues-part-57\/","url_meta":{"origin":192,"position":1},"title":"MySQL 5 : Les vues &#8212; (part 5\/7)","author":"Olivier DASINI","date":"19 d\u00e9cembre 2008","format":false,"excerpt":"Masquer la complexit\u00e9 du sch\u00e9ma L'\u00e9quipe de d\u00e9veloppement doit \u00e9crire un moteur de recherche pour une application de commerce \u00e9lectronique. Voici un extrait des tables de la base de donn\u00e9es impliqu\u00e9es dans la recherche des produits du site.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":14,"url":"https:\/\/dasini.net\/blog\/2008\/10\/28\/mysql-50-un-sgbdr-mature-part-24\/","url_meta":{"origin":192,"position":2},"title":"MySQL 5.0 : Un SGBDR mature ? &#8212; (part 2\/4)","author":"Olivier DASINI","date":"28 octobre 2008","format":false,"excerpt":"Les vues sont la plupart du temps utiles pour donner aux utilisateurs l\u2019acc\u00e8s \u00e0 un ensemble de relations repr\u00e9sent\u00e9es sous la forme d'une table. Une vue est une table virtuelle ; les donn\u00e9es de la vue sont en fait des champs de diff\u00e9rentes tables regroup\u00e9es, ou des r\u00e9sultats d\u2019op\u00e9rations sur\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":622,"url":"https:\/\/dasini.net\/blog\/2009\/06\/16\/le-programmateur-devenements-event-scheduler-part-46\/","url_meta":{"origin":192,"position":3},"title":"Le programmateur d&rsquo;\u00e9v\u00e9nements ( Event Scheduler ) (part 4\/6)","author":"Olivier DASINI","date":"16 juin 2009","format":false,"excerpt":"Insertions de donn\u00e9es dans une table, toutes les 30 secondes mysql> SELECT * FROM _event.insert_event ; mysql> DELIMITER \u20ac\u20ac mysql> CREATE EVENT `_event`.`second_event` ON SCHEDULE EVERY 30 SECOND DO BEGIN \/*selectionne la val maximale de la colonne fois. Si elle vaut NULL alors retourne la valeur 0 dans la variable\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":248,"url":"https:\/\/dasini.net\/blog\/2008\/11\/30\/mysql-5-les-vues-part-37\/","url_meta":{"origin":192,"position":4},"title":"MySQL 5 : Les vues &#8212; (part 3\/7)","author":"Olivier DASINI","date":"30 novembre 2008","format":false,"excerpt":"Restrictions Lors de la cr\u00e9ation d'une vue, certaines contraintes doivent \u00eatre prises en compte : * Il n'est pas possible de cr\u00e9er un index sur une vue * La vue ne peut pas contenir de sous-requ\u00eates dans la clause FROM du SELECT. * Il n'est pas possible d'utiliser de variables\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":403,"url":"https:\/\/dasini.net\/blog\/2009\/01\/13\/mysql-5-les-vues-part-77\/","url_meta":{"origin":192,"position":5},"title":"MySQL 5 : Les vues &#8212; (part 7\/7)","author":"Olivier DASINI","date":"13 janvier 2009","format":false,"excerpt":"Conserver la structure d'une table si elle doit \u00eatre modifi\u00e9e La probl\u00e9matique est de mettre \u00e0 jour le sch\u00e9ma de l'application en changeant la structure de certaines tables.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/comments?post=192"}],"version-history":[{"count":7,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/192\/revisions"}],"predecessor-version":[{"id":210,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/192\/revisions\/210"}],"wp:attachment":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/media?parent=192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/categories?post=192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/tags?post=192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}