{"id":2956,"date":"2020-09-29T17:06:54","date_gmt":"2020-09-29T15:06:54","guid":{"rendered":"https:\/\/icn-isn-boissy.yj.fr\/wp\/?p=2956"},"modified":"2024-12-04T10:17:41","modified_gmt":"2024-12-04T09:17:41","slug":"langage-sql","status":"publish","type":"post","link":"https:\/\/icn-isn-boissy.yj.fr\/wp\/2020\/09\/29\/langage-sql\/","title":{"rendered":"Langage SQL"},"content":{"rendered":"\n<p>Nous avons eu l&rsquo;occasion d&rsquo;\u00e9tudier la structure d&rsquo;une base de donn\u00e9es relationnelle, nous allons maintenant apprendre \u00e0 r\u00e9aliser des requ\u00eates, c&rsquo;est-\u00e0-dire que nous allons apprendre \u00e0 cr\u00e9er une base des donn\u00e9es, cr\u00e9er des attributs, ajouter de donn\u00e9es, modifier des donn\u00e9es et enfin, nous allons surtout apprendre \u00e0 interroger une base de donn\u00e9es afin d&rsquo;obtenir des informations.<\/p>\n\n\n\n<p>Pour r\u00e9aliser toutes ces requ\u00eates, nous allons devoir apprendre un langage de requ\u00eates : SQL (Structured Query Language). SQL est propre aux bases de donn\u00e9es relationnelles, les autres types de bases de donn\u00e9es utilisent d&rsquo;autres langages pour effectuer des requ\u00eates.<\/p>\n\n\n\n<p>Pour cr\u00e9er une base de donn\u00e9es et effectuer des requ\u00eates sur cette derni\u00e8re, nous allons utiliser le logiciel \u00ab\u00a0DB Browser for SQLite\u00a0\u00bb (il se stue dans <em><strong>APP22(W:)\\SQLite_Browser_Portable<\/strong><\/em> ).<\/p>\n\n\n\n<p>SQLite est un syst\u00e8me de gestion de base de donn\u00e9es relationnelle tr\u00e8s r\u00e9pandu. Noter qu&rsquo;il existe d&rsquo;autres syst\u00e8mes de gestion de base de donn\u00e9es relationnelle comme MySQL ou PostgreSQL. Dans tous les cas, le langage de requ\u00eate utilis\u00e9 est le SQL (m\u00eame si parfois on peut noter quelques petites diff\u00e9rences). Ce qui sera vu ici avec SQLite pourra, \u00e0 quelques petites modifications pr\u00e8s, \u00eatre utilis\u00e9 avec, par exemple, MySQL.<\/p>\n\n\n\n<p>Nous allons commencer par cr\u00e9er notre base de donn\u00e9es :<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 1<\/h4>\n\n\n\n<p>Apr\u00e8s avoir lanc\u00e9 le logiciel \u00ab\u00a0DB Browser for SQLite\u00a0\u00bb, vous devriez obtenir ceci :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pixees.fr\/informatiquelycee\/n_site\/img\/nsi_term_bd_sql_1.png\" alt=\"DB Browser for SQLite\"\/><\/figure>\n\n\n\n<p>Cliquez sur Nouvelle base de donn\u00e9es. Apr\u00e8s avoir choisi un nom pour votre base de donn\u00e9es (par exemple \u00ab\u00a0db_livres.db\u00a0\u00bb), vous devriez avoir la fen\u00eatre suivante :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pixees.fr\/informatiquelycee\/n_site\/img\/nsi_term_bd_sql_2.png\" alt=\"DB Browser for SQLite\"\/><\/figure>\n\n\n\n<p>Cliquez alors sur <strong><em>Annuler<\/em><\/strong><\/p>\n\n\n\n<p>Notre base de donn\u00e9es a \u00e9t\u00e9 cr\u00e9\u00e9e :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pixees.fr\/informatiquelycee\/n_site\/img\/nsi_term_bd_sql_3.png\" alt=\"DB Browser for SQLite\"\/><\/figure>\n\n\n\n<p>mais pour l&rsquo;instant elle ne contient aucune table (aucune relation), pour cr\u00e9er une table, cliquez sur l&rsquo;onglet \u00ab\u00a0Ex\u00e9cuter le SQL\u00a0\u00bb. On obtient alors :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pixees.fr\/informatiquelycee\/n_site\/img\/nsi_term_bd_sql_4.png\" alt=\"DB Browser for SQLite\"\/><\/figure>\n\n\n\n<p>Copiez-collez le texte ci-dessous dans la fen\u00eatre \u00ab\u00a0SQL 1\u00a0\u00bb<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE LIVRES\n\t(id INT, titre TEXT, auteur TEXT, ann_publi INT, note INT);<\/code><\/pre>\n\n\n\n<p>Cliquez ensuite sur le petit triangle situ\u00e9 au-dessus de la fen\u00eatre SQL 1 <em>Ex\u00e9cuter <\/em>(ou appuyez sur F5), vous devriez avoir ceci :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pixees.fr\/informatiquelycee\/n_site\/img\/nsi_term_bd_sql_5.png\" alt=\"DB Browser for SQLite\"\/><\/figure>\n\n\n\n<p>Comme indiqu\u00e9 dans la fen\u00eatre, \u00ab\u00a0Requ\u00eate ex\u00e9cut\u00e9e avec succ\u00e8s\u00a0\u00bb !<\/p>\n\n\n\n<p>Vous venez de cr\u00e9er votre premi\u00e8re table.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>Revenons sur cette premi\u00e8re requ\u00eate :<\/p>\n\n\n\n<p>Le&nbsp;<em>CREATE TABLE LIVRES<\/em>&nbsp;ne devrait pas vous poser de probl\u00e8me : nous cr\u00e9ons une nouvelle table nomm\u00e9e \u00ab\u00a0LIVRES\u00a0\u00bb.<\/p>\n\n\n\n<p>La suite est \u00e0 peine plus complexe :<\/p>\n\n\n\n<p>nous cr\u00e9ons ensuite les attributs :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>id<\/li>\n\n\n\n<li>titre<\/li>\n\n\n\n<li>auteur<\/li>\n\n\n\n<li>ann_pulbi<\/li>\n\n\n\n<li>note<\/li>\n<\/ul>\n\n\n\n<p>Nous avons pour chaque attribut pr\u00e9cis\u00e9 son domaine : id : entier (INT), titre : cha\u00eene de caract\u00e8res (TEXT), auteur : cha\u00eene de caract\u00e8res, ann_publi : entier et note : entier<\/p>\n\n\n\n<p>L&rsquo;attribut \u00ab\u00a0id\u00a0\u00bb va jouer ici le r\u00f4le de cl\u00e9 primaire. On peut aussi, par souci de s\u00e9curit\u00e9 (afin d&rsquo;\u00e9viter que l&rsquo;on utilise 2 fois la m\u00eame valeur pour l&rsquo;attribut \u00ab\u00a0id\u00a0\u00bb), modifier l&rsquo;instruction SQL vue ci-dessus, afin de pr\u00e9ciser que l&rsquo;attribut \u00ab\u00a0id\u00a0\u00bb est bien notre cl\u00e9 primaire :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE LIVRES\n(id INT, titre TEXT, auteur TEXT, ann_publi INT, note INT, PRIMARY KEY (id));\t<\/code><\/pre>\n\n\n\n<p>Notre syst\u00e8me de gestion de base de donn\u00e9es nous avertira si l&rsquo;on tente d&rsquo;attribuer 2 fois la m\u00eame valeur \u00e0 l&rsquo;attribut\u00a0\u00bbid\u00a0\u00bb.<\/p>\n\n\n\n<p>Nous allons maintenant ajouter des donn\u00e9es :<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 2<\/h4>\n\n\n\n<p>Toujours dans l&rsquo;onglet \u00ab\u00a0Ex\u00e9cuter le SQL\u00a0\u00bb, apr\u00e8s avoir effac\u00e9 la fen\u00eatre SQL 1, copiez-collez dans cette m\u00eame fen\u00eatre la requ\u00eate ci-dessous :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO LIVRES(id,titre,auteur,ann_publi,note)\n\tVALUES\n\t(1,'1984','Orwell',1949,10),\n\t(2,'Dune','Herbert',1965,8),\n\t(3,'Fondation','Asimov',1951,9),\n\t(4,'Le meilleur des mondes','Huxley',1931,7),\n\t(5,'Fahrenheit 451','Bradbury',1953,7),\n\t(6,'Ubik','K.Dick',1969,9),\n\t(7,'Chroniques martiennes','Bradbury',1950,8),\n\t(8,'La nuit des temps','Barjavel',1968,7),\n\t(9,'Blade Runner','K.Dick',1968,8),\n\t(10,'Les Robots','Asimov',1950,9),\n\t(11,'La Plan\u00e8te des singes','Boulle',1963,8),\n\t(12,'Ravage','Barjavel',1943,8),\n\t(13,'Le Ma\u00eetre du Haut Ch\u00e2teau','K.Dick',1962,8),\n\t(14,'Le monde des \u0100','Van Vogt',1945,7),\n\t(15,'La Fin de l\u2019\u00e9ternit\u00e9','Asimov',1955,8),\n\t(16,'De la Terre \u00e0 la Lune','Verne',1865,10);<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>Ici aussi, aucun probl\u00e8me, la requ\u00eate a bien \u00e9t\u00e9 ex\u00e9cut\u00e9e :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pixees.fr\/informatiquelycee\/n_site\/img\/nsi_term_bd_sql_6.png\" alt=\"DB Browser for SQLite\"\/><\/figure>\n\n\n\n<p>La table <strong>LIVRES <\/strong>contient bien les donn\u00e9es souhait\u00e9es (onglet \u00ab\u00a0Parcourir les donn\u00e9es\u00a0\u00bb) :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pixees.fr\/informatiquelycee\/n_site\/img\/nsi_term_bd_sql_7.png\" alt=\"DB Browser for SQLite\"\/><\/figure>\n\n\n\n<p>Nous allons apprendre \u00e0 effectuer des requ\u00eates d&rsquo;interrogation sur la base de donn\u00e9es que nous venons de cr\u00e9er.<\/p>\n\n\n\n<p>Toutes les requ\u00eates se feront dans la fen\u00eatre SQL 1 de l&rsquo;onglet \u00ab\u00a0Ex\u00e9cuter le SQL\u00a0\u00bb<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 3<\/h4>\n\n\n\n<p>Saisissez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT id, titre, auteur, ann_publi, note\nFROM LIVRES\t<\/code><\/pre>\n\n\n\n<p>puis appuyez sur le triangle (ou la touche F5)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>Apr\u00e8s un temps plus ou moins long, vous devriez voir s&rsquo;afficher ceci :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pixees.fr\/informatiquelycee\/n_site\/img\/nsi_term_bd_sql_8.png\" alt=\"DB Browser for SQLite\"\/><\/figure>\n\n\n\n<p>Comme vous pouvez le constater, notre requ\u00eate SQL a permis d&rsquo;afficher tous les livres. Nous avons ici 2 mots cl\u00e9s du langage SQL&nbsp;<strong><em>SELECT<\/em>&nbsp;<\/strong>qui permet de s\u00e9lectionner les attributs qui devront \u00eatre \u00ab\u00a0affich\u00e9s\u00a0\u00bb (je mets \u00ab\u00a0affich\u00e9s\u00a0\u00bb entre guillemets, car le but d&rsquo;une requ\u00eate sql n&rsquo;est pas forc\u00e9ment d&rsquo;afficher les donn\u00e9es) et&nbsp;<strong><em>FROM<\/em>&nbsp;<\/strong>qui indique la table qui doit \u00eatre utilis\u00e9e.<\/p>\n\n\n\n<p>Il est \u00e9videmment possible d&rsquo;afficher seulement certains attributs (ou m\u00eame un seul) :<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 4<\/h4>\n\n\n\n<p>Saisissez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT titre, auteur\nFROM LIVRES<\/code><\/pre>\n\n\n\n<p>V\u00e9rifiez que vous obtenez bien uniquement les titres et les auteurs des livres<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 5<\/h4>\n\n\n\n<p>\u00c9crivez et testez une requ\u00eate permettant d&rsquo;obtenir uniquement les titres des livres.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>N.B. Si vous d\u00e9sirez s\u00e9lectionner tous les attributs, vous pouvez \u00e9crire :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT *\nFROM LIVRES<\/code><\/pre>\n\n\n\n<p>\u00e0 la place de :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT id, titre, auteur, ann_publi, note\nFROM LIVRES<\/code><\/pre>\n\n\n\n<p>Pour l&rsquo;instant nos requ\u00eates affichent tous les livres, il est possible d&rsquo;utiliser la clause&nbsp;<strong><em>WHERE<\/em>&nbsp;<\/strong>afin d&rsquo;imposer une (ou des) condition(s) permettant de s\u00e9lectionner uniquement certaines lignes.<\/p>\n\n\n\n<p>La condition doit suivre le mot-cl\u00e9&nbsp;<strong><em>WHERE<\/em>&nbsp;<\/strong>:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 6<\/h4>\n\n\n\n<p>Saisissez et testez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT titre, ann_publi\nFROM LIVRES\nWHERE auteur='Asimov'<\/code><\/pre>\n\n\n\n<p>V\u00e9rifiez que vous obtenez bien uniquement les livres \u00e9crits par Isaac Asimov.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 7<\/h4>\n\n\n\n<p>\u00c9crivez et testez une requ\u00eate permettant d&rsquo;obtenir uniquement les titres des livres \u00e9crits par Philip K.Dick.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>Il est possible de combiner les conditions \u00e0 l&rsquo;aide d&rsquo;un&nbsp;<strong><em>OR<\/em>&nbsp;<\/strong>ou d&rsquo;un&nbsp;<em><strong>AND<\/strong><\/em><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 8<\/h4>\n\n\n\n<p>Saisissez et testez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT titre, ann_publi\nFROM LIVRES\nWHERE auteur='Asimov' AND ann_publi&gt;1953<\/code><\/pre>\n\n\n\n<p>V\u00e9rifiez que nous obtenons bien le livre \u00e9crit par Asimov publi\u00e9 apr\u00e8s 1953 (comme vous l&rsquo;avez sans doute remarqu\u00e9, il est possible d&rsquo;utiliser les op\u00e9rateurs d&rsquo;in\u00e9galit\u00e9s).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 9<\/h4>\n\n\n\n<p>D&rsquo;apr\u00e8s vous, quel est le r\u00e9sultat de cette requ\u00eate :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT titre\nFROM LIVRES\nWHERE auteur='K.Dick' OR note&gt;=8<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 10<\/h4>\n\n\n\n<p>\u00c9crire une requ\u00eate permettant d&rsquo;obtenir les titres des livres publi\u00e9s apr\u00e8s 1945 qui ont une note sup\u00e9rieure ou \u00e9gale \u00e0 9.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>Il est aussi possible de rajouter la clause SQL&nbsp;<em><strong>ORDER BY<\/strong><\/em>&nbsp;afin d&rsquo;obtenir les r\u00e9sultats class\u00e9s dans un ordre pr\u00e9cis.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 11<\/h4>\n\n\n\n<p>Saisissez et testez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT titre\nFROM LIVRES\nWHERE auteur='K.Dick' ORDER BY ann_publi<\/code><\/pre>\n\n\n\n<p>Nous obtenons les livres de K.Dick class\u00e9s du plus ancien ou plus r\u00e9cent.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>Il est possible d&rsquo;obtenir un classement en sens inverse \u00e0 l&rsquo;aide de la clause <strong>DESC<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 12<\/h4>\n\n\n\n<p>Saisissez et testez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT titre\nFROM LIVRES\nWHERE auteur='K.Dick' ORDER BY ann_publi DESC<\/code><\/pre>\n\n\n\n<p>Nous obtenons les livres de K.Dick class\u00e9s du plus r\u00e9cent au plus ancien.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 13<\/h4>\n\n\n\n<p>Que se passe-t-il quand la clause <strong>ORDER BY<\/strong> porte sur un attribut de type <strong>TEXT <\/strong>?<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>Vous pouvez constater qu&rsquo;une requ\u00eate du type : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT auteur\nFROM LIVRES<\/code><\/pre>\n\n\n\n<p>affiche plusieurs fois certains auteurs (les auteurs qui ont \u00e9crit plusieurs livres pr\u00e9sents dans la base de donn\u00e9es)<\/p>\n\n\n\n<p>Il est possible d&rsquo;\u00e9viter les doublons gr\u00e2ce \u00e0 la clause <strong>DISTINCT<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 14<\/h4>\n\n\n\n<p>Saisissez et testez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT DISTINCT auteur\nFROM LIVRES<\/code><\/pre>\n\n\n\n<p>Nous avons vu pr\u00e9c\u00e9demment qu&rsquo;une base de donn\u00e9es peut contenir plusieurs <strong>relations <\/strong>(plusieurs tables).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 15<\/h4>\n\n\n\n<p>Cr\u00e9ez une nouvelle base de donn\u00e9es que vous nommerez par exemple <strong><em>db_livres_auteurs.db<\/em><\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 16<\/h4>\n\n\n\n<p>Cr\u00e9ez une table <strong>AUTEURS(id INT, nom TEXT, prenom TEXT, ann_naissance INT, langue_ecriture TEXT) <\/strong>\u00e0 l&rsquo;aide d&rsquo;une requ\u00eate SQL.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 17<\/h4>\n\n\n\n<p>Cr\u00e9ez une table <strong>LIVRES(id INT, titre TEXT, id_auteur INT, ann_publi INT, note INT) <\/strong>\u00e0 l&rsquo;aide d&rsquo;une requ\u00eate SQL.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 18<\/h4>\n\n\n\n<p>Ajoutez des donn\u00e9es \u00e0 la table AUTEURS \u00e0 l&rsquo;aide de la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO AUTEURS\n(id,nom,prenom,ann_naissance,langue_ecriture)\nVALUES\n(1,'Orwell','George',1903,'anglais'),\n(2,'Herbert','Frank',1920,'anglais'),\n(3,'Asimov','Isaac',1920,'anglais'),\n(4,'Huxley','Aldous',1894,'anglais'),\n(5,'Bradbury','Ray',1920,'anglais'),\n(6,'K.Dick','Philip',1928,'anglais'),\n(7,'Barjavel','Ren\u00e9',1911,'fran\u00e7ais'),\n(8,'Boulle','Pierre',1912,'fran\u00e7ais'),\n(9,'Van Vogt','Alfred Elton',1912,'anglais'),\n(10,'Verne','Jules',1828,'fran\u00e7ais');<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 19<\/h4>\n\n\n\n<p>Ajoutez des donn\u00e9es \u00e0 la table LIVRES \u00e0 l&rsquo;aide de la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO LIVRES\n(id,titre,id_auteur,ann_publi,note)\nVALUES\n(1,'1984',1,1949,10),\n(2,'Dune',2,1965,8),\n(3,'Fondation',3,1951,9),\n(4,'Le meilleur des mondes',4,1931,7),\n(5,'Fahrenheit 451',5,1953,7),\n(6,'Ubik',6,1969,9),\n(7,'Chroniques martiennes',5,1950,8),\n(8,'La nuit des temps',7,1968,7),\n(9,'Blade Runner',6,1968,8),\n(10,'Les Robots',3,1950,9),\n(11,'La Plan\u00e8te des singes',8,1963,8),\n(12,'Ravage',7,1943,8),\n(13,'Le Ma\u00eetre du Haut Ch\u00e2teau',6,1962,8),\n(14,'Le monde des \u0100',9,1945,7),\n(15,'La Fin de l\u2019\u00e9ternit\u00e9',3,1955,8),\n(16,'De la Terre \u00e0 la Lune',10,1865,10);<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>Nous avons 2 tables, gr\u00e2ce aux <strong>jointures <\/strong>nous allons pouvoir associer ces 2 tables dans une m\u00eame requ\u00eate.<\/p>\n\n\n\n<p>En g\u00e9n\u00e9ral, les jointures consistent \u00e0 associer des lignes de 2 tables. Elles permettent d&rsquo;\u00e9tablir un lien entre 2 tables. Qui dit lien entre 2 tables dit souvent clef \u00e9trang\u00e8re et clef primaire.<\/p>\n\n\n\n<p>Dans notre exemple l&rsquo;attribut \u00ab\u00a0<strong>id_auteur<\/strong>\u00a0\u00bb de la tables <strong>LIVRES <\/strong>est bien une cl\u00e9 \u00e9trang\u00e8re puisque cet attribut correspond \u00e0 l&rsquo;attribut \u00ab\u00a0<strong>id<\/strong>\u00a0\u00bb de la table \u00ab\u00a0<strong>AUTEURS<\/strong>\u00ab\u00a0.<\/p>\n\n\n\n<p>\u00c0 noter qu&rsquo;il est possible de pr\u00e9ciser au moment de la cr\u00e9ation d&rsquo;une table qu&rsquo;un attribut jouera le r\u00f4le de cl\u00e9 \u00e9trang\u00e8re. Dans notre exemple, \u00e0 la place d&rsquo;\u00e9crire :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE LIVRES\n(id INT, titre TEXT, id_auteur INT, ann_publi INT, note INT, PRIMARY KEY (id));<\/code><\/pre>\n\n\n\n<p>on pourra \u00e9crire :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE LIVRES\n(id INT, titre TEXT, id_auteur INT, ann_publi INT, note INT, PRIMARY KEY (id), FOREIGN KEY (id_auteur) REFERENCES AUTEURS(id));<\/code><\/pre>\n\n\n\n<p>gr\u00e2ce \u00e0 cette pr\u00e9cision, sqlite sera capable de d\u00e9tecter les anomalies au niveau de cl\u00e9 \u00e9trang\u00e8re : essayez par exemple d&rsquo;ajouter un livre \u00e0 la table <strong>LIVRES <\/strong>avec l&rsquo;attribut \u00ab\u00a0id_auteur\u00a0\u00bb \u00e9gal \u00e0 11 !<\/p>\n\n\n\n<p>Passons maintenant aux jointures :<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 20<\/h4>\n\n\n\n<p>Saisissez et testez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT *\nFROM LIVRES\nINNER JOIN AUTEURS ON LIVRES.id_auteur = AUTEURS.id<\/code><\/pre>\n\n\n\n<p>Le \u00ab\u00a0<strong>FROM LIVRES INNER JOIN AUTEURS<\/strong>\u00a0\u00bb permet de cr\u00e9er une jointure entre les tables <strong>LIVRES<\/strong> et <strong>AUTEURS <\/strong>(\u00ab\u00a0rassembler\u00a0\u00bb les tables <strong>LIVRES <\/strong>et <strong>AUTEURS <\/strong>en une seule grande table). Le \u00ab\u00a0<strong>ON LIVRES.id_auteur = AUTEURS.id<\/strong>\u00a0\u00bb signifie qu&rsquo;une ligne quelconque <strong>A<\/strong> de la table <strong>LIVRES <\/strong>devra \u00eatre fusionn\u00e9e avec la ligne <strong>B<\/strong> de la table <strong>AUTEURS <\/strong>\u00e0 condition que l&rsquo;attribut <strong>id <\/strong>de la ligne <strong>A<\/strong> soit \u00e9gal \u00e0 l&rsquo;attribut <strong>id_auteur<\/strong> de la ligne <strong>B<\/strong>.<\/p>\n\n\n\n<p>Par exemple, la ligne 1 (id=1) de la table <strong>LIVRES <\/strong>(que l&rsquo;on nommera dans la suite ligne A) sera fusionn\u00e9e avec la ligne 1 (id=1) de la table <strong>AUTEURS <\/strong>(que l&rsquo;on nommera dans la suite B) car l&rsquo;attribut <strong>id_auteur<\/strong> de la ligne A est \u00e9gal \u00e0 1 et l&rsquo;attribut id de la ligne B est aussi \u00e9gal \u00e0 1.<\/p>\n\n\n\n<p>Autre exemple, la ligne 1 (id=1) de la table <strong>LIVRES <\/strong>(que l&rsquo;on nommera dans la suite ligne A) ne sera pas fusionn\u00e9e avec la ligne 2 (id=2) de la table <strong>AUTEURS <\/strong>(que l&rsquo;on nommera dans la suite B&rsquo;) car l&rsquo;attribut <strong>id_auteur<\/strong> de la ligne A est \u00e9gal \u00e0 1 alors que l&rsquo;attribut <strong>id <\/strong>de la ligne B&rsquo; est \u00e9gal \u00e0 2.<\/p>\n\n\n\n<p>Cette notion de jointure n&rsquo;est pas \u00e9vidente, prenez votre temps pour bien r\u00e9fl\u00e9chir et surtout n&rsquo;h\u00e9sitez pas \u00e0 poser des questions.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 21<\/h4>\n\n\n\n<p>Saisissez et testez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT *\nFROM AUTEURS\nINNER JOIN LIVRES ON LIVRES.id_auteur = AUTEURS.id<\/code><\/pre>\n\n\n\n<p>Comme vous pouvez le constater, le r\u00e9sultat est diff\u00e9rent, cette fois-ci ce sont les lignes de la table <strong>LIVRES <\/strong>qui viennent se greffer sur la table <strong>AUTEURS<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>Dans le cas d&rsquo;une jointure, il est tout \u00e0 fait possible de s\u00e9lectionner certains attributs et pas d&rsquo;autres :<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 22<\/h4>\n\n\n\n<p>Saisissez et testez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT nom, prenom, titre\nFROM AUTEURS\nINNER JOIN LIVRES ON LIVRES.id_auteur = AUTEURS.id<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 23<\/h4>\n\n\n\n<p>Saisissez et testez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT titre,nom, prenom\nFROM LIVRES\nINNER JOIN AUTEURS ON LIVRES.id_auteur = AUTEURS.id<\/code><\/pre>\n\n\n\n<p>Si un m\u00eame nom d&rsquo;attribut est pr\u00e9sent dans les 2 tables (par exemple ici l&rsquo;attribut id), il est n\u00e9cessaire d&rsquo;ajouter le nom de la table devant afin de pouvoir les distinguer (AUTEURS.id et LIVRES.id)<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 24<\/h4>\n\n\n\n<p>Saisissez et testez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT titre,AUTEURS.id,nom, prenom\nFROM LIVRES\nINNER JOIN AUTEURS ON LIVRES.id_auteur = AUTEURS.id<\/code><\/pre>\n\n\n\n<p>Il est possible d&rsquo;utiliser la clause <strong>WHERE <\/strong>dans le cas d&rsquo;une jointure :<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 25<\/h4>\n\n\n\n<p>Saisissez et testez la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT titre,nom, prenom\nFROM LIVRES\nINNER JOIN AUTEURS ON LIVRES.id_auteur = AUTEURS.id\nWHERE ann_publi&gt;1950<\/code><\/pre>\n\n\n\n<p>Enfin, pour terminer avec les jointures, vous devez savoir que nous avons abord\u00e9 la jointure la plus simple (INNER JOIN). Il existe des jointures plus complexes (CROSS JOIN, LEFT JOIN, RIGHT JOIN), ces autres jointures ne seront pas abord\u00e9es ici.<\/p>\n\n\n\n<p>Nous en avons termin\u00e9 avec les requ\u00eates d&rsquo;interrogation, int\u00e9ressons-nous maintenant aux requ\u00eates de mise \u00e0 jour (<strong>INSERT<\/strong>, <strong>UPDATE<\/strong>, <strong>DELETE<\/strong>).<\/p>\n\n\n\n<p>Nous allons repartir avec une base de donn\u00e9es qui contient une seule table :<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 26<\/h4>\n\n\n\n<p>Cr\u00e9ez une nouvelle base de donn\u00e9es que vous nommerez par exemple <strong>db_livres2.db<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 27<\/h4>\n\n\n\n<p>Cr\u00e9ez une table LIVRES \u00e0 l&rsquo;aide de la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE LIVRES\n(id INT, titre TEXT, auteur TEXT, ann_publi INT, note INT, PRIMARY KEY (id));<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 28<\/h4>\n\n\n\n<p>Ajoutez des donn\u00e9es \u00e0 la table LIVRES \u00e0 l&rsquo;aide de la requ\u00eate SQL suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO LIVRES\n(id,titre,auteur,ann_publi,note)\nVALUES\n(1,'1984','Orwell',1949,10),\n(2,'Dune','Herbert',1965,8),\n(3,'Fondation','Asimov',1951,9),\n(4,'Le meilleur des mondes','Huxley',1931,7),\n(5,'Fahrenheit 451','Bradbury',1953,7),\n(6,'Ubik','K.Dick',1969,9),\n(7,'Chroniques martiennes','Bradbury',1950,8),\n(8,'La nuit des temps','Barjavel',1968,7),\n(9,'Blade Runner','K.Dick',1968,8),\n(10,'Les Robots','Asimov',1950,9),\n(11,'La Plan\u00e8te des singes','Boulle',1963,8),\n(12,'Ravage','Barjavel',1943,8),\n(13,'Le Ma\u00eetre du Haut Ch\u00e2teau','K.Dick',1962,8),\n(14,'Le monde des \u0100','Van Vogt',1945,7),\n(15,'La Fin de l\u2019\u00e9ternit\u00e9','Asimov',1955,8),\n(16,'De la Terre \u00e0 la Lune','Verne',1865,10);<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>Nous avons d\u00e9j\u00e0 eu l&rsquo;occasion de voir la requ\u00eate permettant d&rsquo;ajouter une entr\u00e9e (utilisation d&rsquo;<strong>INSERT<\/strong>)<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 29<\/h4>\n\n\n\n<p>Que va faire cette requ\u00eate ? V\u00e9rifiez votre r\u00e9ponse en l&rsquo;ex\u00e9cutant et en faisant une requ\u00eate \u00ab\u00a0<strong>SELECT * FROM LIVRES<\/strong>\u00ab\u00a0.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO LIVRES\n(id,titre,auteur,ann_publi,note)\nVALUES\n(17,'Hyp\u00e9rion','Simmons',1989,8);<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 30<\/h4>\n\n\n\n<p>\u00c9crivez et testez une requ\u00eate permettant d&rsquo;ajouter le livre de votre choix \u00e0 la table <strong>LIVRES<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>\u00ab\u00a0<strong>UPDATE<\/strong>\u00a0\u00bb va permettre de modifier une ou des entr\u00e9es. Nous utiliserons \u00ab\u00a0<strong>WHERE<\/strong>\u00ab\u00a0, comme dans le cas d&rsquo;un \u00ab\u00a0<strong>SELECT<\/strong>\u00ab\u00a0, pour sp\u00e9cifier les entr\u00e9es \u00e0 modifier.<\/p>\n\n\n\n<p>Voici un exemple de modification :<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 31<\/h4>\n\n\n\n<p>Que va faire cette requ\u00eate ? V\u00e9rifiez votre r\u00e9ponse en l&rsquo;ex\u00e9cutant et en faisant une requ\u00eate \u00ab\u00a0<strong>SELECT * FROM LIVRES<\/strong>\u00ab\u00a0.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UPDATE LIVRES\nSET note=7\nWHERE titre = 'Hyp\u00e9rion'<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 32<\/h4>\n\n\n\n<p>\u00c9crivez une requ\u00eate permettant d&rsquo;attribuer la note de 10 \u00e0 tous les livres \u00e9crits par Asimov publi\u00e9s apr\u00e8s 1950. Testez cette requ\u00eate.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p>\u00ab\u00a0<strong>DELETE<\/strong>\u00a0\u00bb est utilis\u00e9e pour effectuer la suppression d&rsquo;une (ou de plusieurs) entr\u00e9e(s). Ici aussi c&rsquo;est le \u00ab\u00a0WHERE\u00a0\u00bb qui permettra de s\u00e9lectionner les entr\u00e9es \u00e0 supprimer.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 33<\/h4>\n\n\n\n<p>Que va faire cette requ\u00eate ? V\u00e9rifiez votre r\u00e9ponse en l&rsquo;ex\u00e9cutant et en faisant une requ\u00eate \u00ab\u00a0<strong>SELECT * FROM LIVRES<\/strong>\u00ab\u00a0.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DELETE FROM LIVRES\nWHERE titre='Hyp\u00e9rion'<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 34<\/h4>\n\n\n\n<p>\u00c9crivez une requ\u00eate permettant de supprimer les livres publi\u00e9s avant 1945. Testez cette requ\u00eate.<\/p>\n\r\n","protected":false},"excerpt":{"rendered":"<p>Nous avons eu l&rsquo;occasion d&rsquo;\u00e9tudier la structure d&rsquo;une base de donn\u00e9es relationnelle, nous allons maintenant apprendre \u00e0 r\u00e9aliser des requ\u00eates, c&rsquo;est-\u00e0-dire que nous allons apprendre \u00e0 cr\u00e9er une base des donn\u00e9es, cr\u00e9er des attributs, ajouter de donn\u00e9es, modifier des donn\u00e9es et enfin, nous allons surtout apprendre \u00e0 interroger une base de donn\u00e9es afin d&rsquo;obtenir des &hellip; <a href=\"https:\/\/icn-isn-boissy.yj.fr\/wp\/2020\/09\/29\/langage-sql\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Langage SQL<\/span>  <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,57,67],"tags":[],"class_list":["post-2956","post","type-post","status-publish","format-standard","hentry","category-non-classe","category-nsi","category-bases-de-donnees"],"_links":{"self":[{"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/posts\/2956","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/comments?post=2956"}],"version-history":[{"count":6,"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/posts\/2956\/revisions"}],"predecessor-version":[{"id":4255,"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/posts\/2956\/revisions\/4255"}],"wp:attachment":[{"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/media?parent=2956"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/categories?post=2956"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/tags?post=2956"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}