********************** INNER JOIN ****************************************
USE [BDD]
go
-- creation de deux tables pour exemple
create table commande (Numerodecommande int,IDclient int)
go
create table client (nom varchar (200),prenom varchar (200), IDclient int, adresse
varchar(2000),ville varchar(200))
-- Insertion de valeur dans les tables
insert into commande values
('3712',1),
('4851',2),
('6712',3),
('3215',4),
('3218',5),
('3220',6),
('3221',7),
('3227',8),
('3238',9)
insert into client values
('Thuillier','Olivier',1,'7 Rue poirier','Dreux'),
('Thuillier','Luc',3,'78 avenue de paris','Paris'),
('Thuillier','Théodore',5,'15 Rue asterdam','Asterdam'),
('Thuillier','Zinédine',12,'7 Rue Prague','Prague'),
('Thuillier','Lucas',13,'7 Rue Vienne','Vienne')
-- Que donne les deux Select
select * from commande
go
select * from client
-- ok premiere question je veux les clients qui ont un numéro de commande
select [Link],[Link],[Link],[Link] from commande A
inner join client B
On [Link]=[Link]
--Je veux aussi le nom et prenom des personnes
select [Link], [Link],[Link],[Link] from commande A
inner join table_client B
on [Link] =[Link]
-- le INNER Join est complétement facultatif...
select [Link], [Link],[Link],[Link] from commande A
join client B
on [Link] =[Link]
-- Contrairement a une idée recue,il y aussi aucune incidence sur l'ordre des jointures
dans la jointure elle meme
select [Link], [Link],[Link],[Link] from commande A
join client B
on [Link] =[Link]
go
select [Link], [Link],[Link],[Link] from commande A -- On change l'ordre
de jointure des deux colonnes
join client B
on [Link] =[Link] -- On change l'ordre de jointure des deux colonnes
********************* LEFT/RIGHT JOIN ****************************************
USE [BDD]
go
-- On reprend les deux mêmes tables :
-- Que donne les deux Select
select * from commande
go
select * from client
-- Question: Quel client n'est pas rattaché a un IDCLIENT dans la table commande?
select [Link], [Link],[Link] from client B
left join commande A
on [Link] =[Link]
-- Ca ne marche pas et pourquoi pas avec le filtre IS NULL pour ramener que les valeurs
qui ne correspondent qu'a la table de gauche ?
select [Link],[Link],[Link] from client B
left join commande A
on [Link] =[Link]
where [Link] is NULL
-- La Ca fontionne
-- On voit parfois la valeur OUTER qui est facultatif
select [Link],[Link],[Link] from client B
left outer join commande A
on [Link] =[Link]
where [Link] is NULL
-- Question: On peut recommencer la meme operation avec le RIGHT JOIN en inversant les
tables
select [Link],[Link],[Link] from commande A
right join client B
on [Link] =[Link]
where [Link] is NULL
-- On voit parfois la valeur OUTER qui est facultatif
select [Link],[Link],[Link] from commande A
right outer join client B
on [Link] =[Link]
where [Link] is NULL
********************** FULL OUTER JOIN ***********************************
USE [BDD]
go
-- c'est parti pour la requete en FULL OUTER JOIN avec les deux SELECT en meme temps
select [Link],[Link] from commande A
full outer join table_client B
on [Link] =[Link]
select * from commande
go
select * from Table_client
-- On voit qu'il y a toutes les lignes de la table commande qui sont ramenés de 1 a 9
-- On voit les 2 NULL en bas car 12 et 13 n'est pas reference dans la table client (valeur
12 et 13)
-- Pour mieux comprendre changeons l'ordre de la jointure, en jouant avec les deux SELECT
select [Link],[Link] from table_client B
full outer join commande A
on [Link] =[Link]
select * from commande
go
select * from Table_client
-- On voit qu'il y a toutes les lignes de la table client (1,3,5,12,13)
-- On voit les 5 NULL qui correspondent a la table commande (2,4,6,8,9)
-- et si on rajouter le ISNULL pour le filtre
select * from commande
go
select * from Table_client
select * from commande A
full outer join table_client B
on [Link] =[Link]
where [Link] is null
-- La OUTER est il facultatif ?
select * from commande A
full outer join table_client B
on [Link] =[Link]
where [Link] is null
********************** CROSS JOIN ****************************************
********************************************************************************/
USE [BDD]
go
-- Que donne les deux Select
select * from commande
go
select * from Table_client
-- On voit qu'il y a comme colonne en commum l'IDclient
-- c'est parti pour la requete
select * from commande A
cross join table_client B
-- On voit qu'il y a 45 lignes, 9 lignes dans la table commande et 5 lignes dans la table
table_client
-- donc 9*5 = 45 lignes
-- on voit qu'en faisant un select * de la table commande que Thuillier olivier est
multiplié sur sur les 9 premieres lignes de la table table_client
-- Et si on change l'ordre de jointure ?
-- Que donne les deux Select
select * from commande
go
select * from Table_client
-- et la jointure
select * from table_client B
cross join commande A
-- On voit qu'il y a 45 lignes, 9 lignes dans la table commande et 5 lignes dans la table
table_client
-- donc 9*5 = lignes
USE [BDD]
go
-- Créons un troisiéme table
Create table carte_fidelité (Fidele char(3), IDCLIENT int)
-- Et insérons quelques valeurs
insert into carte_fidelité values
('OUI', 1),
('OUI', 2),
('NON', 3),
('OUI', 4),
('NON', 5),
('OUI', 6),
('NON', 7),
('OUI', 8),
('OUI', 9),
('NON', 10),
('OUI', 11),
('NON', 12)
-- Si on fait les trois SELECT ?
select * from commande
go
select * from client
go
select * from carte_fidelité
-- Question : je veux les clients qui ont bien un numéro de commande
-- mais aussi qui ont une carte de fidélité
-- c'est parti pour la requete sur la jointure sur plusieurs tables
select [Link] from commande A
inner join client B
on [Link]=[Link]
inner join carte_fidelité C
on [Link]=[Link]
where [Link]='OUI'
select * from commande
go
select * from client
-- On voit qu'il y a toutes les lignes de la table commande qui sont ramenés de 1 a 9
-- On voit les 2 NULL en bas car 12 et 13 n'est pas reference dans la table client (valeur
12 et 13)
-- si on essaye prend [Link] on aura logiquement 1,3,5,12,13
select [Link] from commande A
full outer join client B
on [Link] =[Link]
select * from commande
go
select * from client
-- Pour enlever les valeurs concordantes on doit rajouter le filtre isnull
select * from commande A
full outer join client B
on [Link] =[Link]
where [Link] is null
select * from commande
go
select * from client
-- Est ce que le OUTER join est facultatif ?
select * from commande A
full join client B
on [Link] =[Link]
where [Link] is null