<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dasini.net - Journal d'un expert MySQL &#187; vues</title>
	<atom:link href="http://dasini.net/blog/tag/vues/feed/" rel="self" type="application/rss+xml" />
	<link>http://dasini.net/blog</link>
	<description>Repousser les frontières de la connaissance</description>
	<lastBuildDate>Thu, 02 Feb 2012 09:06:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>MySQL 5 : Les vues &#8212; (part 1/7)</title>
		<link>http://dasini.net/blog/2008/11/23/mysql-5-les-vues-part-17/</link>
		<comments>http://dasini.net/blog/2008/11/23/mysql-5-les-vues-part-17/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 00:18:30 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[vues]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=192</guid>
		<description><![CDATA[Le langage SQL acronyme de Structured Query Language (Langage Structuré de Requêtes), a été conçu pour gérer les données dans un SGBDR. A l'aide des DML (Data Manipulation Language ie les requêtes SELECT, INSERT, UPDATE, DELETE) il est possible de manipuler ces données qui sont stockées dans des tables. SQL nous propose une autre interface pour accéder à cette information: les vues.]]></description>
			<content:encoded><![CDATA[<p><!-- 	 	 --></p>
<p>Le langage SQL acronyme de  <strong>S</strong>tructured <strong>Q</strong>uery <strong>L</strong>anguage (Langage Structuré de Requêtes), a été conçu pour gérer les données dans un SGBDR. A l&#8217;aide des DML (<strong>D</strong>ata <strong>M</strong>anipulation <strong>L</strong>anguage ie les requêtes SELECT, INSERT, UPDATE, DELETE) il est possible de manipuler ces données qui sont stockées dans des tables. SQL nous propose une autre interface pour accéder à cette information: les <strong>vues</strong>.</p>
<p>Dans cet article, nous verrons comment créer et se servir des vues, puis avec quelques exemples pratiques, nous allons voir comment les utiliser le mieux possible.</p>
<h2>Qu&#8217;est ce qu&#8217;une vue ?</h2>
<p>Les vues sont des tables virtuelles issues de l&#8217;assemblage d&#8217;autres tables en fonction de critères. Techniquement les vues sont créées à l&#8217;aide d&#8217;une requête SELECT. Elles ne  stockent pas les données quelles contiennent mais conservent juste la requête permettant de les créer.</p>
<p>La requête SELECT qui génère la vue référence une ou plusieurs tables. La vue peut donc être, par exemple, une jointure entre différentes tables, l&#8217;agrégation ou l&#8217;extraction de certaines colonnes d&#8217;une table. Elle peut également être créée à partir d&#8217;une autre vue.</p>
<p>Les vues sont souvent en lecture seule et ne permettent donc que de lire des données. Cependant MySQL permet la création de vues modifiables sous certaines conditions :</p>
<ul>
<li>La requête qui génère la vue 	doit permettre à MySQL de retrouver la trace de l&#8217;enregistrement à 	modifier dans la ou les tables sous-jacentes ainsi que celle de 	toutes les valeurs de chaque colonne. La requête SELECT créant la 	vue ne doit donc pas contenir de clause DISTINCT, GROUP BY, 	HAVING&#8230; et autres fonctions d&#8217;agrégation. La liste complète est  	disponible dans la documentation de MySQL.</li>
<li>L&#8217;autre condition est que sa 	clause ALGORITHM ne doit pas être de valeur TEMPTABLE. Nous 	reviendrons sur ce point.</li>
</ul>
<h2>A quoi servent les vues ?</h2>
<p>Les vues peuvent être utilisées pour différentes raisons, elles permettent de :</p>
<ul>
<li>Contrôler l&#8217;intégrité en 	restreignant l&#8217;accès aux données pour améliorer la 	confidentialité
<ul>
<li>Partitionnement vertical et/ou 		horizontal pour cacher des champs aux utilisateurs, ce qui permet 		de personnaliser l&#8217;affichage des informations suivant le type 		d&#8217;utilisateur.</li>
</ul>
</li>
<li>Masquer la complexité du schéma
<ul>
<li>Indépendance logique des 		données, utile pour donner aux utilisateurs l&#8217;accès à un 		ensemble de relations représentées sous la forme d&#8217;une table. Les 		données de la vue sont alors des champs de différentes tables 		regroupées, ou des résultats d&#8217;opérations sur ces champs.</li>
</ul>
</li>
<li>Modifier automatiquement des 	données sélectionnées (sum(), avg(), max(),&#8230;)
<ul>
<li>Manipuler des valeurs calculées 		à partir d&#8217;autres valeurs du schéma.</li>
</ul>
</li>
<li>Conserver la structure d&#8217;une table 	si elle doit être modifiée
<ul>
<li>Le schéma peut ainsi être 		modifié sans qu&#8217;il ne soit nécessaire de changer les requêtes du 		côté applicatif.</li>
</ul>
</li>
</ul>
<h2>Les droits nécessaires</h2>
<p>Pour créer une vue l&#8217;utilisateur doit avoir le droit <strong>CREATE VIEW</strong>. Il faut également avoir la permission de sélectionner toutes les colonnes qui apparaissent dans la commande <strong>SELECT</strong> spécifiant ce qu&#8217;est la vue.</p>
<p>De plus si la clause <strong>REPLACE </strong>est utilisée, le droit <strong>DROP </strong>est également nécessaire.</p>
<p>Le droit <strong>SHOW VIEW</strong> donne la possibilité d&#8217;exécuter la commande <strong>SHOW CREATE VIEW</strong>. Cette commande permet d&#8217;obtenir les informations de création d&#8217;une vue. Une autre façon d&#8217;obtenir ces informations est d&#8217;interroger la table <strong>view</strong> du schéma <strong>information_schema</strong>. Cette information sera exhaustive seulement pour les vues que vous avez créées.</p>
<pre>GRANT SELECT, DROP, CREATE VIEW, SHOW VIEW ON `projet`.* TO 'secretaire'@'localhost';</pre>
<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/">à suivre&#8230; syntaxe d&#8217;une vue</a>)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2008/11/23/mysql-5-les-vues-part-17/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Présentation : MySQL 5.0, un SGBDR mature ?</title>
		<link>http://dasini.net/blog/2008/11/14/presentation-mysql-50-un-sgbdr-mature/</link>
		<comments>http://dasini.net/blog/2008/11/14/presentation-mysql-50-un-sgbdr-mature/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 09:35:36 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Présentation]]></category>
		<category><![CDATA[déclencheur]]></category>
		<category><![CDATA[federated]]></category>
		<category><![CDATA[information_schema]]></category>
		<category><![CDATA[MySQL 5.O]]></category>
		<category><![CDATA[overview]]></category>
		<category><![CDATA[procédure stockée]]></category>
		<category><![CDATA[vues]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=127</guid>
		<description><![CDATA[MySQL est le SGBDR Open Source le plus populaire au monde. Sa cinquième version, sortie en octobre 2005, permet de mieux répondre aux problématiques d’entreprise. Au menu des nouveautés fonctionnelles : les vues, les procédures stockées, les déclencheurs, de nouveaux moteurs de stockage, la base de données INFORMATION_SCHEMA et diverses petites améliorations.]]></description>
			<content:encoded><![CDATA[<p>MySQL est le<span style="text-decoration: underline;"> SGBDR Open Source le plus populaire au monde</span>. Sa cinquième version, sortie en  octobre <strong>2005</strong>, permet de mieux répondre aux problématiques d’entreprise. Au menu des nouveautés fonctionnelles : les vues, les procédures stockées, les déclencheurs, de nouveaux moteurs de stockage, la base de données INFORMATION_SCHEMA et diverses petites améliorations.</p>
<p><strong><a title="MySQL 5.O, un SGBDR mature ?" href="http://dasini.net/blog/presentations/?#presentation_mysql" target="_self">http://dasini.net/blog/presentations/?#presentation_mysql</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2008/11/14/presentation-mysql-50-un-sgbdr-mature/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL 5.0 : Un SGBDR mature ? &#8212; (part 2/4)</title>
		<link>http://dasini.net/blog/2008/10/28/mysql-50-un-sgbdr-mature-part-24/</link>
		<comments>http://dasini.net/blog/2008/10/28/mysql-50-un-sgbdr-mature-part-24/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 15:28:56 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[MySQL 5]]></category>
		<category><![CDATA[sgbd]]></category>
		<category><![CDATA[vues]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=14</guid>
		<description><![CDATA[Les vues sont la plupart du temps utiles pour donner aux utilisateurs l’accès à un ensemble de relations représentées sous la forme d'une table. Une vue est une table virtuelle ; les données de la vue sont en fait des champs de différentes tables regroupées, ou des résultats d’opérations sur ces champs.]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		H5 { margin-bottom: 0.21cm } 		H5.western { font-family: "Arial", sans-serif; font-size: 11pt } 		H5.cjk { font-family: "MS Mincho"; font-size: 11pt } 		H5.ctl { font-family: "Tahoma"; font-size: 11pt } 		H3 { margin-bottom: 0.21cm } 		H3.western { font-family: "Arial", sans-serif } 		H3.cjk { font-family: "MS Mincho" } 		H3.ctl { font-family: "Tahoma" } --></p>
<address>(<a title="MySQL 5.O, un SGBDR mature ? -- (part 1/4)" href="http://dasini.net/blog/2008/10/27/mysql-50-un-sgbdr-mature-part-14/">&lt;- précédent</a>)</address>
<h3 class="western">Vues</h3>
<h5 class="western">Des vues pour faciliter la visibilité</h5>
<p style="margin-bottom: 0cm;">Les vues sont la plupart du temps utiles pour donner aux utilisateurs l’accès à un ensemble de relations représentées sous la forme d&#8217;une table. Une vue est une table virtuelle ; les données de la vue sont en fait des champs de différentes tables regroupées, ou des résultats d’opérations sur ces champs.</p>
<p style="margin-bottom: 0cm;">
<h5 class="western">Des vues pour améliorer la confidentialité</h5>
<p style="margin-bottom: 0cm;">Une vue n&#8217;est pas forcément un regroupement de plusieurs tables mais peut être un sous ensemble d&#8217;une table (ou de plusieurs) ce qui permet de cacher des champs aux utilisateurs.</p>
<p style="margin-bottom: 0cm;">Par exemple il ne sera pas forcément utile à tout le monde d&#8217;accéder aux champs indiquant les bénéfices réalisés sur un projet dans votre base comptable. Vous pouvez donc créer une vue contenant tous les champs de la table projet sauf le champs bénéfice.</p>
<p style="margin-bottom: 0cm;">L&#8217;approche avec MySQL 5 sera donc plus souple car elle ne force plus un découpage de table pour gérer la confidentialité et les droits donnés aux utilisateurs. Les vues permettront de remplir ce rôle.</p>
<h5 class="western">Les vues compliquent les mises à jour</h5>
<p style="margin-bottom: 0cm;">Insérer ou modifier des données dans une vue n&#8217;est pas aussi simple que de faire un update dans une table. Pour pouvoir le faire il faut réfléchir de façon plus poussée au modèle conceptuel de données :</p>
<p style="margin-bottom: 0cm;">Une vue n&#8217;est pas forcément accessible en insertion / modification. Pour cela il faut qu&#8217;il n&#8217;y ait pas d&#8217;incompatibilité logique à ce qu&#8217;elle le soit.</p>
<ul>
<li>
<p style="margin-bottom: 0cm;">Tous les champs des tables 	possédant des contraintes d&#8217;intégrités (index unique, clés 	primaires ..) doivent être présent</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0cm;">La vue ne doit pas  posséder de 	regroupement ou d’exclusion ( GROUP BY , DISTINCT,  UNION)</p>
</li>
<li>
<p style="margin-bottom: 0cm;">Le plan d&#8217;exécution de la vue ne 	doit pas passer par une table temporaire</p>
</li>
</ul>
<p style="margin-bottom: 0cm;"><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		H5 { margin-bottom: 0.21cm } 		H5.western { font-family: "Arial", sans-serif; font-size: 11pt } 		H5.cjk { font-family: "MS Mincho"; font-size: 11pt } 		H5.ctl { font-family: "Tahoma"; font-size: 11pt } --></p>
<p class="western" style="page-break-after: avoid;">
<h5 class="western">Les vues de MySQL 5 par la pratique</h5>
<pre style="margin-bottom: 0cm;">CREATE
[OR REPLACE]
VIEW view-name
[(column-list)]
AS select-statement</pre>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">Créer une vue revient à appliquer un filtre à une ou plusieurs tables. Pour schématiser prenons une entreprise normale. Dans celle-ci il y a des employés regroupés sous le terme &#8216;personnel&#8217;. On regroupe ces employés par &#8216;catégorie&#8217; en fonction de leur activité (administratif, informatique, commercial,&#8230;).</p>
<p style="margin-bottom: 0cm;">On peut créer une vue contenant l&#8217;ensemble des informaticiens avec le code suivant :</p>
<pre>CREATE VIEW personnelinformatique</pre>
<pre>AS SELECT a.nom AS nom,a.prenom AS prenom,b.service AS service</pre>
<pre>from categorie b, personnel a</pre>
<pre>where a.fkCategorie = 1 and a.fkCategorie = b.pkCategorie;</pre>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;"><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		H5 { margin-bottom: 0.21cm } 		H5.western { font-family: "Arial", sans-serif; font-size: 11pt } 		H5.cjk { font-family: "MS Mincho"; font-size: 11pt } 		H5.ctl { font-family: "Tahoma"; font-size: 11pt } --></p>
<h5 class="western">Optimisation des vues de MySQL 5</h5>
<p style="margin-bottom: 0cm;">
<pre>CREATE</pre>
<pre>[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]</pre>
<pre>[DEFINER = { user | CURRENT_USER }]</pre>
<pre>[SQL SECURITY { DEFINER | INVOKER }]</pre>
<pre>VIEW view-name</pre>
<pre>[(column-list)]</pre>
<pre>AS select-statement</pre>
<pre>[WITH [CASCADED | LOCAL] CHECK OPTION]</pre>
<p style="margin-bottom: 0cm;">
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<ul>
<li>
<p style="margin-bottom: 0cm;">La clause facultative «ALGORITHM» 	n&#8217;est pas standard. Elle permet d&#8217;optimiser votre code.</p>
</li>
<li>
<p style="margin-bottom: 0cm;">MERGE utilise la requête SQL 	ayant servie à la création de la vue comme base d&#8217;opération.</p>
</li>
<li>
<p style="margin-bottom: 0cm;">TEMPTABLE utilise une table 	temporaire créée  pour stocker les résultats.</p>
</li>
</ul>
<p style="margin-bottom: 0cm;">Par défaut l&#8217;optimiseur MySQL décide lui-même quelle option choisir (UNDEFINED). Pour améliorer les performances, il est généralement plus intéressant de le définir statiquement afin d&#8217;éviter à l&#8217;optimiseur de le découvrir à chaque exécution.</p>
<p style="margin-bottom: 0cm;">«DEFINER» assigne un créateur à la vue.</p>
<p style="margin-bottom: 0cm;">«SQL SECURITY» définit quelles seront les droits de l&#8217;utilisateur, lors de l&#8217;exécution de la vue. Deux valeurs sont possibles:</p>
<p style="margin-bottom: 0cm;">- DEFINER permet d&#8217;exécuter la vue avec les droits du créateur.</p>
<p style="margin-bottom: 0cm;">- INVOKER permet d&#8217;exécuter la vue avec ses propres droits.</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">Pour finir, la clause facultative CHECK OPTION permet de ne modifier que la vue ou du moins des informations qui respectent les contraintes de la vue. Ainsi dans notre exemple, avec la clause CHECK OPTION, il ne sera pas possible de modifier au travers de la vue « personnelInformatique » une personne ne travaillant pas dans le service informatique.</p>
<p style="margin-bottom: 0cm;">Manque</p>
<p style="margin-bottom: 0cm;">Le seul léger bémol est que la version 5.0 de MySQL ne disposera pas des vues matérialisées. Les vues matérialisées sont des données physiquement dupliquées dans le SGDB. Par exemple le résultat d&#8217;un calcul n&#8217;est plus à refaire pour chaque accès. Leur utilité se fait particulièrement sentir lors de traitements de tables très volumineuses .</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;"><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		H5 { margin-bottom: 0.21cm } 		H5.western { font-family: "Arial", sans-serif; font-size: 11pt } 		H5.cjk { font-family: "MS Mincho"; font-size: 11pt } 		H5.ctl { font-family: "Tahoma"; font-size: 11pt } --></p>
<h5 class="western">Comparaison avec d&#8217;autres SGBD</h5>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		TD P { margin-bottom: 0.21cm } 		TH P { margin-bottom: 0.21cm; font-style: italic } --></p>
<table border="1" cellspacing="0" cellpadding="4" width="100%" bordercolor="#000000">
<col width="67"></col>
<col width="46"></col>
<col width="47"></col>
<col width="49"></col>
<col width="47"></col>
<thead>
<tr valign="top">
<th width="26%"></th>
<th width="18%">MySQL</th>
<th width="18%">IBM DB2</th>
<th width="19%">Oracle</th>
<th width="18%">SQL Server</th>
</tr>
</thead>
<tbody>
<tr valign="top">
<td width="26%">Basic</td>
<td width="18%">Oui</td>
<td width="18%">Oui</td>
<td width="19%">Oui</td>
<td width="18%">Oui</td>
</tr>
<tr valign="top">
<td width="26%">UNION ALL</td>
<td width="18%">Oui</td>
<td width="18%">Oui</td>
<td width="19%">Oui</td>
<td width="18%">Oui</td>
</tr>
<tr valign="top">
<td width="26%">JOINS</td>
<td width="18%">Oui</td>
<td width="18%">Oui</td>
<td width="19%">Oui</td>
<td width="18%">Oui</td>
</tr>
<tr valign="top">
<td width="26%">INSTEAD OF</td>
<td width="18%">Non</td>
<td width="18%">Oui</td>
<td width="19%">Oui</td>
<td width="18%">Oui</td>
</tr>
<tr valign="top">
<td width="26%">UPDATEABLE_KEY</td>
<td width="18%">Oui</td>
<td width="18%">Non</td>
<td width="19%">Non</td>
<td width="18%">Non</td>
</tr>
</tbody>
</table>
<p>Possibilité des vues avec MySQL 5.0</p>
<p>UPDATEABLE_KEY est une fonctionnalité de MySQL permettant de modifier une clef primaire par le biais d&#8217;une vue.</p>
<address>(<a title="MySQL 5.O, un SGBDR mature ? -- (part 3/4)" href="http://dasini.net/blog/2008/10/29/mysql-50-un-sgbdr-mature-part-34/">suite -&gt;</a>)</address>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2008/10/28/mysql-50-un-sgbdr-mature-part-24/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

