<?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>Le Blog SQL Server d&#039;ElSüket &#187; SQL général</title>
	<atom:link href="https://blog.developpez.com/elsuket/pcategory/sql-general/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/elsuket</link>
	<description>Nicolas Souquet - Expert SQL Server</description>
	<lastBuildDate>Mon, 05 Apr 2021 07:32:41 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Promotion sur les livres sur Microsoft Press Store</title>
		<link>https://blog.developpez.com/elsuket/p13058/t-sql/promotion-sur-les-livres-sur-microsoft-press-store</link>
		<comments>https://blog.developpez.com/elsuket/p13058/t-sql/promotion-sur-les-livres-sur-microsoft-press-store#comments</comments>
		<pubDate>Tue, 28 Jun 2016 22:04:59 +0000</pubDate>
		<dc:creator><![CDATA[elsuket]]></dc:creator>
				<category><![CDATA[Lecture]]></category>
		<category><![CDATA[SQL général]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/elsuket/?p=1257</guid>
		<description><![CDATA[Le livre T-SQL Fundamentals d&#8217;Itzik Ben-Gan, avec qui on a la sensation de réapprendre le T-SQL à chaque ouvrage, va bientôt arriver dans son troisième opus. Pour l&#8217;occasion, Microsoft offre jusqu&#8217;à 40% de remise avec le code PREORDER. Ceci est &#8230; <a href="https://blog.developpez.com/elsuket/p13058/t-sql/promotion-sur-les-livres-sur-microsoft-press-store">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Le livre T-SQL Fundamentals d&rsquo;Itzik Ben-Gan, avec qui on a la sensation de réapprendre le T-SQL à chaque ouvrage, va bientôt arriver dans son <a href="https://www.microsoftpressstore.com/cart/buy.aspx?isbn=9781509302000&amp;partner=76&amp;cmd=add">troisième opus</a>. Pour l&rsquo;occasion, Microsoft offre jusqu&rsquo;à 40% de remise avec le code PREORDER. Ceci est valable jusqu&rsquo;au 31 Juillet 2016.</p>
<p>Bonne lecture !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>En SQL, NULL n&#8217;est pas une valeur !</title>
		<link>https://blog.developpez.com/elsuket/p9971/t-sql/en_sql_null_n_est_pas_une_valeur</link>
		<comments>https://blog.developpez.com/elsuket/p9971/t-sql/en_sql_null_n_est_pas_une_valeur#comments</comments>
		<pubDate>Fri, 13 May 2011 12:54:58 +0000</pubDate>
		<dc:creator><![CDATA[elsuket]]></dc:creator>
				<category><![CDATA[SQL général]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je vois encore énormément d&#8217;erreurs à ce sujet, chez les développeurs avec qui je travaille et j&#8217;ai travaillé, mais aussi sur le forum. Voici donc la démonstration que NULL en SQL n&#8217;est pas une valeur &#8230; C&#8217;est très simple : &#8230; <a href="https://blog.developpez.com/elsuket/p9971/t-sql/en_sql_null_n_est_pas_une_valeur">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Je vois encore énormément d&rsquo;erreurs à ce sujet, chez les développeurs avec qui je travaille et j&rsquo;ai travaillé, mais aussi sur le <a href="http://www.developpez.net/forums/f49/bases-donnees/ms-sql-server/">forum</a>.</p>
<p>Voici donc la démonstration que NULL en SQL n&rsquo;est pas une valeur &#8230;</p>
<p><span id="more-155"></span><br />
C&rsquo;est très simple : exécutez la requête suivante :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">IF NULL = NULL <br />
&nbsp; PRINT 'OK' <br />
ELSE PRINT 'KO'</div></td></tr></tbody></table></div>
<p>Vous pensez que l&rsquo;on va obtenir <em>OK</em> &#8230; Donc vous pensez que NULL est une valeur et c&rsquo;est faux : on obtiendra <em>KO</em> !<br />
Vous pouvez faire l&rsquo;expérience avec n&rsquo;importe quel autre opérateur arithmétique (<code class="codecolorer text default"><span class="text">&gt;, &gt;=, &lt;, &lt;=, &lt;&gt;, !=</span></code>) : vous obtiendrez toujours <em>KO</em></p>
<p>Ceci prouve que NULL n&rsquo;est pas une valeur : en SQL, <strong>c&rsquo;est un marqueur qui signifie l&rsquo;absence de valeur</strong>.<br />
C&rsquo;est d&rsquo;ailleurs la raison pour laquelle en SQL, on écrit IS NULL dans un prédicat (WHERE ou JOIN), et non pas = NULL.<br />
En revanche, dans un langage comme Java ou C#, null == null est effectivement vrai.</p>
<p>En effet, beaucoup de langages évaluent les expressions logiques suivant deux valeurs : <em>true</em> ou <em>false</em>.<br />
Mais en SQL, un prédicat et évalué comme étant TRUE, FALSE <strong>ou UNKNOWN</strong>.</p>
<p>De la même façon, toute autre opération (NULL [operateur_arithmétique] [valeur]), peu importe le type de [valeur], retourne toujours NULL :</p>
<p>&#8211; NULL + 4<br />
&#8211; NULL + &lsquo;uneChaine&rsquo;<br />
&#8211; REPLACE(uneChaineNULL, &lsquo;qqch&rsquo;, &lsquo;_qqch&rsquo;)</p>
<p>Enfin, NULL est traité différemment par les différents opérateurs que l&rsquo;implémentation SQL Server de SQL propose :</p>
<p>&#8211; Les filtres de requête (ON d&rsquo;une jointure, WHERE (et AND qui suivent) et HAVING) évalueront NULL comme ne vérifiant pas le prédicat<br />
&#8211; Une contrainte CHECK évaluera NULL comme vérifiant le prédicat<br />
&#8211; Une contrainte UNIQUE prend NULL comme une valeur, ce qui est totalement faux<br />
&#8211; Une opération avec les opérateurs d&rsquo;ensembles UNION, EXCEPT et INTERSECT traite NULL comme une valeur, ce qui est également faux<br />
&#8211; GROUP BY groupe tous les NULL dans un groupe distinct<br />
&#8211; ORDER BY trie le NULL ensemble<br />
&#8211; La fonction COUNT() tient compte de NULL<br />
&#8211; Les <a href="http://msdn.microsoft.com/fr-fr/library/ms173454.aspx">autres fonctions d’agrégation</a> n&rsquo;en tiennent pas compte</p>
<p>Attention à NULL <img src="https://blog.developpez.com/elsuket/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>ElSüket</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Du choix des types de données</title>
		<link>https://blog.developpez.com/elsuket/p8233/moteur-de-base-de-donnees-sql-server/du_choix_des_types_de_donnees</link>
		<comments>https://blog.developpez.com/elsuket/p8233/moteur-de-base-de-donnees-sql-server/du_choix_des_types_de_donnees#comments</comments>
		<pubDate>Sat, 24 Oct 2009 18:59:01 +0000</pubDate>
		<dc:creator><![CDATA[elsuket]]></dc:creator>
				<category><![CDATA[Moteur de base de données SQL Server]]></category>
		<category><![CDATA[SQL général]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Lors de mes participations au forum SQL Server de ce site, je vois souvent des membres qui manipulent des données qui ne sont pas de type chaîne de caractère dans une colonne de ce type. Cela peut revenir à calculer &#8230; <a href="https://blog.developpez.com/elsuket/p8233/moteur-de-base-de-donnees-sql-server/du_choix_des_types_de_donnees">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Lors de mes participations au forum SQL Server de ce site, je vois souvent des membres qui manipulent des données qui ne sont pas de type chaîne de caractère dans une colonne de ce type.<br />
Cela peut revenir à calculer la racine carrée de carottes, et constitue donc un non-sens.<br />
Voici donc un inventaire de ce que j&rsquo;ai pu rencontrer jusqu&rsquo;ici, et qu&rsquo;il ne faut surtout pas faire pour transformer une base de données en dépotoir de données !</p>
<p><span id="more-154"></span><br />
=> <strong>Utiliser plusieurs colonnes de type BIT pour représenter un état</strong></p>
<p>Certes cela consomme moins d&rsquo;espace, mais l&rsquo;atomicité du sens de la valeur est alors perdue &#8230;<br />
Il sera donc avantageux d&rsquo;utiliser une colonne de type TINYINT qui consomme seulement un octet, en laissant la porte ouverte à de nouveaux états &#8230;</p>
<p>=> <strong>Utiliser le type TIME pour stocker une durée</strong></p>
<p>SQL Server 2008 a introduit plusieurs nouveaux types de données permettant de stocker des valeurs temporelles, notamment le type TIME, qui comme son nom l&rsquo;indique, permet de stocker un horaire, et non pas une durée.<br />
Si d&rsquo;aventure nous devons stocker une durée supérieure à 24h, comment allons-nous alors procéder ? Ce choix reste acceptable si l&rsquo;on est absolument certain que la durée ne dépassera jamais 24h, mais il est plus simple de stocker une durée comme un entier, ce qui permet d&rsquo;utiliser très simplement la fonction DATEADD().<br />
Une autre solution est de stocker la date de début et la date de fin de l&rsquo;opération, et d&rsquo;ajouter une colonne calculée qui spécifie la fonction DATEDIFF().</p>
<p>=> <strong>Utiliser le type DATETIME au lieu du type SMALLDATETIME</strong></p>
<p>Tout aussi regrettable, la confusion entre ces deux types de données :</p>
<p>&#8211; DATETIME nécessite 8 octets, et permet de stocker des dates avec une précision à 3ms,<br />
&#8211; SMALLDATETIME nécessite 4 octets, et permet de stocker des dates avec un précision à la minute.</p>
<p>Il est donc absurde de stocker des dates au type DATETIME pour une application qui n&rsquo;en a pas besoin, comme par exemple un centre de documentation qui propose l&rsquo;emprunt de livres &#8230;</p>
<p>Encore une fois cela a un impact important sur l&rsquo;indexation, puisqu&rsquo;il faudra plus de pages pour stocker la même donnée, et traverser plus de niveaux intermédiaires &#8230; il en résultera donc des lectures de pages supplémentaires et inutiles, pourrissant le cache de données, et ralentissant l&rsquo;exécution des requêtes &#8230;</p>
<p>=> <strong>Stocker des chaînes de caractères numériques ou forcément latins dans une colonne de type Unicode (NCHAR, NVARCHAR)</strong></p>
<p>Pourquoi stocker une référence, une adresse mail, un numéro de téléphone, ou un code postal en Unicode ?<br />
Tout simplement pour consommer deux fois plus d&rsquo;espace !<br />
En effet tout caractère stocké au type de données Unicode occupe 2 octets, contre seulement 1 en CHAR ou VARCHAR.</p>
<p>=> <strong>Utiliser le type VARCHAR au lieu de CHAR</strong></p>
<p>Si par exemple nous avons des codes qui contiennent des lettres, mais dont est certain qu&rsquo;ils seront toujours représentés sur 6 caractères, alors pourquoi stocker ceux-ci dans une colonne de type VARCHAR ?<br />
En effet le type VARCHAR fait consommer 2 octets en sus de tous les caractères de la chaîne, qui permettent de stocker l&rsquo;offset de fin de cette chaîne.<br />
Ce n&rsquo;est pas le cas lorsqu&rsquo;on stocke ce genre de données au type CHAR.</p>
<p>=> <strong>Stocker des dates dans une colonne de type CHAR | NCHAR | VARCHAR | NVARCHAR</strong></p>
<p>On se sert d&rsquo;une colonne de type chaîne pour stocker une date au format désiré, par exemple DDMMYYYY HH:mm:ss &#8230;<br />
Mais il y a pire encore : stocker ces dates au format Unicode (NCHAR, NVARCHAR) surtout quand on sait que les dates ne comprennent jamais de caractères Unicode.<br />
Rappelons donc que ces 4 types de données ne doivent servir exclusivement qu&rsquo;au stockage de chaînes de caractère, et que les types Unicode permettent de stocker des caractères non latins, comme ceux des langues arabes et asiatiques.</p>
<p>Conséquence directe de ce choix : la perte d&rsquo;intégrité des données, puisque dans une colonne de type chaîne de caractère, on peut stocker une représentation d&rsquo;une date, mais aussi n&rsquo;importe quelle autre chaîne de caractères.<br />
Bien sûr, certains me répondront que l&rsquo;on peut mettre une contrainte de domaine (CHECK) sur la colonne &#8230; outre le fait que la comparaison de chaînes est coûteux en ressources système, que ferez-vous en cas d&rsquo;erreur ?</p>
<p>Autre conséquence : comment interroger la table pour retourner les données qui ont été stockées entre deux dates ? Comment utiliser les fonctions consacrées aux dates comme DATEADD(), DATEDIFF(), &#8230; ?</p>
<p>Enfin l&rsquo;efficacité d&rsquo;un index sur une colonne de type chaîne de caractère est plus connue pour être faible.</p>
<p>Tout cela pour ne pas avoir utilisé le type DATETIME ou SMALLDATETIME &#8230; Il faut avouer que c&rsquo;est de l&rsquo;auto-flagellation !</p>
<p>=> <strong>Utiliser le type INT au lieu de SMALLINT, TINYINT ou BIT</strong></p>
<p>Voilà un précepte que l&rsquo;on rencontre aussi souvent qu&rsquo;il est incohérent.</p>
<p>Au nom de la simplicité (mais laquelle ?), nombreux sont ceux qui souhaitent stocker la valeur de clé primaire de tables de référence (jours de la semaine, quelques états possibles d&rsquo;une entité (en veille, en chargement, allumé, en cours d&rsquo;extinction), et j&rsquo;en passe &#8230;) dans une colonne de type INT.</p>
<p>Alors qu&rsquo;à l&rsquo;évidence, il n&rsquo;y aura jamais plus de 256 jours dans une semaine, stockons donc tout cela sur les 4 octets d&rsquo;une colonne de type INT, au lieu de stocker la même information dans une colonne de type TINYINT, pour seulement 1 octet.<br />
De cette façon on pourra avoir des indexes plus volumineux et moins efficaces lors des jointures, tout en pourrissant le cache de données !</p>
<p>=> <strong>Utiliser les types FLOAT ou REAL au lieu de NUMERIC ou DECIMAL</strong></p>
<p>Les types FLOAT et REAL, réservés aux valeurs numériques imprécises, sont appropriés dans le cas où l&rsquo;on a affaire à une application scientifique qui effectue des calculs en virgule flottante.</p>
<p>=> <strong>Utiliser les types MONEY ou SMALLMONEY au lieu de NUMERIC ou DECIMAL</strong></p>
<p>Il s&rsquo;agit ici plus d&rsquo;une anomalie que d&rsquo;autre chose, et je ne m&rsquo;explique toujours pas la présence des types de données MONEY et SMALLMONEY, alors que NUMERIC et DECIMAL conviennent tout à fait au même usage.<br />
Le pire, c&rsquo;est que les premiers fonctionnent très bien pour toute opération arithmétique de base, mais entraînent des imprécisions puisqu&rsquo;ils sont stockés comme des nombres à virgule flottante.<br />
Si on doit donc utiliser des pourcentages sur des valeurs monétaires, ou utiliser des taux de change, on préfèrera les types NUMERIC ou DECIMAL, qui sont précis.</p>
<p>=> <strong>Le comble de la médiocrité : le &laquo;&nbsp;type&nbsp;&raquo; sql_variant</strong></p>
<p>Ce pseudo-type de données est le pire qui ait été inventé : on peut tout y stocker, des chaînes de caractère, des entiers, des décimaux, un document XML, &#8230;</p>
<p>Voyons tous les inconvénients de ce &laquo;&nbsp;type&nbsp;&raquo; :<br />
&#8211; Il n&rsquo;est pas entièrement supporté par ODBC, qui convertit de plus toute valeur automatiquement en NVARCHAR(4000)<br />
&#8211; On ne peut bien évidemment pas l&rsquo;utiliser pour la définition d&rsquo;une colonne calculée,<br />
&#8211; On ne peut pas utiliser l&rsquo;opérateur LIKE sur une colonne de ce &laquo;&nbsp;type&nbsp;&raquo;,<br />
&#8211; Il ne peut pas être utilisé pour définir une clé primaire ou étrangère<br />
&#8211; On ne peut pas utiliser de fonction d&rsquo;aggrégation<br />
&#8211; On ne peut pas effectuer d&rsquo;opération arithmétique</p>
<p>Finalement tout doit être fait à l&rsquo;aide des fonctions CAST() ou CONVERT(), ce qui rend bien sûr un prédicat de filtre non <a href="http://blog.developpez.com/elsuket/p6886/moteur-de-base-de-donnees-sql-server/sql-searchable-arguments-ou-s-args/">SARG-able</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Quelle différence y a-t&#8217;il entre une colonne et un champ ? entre une ligne et un enregistrement ? entre une table et un tableau ?</title>
		<link>https://blog.developpez.com/elsuket/p8118/sql-general/quelle_difference_y_a_t_il_entre_une_col</link>
		<comments>https://blog.developpez.com/elsuket/p8118/sql-general/quelle_difference_y_a_t_il_entre_une_col#comments</comments>
		<pubDate>Mon, 28 Sep 2009 20:55:32 +0000</pubDate>
		<dc:creator><![CDATA[elsuket]]></dc:creator>
				<category><![CDATA[SQL général]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Lors de mes lectures et participations au forum SQL Server de ce site, je vois souvent des participants remplacer le terme ligne par enregistrement ou record, mais aussi le terme colone par le terme champ ou encore field, et enfin &#8230; <a href="https://blog.developpez.com/elsuket/p8118/sql-general/quelle_difference_y_a_t_il_entre_une_col">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Lors de mes lectures et participations au <a href="http://www.developpez.net/forums/f49/bases-donnees/ms-sql-server/">forum SQL Server de ce site</a>, je vois souvent des participants remplacer le terme <em>ligne</em> par <em>enregistrement</em> ou <em>record</em>, mais aussi le terme <em>colone</em> par le terme <em>champ</em> ou encore <em>field</em>, et enfin le pire : <em>table</em> par <em>tableau</em>, probablement par analogie de la représentation  des résultats de requête avec un fichier Excel.</p>
<p>Si certains diront que c&rsquo;est approximativement la même chose, et que s&rsquo;attacher a ce type de détails revient à chercher des poils sur les œufs, je vais démontrer que faire cet abus de langage montre qu&rsquo;on est assez imprécis &#8230;</p>
<p><span id="more-153"></span></p>
<p>=> <strong>Une colonne d&rsquo;une table de base de données n&rsquo;est pas un champ</strong></p>
<p>La différence la plus directe entre une colonne et un champ est qu&rsquo;un champ est défini dans un enregistrement à destination d&rsquo;une application particulière, alors qu&rsquo;une colonne d&rsquo;une ligne dans une table est définie en totale indépendance des applications qui liront ou modifieront ceux-ci.</p>
<p>Une autre discordance tout aussi importante est que toute colonne d&rsquo;une table de base de données stocke des valeurs scalaires et peut surtout être NULLable, notion rarement implémentée dans tout autre langage que SQL.<br />
Et je suis sûr que nombre d&rsquo;entre nous ont déjà eu des problèmes d&rsquo;intégration de données à partir de fichiers plats dans une base de données, où il faut modifier le comportement par défaut de l&rsquo;outil d&rsquo;intégration pour lui faire remplacer un saut de champ ou une chaîne vide du fichier pour voir son intégration dans la table cible remplacée par NULL.</p>
<p>Un nouvel éloignement peut être simplement mis en évidence si nous modifions l&rsquo;ordre des champs que nous avons établi pour une application et que nous tentons de le faire lire à une autre application : l&rsquo;ordre n&rsquo;a aucune influence sur les tuples de valeurs stockées par les colonnes d&rsquo;une table, car celles-ci sont directement étiquetées par leur nom, et non pas désignées par leur ordre d&rsquo;apparition dans le fichier ou le flux.</p>
<p>Un écart plus spécifique est celui de l&rsquo;impossibilité pour un champ d&rsquo;être soumis à des contraintes de domaine (CHECK constraints) ou de valeur par défaut (DEFAULT constraints).</p>
<p>Pour en revenir aux problèmes que l&rsquo;on peut rencontrer lors des intégrations de données contenues dans des fichiers plats à destinations de tables de base de données, il arrive parfois qu&rsquo;il y ait discordance lors du transtypage d&rsquo;un champ vers une colonne : cela est tout simplement du au typage fort des colonnes, alors que les champs ne sont pas typés.<br />
Il s&rsquo;agit alors pour le moteur d&nbsp;&raquo;intégration de transtyper automatiquement, par exemple, d&rsquo;une chaîne de caractère vers un entier &#8230;</p>
<p>=> <strong>Une ligne d&rsquo;une table de base de données n&rsquo;est pas un enregistrement</strong></p>
<p>De la même façon que pour les champs, la structure des enregistrements est déterminée pour l&rsquo;usage d&rsquo;une application.<br />
Encore une fois, l&rsquo;ordre physique des champs de l&rsquo;enregistrement prime, alors que l&rsquo;ordre des colonnes d&rsquo;une ligne n&rsquo;altère pas la signification du tuple représenté par une ligne de base de données : {A,B,C} en base de données signifie la même chose que {C,A,B}, ce qui n&rsquo;est pas le cas dans un fichier ou un flux.</p>
<p>Toujours de la même manière que pour les colonnes, une ligne est définie dans un schéma de base de données, et non pas par l&rsquo;application qui en est la destination.<br />
L&rsquo;illustration en est la notion d&rsquo;ensemble vide : alors qu&rsquo;il est impossible de signifier cette notion dans un fichier, qui restera vide, une table de base de données, même si son cardinal est nul, conserve sa structure fortement typée, ses contraintes, &#8230;</p>
<p>Enfin toute ligne d&rsquo;une table de base de données est lue comme l&rsquo;unité de travail la plus simple, alors qu&rsquo;on peut extraire seulement certains champs d&rsquo;un enregistrement.</p>
<p>=> <strong>Une table n&rsquo;est pas un tableau</strong></p>
<p>Comme nous l&rsquo;avons vu précédemment, la notion d&rsquo;ordre en base de données n&rsquo;existe pas, alors que dans un fichier ou flux, c&rsquo;est tout à fait vrai.<br />
En effet une table n&rsquo;est pas accédée de façon séquentielle, et en ce sens l&rsquo;utilisation de curseurs est un non-sens pour les traitements en base de données, puisqu&rsquo;on peut associer à un curseur les mots NEXT, PREVIOUS, FIRST et LAST.<br />
Notons au passage que les curseurs sont un héritage de ce bon vieux COBOL, qui permettait en outre de lire des fichier dits <strong><em>séquentiels</em></strong>.</p>
<p>Mais plus important que cela, c&rsquo;est surtout les contraintes d&rsquo;intégrité que l&rsquo;on peut définir entre les tables d&rsquo;une base de données, et qu&rsquo;il n&rsquo;est pas possible de définir dans un fichier, ou entre plusieurs fichiers.</p>
<p>Aussi, un fichier est attaché à sa méthode de stockage sur disque, ce qui n&rsquo;est pas le cas d&rsquo;une table de base de données, qui en fait totale abstraction.</p>
<p>Tout cela pour bien comprendre la différence fondamentale qu&rsquo;il y a entre penser par ensembles, et penser séquentiellement.</p>
<p>ElSuket</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
