Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comprendre les vues en SQL

Par Manoj Debnath

Les tables d'une base de données SQL peuvent contenir une énorme quantité de données, mais elles ne sont pas toujours dans un format utile pour être facilement utilisées. Le volume de données doit être filtré en fonction de certains critères spécifiés pour une utilisation efficace. Pour des raisons de sécurité, nous pourrions vouloir rendre public seulement une certaine quantité de données tandis que le reste pourrait être accessible aux utilisateurs privilégiés. Les opérations SQL DML sont extensibles et utilisées pour filtrer une ou plusieurs tables à l'aide d'expressions de requête complexes. En tirant parti de l'idée, nous pouvons créer des tables virtuelles à partir de tables de base persistantes à l'aide de SQL qui contiendraient les données exactes dont nous avons besoin. C'est la raison pour laquelle la norme SQL:2006 a introduit l'utilisation de tables de vues, ou vues. La définition d'une vue ou d'une table virtuelle existe en tant qu'objet de schéma. Cet article présente le concept de vues en SQL, son fonctionnement et montre comment il est implémenté avec quelques exemples.

Introduction aux vues SQL

Les vues SQL ne sont rien d'autre que des tables virtuelles résidant en mémoire dérivées d'une ou plusieurs tables de base. Les tables virtuelles signifient que les tuples dans les vues n'ont pas d'existence physique et ne sont pas stockés dans la base de données. Les tuples sont comme des données temporaires créées à la suite de la requête SQL qui extrait généralement des données filtrées d'une ou plusieurs tables de base. Par conséquent, il existe une limitation sur le type d'opération qui peut être appliqué à une table de vue. Par exemple, l'opération de mise à jour ne peut pas être appliquée à tous les types de vues, mais il n'y a aucune limitation sur l'application d'une requête SQL dessus.

Les exemples ci-dessous sont testés avec la base de données MySQL. Commencez par créer quelques tableaux :

mon_entreprise base de données :

CREATE DATABASE my_company;

CREATE TABLE Employee(
    empId INT(11) UNSIGNED CHECK (empId > 0),
    empName VARCHAR(20),
    birthDate DATE,
    address TEXT(128),
    gender VARCHAR(1),
    salary DECIMAL(15,2),
    managerId INT(11) UNSIGNED,
    deptId INT(11) UNSIGNED,
    PRIMARY KEY(empId)
);
 
CREATE TABLE Department(
    deptId INT(11) UNSIGNED CHECK (empId > 0),
    deptName VARCHAR(20),
    deptMgrId INT(11) UNSIGNED,
    mgrStartDate DATE,
    PRIMARY KEY(deptId)
);

CREATE TABLE Project(
    projId INT(11) UNSIGNED CHECK (empId > 0),
    projName VARCHAR(20),
    projLocation TEXT(128),
    deptId INT(11) UNSIGNED,
    PRIMARY KEY(projId)
);
 
CREATE TABLE EmpWorksOnProj(
    empId INT(11) UNSIGNED,
    projId INT(11) UNSIGNED,
    hoursWorked DECIMAL(4,2)
);  
 
ALTER TABLE Employee ADD CONSTRAINT fk_emp_mgr FOREIGN KEY(managerId) REFERENCES Employee(empId);
ALTER TABLE Employee ADD CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);
ALTER TABLE Department ADD CONSTRAINT fk_dept_mgr FOREIGN KEY(deptMgrId) REFERENCES Employee(empId);
ALTER TABLE Project ADD CONSTRAINT fk_proj_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);

Les vues peuvent être considérées comme une table de référence, et nous pouvons l'utiliser aussi souvent que nous le souhaitons, même si elle n'existe pas physiquement. Par exemple, nous pouvons fréquemment avoir besoin de faire référence à mon_entreprise base de données et trouver Employé et Projet information. Notez qu'il existe une relation plusieurs à plusieurs entre Employé et Projet car une personne peut travailler sur plusieurs projets et un projet a également de nombreux employés. Ainsi, au lieu de spécifier la jointure de trois tables :Employé , EmpWorksOnProj , et Projet chaque fois que nous avons besoin d'une information collaborative et émettons une requête, nous définissons une vue qui est spécifiée comme résultat de la jointure entre ces tables. La vue forme la table virtuelle créée à partir du résultat de la requête. L'avantage est que la requête peut désormais extraire à partir d'une seule table résultante plutôt que d'avoir à extraire à partir de trois tables jointes. La collection de tables :Employé , Projet , Département etc. forment ainsi les tables de base ou table de définition de la vue.

Créons quelques vues basées sur le schéma donné ci-dessus.

CREATE VIEW V1
AS
SELECT
   empName, projName, hoursWorked
FROM
   Employee, Project, EmpWorksOnProj
WHERE
   Employee.empId=EmpWorksOnProj.empId
AND
   Project.projId=EmpWorksOnProj.projId;
 

La manière de spécifier des requêtes SQL sur une vue ou une table virtuelle est la même que pour spécifier des requêtes impliquant des tables de base. Vous pouvez utiliser SQL SELECT sur les vues pour obtenir les données comme suit :

SÉLECTIONNER * À PARTIR DE V1 ;

EmpName

NomProj

Heures travaillées

Mickey Mouse

Club House

6.50

Donald Duck

Agriculture

7.0

Ce qui suit crée une seconde vue :

CREATE VIEW V2 AS SELECT deptName, COUNT(*), SUM(salary) FROM Dept, Employee WHERE Employee.deptId=Department.deptId GROUP BY deptName;

Les résultats SQL SELECT dans

SELECT * FROM V1;

Nom du service

COMPTER(*)

SUM(salaire)

Musique

5

56000.00

Drame

2

25400.00

Notez que dans la vue V1, les noms d'attribut sont dérivés de la table de base. Dans la V2, les nouveaux noms d'attributs sont explicitement spécifiés à l'aide d'une correspondance un à un entre les attributs spécifiés de la clause CREATE VIEW et ceux spécifiés dans la clause SELECT. La clause SELECT avec la vue est décisive pour la définition de la vue.

Les informations affichées sont toujours censées être à jour. Cela signifie qu'il doit toujours refléter les modifications apportées aux tables de base sur lesquelles il est défini. Ceci est intéressant, car cela signifie que la vue n'est pas réellement matérialisée au moment de sa définition, mais plus tard lorsqu'une requête y est spécifiée. Le système de gestion de base de données en arrière-plan est responsable de la mise à jour de la vue.

METTRE À JOUR, INSÉRER et SUPPRIMER sur les vues

En SQL, il est possible de créer des vues pouvant être mises à jour qui peuvent être utilisées pour modifier des données existantes ou insérer de nouvelles lignes dans la vue qui à son tour insère ou modifie l'enregistrement dans la table de base . Une vue peut être mise à jour ou non est déterminée par l'instruction SELECT définie dans la définition de la vue. Il n'y a pas de clause spéciale pour désigner une vue pouvant être mise à jour. En règle générale, la définition de la vue doit être simple et ne doit contenir aucune fonction d'agrégation telle que SUM, AVG, MAX, MIN, COUNT. Tout type de regroupement ou de clause DISTINCT ou JOIN rend également la vue non modifiable. Reportez-vous au manuel de la base de données pertinente du SGBDR spécifique pour savoir ce qui rend une vue non actualisable.

Créons une vue pouvant être mise à jour :

CREATE VIEW v3_ch_dept_name
AS
SELECT
   deptId, deptName, deptMgrId, mgrStartDate
FROM
   Department;

La requête SELECT en vue :

SELECT * FROM v3_ch_dept_name;

ID de service

Nom du service

DeptMgrId

DateDébutGestion

1

Musique

123456789

2020-01-01

5

Drame

987654321

2018-03-05

Maintenant, mettez à jour la vue en modifiant le nom du service (deptName).

UPDATE
   v3_ch_dept_name
SET
   deptName = 'Security'
WHERE
   deptId = 5;

Une ligne peut être insérée dans la vue comme suit :

INSERT
   INTO v3_ch_dept_name
VALUES (7,'Logistics',666884444,'1982-07-07');

Nous pouvons également SUPPRIMER une ligne de la vue comme suit :

DELETE FROM v3_ch_dept_name WHERE deptId = 7;

Dans MySQL, vous pouvez facilement trouver les vues d'une base de données qui peuvent être mises à jour ou non à l'aide de la commande SELECT suivante.

SELECT
   table_name
FROM
   information_schema.views
WHERE
   is_updatable like 'YES'
AND
   table_schema like 'my_company';

SUPPRIMER les vues de la base de données

Une vue peut toujours être supprimée avec DROP VIEW commande.

DROP VIEW V1;

Notez que lorsque nous exécutons la commande drop view, cela supprime la définition de la vue. Les données sous-jacentes stockées dans les tables de base à partir desquelles cette vue est dérivée restent inchangées. Une vue une fois supprimée peut être recréée avec le même nom.

L'instruction ALTER VIEW

Les vues sont généralement inaltérables selon la norme SQL:2006, cela signifie que l'instruction ALTER VIEW ne fonctionne pas avec les vues. Cependant, il existe des SGBDR comme MySQL ou SQL Server qui prennent en charge ce type d'instruction. L'Oracle croit qu'il faut d'abord supprimer la vue, puis la recréer plutôt que de la modifier. Par conséquent, les fonctionnalités prises en charge sur les vues par les SGBDR varient d'un produit à l'autre.

Conclusion

Les vues SQL sont également un outil utile pour accéder à plusieurs types de données. Les requêtes complexes peuvent être stockées dans la définition de la vue. Cela tire parti de la réutilisation car nous pouvons invoquer la vue au lieu de recréer les requêtes chaque fois que nous en avons besoin. C'est un moyen pratique de présenter des informations à l'utilisateur en cachant de nombreuses informations que nous ne voulons pas exposer à tout le monde. Ceci est également important du point de vue de la sécurité. Les structures complexes peuvent être synthétisées et présentées dans un format simple pour l'utilisateur final.

Références :

Elmasri, Ramez et Shamkant B. Navathe. Principes de base des systèmes de bases de données . Éducation Pearson.