Requêtes SQL simples – aide courte et exemples. Dédié aux vrais « nuls » ou MySQL pour les débutants

Langage de requête structuré ou SQL est un langage de programmation déclaratif destiné à être utilisé dans les bases de données quasi-relationnelles. La plupart des fonctionnalités originales de SQL proviennent du calcul des tuples, mais dernières extensions SQL inclut de plus en plus d'algèbre relationnelle.
SQL a été créé à l'origine par IBM, mais de nombreux fournisseurs ont développé leurs propres dialectes. Il a été adopté comme norme par l’American National Standards Institute (ANSI) en 1986 et par l’ISO en 1987. Dans la norme du langage de programmation SQL, l'ANSI a déclaré que la prononciation officielle de SQL est « es q el ». Cependant, de nombreux spécialistes des bases de données ont utilisé la prononciation « d'argot » « Sequel », qui reflète le nom original du langage, Sequel, qui a ensuite été modifié en raison d'un conflit de marque et de nom avec IBM. Programmation pour débutants.
Langage de programmation SQL a été révisé en 1992 et cette version est connue sous le nom de SQL-92. 1999 a ensuite été à nouveau révisé pour devenir SQL:1999 (AKA SQL3). Programmation pour les nuls. SQL 1999 prend en charge des objets qui n'étaient pas pris en charge auparavant dans d'autres versions, mais depuis fin 2001, seuls quelques systèmes de gestion de bases de données prenaient en charge les implémentations SQL : SQL 1999.
SQL, bien que défini comme ANSI et ISO, comporte de nombreuses variantes et extensions, dont la plupart ont leurs propres caractéristiques, telles que l'implémentation "PL/SQL" d'Oracle Corporation ou l'implémentation de Sybase et Microsoft appelée "Transact-SQL", ce qui peut prêter à confusion. ceux qui connaissent les bases de la programmation. Il n'est pas rare non plus que les implémentations commerciales omettent la prise en charge des principales fonctionnalités de la norme, telles que les types de données comme la date et l'heure, préférant certaines de leurs propres variantes. En conséquence, contrairement à ANSI C ou ANSI Fortran qui peuvent généralement être portés d'une plateforme à l'autre sans changements structurels majeurs, les requêtes du langage de programmation SQL peuvent rarement être portées entre différents systèmes de bases de données sans modifications significatives. La plupart des acteurs du secteur des bases de données pensent que ce manque de compatibilité est intentionnel, afin de fournir à chaque développeur son propre système de gestion de base de données et de lier l'acheteur à une base de données spécifique.
Comme son nom l'indique, le langage de programmation SQL est conçu à des fins spécifiques et limitées : interroger des données contenues dans une base de données relationnelle. En tant que tel, il s'agit d'un ensemble d'instructions de langage de programmation permettant de créer des échantillons de données, plutôt que d'un langage procédural tel que C ou BASIC, conçus pour résoudre un éventail beaucoup plus large de problèmes. Les extensions de langage telles que « PL/SQL » sont conçues pour résoudre cette limitation en ajoutant des éléments procéduraux à SQL tout en conservant les avantages de SQL. Une autre approche consiste à intégrer des commandes de langage de programmation procédurale dans des requêtes SQL et à interagir avec la base de données. Par exemple, Oracle et d'autres prennent en charge Langage Java dans la base de données, tandis que PostgreSQL vous permet d'écrire des fonctions en Perl, Tcl ou C.
Une blague à propos de SQL : "SQL n'est ni structuré ni un langage." Le but de la blague est que SQL n'est pas un langage de Turing. .

Sélectionnez * dans T
C1 C2
1 un
2 b
C1 C2
1 un
2 b
Sélectionnez C1 dans T
C1
1
2
C1 C2
1 un
2 b
Sélectionnez * dans T où C1=1
C1 C2
1 un

Étant donné un tableau T, la requête Select * from T affichera tous les éléments de toutes les lignes du tableau.
A partir de la même table, la requête Select C1 from T affichera les éléments de la colonne C1 de toutes les lignes de la table.
A partir de la même table, la requête Select * from T which C1=1 affichera tous les éléments de toutes les lignes où la valeur de la colonne C1 est "1".

Mots-clés SQL

Les mots SQL sont divisés en plusieurs groupes.

Le premier est Langage de manipulation de données ou DML(langage de gestion de données). DML est un sous-ensemble du langage utilisé pour interroger les bases de données et ajouter, mettre à jour et supprimer des données.

  • SELECT est l'une des commandes DML les plus couramment utilisées et permet à l'utilisateur de spécifier une requête comme description définie du résultat souhaité. La requête ne précise pas comment les résultats doivent être organisés - traduire la requête sous une forme pouvant être exécutée dans la base de données est la tâche du système de base de données, plus spécifiquement de l'optimiseur de requêtes.
  • INSERT est utilisé pour ajouter des lignes (ensemble formel) à une table existante.
  • UPDATE est utilisé pour modifier les valeurs de données dans une ligne de tableau existante.
  • DELETE spécifie les lignes existantes qui seront supprimées de la table.

Trois autres mots-clés peuvent être considérés comme appartenant au groupe DML :

  • BEGIN WORK (ou START TRANSACTION, selon le dialecte SQL) peut être utilisé pour marquer le début d'une transaction de base de données qui soit se terminera entièrement, soit ne s'exécutera pas du tout.
  • COMMIT indique que toutes les modifications de données apportées après l'exécution des opérations sont enregistrées.
  • ROLLBACK spécifie que toutes les modifications de données après la dernière validation ou restauration doivent être détruites, jusqu'au point qui a été enregistré dans la base de données comme « restauration ».

COMMIT et ROLLBACK sont utilisés dans des domaines tels que le contrôle et le verrouillage des transactions. Les deux instructions terminent toutes les transactions en cours (ensembles d'opérations sur la base de données) et suppriment tous les verrous sur la modification des données dans les tables. La présence ou l'absence d'une instruction BEGIN WORK ou similaire dépend de l'implémentation SQL particulière.

Le deuxième groupe de mots-clés appartient au groupe Langage de définition de données ou DDL (langage de définition de données). DDL permet à l'utilisateur de définir de nouvelles tables et leurs éléments associés. La plupart des bases de données SQL commerciales possèdent leurs propres extensions DDL qui permettent de contrôler des éléments non standard, mais généralement vitaux, d'un système particulier.
Les points principaux du DDL sont les commandes de création et de suppression.

  • CREATE spécifie les objets (tels que les tables) qui seront créés dans la base de données.
  • DROP spécifie quels objets existants dans la base de données seront supprimés, généralement définitivement.
  • Certains systèmes de bases de données prennent également en charge la commande ALTER, qui permet à l'utilisateur de modifier un objet existant de différentes manières, par exemple en ajoutant des colonnes à une table existante.

Le troisième groupe de mots-clés SQL est Langage de contrôle de données ou DCL (Data Control Language). DCL est responsable des droits d'accès aux données et permet à l'utilisateur de contrôler qui a accès pour afficher ou manipuler les données dans la base de données. Il y a deux mots-clés principaux ici :

  • GRANT - permet à l'utilisateur d'effectuer des opérations
  • REVOKE - Supprime ou restreint la capacité de l'utilisateur à effectuer des opérations.

Systèmes de bases de données utilisant SQL

  • InterBase
  • MySQL
  • Oracle
  • PostgreSQL
  • serveur SQL

Comment devenir un professionnel du développement de sites Web et commencer à gagner de l’argent ? Cours vidéo bon marché avec une introduction introductive.

Chacun de nous rencontre et utilise régulièrement diverses bases de données. Lorsque nous sélectionnons une adresse e-mail, nous travaillons avec une base de données. Les bases de données sont utilisées par les services de recherche, les banques pour stocker les données clients, etc.

Mais malgré utilisation constante bases de données, même pour de nombreux développeurs systèmes logiciels Il reste de nombreux « points blancs » en raison des différentes interprétations des mêmes termes. Nous donnerons courte définition termes de base de données de base avant d’aborder le langage SQL. Donc.

Base de données - un fichier ou une collection de fichiers pour stocker des structures de données ordonnées et leurs relations. Très souvent, un système de gestion est appelé base de données - il ne s'agit que d'un référentiel d'informations dans un format spécifique et peut fonctionner avec différents SGBD.

Tableau - Imaginons un dossier dans lequel sont stockés des documents, regroupés selon une certaine caractéristique, par exemple une liste des commandes du mois dernier. Il s'agit d'une table dans un ordinateur. Une table distincte a son propre nom unique.

Type de données - le type d’informations pouvant être stockées dans une colonne ou une ligne distincte. Il peut s'agir de chiffres ou de texte d'un certain format.

Colonne et ligne- Nous avons tous travaillé avec des feuilles de calcul, qui comportent également des lignes et des colonnes. Toute base de données relationnelle fonctionne avec les tables de la même manière. Les lignes sont parfois appelées enregistrements.

Clé primaire- Chaque ligne d'un tableau peut avoir une ou plusieurs colonnes pour l'identifier de manière unique. Sans clé primaire, il est très difficile de mettre à jour, modifier et supprimer les lignes pertinentes.

Qu’est-ce que SQL ?

SQL(anglais - langage de requête structuré) a été développé uniquement pour travailler avec des bases de données et dans actuellement est un standard pour tous les SGBD populaires. La syntaxe du langage se compose d'un petit nombre d'opérateurs et est facile à apprendre. Mais, malgré son apparente simplicité, il permet de créer des requêtes SQL pour des opérations complexes avec une base de données de toute taille.

Depuis 1992, il existe une norme généralement acceptée appelée ANSI SQL. Il définit la syntaxe de base et les fonctions des opérateurs et est pris en charge par tous les leaders du marché des SGBD, comme ORACLE. Il est impossible de considérer toutes les fonctionnalités du langage dans un court article, nous ne considérerons donc brièvement que les principales. Requêtes SQL. Les exemples montrent clairement la simplicité et les capacités du langage :

  • créer des bases de données et des tables ;
  • échantillonnage de données ;
  • ajouter des enregistrements ;
  • modification et suppression des informations.

Types de données SQL

Toutes les colonnes d'une table de base de données stockent le même type de données. Les types de données en SQL sont les mêmes que dans les autres langages de programmation.

Nous créons des tables et des bases de données

Il existe deux manières de créer de nouvelles bases de données, tables et autres requêtes en SQL :

  • Instructions SQL via la console SGBD
  • Utilisation des outils d'administration interactifs inclus avec le serveur de base de données.

Créé nouvelle base données de l'opérateur CRÉER UNE BASE DE DONNÉES<наименование базы данных>; . Comme vous pouvez le constater, la syntaxe est simple et concise.

Nous créons des tables dans la base de données à l'aide de l'instruction CREATE TABLE avec les paramètres suivants :

  • nom de la table
  • noms de colonnes et types de données

À titre d'exemple, créons une table Commodity avec les colonnes suivantes :

Créez un tableau :

CRÉER UNE TABLE

(commodity_id CHAR(15) NON NULL,

id_vendeur CHAR(15) NON NULL,

nom_produit CHAR(254) NULL,

prix_produit DECIMAL(8,2) NULL,

marchandise_desc VARCHAR(1000) NULL);

Le tableau se compose de cinq colonnes. Après le nom vient le type de données, les colonnes sont séparées par des virgules. La valeur de la colonne peut accepter des valeurs vides (NULL) ou doit être remplie (NON NULL), et cela est déterminé lors de la création de la table.

Récupérer des données d'une table

L'opérateur de récupération de données est la requête SQL la plus couramment utilisée. Pour obtenir des informations, il faut indiquer ce que l'on souhaite sélectionner dans un tel tableau. Tout d'abord un exemple simple :

SELECT nom_produit FROM Produit

Après l'instruction SELECT, nous spécifions le nom de la colonne pour obtenir des informations, et FROM définit la table.

Le résultat de la requête sera toutes les lignes de la table avec les valeurs Commodity_name dans l'ordre dans lequel elles ont été saisies dans la base de données, c'est-à-dire sans aucun tri. Une clause ORDER BY supplémentaire est utilisée pour trier le résultat.

Pour interroger plusieurs champs, répertoriez-les séparés par des virgules, comme dans l'exemple suivant :

SELECT id_marchandise, nom_marchandise, prix_marchandise FROM Marchandise

Il est possible d'obtenir la valeur de toutes les colonnes d'une ligne comme résultat d'une requête. Pour cela, utilisez le signe « * » :

SELECT * FROM Produit

  • De plus, SELECT prend en charge :
  • Tri des données (opérateur ORDER BY)
  • Sélection selon conditions (OÙ)
  • Terme de regroupement (GROUP BY)

Ajouter une ligne

Pour ajouter une ligne à une table, des requêtes SQL avec l'opérateur INSERT sont utilisées. L'ajout peut se faire de trois manières :

  • ajoutez une nouvelle ligne entière ;
  • partie de chaîne ;
  • résultats de la requête.

Pour ajouter une ligne complète, vous devez spécifier le nom de la table et les valeurs de la colonne (champ) nouvelle ligne. Voici un exemple :

INSERT INTO Commodity VALUES("106 ", "50", "Coca-Cola", "1.68", "No Alcogol ,)

L'exemple ajoute un nouveau produit au tableau. Les valeurs sont répertoriées après VALEURS pour chaque colonne. S'il n'y a pas de valeur correspondante pour la colonne, alors NULL doit être spécifié. Les colonnes sont remplies de valeurs dans l'ordre spécifié lors de la création de la table.

Si vous ajoutez seulement une partie d'une ligne, vous devez spécifier explicitement les noms des colonnes, comme dans l'exemple :

INSERT INTO Commodity (commodity_id, Vendor_id, Commodity_name)

VALEURS("106 ", '50", "Coca-Cola",)

Nous avons saisi uniquement les identifiants du produit, du fournisseur et son nom, et avons laissé les champs restants vides.

Ajout de résultats de requête

INSERT est principalement utilisé pour ajouter des lignes, mais peut également être utilisé pour ajouter les résultats d'une instruction SELECT.

Modification des données

Pour modifier les informations dans les champs d'une table de base de données, vous devez utiliser l'instruction UPDATE. L'opérateur peut être utilisé de deux manières :

  • Toutes les lignes du tableau sont mises à jour.
  • Uniquement pour une ligne spécifique.

UPDATE se compose de trois éléments principaux :

  • tableau dans lequel des modifications doivent être apportées ;
  • les noms de champs et leurs nouvelles valeurs ;
  • conditions de sélection des lignes à modifier.

Regardons un exemple. Disons que le prix d'un produit avec l'ID=106 a changé, cette ligne doit donc être mise à jour. On écrit l'opérateur suivant :

MISE À JOUR Commodity SET Commodity_price = "3.2" WHERE Commodity_id = "106"

Nous avons indiqué le nom de la table, dans notre cas Commodity, où la mise à jour sera effectuée, puis après SET - la nouvelle valeur de la colonne et trouvée l'entrée souhaitée, en spécifiant la valeur d'ID souhaitée dans WHERE.

Pour modifier plusieurs colonnes, l'instruction SET est suivie de plusieurs paires colonne-valeur séparées par des virgules. Regardons un exemple dans lequel le nom et le prix d'un produit sont mis à jour :

UPDATE Commodity SET Commodity_name = 'Fanta', Commodity_price = "3.2" WHERE Commodity_id = "106"

Pour supprimer des informations dans une colonne, vous pouvez lui attribuer la valeur NULL si la structure de la table le permet. Il faut se rappeler que NULL est précisément une valeur « non », et non zéro sous forme de texte ou de nombre. Supprimons la description du produit :

MISE À JOUR Commodity SET Commodity_desc = NULL WHERE Commodity_id = "106"

Supprimer des lignes

Les requêtes SQL pour supprimer des lignes dans une table sont exécutées à l'aide de l'instruction DELETE. Il existe deux cas d'utilisation :

  • Certaines lignes du tableau sont supprimées ;
  • Toutes les lignes du tableau sont supprimées.

Un exemple de suppression d'une ligne d'un tableau :

DELETE FROM Commodity WHERE marchandise_id = "106"

Après DELETE FROM nous indiquons le nom de la table dans laquelle les lignes seront supprimées. La clause WHERE contient la condition selon laquelle les lignes seront sélectionnées pour être supprimées. Dans l'exemple, nous supprimons la ligne de produits avec l'ID=106. Spécifier OÙ est très important car l'omission de cette instruction supprimera toutes les lignes du tableau. Cela s'applique également à la modification de la valeur des champs.

L'instruction DELETE ne spécifie pas de noms de colonnes ni de métacaractères. Il supprime complètement les lignes, mais il ne peut pas supprimer une seule colonne.

Utiliser SQL dans Microsoft Access

Généralement utilisé de manière interactive pour créer des tables, des bases de données, gérer, modifier, analyser des données dans une base de données et pour implémenter des requêtes SQL Access via un concepteur de requêtes interactif pratique (Query Designer), à l'aide duquel vous pouvez créer et exécuter immédiatement Instructions SQL de toute complexité.

Le mode d'accès au serveur est également pris en charge, dans lequel le SGBD Access peut être utilisé comme générateur de requêtes SQL vers n'importe quelle source de données ODBC. Cette fonctionnalité permet Accéder aux applications interagir avec n’importe quel format.

Extensions SQL

Étant donné que les requêtes SQL ne possèdent pas toutes les capacités des langages de programmation procédurale, telles que les boucles, les branchements, etc., les fabricants de SGBD développent leur propre version de SQL avec des fonctionnalités avancées. Tout d'abord, il s'agit de la prise en charge des procédures stockées et des opérateurs standards des langages procéduraux.

Les dialectes les plus courants de la langue :

  • Base de données Oracle - PL/SQL
  • Interbase, Firebird-PSQL
  • MicrosoftSQL Serveur - Transact-SQL
  • PostgreSQL-PL/pgSQL.

SQL sur Internet

Le SGBD MySQL est distribué sous la licence publique générale GNU gratuite. Il existe une licence commerciale avec la possibilité de développer des modules personnalisés. Comment composant inclus dans les assemblages de serveurs Internet les plus populaires, tels que XAMPP, WAMP et LAMP, et est le SGBD le plus populaire pour développer des applications sur Internet.

Il a été développé par Sun Microsystems et est actuellement pris en charge par Oracle Corporation. Les bases de données d'une taille maximale de 64 téraoctets, la norme de syntaxe SQL : 2003, la réplication des bases de données et les services cloud sont prises en charge.

  • Didacticiel

De quoi parle ce tutoriel ?

Ce tutoriel est en quelque sorte un « tampon de ma mémoire » en langage SQL (DDL, DML), c'est-à-dire ce sont des informations qui se sont accumulées en cours de route activité professionnelle et est constamment stocké dans ma tête. C'est pour moi un minimum suffisant, qui est le plus souvent utilisé lorsque l'on travaille avec des bases de données. S'il est nécessaire d'utiliser des constructions SQL plus complètes, je me tourne généralement vers la bibliothèque MSDN située sur Internet pour obtenir de l'aide. À mon avis, il est très difficile de tout garder en tête, et cela n'est pas particulièrement nécessaire. Mais connaître les structures de base est très utile, car... ils sont applicables presque sous la même forme dans de nombreuses bases de données relationnelles, telles qu'Oracle, MySQL, Firebird. Les différences résident principalement dans les types de données, qui peuvent différer dans le détail. Il n'existe pas beaucoup de constructions SQL de base et, avec une pratique constante, elles sont rapidement mémorisées. Par exemple, pour créer des objets (tables, contraintes, index, etc.) il suffit d'avoir à portée de main éditeur de texte environnement (IDE) pour travailler avec une base de données, et il n'est pas nécessaire d'étudier des outils visuels adaptés pour travailler avec un type spécifique de base de données (MS SQL, Oracle, MySQL, Firebird, ...). C'est également pratique car tout le texte est sous vos yeux et vous n'avez pas besoin de parcourir de nombreux onglets pour créer, par exemple, un index ou une contrainte. À emploi permanent avec une base de données, créer, modifier et surtout recréer un objet à l'aide de scripts est plusieurs fois plus rapide que si vous le faites en mode visuel. Également en mode script (et, par conséquent, avec le plus grand soin), il est plus facile de définir et de contrôler les règles de dénomination des objets (mon avis subjectif). De plus, les scripts sont pratiques à utiliser lorsque les modifications apportées dans une base de données (par exemple, test) doivent être transférées sous la même forme vers une autre base de données (productive).

Le langage SQL est divisé en plusieurs parties, je vais ici m'intéresser aux 2 parties les plus importantes :
  • DML – Data Manipulation Language, qui contient les constructions suivantes :
    • SELECT – sélection des données
    • INSERT – insertion de nouvelles données
    • MISE À JOUR – mise à jour des données
    • DELETE – suppression de données
    • MERGE – fusion de données
Parce que Je suis un praticien ; il y aura peu de théorie en tant que telle dans ce manuel, et toutes les constructions seront expliquées à l'aide d'exemples pratiques. De plus, je crois qu'un langage de programmation, et notamment SQL, ne peut être maîtrisé que par la pratique, en l'expérimentant soi-même et en comprenant ce qui se passe lorsque l'on exécute telle ou telle construction.

Ce manuel a été créé selon le principe étape par étape, c'est-à-dire vous devez le lire séquentiellement et de préférence suivre immédiatement les exemples. Mais si en cours de route vous avez besoin d'en savoir plus sur une certaine commande, utilisez une recherche spécifique sur Internet, par exemple dans la bibliothèque MSDN.

Lors de la rédaction de ce didacticiel, j'ai utilisé la base de données MS SQL Server version 2014 et MS SQL Server Management Studio (SSMS) pour exécuter les scripts.

En bref sur MS SQL Server Management Studio (SSMS)

SQL Server Management Studio (SSMS) est un utilitaire pour Microsoft SQL Server permettant de configurer, de gérer et d'administrer les composants de base de données. Cet utilitaire contient un éditeur de script (que nous utiliserons principalement) et un programme graphique qui fonctionne avec les objets et les paramètres du serveur. L'outil principal de SQL Server Management Studio est l'Explorateur d'objets, qui permet à l'utilisateur d'afficher, de récupérer et de gérer les objets du serveur. Ce texte est partiellement emprunté à Wikipédia.

Pour créer un nouvel éditeur de script, utilisez le bouton « Nouvelle requête » :

Pour changer la base de données actuelle, vous pouvez utiliser la liste déroulante :

Pour exécuter une commande spécifique (ou un groupe de commandes), sélectionnez-la et appuyez sur le bouton « Exécuter » ou sur la touche « F5 ». S'il n'y a qu'une seule commande actuellement dans l'éditeur ou si vous devez exécuter toutes les commandes, vous n'avez rien à sélectionner.

Après avoir exécuté des scripts, en particulier ceux créant des objets (tables, colonnes, index), pour voir les modifications, utilisez l'actualisation dans le menu contextuel en mettant en surbrillance le groupe approprié (par exemple, Tables), la table elle-même ou le groupe Colonnes qu'elle contient.

En fait, c'est tout ce que nous avons besoin de savoir pour compléter les exemples donnés ici. Le reste de l’utilitaire SSMS est facile à apprendre par vous-même.

Un peu de théorie

Une base de données relationnelle (RDB, ou ci-après dans le contexte simplement DB) est un ensemble de tables interconnectées. En gros, une base de données est un fichier dans lequel les données sont stockées sous une forme structurée.

SGBD – Système de gestion de base de données, c'est-à-dire il s'agit d'un ensemble d'outils permettant de travailler avec un type spécifique de base de données (MS SQL, Oracle, MySQL, Firebird, ...).

Note
Parce que dans la vie, dans le langage familier, on dit le plus souvent : « Oracle DB », ou même simplement « Oracle », signifiant en fait « Oracle SGBD », puis dans le contexte de ce manuel le terme DB sera parfois utilisé. D’après le contexte, je pense qu’il sera clair de quoi nous parlons exactement.

Un tableau est une collection de colonnes. Les colonnes peuvent aussi être appelées champs ou colonnes ; tous ces mots seront utilisés comme synonymes exprimant la même chose.

La table est l'objet principal du RDB ; toutes les données du RDB sont stockées ligne par ligne dans les colonnes du tableau. Les lignes et les enregistrements sont également des synonymes.

Pour chaque table, ainsi que ses colonnes, sont spécifiés les noms par lesquels on y accède ensuite.
Le nom d'un objet (nom de table, nom de colonne, nom d'index, etc.) dans MS SQL peut avoir longueur maximale 128 caractères.

Pour référence– dans la base de données ORACLE, les noms d'objets peuvent avoir une longueur maximale de 30 caractères. Par conséquent, pour une base de données spécifique, vous devez développer vos propres règles de dénomination des objets afin de respecter la limite du nombre de caractères.

SQL est un langage qui permet d'interroger une base de données à l'aide d'un SGBD. Dans un SGBD spécifique, le langage SQL peut avoir une implémentation spécifique (son propre dialecte).

DDL et DML sont un sous-ensemble du langage SQL :

  • Le langage DDL est utilisé pour créer et modifier la structure de la base de données, c'est-à-dire pour créer/modifier/supprimer des tables et des relations.
  • Le langage DML permet de manipuler les données d'une table, c'est-à-dire avec ses lignes. Il vous permet de sélectionner des données dans des tables, d'ajouter de nouvelles données aux tables, ainsi que de mettre à jour et de supprimer des données existantes.

En SQL, vous pouvez utiliser 2 types de commentaires (monoligne et multiligne) :

Commentaire d'une ligne
Et

/* commentaire multiligne */

En fait, cela suffira pour la théorie.

DDL – Langage de définition de données

Par exemple, considérons un tableau contenant des données sur les employés, sous une forme familière à une personne qui n'est pas programmeur :

Dans ce cas, les colonnes du tableau portent les noms suivants : Matricule, Nom complet, Date de naissance, E-mail, Fonction, Service.

Chacune de ces colonnes peut être caractérisée par le type de données qu'elle contient :

  • Matricule – entier
  • Nom complet – chaîne
  • Date de naissance - date
  • E-mail – chaîne
  • Position - chaîne
  • Département - ligne
Le type de colonne est une caractéristique qui indique le type de données qu'une colonne donnée peut stocker.

Pour commencer, il suffira de mémoriser uniquement les types de données de base suivants utilisés dans MS SQL :

Signification Notation en MS SQL Description
Chaîne de longueur variable varchar(N)
Et
nvarchar(N)
En utilisant le nombre N, nous pouvons spécifier la longueur de chaîne maximale possible pour la colonne correspondante. Par exemple, si nous voulons dire que la valeur de la colonne « Nom » peut contenir un maximum de 30 caractères, alors nous devons définir son type sur nvarchar(30).
La différence entre varchar et nvarchar est que varchar vous permet de stocker des chaînes au format ASCII, où un caractère occupe 1 octet, et nvarchar stocke des chaînes au format Unicode, où chaque caractère occupe 2 octets.
Le type varchar ne doit être utilisé que si vous êtes sûr à 100 % que le champ n'aura pas besoin de stocker de caractères Unicode. Par exemple, varchar peut être utilisé pour stocker des adresses e-mail car... ils ne contiennent généralement que des caractères ASCII.
Chaîne de longueur fixe char(N)
Et
nchar(N)
Ce type diffère d'une chaîne de longueur variable en ce sens que si la longueur de la chaîne est inférieure à N caractères, elle est alors toujours complétée à droite jusqu'à une longueur de N avec des espaces et stockée dans la base de données sous cette forme, c'est-à-dire dans la base de données, il occupe exactement N caractères (où un caractère occupe 1 octet pour char et 2 octets pour nchar). Dans ma pratique, ce type est très rarement utilisé, et s'il est utilisé, il l'est principalement au format char(1), c'est-à-dire lorsqu'un champ est défini par un seul caractère.
Entier int Ce type nous permet d'utiliser uniquement des entiers dans la colonne, à la fois positifs et négatifs. Pour référence (ce n'est plus si pertinent pour nous), la plage de nombres autorisée par le type int va de -2 147 483 648 à 2 147 483 647. Il s'agit généralement du type principal utilisé pour spécifier les identifiants.
Nombre réel ou réel flotter En termes simples, il s’agit de nombres pouvant contenir un point décimal (virgule).
date date Si la colonne doit stocker uniquement la date, qui se compose de trois composants : jour, mois et année. Par exemple, 15/02/2014 (15 février 2014). Ce type peut être utilisé pour la colonne « Date d'admission », « Date de naissance », etc., c'est-à-dire dans les cas où il est important pour nous d'enregistrer uniquement la date, ou lorsque la composante temporelle n'est pas importante pour nous et peut être ignorée ou si elle n'est pas connue.
Temps temps Ce type peut être utilisé si la colonne doit stocker uniquement des données temporelles, c'est-à-dire Heures, minutes, secondes et millisecondes. Par exemple, 17:38:31.3231603
Par exemple, « Heure de départ du vol » quotidiennement.
date et l'heure dateheure Ce type vous permet d'enregistrer simultanément la date et l'heure. Par exemple, 15/02/2014 17:38:31.323
Par exemple, il peut s'agir de la date et de l'heure d'un événement.
Drapeau peu Ce type est pratique à utiliser pour stocker des valeurs de la forme « Oui »/« Non », où « Oui » sera stocké sous la valeur 1 et « Non » sera stocké sous la forme 0.

De plus, la valeur du champ, si elle n'est pas interdite, ne peut pas être spécifiée ; le mot clé NULL est utilisé à cet effet.

Pour exécuter les exemples, créons une base de données de test appelée Test.

Une base de données simple (sans préciser paramètres supplémentaires) peut être créé en exécutant la commande suivante :

CRÉER UNE BASE DE DONNÉES
Vous pouvez supprimer la base de données avec la commande (vous devez être très prudent avec cette commande) :

Test de suppression de la base de données
Afin de basculer vers notre base de données, vous pouvez exécuter la commande :

Test d'UTILISATION
Vous pouvez également sélectionner la base de données Test dans la liste déroulante de la zone de menu SSMS. Lorsque je travaille, j'utilise souvent cette méthode pour basculer entre les bases de données.

Maintenant, dans notre base de données, nous pouvons créer un tableau en utilisant les descriptions telles quelles, en utilisant des espaces et des caractères cyrilliques :

CREATE TABLE [Employés]([Numéro du personnel] int, [Nom] nvarchar(30), [Date de naissance] date, nvarchar(30), [Position] nvarchar(30), [Département] nvarchar(30))
Dans ce cas, nous devrons mettre les noms entre crochets […].

Mais dans la base de données, pour plus de commodité, il est préférable de spécifier tous les noms d'objets en latin et de ne pas utiliser d'espaces dans les noms. Dans MS SQL, généralement dans ce cas, chaque mot commence par une lettre majuscule, par exemple, pour le champ « Personnel Number », nous pourrions définir le nom PersonnelNumber. Vous pouvez également utiliser des chiffres dans le nom, par exemple PhoneNumber1.

Sur une note
Dans certains SGBD, le format de dénomination suivant « PHONE_NUMBER » peut être préférable ; par exemple, ce format est souvent utilisé dans la base de données ORACLE. Naturellement, lors de la spécification d'un nom de champ, il est souhaitable qu'il ne coïncide pas avec les mots-clés utilisés dans le SGBD.

Pour cette raison, vous pouvez oublier la syntaxe des crochets et supprimer le tableau [Employés] :

TABLE DE DÉPÔT [Employés]
Par exemple, une table avec des employés peut être nommée « Employés » et ses champs peuvent recevoir les noms suivants :

  • ID – Numéro de personnel (ID d’employé)
  • Nom – nom complet
  • Anniversaire – Date de naissance
  • Courriel – Courriel
  • Poste - Poste
  • Département - Département
Très souvent, le mot ID est utilisé pour nommer un champ d'identifiant.

Créons maintenant notre tableau :

CREATE TABLE Employés (ID int, Nom nvarchar (30), Date d'anniversaire, Email nvarchar (30), Poste nvarchar (30), Département nvarchar (30))
Pour spécifier les colonnes requises, vous pouvez utiliser l'option NOT NULL.

Pour une table existante, les champs peuvent être redéfinis à l'aide des commandes suivantes :

Mettre à jour le champ ID ALTER TABLE Employés ALTER COLUMN ID int NOT NULL -- mettre à jour le champ Nom ALTER TABLE Employés ALTER COLUMN Nom nvarchar(30) NOT NULL

Sur une note
Le concept général du langage SQL reste le même pour la plupart des SGBD (du moins, c'est ce que je peux en juger à partir des SGBD avec lesquels j'ai travaillé). Les différences entre DDL dans différents SGBD résident principalement dans les types de données (non seulement leurs noms peuvent différer ici, mais aussi les détails de leur implémentation), et les spécificités mêmes de l'implémentation du langage SQL peuvent également différer légèrement (c'est-à-dire le l'essence des commandes est la même, mais il peut y avoir de légères différences de dialecte, hélas, mais il n'y a pas de norme unique). Après avoir maîtrisé les bases de SQL, vous pouvez facilement passer d'un SGBD à un autre, car... Dans ce cas, il vous suffira de comprendre les détails de l'implémentation des commandes dans le nouveau SGBD, c'est-à-dire dans la plupart des cas, il suffit de faire une analogie.

Création d'une table CREATE TABLE Employees(ID int, -- dans ORACLE le type int est l'équivalent (wrapper) du nombre (38) Nom nvarchar2(30), -- nvarchar2 dans ORACLE est équivalent à nvarchar dans MS SQL Date d'anniversaire, Email nvarchar2(30) , Position nvarchar2(30), Département nvarchar2(30)); -- mise à jour des champs ID et Nom (ici MODIFY(...) est utilisé à la place de ALTER COLUMN) ALTER TABLE Employees MODIFY(ID int NOT NULL,Name nvarchar2(30) NOT NULL); -- ajout de PK (dans ce cas, la construction ressemble à celle de MS SQL, elle sera montrée ci-dessous) ALTER TABLE Employees ADD CONSTRAINT PK_Employees PRIMARY KEY(ID);
Pour ORACLE, il existe des différences en termes d'implémentation du type varchar2 : son encodage dépend des paramètres de la base de données et le texte peut être enregistré, par exemple, en encodage UTF-8. De plus, la longueur du champ dans ORACLE peut être définie à la fois en octets et en caractères, pour cela nous utilisons options additionelles BYTE et CHAR, qui sont spécifiés après la longueur du champ, par exemple :

NAME varchar2(30 BYTE) -- la capacité du champ sera de 30 octets NAME varchar2(30 CHAR) -- la capacité du champ sera de 30 caractères
L'option qui sera utilisée par défaut BYTE ou CHAR, dans le cas d'une simple spécification du type varchar2(30) dans ORACLE, dépend des paramètres de la base de données et peut parfois être définie dans les paramètres de l'EDI. En général, on peut parfois facilement se tromper, donc dans le cas d'ORACLE, si le type varchar2 est utilisé (et cela est parfois justifié ici, par exemple, lors de l'utilisation de l'encodage UTF-8), je préfère écrire explicitement CHAR (puisque il est généralement plus pratique de calculer la longueur de la chaîne en caractères ).

Mais dans ce cas, s'il y a déjà des données dans le tableau, alors pour une exécution réussie des commandes, il est nécessaire que les champs ID et Nom soient remplis dans toutes les lignes du tableau. Montrons cela avec un exemple : insérez des données dans le tableau dans les champs ID, Poste et Département ; cela peut être fait avec le script suivant :

INSÉRER les VALEURS des employés (ID, Poste, Département) (1000,N"Directeur",N"Administration"), (1001,N"Programmeur",N"IT"), (1002,N"Comptable",N"Comptabilité" ), (1003,N"Programmeur principal",N"IT")
Dans ce cas, la commande INSERT générera également une erreur, car Lors de l'insertion, nous n'avons pas précisé la valeur du champ Nom requis.
Si nous avions déjà ces données dans la table d'origine, alors la commande « ALTER TABLE Employees ALTER COLUMN ID int NOT NULL » serait exécutée avec succès, et la commande « ALTER TABLE Employees ALTER COLUMN Name int NOT NULL » produirait un message d'erreur, que le champ Nom contient des valeurs NULL (non spécifiées).

Ajoutons des valeurs pour le champ Nom et remplissons à nouveau les données :


Vous pouvez également utiliser l'option NOT NULL directement lors de la création nouveau tableau, c'est à dire. dans le cadre de la commande CREATE TABLE.

Tout d'abord, supprimez la table à l'aide de la commande :

DROP TABLE Employés
Créons maintenant une table avec les colonnes ID et Nom requises :

CREATE TABLE Employés (ID int NOT NULL, Nom nvarchar (30) NOT NULL, Date d'anniversaire, Email nvarchar (30), Poste nvarchar (30), Département nvarchar (30))
Vous pouvez également écrire NULL après le nom de la colonne, ce qui signifie que les valeurs NULL (non spécifiées) y seront autorisées, mais ce n'est pas nécessaire, car cette caractéristique est implicite par défaut.

Si au contraire vous souhaitez rendre facultative une colonne existante, alors utilisez la syntaxe de commande suivante :

ALTER TABLE Employés ALTER COLUMN Nom nvarchar(30) NULL
Ou simplement:

ALTER TABLE Employés ALTER COLUMN Nom nvarchar(30)
Avec cette commande, nous pouvons également changer le type de champ en un autre type compatible, ou modifier sa longueur. Par exemple, agrandissons le champ Nom à 50 caractères :

ALTER TABLE Employés ALTER COLUMN Nom nvarchar(50)

Clé primaire

Lors de la création d'une table, il est souhaitable qu'elle comporte une colonne unique ou un ensemble de colonnes unique pour chacune de ses lignes - un enregistrement peut être identifié de manière unique par cette valeur unique. Cette valeur est appelée clé primaire de la table. Pour notre table Employés, une telle valeur unique pourrait être la colonne ID (qui contient le « Numéro de personnel de l'employé » - laissez dans notre cas valeur donnée unique pour chaque collaborateur et ne peut être répété).

Vous pouvez créer une clé primaire pour une table existante à l'aide de la commande :

ALTER TABLE Employés ADD CONSTRAINT PK_Employees PRIMARY KEY(ID)
Où "PK_Employees" est le nom de la contrainte responsable de la clé primaire. En règle générale, la clé primaire est nommée à l'aide du préfixe « PK_ » suivi du nom de la table.

Si la clé primaire est composée de plusieurs champs, alors ces champs doivent être listés entre parenthèses, séparés par des virgules :

ALTER TABLE nom_table ADD CONSTRAINT nom_contrainte PRIMARY KEY(field1,field2,…)
Il convient de noter que dans MS SQL, tous les champs inclus dans la clé primaire doivent avoir la caractéristique NOT NULL.

La clé primaire peut également être déterminée directement lors de la création d'une table, c'est-à-dire dans le cadre de la commande CREATE TABLE. Supprimons le tableau :

DROP TABLE Employés
Et puis nous allons le créer en utilisant la syntaxe suivante :

CREATE TABLE Employees (ID int NOT NULL, Name nvarchar(30) NOT NULL, Date d'anniversaire, Email nvarchar(30), Position nvarchar(30), Department nvarchar(30), CONSTRAINT PK_Employees PRIMARY KEY(ID) -- décrit PK après tous les champs comme limitation)
Après la création, remplissez le tableau avec les données :

INSÉRER les VALEURS des employés (ID, Poste, Département, Nom) (1000,N"Directeur",N"Administration",N"Ivanov I.I."), (1001,N"Programmeur",N"IT",N" Petrov P.P." ), (1002,N"Comptable",N"Comptabilité",N"Sidorov S.S."), (1003,N"Programmeur principal",N"IT",N"Andreev A. A.")
Si la clé primaire d'un tableau est constituée uniquement des valeurs d'une colonne, alors vous pouvez utiliser la syntaxe suivante :

CREATE TABLE Employees(ID int NOT NULL CONSTRAINT PK_Employees PRIMARY KEY, -- spécifier comme caractéristique du champ Nom nvarchar(30) NOT NULL, Date d'anniversaire, Email nvarchar(30), Poste nvarchar(30), Département nvarchar(30) )
En fait, vous n’êtes pas obligé de préciser le nom de la contrainte, auquel cas un nom système lui sera attribué (du type « PK__Employee__3214EC278DA42077 ») :

CREATE TABLE Employés (ID int NOT NULL, Nom nvarchar (30) NOT NULL, Date d'anniversaire, Email nvarchar (30), Poste nvarchar (30), Département nvarchar (30), CLÉ PRIMAIRE (ID))
Ou:

CREATE TABLE Employés (ID int NOT NULL PRIMARY KEY, Nom nvarchar(30) NOT NULL, Date d'anniversaire, Email nvarchar(30), Position nvarchar(30), Département nvarchar(30))
Mais je recommanderais que pour les tables permanentes, vous définissiez toujours explicitement le nom de la contrainte, car Avec un nom explicitement spécifié et compréhensible, il sera plus facile de le manipuler plus tard ; vous pourrez par exemple le supprimer :

ALTER TABLE Employés DROP CONSTRAINT PK_Employees
Mais une syntaxe aussi courte, sans préciser les noms des restrictions, est pratique à utiliser lors de la création de tables de base de données temporaires (le nom de la table temporaire commence par # ou ##), qui seront supprimées après utilisation.

Résumons

Sur ce moment Nous avons examiné les commandes suivantes :
  • CRÉER UN TABLEAU table_name (liste des champs et de leurs types, restrictions) – utilisé pour créer une nouvelle table dans la base de données actuelle ;
  • TABLEAU DE DÉPÔT table_name – utilisé pour supprimer une table de la base de données actuelle ;
  • MODIFIER TABLE nom de la table MODIFIER LA COLONNE nom_colonne... – utilisé pour mettre à jour le type de colonne ou modifier ses paramètres (par exemple, pour définir la caractéristique NULL ou NOT NULL) ;
  • MODIFIER TABLE nom de la table AJOUTER UNE CONTRAINTE nom_contrainte CLÉ PRIMAIRE(field1, field2,...) – ajout d'une clé primaire à une table existante ;
  • MODIFIER TABLE nom de la table CONTRAINTE DE SUPPRESSION constraint_name – supprime une contrainte de la table.

Un peu sur les tables temporaires

Extrait de MSDN. Il existe deux types de tables temporaires dans MS SQL Server : locale (#) et globale (##). Les tables temporaires locales ne sont visibles que par leurs créateurs jusqu'à la fin de la session de connexion à l'instance SQL Server lors de leur première création. Les tables temporaires locales sont automatiquement supprimées après qu'un utilisateur se déconnecte de l'instance de SQL Server. Les tables temporaires globales sont visibles par tous les utilisateurs pendant toutes les sessions de connexion après la création de ces tables et sont supprimées lorsque tous les utilisateurs faisant référence à ces tables se déconnectent de l'instance de SQL Server.

Les tables temporaires sont créées dans la base de données système tempdb, c'est-à-dire En les créant, nous n'obstruons pas la base de données principale ; sinon, les tables temporaires sont complètement identiques aux tables normales ; elles peuvent également être supprimées à l'aide de la commande DROP TABLE. Les tables temporaires locales (#) sont plus couramment utilisées.

Pour créer une table temporaire, vous pouvez utiliser la commande CREATE TABLE :

CRÉER UNE TABLE #Temp(ID int, Nom nvarchar(30))
Puisqu'une table temporaire dans MS SQL est similaire à une table ordinaire, elle peut également être supprimée à l'aide de la commande DROP TABLE :

DÉPOSER LA TABLE #Temp

Vous pouvez également créer une table temporaire (comme une table normale) et la remplir immédiatement avec les données renvoyées par la requête en utilisant la syntaxe SELECT ... INTO :

SELECT ID,Name INTO #Temp FROM Employés

Sur une note
L'implémentation des tables temporaires peut différer selon les SGBD. Par exemple, dans les SGBD ORACLE et Firebird, la structure des tables temporaires doit être déterminée à l'avance par la commande CREATE GLOBAL TEMPORARY TABLE, indiquant les spécificités du stockage des données, puis l'utilisateur la voit parmi les tables principales et travaille avec elle. comme avec une table ordinaire.

Normalisation de la base de données – division en sous-tables (répertoires) et identification des connexions

Notre tableau actuel des employés présente l'inconvénient que dans les champs Poste et Service, l'utilisateur peut saisir n'importe quel texte, qui est principalement semé d'erreurs, puisque pour un employé, il peut simplement indiquer « IT » comme service, et pour un deuxième employé, pour exemple, saisissez « Département informatique », le troisième a « informatique ». En conséquence, il ne sera pas clair ce que l'utilisateur voulait dire, c'est-à-dire Ces employés sont-ils des employés du même service, ou l'utilisateur s'est-il décrit et il s'agit de 3 services différents ? De plus, dans ce cas, nous ne pourrons pas regrouper correctement les données pour certains rapports, où il peut être nécessaire d'afficher le nombre d'employés par chaque service.

Le deuxième inconvénient est le volume de stockage de ces informations et leur duplication, c'est-à-dire Pour chaque employé, le nom complet du service est indiqué, ce qui nécessite de l'espace dans la base de données pour stocker chaque caractère du nom du service.

Le troisième inconvénient est la difficulté de mettre à jour ces champs si le nom d'un poste change, par exemple, si vous devez renommer le poste « Programmeur » en « Programmeur Junior ». Dans ce cas, nous devrons apporter des modifications à chaque ligne du tableau dont la Position est égale à « Programmeur ».

Pour éviter ces inconvénients, la normalisation de la base de données est utilisée, en la divisant en sous-tables et tables de référence. Il n'est pas nécessaire d'entrer dans la jungle de la théorie et d'étudier ce que sont les formes normales ; il suffit de comprendre l'essence de la normalisation.

Créons 2 tables répertoire « Positions » et « Départements », appelons respectivement la première Positions et la seconde, Départements :

CREATE TABLE Positions(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, Nom nvarchar(30) NOT NULL) CREATE TABLE Departments(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY KEY, Nom nvarchar(30 ) PAS NULL)
Notez qu'ici nous avons utilisé la nouvelle option IDENTITY, qui dit que les données de la colonne ID seront numérotées automatiquement, à partir de 1, par incréments de 1, c'est-à-dire Lors de l'ajout de nouveaux enregistrements, les valeurs 1, 2, 3, etc. leur seront séquentiellement attribuées. De tels champs sont généralement appelés auto-incrémentés. Une table ne peut avoir qu'un seul champ défini avec la propriété IDENTITY, et généralement, mais pas nécessairement, ce champ est la clé primaire de cette table.

Sur une note
Dans différents SGBD, l'implémentation des champs avec un compteur peut se faire différemment. Dans MySQL, par exemple, un tel champ est défini à l'aide de l'option AUTO_INCREMENT. Dans ORACLE et Firebird, cette fonctionnalité pouvait auparavant être émulée à l'aide de SEQUENCE. Mais pour autant que je sache, ORACLE a maintenant ajouté l'option GÉNÉRÉE COMME IDENTITÉ.

Remplissons ces tables automatiquement, en fonction des données actuelles enregistrées dans les champs Poste et Département de la table Employés :

Nous remplissons le champ Nom de la table Postes avec des valeurs uniques du champ Position de la table Employés INSERT Positions(Name) SELECT DISTINCT Position FROM Employees WHERE Position IS NOT NULL -- rejetons les enregistrements pour lesquels le poste n'est pas spécifié
Faisons de même pour la table Départements :

INSÉRER les départements (nom) SELECT DISTINCT Department FROM Employés OÙ le département n'est pas NULL
Si nous ouvrons maintenant les tables Postes et Départements, nous verrons un ensemble numéroté de valeurs pour le champ ID :

SELECT * FROM Postes

SELECT * FROM Départements

Ces tableaux joueront désormais le rôle d'ouvrages de référence pour préciser les postes et les départements. Nous allons maintenant faire référence aux identifiants de travail et de service. Tout d'abord, créons de nouveaux champs dans la table Employés pour stocker les données d'identification :

Ajouter un champ pour l'ID de poste ALTER TABLE Employees ADD PositionID int -- ajouter un champ pour l'ID de département ALTER TABLE Employees ADD DepartmentID int
Le type des champs de référence doit être le même que dans les répertoires, dans ce cas il s'agit d'un int.

Vous pouvez également ajouter plusieurs champs au tableau à la fois avec une seule commande, en répertoriant les champs séparés par des virgules :

ALTER TABLE Employés ADD PositionID int, DepartmentID int
Écrivons maintenant des liens (restrictions de référence - FOREIGN KEY) pour ces champs afin que l'utilisateur n'ait pas la possibilité d'écrire dans ces champs des valeurs qui ne font pas partie des valeurs d'ID trouvées dans les répertoires.

ALTER TABLE Employés AJOUTER UNE CONTRAINTE FK_Employees_PositionID FOREIGN KEY(PositionID) RÉFÉRENCES Postes(ID)
Et nous ferons de même pour le deuxième champ :

ALTER TABLE Employés AJOUTER UNE CONTRAINTE FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) RÉFÉRENCES Départements(ID)
Désormais, l'utilisateur pourra saisir uniquement les valeurs d'ID du répertoire correspondant dans ces champs. Ainsi, afin d'utiliser un nouveau département ou poste, il devra d'abord ajouter une nouvelle entrée dans l'annuaire correspondant. Parce que Les postes et départements sont désormais stockés dans les répertoires en un seul exemplaire, donc pour changer le nom, il suffit de le changer uniquement dans le répertoire.

Le nom d'une contrainte de référence est généralement un nom composite, composé du préfixe "FK_", suivi du nom de la table, suivi d'un trait de soulignement, suivi du nom du champ qui fait référence à l'identifiant de la table de référence.

Un identifiant (ID) est généralement une valeur interne qui n'est utilisée que pour les relations et la valeur qui y est stockée est complètement indifférente dans la plupart des cas, il n'est donc pas nécessaire d'essayer de se débarrasser des trous dans la séquence de nombres qui surviennent pendant le travail. avec la table, par exemple, après avoir supprimé des enregistrements du répertoire.

ALTER TABLE table ADD CONSTRAINT nom_contrainte FOREIGN KEY(field1,field2,…) REFERENCES reference_table(field1,field2,…)
Dans ce cas, dans la table « reference_table », la clé primaire est représentée par une combinaison de plusieurs champs (field1, field2,...).

En fait, mettons maintenant à jour les champs PositionID et DepartmentID avec les valeurs d'ID des répertoires. Utilisons la commande DML UPDATE à cet effet :

UPDATE e SET PositionID=(SELECT ID FROM Postes WHERE Name=e.Position), DepartmentID=(SELECT ID FROM Departments WHERE Name=e.Department) FROM Employés e
Voyons ce qui se passe en exécutant la requête :

SELECT * FROM Employés

Ça y est, les champs PositionID et DepartmentID sont remplis avec les identifiants correspondant aux postes et départements ; les champs Position et Department ne sont plus nécessaires dans la table Employés, vous pouvez supprimer ces champs :

ALTER TABLE Employés DROP COLUMN Position,Département
Maintenant, notre tableau ressemble à ceci :

SELECT * FROM Employés

IDENTIFIANT Nom Anniversaire E-mail ID de position Numéro de département
1000 Ivanov I.I. NUL NUL 2 1
1001 Petrov P.P. NUL NUL 3 3
1002 Sidorov S.S. NUL NUL 1 2
1003 Andreev A.A. NUL NUL 4 3

Ceux. Nous avons finalement supprimé le stockage des informations redondantes. Désormais, à partir des numéros de poste et de service, nous pouvons déterminer sans ambiguïté leurs noms à l'aide des valeurs des tableaux de référence :

SELECT e.ID,e.Name,p.Name PositionName,d.Name DepartmentName FROM Employés e LEFT JOIN Départements d ON d.ID=e.DepartmentID LEFT JOIN Postes p ON p.ID=e.PositionID

Dans l'inspecteur d'objets, nous pouvons voir tous les objets créés pour une table donnée. À partir de là, vous pouvez effectuer diverses manipulations avec ces objets, par exemple renommer ou supprimer des objets.

Il convient également de noter que le tableau peut faire référence à lui-même, c'est-à-dire vous pouvez créer un lien récursif. Par exemple, ajoutons un autre champ ManagerID à notre table avec les employés, qui indiquera l'employé dont cet employé relève. Créons un champ :

ALTER TABLE Employés ADD ManagerID int
Ce champ autorise une valeur NULL ; le champ sera vide si, par exemple, il n'y a pas de supérieur hiérarchique sur l'employé.

Créons maintenant une FOREIGN KEY pour la table Employees :

ALTER TABLE Employés AJOUTER UNE CONTRAINTE FK_Employees_ManagerID CLÉ ÉTRANGÈRE (ManagerID) RÉFÉRENCES Employés (ID)
Créons maintenant un diagramme et voyons à quoi ressemblent les relations entre nos tables :

En conséquence, nous devrions voir l'image suivante (la table Employés est connectée aux tables Postes et Départements, et fait également référence à elle-même) :

Enfin, il convient de préciser que les clés de référence peuvent inclure des options supplémentaires ON DELETE CASCADE et ON UPDATE CASCADE, qui indiquent comment se comporter lors de la suppression ou de la mise à jour d'un enregistrement référencé dans la table de référence. Si ces options ne sont pas spécifiées, nous ne pouvons pas modifier l'ID dans la table du répertoire pour un enregistrement référencé à partir d'une autre table, et nous ne pourrons pas non plus supprimer un tel enregistrement du répertoire tant que nous n'aurons pas supprimé toutes les lignes faisant référence à cet enregistrement. ou, Mettons à jour les références dans ces lignes avec une valeur différente.

Par exemple, recréons la table spécifiant l'option ON DELETE CASCADE pour FK_Employees_DepartmentID :

DROP TABLE Employés CREATE TABLE Employés (ID int NOT NULL, Nom nvarchar (30), Date d'anniversaire, Email nvarchar (30), PositionID int, DepartmentID int, ManagerID int, CONSTRAINT PK_Employees PRIMARY KEY (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY (DepartmentID ) RÉFÉRENCES Départements (ID) ON DELETE CASCADE, CONTRAINTE FK_Employees_PositionID CLÉ ÉTRANGÈRE (PositionID) RÉFÉRENCES Positions (ID), CONTRAINTE FK_Employees_ManagerID CLÉ ÉTRANGÈRE (ManagerID) RÉFÉRENCES Employés (ID)) INSÉRER Employés (ID, Nom, Anniversaire, ID de position, ID de département, Manager ID )VALEURS (1000,N"Ivanov I.I.","19550219",2,1,NULL), (1001,N"Petrov P.P.","19831203",3,3,1003), (1002 ,N"Sidorov S.S. ","19760607",1,2,1000), (1003,N"Andreev A.A.","19820417",4,3,1000)
Supprimons le département avec l'ID 3 de la table Departments :

SUPPRIMER les départements OÙ ID=3
Regardons les données du tableau Employés :

SELECT * FROM Employés

IDENTIFIANT Nom Anniversaire E-mail ID de position Numéro de département ID du gestionnaire
1000 Ivanov I.I. 1955-02-19 NUL 2 1 NUL
1002 Sidorov S.S. 1976-06-07 NUL 1 2 1000

Comme vous pouvez le constater, les données du service 3 de la table Employés ont également été supprimées.

L'option ON UPDATE CASCADE se comporte de la même manière, mais elle est efficace lors de la mise à jour de la valeur de l'ID dans le répertoire. Par exemple, si nous modifions l'ID d'un poste dans le répertoire des postes, alors dans ce cas, le DepartmentID dans la table Employees sera mis à jour avec la nouvelle valeur d'ID que nous avons définie dans le répertoire. Mais dans ce cas, il ne sera tout simplement pas possible de le démontrer, car la colonne ID de la table Departments a l'option IDENTITY, ce qui ne nous permettra pas d'exécuter la requête suivante (changer l'ID de département 3 en 30) :

MISE À JOUR Départements SET ID=30 WHERE ID=3
L'essentiel est de comprendre l'essence de ces 2 options ON DELETE CASCADE et ON UPDATE CASCADE. J'utilise très rarement ces options et vous recommande de bien réfléchir avant de les spécifier dans une contrainte de référence, car si vous supprimez accidentellement une entrée d'une table de répertoire, cela peut entraîner gros problèmes et créer une réaction en chaîne.

Restaurons le département 3 :

Nous autorisons l'ajout/modification de la valeur IDENTITY SET IDENTITY_INSERT Departments ON INSERT Departments(ID,Name) VALUES(3,N"IT") -- nous interdisons l'ajout/modification de la valeur IDENTITY SET IDENTITY_INSERT Departments OFF
Effacons complètement la table Employees à l'aide de la commande TRUNCATE TABLE :

TRUNCATE TABLE Employés
Et encore une fois, nous y rechargerons les données en utilisant la commande INSERT précédente :

INSÉRER les employés (ID, Nom, Anniversaire, ID de position, ID de département, ID de gestionnaire) VALEURS (1000, N "Ivanov I.I.", "19550219", 2,1, NULL), (1001, N "Petrov P.P." , "19831203", 3 ,3,1003), (1002,N"Sidorov S.S.","19760607",1,2,1000), (1003,N"Andreev A.A.","19820417" ,4,3,1000)

Résumons

Pour le moment, plusieurs autres commandes DDL ont été ajoutées à nos connaissances :
  • Ajouter la propriété IDENTITY à un champ – vous permet de faire de ce champ un champ renseigné automatiquement (champ de compteur) pour la table ;
  • MODIFIER TABLE nom de la table AJOUTER list_of_fields_with_characteristics – vous permet d'ajouter de nouveaux champs au tableau ;
  • MODIFIER TABLE nom de la table COLONNE DE GOUTTE list_fields – vous permet de supprimer des champs de la table ;
  • MODIFIER TABLE nom de la table AJOUTER UNE CONTRAINTE nom_contrainte CLÉ ÉTRANGÈRE(des champs) LES RÉFÉRENCES table_reference (champs) – vous permet de définir la relation entre la table et la table de référence.

Autres restrictions – UNIQUE, PAR DÉFAUT, CHECK

À l'aide d'une contrainte UNIQUE, vous pouvez dire que la valeur de chaque ligne d'un champ ou d'un ensemble de champs donné doit être unique. Dans le cas de la table Employees, on peut imposer une telle contrainte sur le champ Email. Il suffit de pré-remplir Email avec les valeurs si elles ne sont pas déjà définies :

MISE À JOUR Employés SET Email=" [email protégé]" OÙ ID=1000 MISE À JOUR Employés SET Email=" [email protégé]" WHERE ID=1001 UPDATE Employés SET Email=" [email protégé]" WHERE ID=1002 UPDATE Employés SET Email=" [email protégé]"OÙ ID=1003
Vous pouvez désormais imposer une contrainte d'unicité sur ce champ :

ALTER TABLE Employés ADD CONSTRAINT UQ_Employees_Email UNIQUE(Email)
Désormais, l'utilisateur ne pourra plus saisir le même E-Mail pour plusieurs collaborateurs.

Une contrainte d'unicité est généralement nommée comme suit : vient d'abord le préfixe « UQ_ », puis le nom de la table et après le trait de soulignement vient le nom du champ sur lequel cette contrainte est appliquée.

Ainsi, si une combinaison de champs doit être unique dans le contexte des lignes du tableau, alors nous les listons séparés par des virgules :

ALTER TABLE nom_table ADD CONSTRAINT nom_contrainte UNIQUE(champ1,champ2,…)
En ajoutant une contrainte DEFAULT au champ, nous pouvons définir une valeur par défaut qui sera substituée si, lors de l'insertion nouvelle entrée ce champ ne sera pas répertorié dans la liste des champs de la commande INSERT. Cette restriction peut être définie directement lors de la création de la table.

Ajoutons un nouveau champ Date d'embauche à la table Employés et appelons-le HireDate et disons que la valeur par défaut de ce champ sera la date actuelle :

ALTER TABLE Employés ADD HireDate date NOT NULL DEFAULT SYSDATETIME()
Ou si la colonne HireDate existe déjà, alors la syntaxe suivante peut être utilisée :

ALTER TABLE Employés ADD DEFAULT SYSDATETIME() FOR HireDate
Ici je n'ai pas précisé le nom de la contrainte, car... dans le cas de DEFAULT, j'estime que ce n'est pas si critique. Mais si vous le faites de la bonne manière, alors je pense que vous n’avez pas besoin d’être paresseux et que vous devriez définir un nom normal. Cela se fait comme suit:

ALTER TABLE Employés ADD CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME() FOR HireDate
Étant donné que cette colonne n'existait pas auparavant, lorsqu'elle sera ajoutée à chaque enregistrement, la valeur de la date actuelle sera insérée dans le champ HireDate.

Lors de l'ajout d'une nouvelle entrée, la date actuelle sera également insérée automatiquement, bien sûr, à moins que nous ne la définissions explicitement, c'est-à-dire Nous ne l'indiquerons pas dans la liste des colonnes. Montrons cela avec un exemple sans spécifier le champ HireDate dans la liste des valeurs ajoutées :

INSÉRER les employés (ID, nom, e-mail) VALEURS (1004, N "Sergeev S.S.", " [email protégé]")
Voyons ce qui se passe:

SELECT * FROM Employés

IDENTIFIANT Nom Anniversaire E-mail ID de position Numéro de département ID du gestionnaire Date d'embauche
1000 Ivanov I.I. 1955-02-19 [email protégé] 2 1 NUL 2015-04-08
1001 Petrov P.P. 1983-12-03 [email protégé] 3 4 1003 2015-04-08
1002 Sidorov S.S. 1976-06-07 [email protégé] 1 2 1000 2015-04-08
1003 Andreev A.A. 1982-04-17 [email protégé] 4 3 1000 2015-04-08
1004 Sergueïev S.S. NUL [email protégé] NUL NUL NUL 2015-04-08

La contrainte de vérification CHECK est utilisée lorsqu'il est nécessaire de vérifier les valeurs insérées dans un champ. Par exemple, imposons cette restriction sur le champ matricule, qui est pour nous un identifiant (ID) d'employé. En utilisant cette contrainte, nous disons que les effectifs doivent avoir une valeur comprise entre 1000 et 1999 :

ALTER TABLE Employés ADD CONSTRAINT CK_Employees_ID CHECK(ID BETWEEN 1000 AND 1999)
La contrainte est généralement nommée de la même manière, d'abord avec le préfixe « CK_ », puis le nom de la table et le nom du champ sur lequel est imposée cette contrainte.

Essayons d'insérer un enregistrement invalide pour vérifier que la contrainte fonctionne (nous devrions obtenir l'erreur correspondante) :

INSÉRER les valeurs des employés (ID, e-mail) (2000, " [email protégé]")
Modifions maintenant la valeur insérée à 1500 et assurons-nous que l'enregistrement est inséré :

INSÉRER les valeurs des employés (ID, e-mail) (1 500, " [email protégé]")
Vous pouvez également créer des contraintes UNIQUE et CHECK sans spécifier de nom :

ALTER TABLE Employés AJOUTER UNIQUE (Email) ALTER TABLE Employés AJOUTER CHECK (ID ENTRE 1000 ET 1999)
Mais ce n’est pas une très bonne pratique et il vaut mieux préciser explicitement le nom de la contrainte, car Pour le comprendre plus tard, ce qui sera plus difficile, vous devrez ouvrir l'objet et regarder de quoi il est responsable.

Avec un bon nom, de nombreuses informations sur la contrainte peuvent être apprises directement de son nom.

Et, par conséquent, toutes ces restrictions peuvent être créées immédiatement lors de la création d'une table, si elle n'existe pas encore. Supprimons le tableau :

DROP TABLE Employés
Et nous allons le recréer avec toutes les restrictions créées avec une seule commande CREATE TABLE :

CREATE TABLE Employees (ID int NOT NULL, Name nvarchar(30), Date d'anniversaire, Email nvarchar(30), PositionID int, DepartmentID int, HireDate date NOT NULL DEFAULT SYSDATETIME(), -- pour DEFAULT, je ferai une exception CONSTRAINT PK_Employees CLÉ PRIMAIRE (ID), CONTRAINTE FK_Employees_DepartmentID CLÉ ÉTRANGÈRE(DepartmentID) RÉFÉRENCES Départements(ID), CONTRAINTE FK_Employees_PositionID FOREIGN KEY(PositionID) RÉFÉRENCES Postes(ID), CONTRAINTE UQ_Employees_Email UNIQUE (Email), CONTRAINTE CK_Employees_ID CHECK (ID BETWEEN 1000 AND 1999))

INSÉRER les employés (ID, nom, anniversaire, e-mail, ID de position, ID de département) VALEURS (1000, N "Ivanov I.I.", "19550219", " [email protégé]",2,1), (1001,N"Petrov P.P.","19831203"," [email protégé]",3,3), (1002,N"Sidorov S.S.","19760607"," [email protégé]",1,2), (1003,N"Andreev A.A.","19820417"," [email protégé]",4,3)

Un peu sur les index créés lors de la création des contraintes PRIMARY KEY et UNIQUE

Comme vous pouvez le voir dans la capture d'écran ci-dessus, lors de la création des contraintes PRIMARY KEY et UNIQUE, des index portant les mêmes noms (PK_Employees et UQ_Employees_Email) ont été automatiquement créés. Par défaut, l'index de la clé primaire est créé en tant que CLUSTERED et pour tous les autres index en tant que NONCLUSTERED. Il faut dire que le concept d'index de cluster n'est pas disponible dans tous les SGBD. Une table ne peut avoir qu’un seul index CLUSTERED. CLUSTERED – signifie que les enregistrements de la table seront triés par cet index, on peut aussi dire que cet index a un accès direct à toutes les données de la table. C'est pour ainsi dire l'index principal du tableau. Pour le dire encore plus grossièrement, il s’agit d’un index attaché à une table. Un index clusterisé est un outil très puissant qui peut aider à optimiser les requêtes, mais rappelons-le pour l'instant. Si nous voulons indiquer que l'index clusterisé doit être utilisé non pas sur la clé primaire, mais sur un autre index, alors lors de la création de la clé primaire, nous devons spécifier l'option NONCLUSTERED :

ALTER TABLE nom_table ADD CONSTRAINT nom_contrainte PRIMARY KEY NONCLUSTERED(field1,field2,…)
Par exemple, rendons l'index de contrainte PK_Employees non clusterisé et l'index de contrainte UQ_Employees_Email clusterisé. Tout d'abord, supprimons ces restrictions :

ALTER TABLE Employés DROP CONSTRAINT PK_Employees ALTER TABLE Employés DROP CONSTRAINT UQ_Employees_Email
Créons-les maintenant avec les options CLUSTERED et NONCLUSTERED :

ALTER TABLE Employés ADD CONSTRAINT PK_Employees PRIMARY KEY NONCLUSTERED (ID) ALTER TABLE Employés ADD CONSTRAINT UQ_Employees_Email UNIQUE CLUSTERED (Email)
Maintenant, en sélectionnant dans la table Employees, nous verrons que les enregistrements sont triés par l'index clusterisé UQ_Employees_Email :

SELECT * FROM Employés

IDENTIFIANT Nom Anniversaire E-mail ID de position Numéro de département Date d'embauche
1003 Andreev A.A. 1982-04-17 [email protégé] 4 3 2015-04-08
1000 Ivanov I.I. 1955-02-19 [email protégé] 2 1 2015-04-08
1001 Petrov P.P. 1983-12-03 [email protégé] 3 3 2015-04-08
1002 Sidorov S.S. 1976-06-07 [email protégé] 1 2 2015-04-08

Auparavant, lorsque l'index clusterisé était l'index PK_Employees, les enregistrements étaient triés par défaut par champ ID.

Mais dans ce cas, ce n'est qu'un exemple qui montre l'essence d'un index clusterisé, car Très probablement, des requêtes seront adressées à la table Employés à l'aide du champ ID et, dans certains cas, elle fera peut-être elle-même office de répertoire.

Pour les répertoires, il est généralement conseillé que l'index clusterisé soit construit sur la clé primaire, car dans les requêtes on se réfère souvent à l'identifiant de l'annuaire pour obtenir, par exemple, le nom (Position, Département). Rappelons ici ce que j'ai écrit ci-dessus, à savoir qu'un index clusterisé a un accès direct aux lignes de la table, et il s'ensuit que nous pouvons obtenir la valeur de n'importe quelle colonne sans surcharge supplémentaire.

Il est avantageux d’appliquer un index de cluster aux champs échantillonnés le plus fréquemment.

Parfois, les tables sont créées avec une clé basée sur un champ de substitution ; dans ce cas, il peut être utile de sauvegarder l'option d'index CLUSTERED pour un index plus approprié et de spécifier l'option NONCLUSTERED lors de la création d'une clé primaire de substitution.

Résumons

Sur à ce stade nous avons pris connaissance de toutes sortes de restrictions, dans leur forme même sous forme simple, qui sont créés par une commande telle que « ALTER TABLE table_name ADD CONSTRAINT constraint_name… » :
  • CLÉ PRIMAIRE- clé primaire;
  • CLÉ ÉTRANGÈRE– établir des connexions et contrôler l’intégrité référentielle des données ;
  • UNIQUE– vous permet de créer un caractère unique ;
  • VÉRIFIER– vous permet de garantir l’exactitude des données saisies ;
  • DÉFAUT– permet de définir une valeur par défaut ;
  • Il convient également de noter que toutes les restrictions peuvent être supprimées à l'aide de la commande " MODIFIER TABLE nom de la table CONTRAINTE DE SUPPRESSION nom_contrainte".
Nous avons également abordé en partie le thème des index et examiné le concept de cluster ( GROUPÉ) et non clusterisés ( NON CLUSTERÉ) indice.

Création d'index autonomes

Par indépendant, nous entendons ici les index qui ne sont pas créés sous la contrainte PRIMARY KEY ou UNIQUE.

Les index sur un ou plusieurs champs peuvent être créés avec la commande suivante :

CRÉER UN INDEX IDX_Employees_Name ON Employés (Nom)
Ici également, vous pouvez spécifier les options CLUSTERED, NONCLUSTERED, UNIQUE, et vous pouvez également spécifier le sens de tri de chaque champ individuel ASC (par défaut) ou DESC :

CRÉER UN INDEX NON CLUSTERÉ UNIQUE UQ_Employees_EmailDesc ON Employés (Email DESC)
Lors de la création d'un index non clusterisé, l'option NONCLUSTERED peut être omise, car il est implicite par défaut et est affiché ici simplement pour indiquer la position de l'option CLUSTERED ou NONCLUSTERED dans la commande.

Vous pouvez supprimer l'index avec la commande suivante :

DROP INDEX IDX_Employees_Name ON Employés
Des index simples, ainsi que des contraintes, peuvent être créés dans le contexte de la commande CREATE TABLE.

Par exemple, supprimons à nouveau le tableau :

DROP TABLE Employés
Et nous allons le recréer avec toutes les restrictions et index créés avec une seule commande CREATE TABLE :

CREATE TABLE Employés (ID int NON NULL, Nom nvarchar (30), Date d'anniversaire, Email nvarchar (30), PositionID int, DepartmentID int, HireDate date NON NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME(), ManagerID int, CONSTRAINT PK_Employees PRIMARY KEY (ID ), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES Employees(ID), CONTRAINTE UQ_Employ ees_Email UNIQUE(Email), CONTRAINTE CK_Employees_ID CHECK(ID ENTRE 1000 ET 1999), INDEX IDX_Employees_Name(Nom))
Enfin, insérons nos collaborateurs dans le tableau :

INSÉRER les employés (ID, nom, anniversaire, e-mail, ID de position, ID de département, ID de responsable) VALEURS (1000, N "Ivanov I.I.", "19550219", [email protégé]",2,1,NULL), (1001,N"Petrov P.P.","19831203"," [email protégé]",3,3,1003), (1002,N"Sidorov S.S.","19760607"," [email protégé]",1,2,1000), (1003,N"Andreev A.A.","19820417"," [email protégé]",4,3,1000)
De plus, il convient de noter que vous pouvez inclure des valeurs dans un index non clusterisé en les spécifiant dans INCLUDE. Ceux. dans ce cas, l'index INCLUDE rappellera un peu un index clusterisé, seulement maintenant l'index n'est pas attaché à la table, mais les valeurs nécessaires sont attachées à l'index. En conséquence, de tels index peuvent grandement améliorer les performances des requêtes de sélection (SELECT) : si tous les champs répertoriés se trouvent dans l'index, l'accès à la table peut ne pas être du tout nécessaire. Mais cela augmente naturellement la taille de l'index, car... les valeurs des champs répertoriés sont dupliquées dans l'index.

Extrait de MSDN. Syntaxe de commande générale pour la création d'index

CRÉER [UNIQUE] [CLUSTERÉ | NON CLUSTERED ] INDEX nom_index ON (colonne [ ASC | DESC ] [ ,...n ]) [ INCLUDE (nom_colonne [ ,...n ]) ]

Résumons

Les index peuvent augmenter la vitesse de récupération des données (SELECT), mais ils réduisent la vitesse de modification des données des tables, car Après chaque modification, le système devra reconstruire tous les index d'une table spécifique.

Il convient dans chaque cas de trouver solution optimale, un juste milieu pour que les performances d'échantillonnage et de modification des données soient au bon niveau. La stratégie de création d'index et le nombre d'index peuvent dépendre de nombreux facteurs, tels que la fréquence à laquelle les données de la table changent.

Conclusion sur le DDL

Comme vous pouvez le constater, DDL n’est pas aussi compliqué qu’il y paraît à première vue. Ici, j'ai pu montrer presque toutes ses structures principales en utilisant seulement trois tableaux.

L'essentiel est d'en comprendre l'essence, et le reste est une question de pratique.

Bonne chance pour maîtriser ce merveilleux langage appelé SQL.

La plupart des applications Web modernes interagissent avec des bases de données, généralement en utilisant un langage appelé SQL. Heureusement pour nous, cette langue est très facile à apprendre. Dans cet article, nous examinerons des choses simples SQL requêtes et apprenez à les utiliser pour interagir avec Base de données MySQL.

De quoi aurez-vous besoin ?

SQL (langage de requête structuré) un langage spécialement conçu pour s'interfacer avec les systèmes de gestion de bases de données tels que MySQL, Oracle, SQLite et autres... Pour compléter SQL demandes dans cet article, je vous conseille d'installer MySQL sur ordinateur local. Je recommande également d'utiliser phpMonAdmin comme interface visuelle.

Tout cela est disponible dans le Denver préféré de tous. Je pense que tout le monde devrait savoir ce que c'est et où l'obtenir :). Peut utilisez également WAMP ou MAMP.

Denver a un intégré MySQL console. C'est ce que nous utiliserons.

CRÉER UNE BASE DE DONNÉES :création de base de données

Voici notre première demande. Nous allons créer notre première base de données pour des travaux ultérieurs.

Pour commencer, ouvrez MySQL console et connectez-vous. Pour WAMP Le mot de passe par défaut est vide. Ce n'est rien :). Pour MAMP - "racine". Pour Denver, il faut clarifier.

Après vous être connecté, entrez la ligne suivante et cliquez sur Entrer:

CRÉER UNE BASE DE DONNÉES my_first_db ;

Notez qu'un point-virgule (;) est ajouté à la fin de la requête, comme dans les autres langages.

Également des commandes en SQL sensible aux majuscules et minuscules. Nous les écrivons en majuscules.

Possibilités officiellement: Jeu de caractèresEt Collation

Si vous souhaitez installer le jeu de caractères (jeu de caractères) et le classement (comparaison) peuvent être écrivez la commande suivante :

CREATE DATABASE my_first_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Recherche une liste des jeux de caractères pris en charge dans MySQL.

AFFICHER LES BASES DE DONNÉES :affiche une liste de toutes les bases de données

Cette commande est utilisée pour lister toutes les bases de données disponibles.

SUPPRIMER LA BASE DE DONNÉES :supprimer une base de données

Vous pouvez supprimer une base de données existante à l'aide de cette requête.

Soyez prudent avec cette commande car elle s'exécute sans avertissement. S'il y a des données dans votre base de données, elles seront toutes supprimées.

UTILISER:Sélection de base de données

Techniquement, ce n'est pas une requête, mais une instruction et ne nécessite pas de point-virgule à la fin.

Il indique à MySQL sélectionnez la base de données par défaut pour la session en cours. Nous sommes maintenant prêts à créer des tables et à effectuer d'autres tâches avec la base de données.

Qu'est-ce qu'une table dans une base de données ?

Vous pouvez représenter la table dans la base de données comme Fichier Excel.

Tout comme sur l'image, les tableaux ont des noms de colonnes, des lignes et des informations. En utilisant SQL requêtes, nous pouvons créer de telles tables. Nous pouvons également ajouter, lire, mettre à jour et supprimer des informations.

CRÉER UN TABLEAU : Création d'un tableau

C En utilisant cette requête, nous pouvons créer des tables dans la base de données. Malheureusement, la documentation MySQL pas très clair pour les débutants sur cette question. La structure de ce type de requête peut être très complexe, mais nous allons commencer par quelque chose de simple.

La requête suivante créera une table avec 2 colonnes.

Utilisateurs CREATE TABLE (nom d'utilisateur VARCHAR(20), create_date DATE) ;

Veuillez noter que nous pouvons écrire nos requêtes sur plusieurs lignes et avec des onglets pour l'indentation.

La première ligne est simple. Nous créons simplement une table appelée "utilisateurs". Ensuite, entre parenthèses, séparées par des virgules, se trouve une liste de toutes les colonnes. Après chaque nom de colonne, nous avons des types d'informations, tels que VARCHAR ou DATE.

VARCHAR(20) signifie que la colonne est de type chaîne et peut comporter un maximum de 20 caractères. DATE est également un type d'information utilisé pour stocker les dates au format suivant : "AAAA - MM-JJ".

CLÉ PRIMAIRE ( clé primaireh)

Avant d'exécuter la requête suivante, nous devons également inclure une colonne pour "user_id", qui sera notre clé primaire. Vous pouvez considérer PRIMARY KEY comme des informations utilisées pour identifier chaque ligne d’un tableau.

Utilisateurs CREATE TABLE (user_id INT AUTO_INCREMENT PRIMARY KEY, nom d'utilisateur VARCHAR(20), create_date DATE) ;

INT crée un type entier de 32 bits (par exemple, des nombres). INCRÉMENTATION AUTOMATIQUE génère automatiquement une nouvelle valeur IDENTIFIANT chaque fois que nous ajoutons une nouvelle série d’informations. Ce n’est pas nécessaire, mais cela facilite l’ensemble du processus.

Il n'est pas nécessaire que cette colonne soit une valeur entière, mais elle est le plus souvent utilisée. Disponibilité Clé primaireégalement facultatif, mais recommandé pour l'architecture et les performances de la base de données.

Lançons la requête :

AFFICHER LES TABLEAUX :afficher tous les tableaux

Cette requête vous permet d'obtenir une liste des tables présentes dans la base de données.

EXPLIQUER:Afficher la structure du tableau

Pour afficher la structure d'une table existante, vous pouvez utiliser cette requête.

Les colonnes sont affichées avec toutes les propriétés.

TABLEAU DE DÉPÔT :supprimer le tableau

Identique à DROP DATABASES, cette requête supprime la table et son contenu sans avertissement.

MODIFIER TABLE: changer de table

Cette requête peut également contenir une structure complexe en raison de plus changements qu'il peut apporter à la table. Regardons des exemples.

(si vous avez supprimé la table à l'étape précédente, créez-la à nouveau pour les tests)

AJOUTER UNE COLONNE

ALTER TABLE utilisateurs ADD email VARCHAR(100) AFTER nom d'utilisateur ;

En raison de la bonne lisibilité de SQL, je pense qu'il ne sert à rien de l'expliquer en détail. Nous ajoutons une nouvelle colonne « email » après « nom d'utilisateur ».

SUPPRIMER UNE COLONNE

C'était aussi très facile. Utilisez cette demande avec prudence car vos données peuvent être supprimées sans avertissement.

Restaurez la colonne que vous venez de supprimer pour d'autres expériences.

FAIRE DES MODIFICATIONS DANS UNE COLONNE

Parfois, vous souhaiterez peut-être apporter des modifications aux propriétés d'une colonne et vous n'avez pas besoin de la supprimer complètement pour ce faire.

Cette requête a renommé la colonne utilisateur en « nom_utilisateur » et a modifié son type de VARCHAR(20) en VARCHAR(30). Ce changement ne devrait pas modifier les données du tableau.

INSÉRER: Ajouter des informations à un tableau

Ajoutons quelques informations au tableau à l'aide de la requête suivante.

Comme vous pouvez le voir, VALUES() contient une liste de valeurs séparées par des virgules. Toutes les valeurs sont placées dans des colonnes uniques. Et les valeurs doivent être dans l'ordre des colonnes définies lors de la création du tableau.

Notez que la première valeur est NULL pour le champ PRIMARY KEY appelé « user_id ». Nous faisons cela pour que l'ID soit généré automatiquement, puisque la colonne a la propriété AUTO_INCREMENT. Lorsque des informations sont ajoutées pour la première fois, l'ID sera 1. La ligne suivante sera 2, et ainsi de suite...

OPTION ALTERNATIVE

Il existe une autre option de requête pour ajouter des lignes.

Cette fois, nous utilisons le mot-clé SET au lieu de VALUES et il n'a pas de parenthèses. Il y a plusieurs nuances :

Vous pouvez sauter la colonne. Par exemple, nous n'avons pas attribué de valeur à "user_id", qui serait par défaut sa valeur AUTO_INCREMENT. Si vous omettez une colonne de type VARCHAR, une ligne vide sera ajoutée.

Chaque colonne doit être référencée par son nom. De ce fait, ils peuvent être mentionnés dans n’importe quel ordre, contrairement à la version précédente.

OPTION ALTERNATIVE 2

Voici une autre option.

Encore une fois, puisqu'il existe des références au nom de la colonne, vous pouvez définir les valeurs dans n'importe quel ordre.

LAST_INSERT_ID()

Vous pouvez utiliser cette requête pour obtenir l'ID AUTO_INCREMENT pour la dernière ligne de la session en cours.

MAINTENANT()

Il est maintenant temps de montrer comment utiliser la fonction MySQL dans les requêtes.

La fonction NOW() affiche la date actuelle. Vous pouvez donc l'utiliser pour définir automatiquement la date d'une colonne sur la date actuelle lorsque vous insérez une nouvelle ligne.

Veuillez noter que nous avons reçu 1 avertissement, mais veuillez l'ignorer. La raison en est que NOW() sert également à générer des informations temporaires.

SÉLECTIONNER: Lire les données d'une table

Si nous ajoutons des informations à un tableau, il serait alors logique d’apprendre à les lire à partir de là. C'est là que la requête SELECT nous aidera.

Vous trouverez ci-dessous la requête SELECT la plus simple possible pour lire une table.

Dans ce cas, l'astérisque (*) signifie que nous avons demandé tous les champs du tableau. Si vous souhaitez uniquement certaines colonnes, la requête ressemblera à ceci.

Condition

Le plus souvent, nous ne nous intéressons pas à toutes les colonnes, mais seulement à certaines. Par exemple, supposons que nous n'ayons besoin que d'une adresse e-mail pour l'utilisateur "nettuts".

WHERE vous permet de définir des conditions dans une requête et d'effectuer des sélections détaillées.

Notez que pour l'égalité, un signe égal (=) est utilisé, et non deux, comme en programmation.

Vous pouvez également utiliser des comparaisons.

AND ou OR peuvent être utilisés pour combiner des conditions :

Notez que les valeurs numériques ne doivent pas être entre guillemets.

DANS()

Ceci est utile pour échantillonner sur plusieurs valeurs

COMME

Vous permet de faire des requêtes "wildcard"

L'icône % est utilisée comme "caractère générique". Autrement dit, n'importe quoi pourrait être à sa place.

ConditionCOMMANDÉ PAR

Si vous souhaitez obtenir le résultat sous une forme ordonnée selon n'importe quel critère

L'ordre par défaut est ASC (du plus petit au plus grand). Pour le contraire, DESC est utilisé.

LIMITE... DÉCALAGE...

Vous pouvez limiter le nombre de résultats renvoyés.

LIMIT 2 ne prend que les 2 premiers résultats. LIMITE 1 OFFSET 2 obtient 1 résultat après les 2 premiers. LIMIT 2, 1 signifie la même chose (notez simplement que offset vient en premier, puis limit ).

MISE À JOUR: Apporter des modifications aux informations du tableau

Cette requête est utilisée pour modifier les informations dans une table.

Dans la plupart des cas, il est utilisé conjointement avec une clause WHERE, car vous souhaiterez probablement apporter des modifications à certaines colonnes. S'il n'y a pas de clause WHERE, les modifications affecteront toutes les lignes.

Vous pouvez également utiliser LIMIT pour limiter le nombre de lignes auxquelles des modifications doivent être apportées.

SUPPRIMER: Supprimer des informations d'un tableau

Tout comme UPDATE, cette requête est utilisée avec WHERE :

Pour supprimer le contenu d'un tableau, vous pouvez simplement faire ceci :

SUPPRIMER DES utilisateurs ;

Mais il vaut mieux utiliser TRONQUER

En plus de la suppression, cette requête réinitialise également les valeurs INCRÉMENTATION AUTOMATIQUE et lors de l'ajout de lignes à nouveau, le compte à rebours commencera à zéro. SUPPRIMER ne le fait pas et le compte à rebours continue.

Désactivation des valeurs minuscules et des mots spéciaux

Valeurs de chaîne

Certains caractères doivent être désactivés ( s'échapper ), ou il peut y avoir des problèmes.

Une barre oblique inverse est utilisée pour cela.(\).

Mots spéciaux

Parce que dans MySQL il y a beaucoup de mots spéciaux ( SÉLECTIONNER ou METTRE À JOUR ), pour éviter les erreurs lors de leur utilisation, vous devez utiliser des guillemets. Mais pas des citations ordinaires, mais comme ça(`).

Autrement dit, vous devrez ajouter une colonne nommée " supprimer ", vous devez procéder ainsi :

Conclusion

Merci d'avoir lu jusqu'au bout. J'espère que vous avez trouvé cet article utile. Ce n'est pas encore fini! À suivre:).