Home

Données Jointures

 

Jointures

 

Introduction

Lors de l'étude des relations, nous avons passé en revue les techniques de disposition des données d'une table pour les enregistrements d'une autre table. Cela a démontré à réduire la duplication des données et les erreurs. Un autre problème qui implique la combinaison de tables consiste en la création d'enregistrements de plus d'une table et faire le résultat dans une liste unique. Il s'agit de la base de données jointures.

Une jointure de données est une technique de création d'une liste d'enregistrements de plus qu'une seule table, à l'aide de toutes les colonnes de toutes les tables impliquées ou en sélectionnant uniquement les colonnes souhaitées dans une ou toutes les tables impliquées. Cela signifie qu'une jointure de données est créée essentiellement en trois étapes :

  1. Sélectionnez les tables qui seront impliquées dans la jointure
  2. Sélectionnez une colonne qui va créer le lien de chaque table
  3. Écrivez une instruction SQL qui créera les enregistrements

Le tableau d'une jointure

Avant de créer une jointure, vous devez avoir les tables qui pourraient être impliquées. Les tables sont créées à l'aide des techniques que nous avons vues dans les leçons précédentes. Il est également important de créer une clé primaire pour chaque table. La table parente devra avoir généralement uniquement cette clé primaire qui serait utilisée pour établir le "lien" avec une table enfant. Si nécessaire, vous pouvez ensuite créer les enregistrements nécessaires pour la table. Voici un exemple :

CREATE TABLE 
(
     GenderID int identity (1, 1) not null, 
     Gender nchar(15), 
     CONSTRAINT PK_Genders PRIMARY KEY(GenderID)
) ; 
GO 
 
 
INSERT INTO Genders(Gender) 
VALUES(N'Male'),(N'Female'),(N'Unknown') ; 
GO

Lors de la création de la table enfant, n'oubliez pas de créer une colonne qui servirait comme le lien avec la table parente. Par (une bonne) habitude comme nous l'avons vu lors de l'étude des relations, le nom et le type de données de cette colonne sont les mêmes que la clé primaire de la table parente. Voici un exemple :

-- ===================================================  
-- Database:	 People
-- Author:	 FunctionX
-- Date Created: Tuesday, July 28, 2009  
-- ===================================================    
 
 
IF EXISTS(SELECT name FROM sys.databases  	
          WHERE name = N'People')
DROP DATABASE People;  
GO 
CREATE DATABASE People; 
GO    
 
 
USE People;  
GO 
 
 
IF OBJECT_ID('Genders', 'U') IS NOT NULL    
 DROP TABLE Genders  
GO    
 
 
-- ===================================================  
-- Database:  	 People
-- Table:     	 Genders
-- Author:    	 FunctionX  
-- Date Created:   Tuesday, July 28, 2009 
-- Description:	 This table holds the list of genders  
-- =================================================== 
CREATE TABLE Genders  
(      
    GenderID int identity(1, 1) not null,      
    Gender nchar(15),      
    CONSTRAINT PK_Genders PRIMARY KEY(GenderID) 
);  
GO   
 
 
INSERT INTO Genders(Gender) 
VALUES(N'Male'),(N'Female'),(N'Unknown');  
GO    
 
 
-- =================================================== 
-- Database:  	 People
-- Table:     	 Persons
-- Author:	     FunctionX  
-- Date Created:   Tuesday, July 28, 2009
-- Description:	 This table holds a list of people  
--				 and their genders  
-- ===================================================
CREATE TABLE Persons  
(      
    PersonID int identity(1, 1) not null,      
    FirstName nvarchar(20),      
    LastName nvarchar(20),      
    GenderID int,      
    CONSTRAINT PK_Persons PRIMARY KEY(PersonID) 
);  
GO    
 
 
INSERT INTO Persons(FirstName, LastName, GenderID)  
VALUES(N'John', N'Franks', 1), (N'Peter', N'Sonnens', 1);  
GO  
INSERT INTO Persons(FirstName, LastName)  
VALUES(N'Leslie',N'Aronson'); 
GO  
INSERT INTO Persons(FirstName, LastName, GenderID)  
VALUES(N'Mary', N'Shamberg', 2), (N'Chryssa', N'Lurie', 2),        
      (N'Hellah', N'Zanogh', 3), (N'Olympia', N'Sumners', 2),        
      (N'Roberta', N'Jerseys', 2);  
GO  
INSERT INTO Persons(FirstName, LastName)  
VALUES(N'Hel©ne', N'Campo');  
GO  
INSERT INTO Persons(LastName, GenderID)  
VALUES(N'Millam', 1), (N'Hessia', 2);  
GO  
INSERT INTO Persons(FirstName, LastName, GenderID)  
VALUES(N'Stanley', N'Webbs', 2), (N'Arnie', N'Ephron', 3),        
      (N'Mike', N'Pastore', 1);  
GO  
INSERT INTO Persons(FirstName) VALUES(N'Salim');  
GO  
INSERT INTO Persons(FirstName, LastName, GenderID)  
VALUES(N'Mary', N'Shamberg', 2), (N'Chryssa', N'Lurie', 2);  
GO  
INSERT INTO Persons(LastName) VALUES(N'Millers');  
GO  
INSERT INTO Persons(FirstName, GenderID) VALUES(N'Robert', 1);  
GO

Practical LearningFormation pratique : Présentation des jointures

  1. Démarrez Microsoft SQL Server avec SQL Server Management Studio et connectez-vous au serveur
  2. Dans le menu principal, cliquez sur fichier-> New->Query with Current Connection
  3. Pour préparer une base de données pour nos exercices, copiez et collez le code suivant dans la fenêtre de requête :
    -- ============================================= 
    -- Author:   FunctionX  
    -- Database: RealEstate2  
    -- =============================================  
    IF EXISTS 
    (    
    SELECT *      
      FROM sys.databases     
     WHERE name = N'RealEstate2'  
    )    
    DROP DATABASE RealEstate2  
    GO  
    CREATE DATABASE RealEstate2; 
    GO    
     
     
    -- =============================================  
    -- Author:   FunctionX  
    -- Database: RealEstate2  
    -- Table:    PropertyTypes  
    -- =============================================  
    USE RealEstate2;  
    GO  
    CREATE TABLE PropertyTypes  
    (    
        PropertyTypeID int identity(1,1) NOT NULL,    
        PropertyType varchar(20)  
    );  
    GO  
    INSERT INTO PropertyTypes(PropertyType)  
    VALUES(N'Condominium'); 
    GO  
    INSERT INTO PropertyTypes(PropertyType)  
    VALUES(N'Single Family');  
    GO  
    INSERT INTO PropertyTypes(PropertyType)  
    VALUES(N'Townhouse');  
    GO  
    INSERT INTO PropertyTypes(PropertyType)  
    VALUES(N'Unknown');  
    GO    
     
     
    -- =============================================  
    -- Author:   FunctionX  
    -- Database: RealEstate2  
    -- Table:    Conditions 
    -- ============================================= 
    USE RealEstate2;  
    GO  
    CREATE TABLE Conditions  
    (    
        ConditionID int identity(1,1) NOT NULL,    
        Condition varchar(20)  
    );  
    GO  
    INSERT INTO Conditions(Condition)  
    VALUES(N'Excellent');  
    GO  
    INSERT INTO Conditions(Condition)  
    VALUES(N'Good');  
    GO  
    INSERT INTO Conditions(Condition)  
    VALUES(N'Bad Shape');  
    GO  
    INSERT INTO Conditions(Condition)  
    VALUES(N'Highly Damaged');  
    GO   
     
     
    -- =============================================  
    -- Author:   FunctionX  
    -- Database: RealEstate2  
    -- Table:    Properties  
    -- =============================================  
    CREATE TABLE Properties  
    (    
        PropertyID int identity(1,1) NOT NULL,    
        PropertyNumber char(6),    
        Address varchar(100),    
        City varchar(50),    
        State char(2),    
        ZIPCode varchar(12),    
        PropertyTypeID int,    
        ConditionID int,    
        Bedrooms smallint,    
        Bathrooms float,    
        FinishedBasement bit,    
        IndoorGarage bit,    
        Stories smallint,    
        YearBuilt smallint,    
        MarketValue money  
    );  
    GO    
     
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'524880', N'1640 Lombardo Ave', N'Silver Spring', N'MD',    
           N'20904', 2, 2, 4, 2.5, 3, 1, 3, 1995, 495880.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'688364', N'10315 North Hacht Rd', N'College Park', N'MD',         
           N'20747', 2, 1, 4, 3.5, 3,         
           1, 2, 2000, 620724.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, FinishedBasement,    
      Stories, MarketValue)  
    VALUES(N'611464', N'6366 Lolita Drive', N'Laurel', N'MD',        
           N'20707', 2, 2, 1, 2, 422625.00);  
    GO  
    INSERT INTO Properties(Address, City, PropertyTypeID,    
      Bedrooms, MarketValue)  
    VALUES(N'9002 Palasko Hwy', N'Tysons Corner',        
           1, 2, 422895.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, State,    
      ZIPCode, Bedrooms, YearBuilt, MarketValue)  
    VALUES(N'420115', N'DC',         
           N'20011', 2, 1982, 312555);  
    GO       
    INSERT INTO Properties(PropertyNumber, City, ZIPCode,   
      PropertyTypeID, Bedrooms, YearBuilt, MarketValue) 
    VALUES(N'917203', N'Alexandria', N'22024',        
           2, 3, 1965, 345660.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      PropertyTypeID, ConditionID, Bedrooms, Bathrooms, MarketValue)  
    VALUES(N'200417', N'4140 Holisto Crt', N'Germantown', N'MD',         
           1, 1, 2, 1, 215495.00);  
    GO  
    INSERT INTO Properties(City, State, PropertyTypeID, ConditionID,    
      Bedrooms, Bathrooms,  YearBuilt, MarketValue)  
    VALUES(N'Rockville', N'MD', 1, 2, 2, 2, 1996, 436885.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'927474', N'9522 Lockwood Rd', N'Chevy Chase', N'MD',         
           N'20852', 3, 3, 3, 2.5, 3, 0, 3,         
           1992, 415665.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'207850', N'14250 Parkdoll Rd', N'Rockville', N'MD',         
           N'20854', 3, 2, 3, 2.5, 2, 1, 2,         
          1988, 325995.00);  
    GO      
    INSERT INTO Properties(City, PropertyTypeID, Bedrooms,    
      YearBuilt, MarketValue)  
    VALUES(N'Washington', 3, 4, 1975, 366775.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      YearBuilt, MarketValue)  
    VALUES(N'288540', N'10340 Helmes Street #408', N'Silver Spring', N'MD',         
           N'20906', 1, 2, 1, 1, 2000, 242775.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'247472', N'1008 Coppen Street', N'Silver Spring', N'MD',         
           N'20906', 2, 1,         
           3, 3, 3, 1, 3, 1996, 625450.00);  
    GO  
    INSERT INTO Properties(City, ZIPCode, PropertyTypeID,      
      Stories, YearBuilt, MarketValue)  
    VALUES(N'Chevy Chase', N'20956', 2,         
      3, 2001, 525450.00);  
    GO  
    INSERT INTO Properties(Address, City, State,    
      PropertyTypeID, ConditionID, Bedrooms, MarketValue)  
    VALUES(N'686 Herod Ave #D04', N'Takoma Park', N'MD',         
           1, 1, 2, 360885.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'297446', N'14005 Sniders Blvd', N'Laurel', N'MD',         
           N'20707', 3, 4,         
           4, 1.5, 3, 1, 2, 2002, 412885.00);  
    GO  
    INSERT INTO Properties(City, ZIPCode, ConditionID, Bedrooms,    
      Stories, YearBuilt)  
    VALUES(N'Silver Spring', N'20905', 2,         
           4, 2, 1965);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'924792', N'680 Prushia Rd', N'Washington', N'DC',         
           N'20008', 2, 2,         
           5, 3.5, 3, 0, 3, 2000, 555885.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'294796', N'14688 Parrison Street', N'College Park', N'MD',         
           N'20742', 2, 1,         
           5, 2.5, 2, 1, 2, 1995, 485995.00);  
    GO  
    INSERT INTO Properties(City, State, PropertyTypeID, ConditionID,    
      Bedrooms, Bathrooms,  YearBuilt, MarketValue)  
    VALUES(N'Rockville', N'MD', 1, 2, 1, 1, 1996, 418885.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      YearBuilt, MarketValue)  
    VALUES(N'811155', N'10340 Helmes Street #1012', N'Silver Spring',         
           'MD', N'20906', 1, 2,         
           1, 1, 2000, 252775.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'447597', N'4201 Vilamar Ave', N'Hyattsville', N'MD',         
           N'20782', 3, 1,         
           3, 2, 2, 1, 3, 1992, 365880.00);  
    GO  
    INSERT INTO Properties(Address, ZIPCode, Bathrooms)  
    VALUES(N'1622 Rombard Str', 20904, 2.5);  
    GO  
    INSERT INTO Properties(City, State, PropertyTypeID, ConditionID,    
      Bedrooms, Bathrooms,  YearBuilt, MarketValue)  
    VALUES(N'Rockville', N'MD', 1, 2, 1, 1, 1996, 420555.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'297415', N'980 Phorwick Street', N'Washington', N'DC',         
           N'20004', 2, 2,         
           4, 3.5, 3, 3, 1, 2004, 735475.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'475974', N'9015 Marvin Crow Ave', N'Gaithersburg', N'MD',         
      N'20872', 2, 4,         
      4, 2.5, 3, 1, 1, 1965, 615775.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'836642', N'3016 Feldman Court', N'Rockville', N'MD',         
           N'20954', 2, 3,         
           5, 3, 3, 1, 3, 1960, 528555.00);  
    GO  
    INSERT INTO Properties(Address, City, ZIPCode, PropertyTypeID,    
      Bedrooms, Bathrooms, YearBuilt, MarketValue)  
    VALUES(N'2444 Arielson Rd', N'Rockville', N'20854',   
           1, 2, 1, 1996, 475555.00);  
    GO    
     
    INSERT INTO Properties(City, State, PropertyTypeID, Stories)  
    VALUES(N'Rockville', N'MD',        
           3, 1);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'208304', N'7307 Everett Hwy', N'Washington', N'DC',         
           N'20012', 3, 1,         
           2, 2.5, 2, 0, 4, 2006, 420550.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms,    
      Bathrooms, YearBuilt, MarketValue)  
    VALUES(N'644114', N'10340 Helmes Street#1006', N'Silver Spring',         
           'MD', N'20906', 1, 2,         
           2, 2, 2000, 258445.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'937966', N'7303 Warfield Court', N'Tysons Corner', N'VA',         
           '22131', 2, 2,         
           3, 2.5, 3, 1, 4, 2006, 
           825775.00);  
    GO  
    INSERT INTO Properties(City, ZIPCode, ConditionID, Bedrooms,     
      Stories, YearBuilt)  
    VALUES(N'Fairfax', N'22232', 2, 3, 3, 1985);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'297497', N'12401 Conniard Ave', N'Takoma Park', N'MD',         
           N'20910', 3, 2,         
           3, 2.5, 3, 1, 3, 2004, 280775.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, City, ZIPCode,    
      PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      YearBuilt, Stories, MarketValue)  
    VALUES(N'855255', N'Laurel', N'20707', 2,         
           4, 3, 2, 1962, 2, 342805.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'469750', N'6124 Falk Rd', N'Arlington', N'VA',         
           '22031', 2, 4,         
           4, 3.5, 3, 1, 1, 1982, 635995.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'826927', N'5121 Riehl Ace', N'Fairfax', N'VA',         
           '22232', 3, 1,        
           3, 1.5, 2, 0, 1, 2002, 325620.00);  
    GO  
    INSERT INTO Properties(City, ZIPCode, PropertyTypeID, Bedrooms,     
      Bathrooms, MarketValue)  
    VALUES(N'Silver Spring', N'20906', 1, 2, 2, 335655.00);  
    GO    
     
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'287064 ', N'9533 Pensulian Rd', N'Silver Spring', N'MD',         
           N'20904', 2, 3,         
           3, 1.5, 3, 1, 2, 1992, 485775.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, City, ZIPCode,    
      PropertyTypeID, ConditionID, Bedrooms, YearBuilt, Stories)  
    VALUES(N'724001 ', N'705 Helios Ave', N'20004',         
           3, 3, 3, 1974, 4);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'209275', N'944 Fryer Ave', N'Chevy Chase', N'MD',         
           N'20852', 2, 1,         
           5, 2.5, 3, 0, 2, 2002, 625665.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'204759', N'1950 Galego Street', N'Germantown', N'MD',         
           N'20874', 2, 1,         
           4, 3.5, 2, 1, 4, 2007, 428665.00);  
    GO  
    INSERT INTO Properties(PropertyNumber, Address, City, State,    
      ZIPCode, PropertyTypeID, ConditionID, Bedrooms, Bathrooms,    
      FinishedBasement, IndoorGarage, Stories, YearBuilt, MarketValue)  
    VALUES(N'937259', N'12366 Fowler Ave', N'Alexandria', N'VA',         
           '22031', 3, 2,         
           3, 1.5, 3, 1, 3, 2007, 402815.00);  
    GO
  4. Appuyez sur F5 pour exécuter

Création de jointure

Équipé de leurs colonnes et des tables requises, vous pouvez créer la jointure. Pour le faire dans SQL Server Management Studio, dans l'Explorateur d'objets, cliquez avec le bouton droit de la souris sur la base de données et cliquez sur Ouvrir une fenêtre de requête. Puis :

  • Dans le menu principal, cliquez sur requête-> conception de requête dans l'éditeur...
  • Cliquez avec le bouton droit de la souris quelque part dans la fenêtre de requête, puis cliquez sur conception de requête dans l'éditeur

Toutes ces actions afficheront la fenêtre de la table :

Query Designer

Parce que la Fondation d'une jointure se trouve sur au moins deux tables, vous devez les ajouter. Pour ce faire, utilisez la boîte de dialogue Add Table. Si vous avez fermé la boîte de dialogue Add Table, vous pouvez cliquez avec le bouton droit de la souris sur la partie supérieure du Concepteur de Requêtes et cliquez sur Add Table...

Query Designer

Dans la boîte de dialogue Add Table :

  • Vous pouvez cliquer sur le nom de la table et cliquez sur Ajouter
  • Vous pouvez également double-cliquer sur une table

Après avoir ajouté les tables, cliquez sur Fermer.

Voici un exemple de deux tables qui ont été ajoutées :

Query Designer

Si une relation a déjà été établie entre les tables, une ligne de jonction l'afficherait.

Dans le SQL, la formule de base qui permet de créer une jointure est :

SELECT WhatColumn(s) 
FROM ChildTable 
TypeOfJoin ParentTable 
ON condition

Le facteur ChildTable spécifie la table contenant les enregistrements qui seront extraits. Elle peut être représentée comme suit :

SELECT WhatColumn(s) 
FROM Persons 
TypeOfJoin ParentTable 
ON condition

Le facteur ParentTable spécifie la table contenant la colonne avec la clé primaire qui va contrôler quels enregistrements, liés à la table enfant, qui s'afficheront. Ce facteur serait représenté comme suit :

SELECT WhatColumn(s) 
FROM Persons 
TypeOfJoin Genders 
ON Persons.GenderID = Genders.GenderID

Le facteur Condition est une expression logique utilisée pour valider les enregistrements qui seront isolés. Pour créer la condition, vous devez attribuer la colonne de clé primaire de la Table Parent à la colonne Clé Etrangère de la Table Enfant. Car les deux colonnes ont probablement le même nom, pour les distinguer, leurs noms devraient être qualifiés. Cela serait effectué comme suit :

SELECT WhatColumn(s) 
FROM Persons 
TypeOfJoin Genders 
ON Persons.GenderID = Genders.GenderID

Le facteur WhatColumn(s) de notre formule permet de faire une liste des colonnes à inclure dans votre relevé. Comme vous devez être conscient, vous pouvez inclure toutes les colonnes en utilisant l'opérateur * . Voici un exemple :

SELECT * 
FROM Persons 
TypeOfJoin Genders 
ON Persons.GenderID = Genders.GenderID

Dans ce cas, toutes les colonnes de toutes les tables devraient être incluses dans le résultat. Au lieu de toutes les colonnes, vous pouvez choisir une liste restreinte. Dans ce cas, créez la liste après le mot-clé SELECT en les séparant par des virgules. Vous pouvez utiliser le nom d'une colonne normalement si ce nom n'est pas dupliqué dans plus d'une colonne. Voici un exemple :

SELECT LastName, FirstName, Gender
FROM Persons
TypeOfJoin Genders 
ON Persons.GenderID = Genders.GenderID

Si le même nom d'une colonne est trouvé dans plusieurs tables, comme c'est le cas pour une combinaison de clé primaire-étrangère, vous devez qualifier le nom. Voici un exemple :

SELECT LastName, FirstName, Persons.GenderID, 
       Genders.GenderID, 
FROM Persons
TypeOfJoin Genders
ON Persons.GenderID = Genders.GenderID

En fait, pour rendre votre code plus facile à lire, pensez à qualifier le nom de chaque colonne de votre instruction SELECT. Voici un exemple :

SELECT Persons.LastName, Persons.FirstName, Persons.GenderID, 
       Genders.GenderID, Genders.Gender 
From Persons
TypeOfJoin Genders
ON Persons.GenderID = Genders.GenderID

Si vous avez un schéma, vous pouvez l'utiliser pour qualifier une (chaque) table. Voici un exemple :

SELECT dbo.Persons.LastName, dbo.Persons.FirstName, dbo.Persons.GenderID, 
       dbo.Genders.GenderID, dbo.Genders.Gender 
FROM dbo.Personnes 
TypeOfJoin dbo.Genders
ON dbo.Persons.GenderID = dbo.Genders.GenderID

Vous pouvez également utiliser un nom d'alias pour chaque table. Voici un exemple :

SELECT pers.LastName, pers.FirstName, pers.GenderID, 
       Genders.GenderID, Genders.Gender 
FROM Persons pers 
TypeOfJoin Genders
ON pers.GenderID = Genders.GenderID

Practical LearningFormation pratique : Préparer une jointure

  1. Cliquez sur la partie supérieure de la fenêtre qui contient le code
  2. Appuyez sur Ctrl + A pour sélectionner tout
  3. Tapez USE RealEstate2 ; et appuyez sur la touche Entrée
  4. Tapez GO et appuyez sur la touche Entrée
  5. Dans le menu principal, cliquez sur requête-> conception de requête dans l'éditeur
  6. Dans la boîte de dialogue Ajoutez une table, cliquez sur Propriétés, puis cliquez sur Ajouter
  7. Dans la boîte de dialogue Ajouter une table, double-cliquez sur PropertyTypes
  8. Cliquez sur Fermer
 
 
 

Joint externe et interne

 

Introduction

Lors de l'étude des relations de données, nous avons vu le rôle des clés primaires et étrangères dans le maintien de l'échange d'informations entre les deux tables. Cette technique de lier les tables joue un rôle important lors de la création d'une jointure. Il permet de décider si vous voulez inclure tous les enregistrements ou isoler seulement certains d'entre eux. Afin de respecter la direction d'une relation entre deux tables tel qu'il est appliqué à une requête, Transact-SQL prend en charge trois types de jointures.

Jointures croisées

Une jointure croisée crée une liste de tous les enregistrements des deux tables comme suit : le premier enregistrement de la Table de parent est associé à chaque enregistrement de la Table Enfant, puis le deuxième enregistrement à partir de la table parent est associé à chaque enregistrement de la table enfant et ainsi de suite. Dans ce cas également, il n'est pas nécessaire d'une colonne commune entre les deux tables. En d'autres termes, vous n'utiliserez pas la clause ON.

Pour créer une jointure croisée, vous pouvez remplacer le facteur TypeOfJoin de notre formule avec CROSS JOIN ou CROSS OUTER JOIN. Voici un exemple :

SELECT Persons.PersonID, Persons.FirstName, Persons.LastName, 
       Genders.GenderID, Genders.Gender 
FROM Persons 
CROSS JOIN Genders
GO

Par défaut, dans SQL Server Management Studio, une fois que vous venez d'ajouter un tableau à un autre (si aucune relation n'était déjà établie entre les deux tables), la requête serait automatiquement une jointure croisée. Tout ce que vous avez à faire est de sélectionner les colonnes nécessaires :

Après avoir sélectionné les colonnes, vous pouvez cliquer sur OK et exécuter la requête pour voir le résultat :

Join

Jointure interne

Imaginez que vous avez deux tables qui peuvent être liées par le biais de la clé primaire et l'autre clé étrangère :

Genders

Notez que certains enregistrements dans la table de personnes n'ont pas une entrée pour la colonne GenderID et ont été marqués avec NULL par le moteur de base de données. Lors de la création d'une requête d'enregistrements de la table de personnes, si vous souhaitez que votre liste inclue uniquement les enregistrements qui ont une entrée, vous pouvez le créer en jointure interne.

Par défaut, à partir de SQL Server Management Studio, lors de la création d'une nouvelle requête, si une relation a déjà été établie entre les deux tables, la requête est faite d'une jointure interne. S'il n'y a aucune relation explicitement établie entre les deux tables, vous devez la créer ou modifier l'instruction SQL. Tenez compte des points suivants :

Notez que, parce qu'aucune relation n'est établie entre les deux tables, la jointure est dépassée.

Pour créer une jointure interne, vous avez deux options. Vous pouvez faire glisser la clé primaire de la table parente et la déposer sur la clé étrangère dans la table enfant. Voici un exemple :

Join

Alternativement, vous pouvez modifier manuellement l'instruction SQL pour rendre une jointure interne. Pour ce faire, vous spécifiez le facteur TypeOfJoin de notre formule avec l'expression INNER JOIN. Voici un exemple :

SELECT Persons.PersonID, Persons.FirstName, Persons.LastName, Persons.GenderID, 
       Genders.GenderID AS [Gender ID], Genders.Gender 
FROM   Persons INNER JOIN Genders ON Persons.GenderID = Genders.GenderID

Après avoir créé la jointure, dans la section de schéma, une ligne sera créée pour joindre les tables :

Join

Vous pouvez alors exécuter la requête pour voir le résultat. Cela donnerait :

Join

Nous l'avons mentionné précédemment que vous pourriez inclure toutes les colonnes dans la requête. Dans notre résultat, puisque nous ne sommes plus intéressés par le genre de chaque enregistrement de personnes, nous n'avons pas besoin de la colonne GenderID de la table genres. Voici un exemple :

Join

Join

Comme mentionné précédemment, vous remarquerez que le résultat inclut uniquement les enregistrements qui ont une entrée (une entrée non-NULL) dans la colonne de clé étrangère GenderID de la table de personnes.

Une alternative à l'expression INNER JOIN consiste à taper simplement JOIN. Voici un exemple :

SELECT Persons.PersonID, Persons.FirstName, Persons.LastName, 
       Genders.Gender 
FROM Persons 
JOIN Genders 
ON Persons.GenderID = Genders.GenderID
 
GO

Pour détruire une jointure entre deux tables, si vous travaillez dans la fenêtre de la table, vous pouvez cliquer avec le bouton droit de la souris sur la ligne qui joint les tables et cliquer sur Supprimer. Dans SQL, vous devez modifier les expressions qui composent la jointure (la jointure et les expressions ON).

Practical LearningFormation pratique : Création d'une jointure interne

  1. Pour créer une jointure interne, à partir de la table PropertyTypes, faites glisser PropertyTypeID et déposez-le sur le champ PropertyTypeID de la table de propriétés :

    Joining
  2. Relâchez le bouton de la souris
  3. Sur les tables, cliquez sur les cases à cocher des champs suivants : PropertyType, City, Bedrooms, Bathrooms, YearBuilt et MarketValue

    Join
  4. Cliquez sur OK
  5. Dans la barre d'outils de l'éditeur SQL, cliquez sur le bouton Exécuter Executepour visualiser le résultat

    Join
  6. Sélectionnez le code qui a été ajouté (de SELECT à PropertyTypes.PropertyTypeID) et appuyez sur la touche Suppr
  7. Dans le menu principal, cliquez sur Query-> Design Query in Editor...
  8. Dans la boîte de dialogue Ajouter une table, double-cliquez sur Properties, double-cliquez sur PropertyTypes
  9. Cliquez sur Fermer
  10. Pour créer une jointure interne, à partir de la table PropertyTypes, faites glisser PropertyTypeID et déposez-le sur le champ PropertyTypeID de la table de propriétés :

    Joining
  11. Relâchez le bouton de la souris
  12. Sur les tables, cliquez sur les cases à cocher des champs suivants : PropertyType, City, Bedrooms, Bathrooms, YearBuilt et MarketValue

Jointure externe

 

Introduction

Au lieu d'afficher uniquement les enregistrements qui ont des écritures dans la table enfant, il se peut que vous vouliez votre requête pour inclure tous les enregistrements, y compris ceux qui sont nuls. Pour obtenir ce résultat, vous devez créer une jointure externe. Vous disposez de trois options.

Une jointure externe gauche

Une jointure externe gauche produit tous les enregistrements de la table enfant, appelée également la table de droite. Les enregistrements de la table d'enfants qui n'ont pas d'entrée dans la colonne de clé étrangère sont marqués comme NULL.

Pour créer une jointure externe gauche, si vous travaillez dans la fenêtre de la table, dans la section de schéma, cliquez avec le bouton droit de la souris sur la ligne qui joint les tables et cliquez sur l'option qui sélectionne tous les enregistrements dans la table enfant (dans ce cas, ce serait de sélectionner toutes les lignes de personnes) :

Alternativement, vous pouvez remplacer le facteur TypeOfJoin de notre formule avec LEFT JOIN ou LEFT OUTER JOIN. Voici un exemple :

SELECT Persons.PersonID, Persons.FirstName, Persons.LastName, 
       Genders.GenderID, Genders.Gender 
FROM Persons 
LEFT OUTER JOIN Genders 
ON Persons.GenderID = Genders.GenderID
 
GO

Dans les deux cas, le bouton au milieu de la ligne devrait être ajouté à une flèche pointant vers la table Parent. Vous pouvez alors exécuter la requête pour voir le résultat. Voici un exemple :

Join

Join

Notez que le résultat comprend tous les enregistrements de la table de personnes (également appelés la droite) et les enregistrements qui n'ont pas d'entrée dans la colonne GenderID de la table de personnes (droite) sont marqués avec NULL.

Jointure externe droite

Une jointure externe droite considère tous les enregistrements issus de la table parente et trouve un enregistrement correspondant dans la table enfant. Pour ce faire, il commence par le premier enregistrement de la table parente (dans ce cas, la table Genders) et affiche chaque enregistrement de la table enfant (dans ce cas, le tableau Persons), qui possède une entrée correspondante. Cela signifie que, dans notre exemple, une jointure externe droite créerait tout d'abord une liste des enregistrements des personnes qui ont une valeur (femelle) pour la colonne GenderID. Après le premier enregistrement, la jointure externe droite se déplace vers le deuxième enregistrement et ainsi de suite, chaque fois en répertoriant les enregistrements de la table enfant qui ont une entrée correspondante pour la clé primaire de la table parente.

Pour créer visuellement une jointure externe droite dans la table de fenêtre, après avoir établi une jointure entre les deux tables, si vous aviez précédemment créé une jointure externe gauche, vous devez la supprimer en cliquant avec le bouton droit de la souris sur la ligne entre les tables et en sélectionnant la deuxième option sous Supprimer. Vous pouvez ensuite cliquer avec le bouton droit de la souris sur la ligne qui les relie et cliquez sur l'option qui sélectionnerait tous les enregistrements dans la table parente. Dans notre exemple, vous devez cliquer sur Select All Rows From Genders.

Pour créer une jointure externe droite dans SQL, vous pouvez remplacer le facteur TypeOfJoin de notre formule avec RIGHT JOIN ou RIGHT OUTER JOIN. Voici un exemple :

SELECT Persons.PersonID, Persons.FirstName, Persons.LastName, 
       Genders.GenderID, Genders.Gender 
FROM Persons 
RIGHT OUTER JOIN Genders 
ON Persons.GenderID = Genders.GenderID
 
GO

Dans les deux cas, le bouton sur la ligne de jonction entre les tables aurait une flèche pointant vers la table enfant. Vous pouvez ensuite exécuter la requête. Voici un exemple :

Join

Join

Notez que le résultat de la requête commence par le premier enregistrement de la table Parente, également appelée la table gauche (dans ce cas, le tableau Genders) et répertorie les enregistrements de la table enfant, appelée également la table de droite (dans ce cas la table Persons), qui ont l'entrée correspondant à ce premier enregistrement. Puis il passe à la prochaine valeur GenderID. Notez également qu'il n'y a aucun enregistrement NULL dans le Gender.

Practical LearningFormation pratique : Réception des Enregistrements non-NULL

  1. Pour obtenir uniquement une liste des propriétés dont les types sont connus, cliquez avec le bouton droit de la souris sur la ligne entre les tables et cliquez sur Sélectionner toutes les lignes de PropertyTypes

    Join
  2. Cliquez sur OK
  3. Dans la barre d'outils de l'éditeur SQL, cliquez sur le bouton Exécuter Execute

    Join
  4. Sélectionnez le code qui a été ajouté (de SELECT à PropertyTypes.PropertyTypeID) et appuyez sur la touche Suppr
  5. Dans le menu principal, cliquez sur requête-> Création requête dans l'éditeur...
  6. Dans la boîte de dialogue Ajouter une table, double-cliquez sur Propriétés, double-cliquez sur PropertyTypes
  7. Cliquez sur Fermer
  8. Pour créer une jointure interne, à partir de la table PropertyTypes, faites glisser PropertyTypeID et déposez-le sur le champ PropertyTypeID de la table de propriétés :

    Joining
  9. Relâchez le bouton de la souris
  10. Sur les tables, cliquez sur les cases à cocher des champs suivants : PropertyType, City, Bedrooms, Bathrooms, YearBuilt et MarketValue

Une jointure externe complète

Une jointure externe complète produit tous les enregistrements tant du parent que des tables d'enfants. Si un enregistrement d'une table n'a pas de valeur dans l'autre valeur, la valeur de cet enregistrement est marquée comme NULL.

Pour créer visuellement une jointure externe complète, dans la table de fenêtre, cliquez avec le bouton droit de la souris sur la ligne entre les tables et sélectionnez chaque option sous Supprimer afin que les deux soient vérifiées. Pour créer une jointure externe complète en SQL, remplacez le facteur TypeOfJoin de notre formule FULL JOIN ou FULL OUTER JOIN. Voici un exemple :

SELECT Persons.PersonID, Persons.FirstName, Persons.LastName, 
       Genders.GenderID, Genders.Gender 
FROM Persons FULL OUTER JOIN Genders
ON Persons.GenderID = Genders.GenderID
 
GO

Le bouton sur la ligne entre les tables semble maintenant sous la forme d'un carré. Vous pouvez alors exécuter la requête. Voici un exemple :

Join

Join

Tout comme nous avons impliqué seulement deux tables dans notre jointure jusqu'ici, vous pouvez créer une jointure qui inclut plusieurs tables.

Jointures et analyse des données

 

Introduction

Comme démontré jusqu'ici et dans les leçons précédentes, la raison principale de la création de requêtes est d'isoler les enregistrements. Cette opération est effectuée à l'aide des conditions et critères. Les Jointures améliorent cette fonctionnalité car elles permettent d'envisager des enregistrements de tables différentes et de les inclure dans une instruction SQL commune.

Dans les jointures que nous avons créées jusqu'à présent, nous avons considéré comme tous les enregistrements et laissé la liste du moteur de base de données en utilisant uniquement les règles des jointures intégrér le SQL. Pour rendre une telle liste plus utile ou restrictive, vous pouvez poser vos propres conditions qui doivent être respectées pour isoler les enregistrements comme un entonnoir. Comme fait dans les leçons précédentes, pour inclure un critère dans une instruction SELECT, vous pouvez créer une clause WHERE.

Utilisation des critères

Pour créer un critère dans une requête que vous créez à partir du SQL Server Management Studio, sélectionnez d'abord une colonne à afficher dans la section grille. Tout aussi examiné dans les leçons précédentes lors de la création d'une requête, pour spécifier un critère, dans la zone de critères correspondant à la colonne, saisissez la condition à l'aide des opérateurs que nous avons examinés dans les leçons précédentes. Voici un exemple :

SELECT Persons.PersonID, Persons.FirstName, Persons.LastName, 
       Genders.GenderID, Genders.Gender 
FROM Persons LEFT OUTER JOIN 
Genders ON Persons.GenderID = Genders.GenderID 
WHERE Genders.Gender = N'female'; 
GO

Join

Cela donnerait :

Join

Practical LearningFormation pratique : Analyse des données concernant les jointures

  1. Pour voir une liste des seules maisons de ville, modifiez l'instruction dans la section SQL comme suit :
    SELECT PropertyTypes.PropertyType, Properties.City, 
           Properties.State, Properties.ZIPCode, Properties.Bedrooms, 
           Properties.Bathrooms, Properties.Stories, Properties.MarketValue 
    FROM   Propriétés RIGHT OUTER JOIN PropertyTypes 
    ON     Properties.PropertyTypeID = PropertyTypes.PropertyTypeID 
    WHERE (PropertyTypes.PropertyTypeID = 3)
  2. Dans la barre d'outils de l'éditeur SQL, cliquez sur le bouton Exécuter SQL Execute SQL
  3. Pour obtenir une liste des maisons de ville et de la famille unique, modifiez l'instruction SQL comme suit :
    SELECT PropertyTypes.PropertyType, Properties.MarketValue, 
           Properties.City, Properties.State, Properties.Bedrooms, 
           Properties.YearBuilt, Properties.bathrooms, 
           Properties.FinishedBasement, Properties.Stories 
    FROM   Properties RIGHT OUTER JOIN PropertyTypes 
    ON     Properties.PropertyTypeID = PropertyTypes.PropertyTypeID 
    WHERE  (PropertyTypes.PropertyTypeID IN (2, 3))
  4. Dans la barre d'outils de l'Editeur SQL, cliquez sur le bouton Exécuter SQL Execute SQL
  5. Pour obtenir une liste des familles uniques disposées dans l'ordre chronologique commençant par la plus récente, modifiez l'instruction SQL comme suit :
    SELECT PropertyTypes.PropertyType, 
           Properties.City, Properties.State, Properties.ZIPCode, 
           Properties.Bedrooms, Properties.Bathrooms, Properties.Stories, 
           Properties.YearBuilt, Properties.MarketValue 
    FROM   Properties RIGHT OUTER JOIN PropertyTypes 
    ON     Properties.PropertyTypeID = PropertyTypes.PropertyTypeID 
    WHERE  (PropertyTypes.PropertyTypeID = 2) 
    ORDER BY Properties.YearBuilt DESC
  6. Cliquez avec le bouton droit de la souris sur la table, puis cliquez sur Exécuter SQL
  7. Pour obtenir une liste des propriétés qui coûtent entre 350 000 $ et $ 425 000, modifiez l'instruction SQL comme suit :
    SELECT Properties.PropertyNumber, PropertyTypes.PropertyType, 
           Properties.MarketValue, Properties.City, Properties.State, 
           Properties.Bedrooms, Properties.YearBuilt 
    FROM   Propriétés RIGHT OUTER JOIN PropertyTypes 
    ON     Properties.PropertyTypeID = PropertyTypes.PropertyTypeID 
    WHERE (Properties.MarketValue BETWEEN 350000 AND 475000)
  8. Dans la barre d'outils de l'éditeur SQL, cliquez sur le bouton Exécuter SQL Execute SQL
  9. Pour obtenir une liste des maisons de familles uniques en Virginie organisées dans l'ordre chronologique et uniquement si le nombre de propriété est connu, modifiez l'instruction SQL comme suit :
    SELECT Properties.PropertyNumber, 
           PropertyTypes.PropertyType, Properties.MarketValue, Properties.City, 
           Properties.State, Properties.Bedrooms, 
           Properties.FinishedBasement, Properties.YearBuilt 
    FROM   Properties RIGHT OUTER JOIN PropertyTypes 
    ON     Properties.PropertyTypeID = PropertyTypes.PropertyTypeID 
    WHERE (PropertyTypes.PropertyTypeID = 2)AND 
          (Properties.PropertyNumber IS NOT NULL) AND 
          (Properties.State = N'VA ') 
    ORDER BY Properties.YearBuilt DESC
  10. Dans la barre d'outils de l'éditeur SQL, cliquez sur le bouton Exécuter SQL Execute SQL
  11. Pour obtenir une liste des propriétés dans le sud du Maryland mais le coût est inférieur à 400 000 $, modifiez l'instruction SQL comme suit :
    SELECT Properties.PropertyNumber, PropertyTypes.PropertyType, 
           Properties.MarketValue, Properties.City, Properties.State, 
           Properties.Bedrooms, Properties.YearBuilt 
    FROM   Properties RIGHT OUTER JOIN PropertyTypes 
    ON     Properties.PropertyTypeID = PropertyTypes.PropertyTypeID 
    WHERE (Properties.MarketValue < 400000) AND 
          (Properties.ZIPCode BETWENN N '20500' AND '21000' N)
  12. Dans la barre d'outils de l'Editeur SQL, cliquez sur le bouton Exécuter SQL Execute SQL
 
 
   
 

Précédent Copyright © 2009 Yevol Suivant