Cassandra Query Language
CQL (Cassandra Query Language) est le langage de requête utilisé par Apache Cassandra. Bien qu’il ressemble à SQL, il est conçu pour les opérations de base de données distribuées sans prise en charge de certaines fonctionnalités comme les jointures.
Données
Dans le cadre des requêtes ci-dessous, un example de données d’une bibliothèque est utilisé. Les données sont stockées dans un keyspace library
qui contient deux tables : users
et loan
(emprunt en anglais).
Table users
La table users
contient les informations des utilisateurs de la bibliothèque :
-
id
: identifiant unique de l’utilisateur -
name
: nom de l’utilisateur -
age
: âge de l’utilisateur
Ci-dessous un exemple de données pour la table users
:
id | name | age |
---|---|---|
6a6148d1-4a56-4d6a-a610 | Alice | 30 |
79e9b9b4-8b76-4cb7-8419 | Bob | 23 |
cb923190-d658-4471-827d | Charlie | 45 |
8eabd71d-c1f0-4496-9415 | Dalia | 28 |
2c524549-09f0-4e8e-9afc | Eve | 36 |
Table loan
La table loan
contient les informations des emprunts de livres :
-
book_id
: identifiant du livre emprunté -
user_id
: identifiant de l’utilisateur -
loan_id
: identifiant unique de l’emprunt -
timestamp
: date et heure de l’emprunt
Voici des données pour la table loan
:
book_id | loan_id | user_id | timestamp |
---|---|---|---|
549d7790-2aa1-4710-88d4 | 437c10d7-5508-4ecf-b821 | 6a6148d1-4a56-4d6a-a610 | 2021-03-31 10:00:00+0000 |
616be2d4-d205-4278-ad6d | dc880752-f900-4454-8993 | 6a6148d1-4a56-4d6a-a610 | 2022-08-06 15:00:00+0000 |
549d7790-2aa1-4710-88d4 | 4c63cb26-f5f1-4ca3-bd62 | 79e9b9b4-8b76-4cb7-8419 | 2023-35-22 11:00:00+0000 |
b3420ae3-88b8-45f7-adc1 | 4e1e806b-872b-421e-a461 | cb923190-d658-4471-827d | 2025-10-03 12:00:00+0000 |
0d7c6069-d250-431a-8573 | 8eabd71d-c1f0-4496-9415 | 8eabd71d-c1f0-4496-9415 | 2021-11-14 13:00:00+0000 |
2f228bd5-a517-4214-8303 | f93925d8-79e6-461d-ace8 | 2c524549-09f0-4e8e-9afc | 2021-12-05 14:00:00+0000 |
Exemples de commandes en CQL
Voici quelques exemples de commandes CQL pour interagir avec la base de données library
qui contient les données des utilisateurs et des emprunts de livres d’une bibliothèque.
Keyspaces
Cassandra définit des keyspaces pour regrouper les tables. Un keyspace est l’équivalent d’une base de données dans un système de gestion de base de données relationnelle. Les keyspaces ont des propriétés de réplication qui définissent comment les données sont répliquées sur les nœuds du cluster.
- Création d’un keyspace :
CREATE KEYSPACE library WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};
- Changement de keyspace :
USE library ;
L’instruction
USE
replace le keyspace courant par celui spécifié dans la requête. Ainsi, toutes les requêtes suivantes seront exécutées dans le keyspacelibrary
. Il n’est pas nécessaire de spécifier le keyspace dans les requêtes suivantes. On peut écrire directementCREATE TABLE users (...)
sans spécifier le keyspace. - Liste des keyspaces :
DESCRIBE KEYSPACES;
Cette commande permet de lister tous les keyspaces disponibles dans le cluster.
- Description d’un keyspace :
DESCRIBE KEYSPACE library;
Cette commande permet de voir les détails du keyspace
library
. - Suppression d’un keyspace :
DROP KEYSPACE IF EXISTS library;
Création de tables
La création de tables en CQL
est similaire à SQL
. Il faut veiller à bien définir la clé primaire pour chaque table qui est essentielle pour la distribution des données dans le cluster.
- Clé primaire simple
CREATE TABLE library.users ( id UUID PRIMARY KEY, name TEXT, age INT );
Pour plus d’informations sur les types de données supportés par Apache Cassandra, vous pouvez consulter la documentation.
- Clé primaire composite
CREATE TABLE library.loan ( book_id UUID, loan_id UUID, user_id UUID, timestamp TIMESTAMP, PRIMARY KEY (loan_id, user_id) );
Ici nous avons une table qui possède deux colonnes comme clé primaire. Cela signifie que la combinaison de
loan_id
etuser_id
doit être unique. - Clé de clustering
CREATE TABLE library.loan ( book_id UUID, loan_id UUID, user_id UUID, timestamp TIMESTAMP, PRIMARY KEY ((loan_id, user_id), timestamp) ) WITH CLUSTERING ORDER BY (timestamp DESC);
Ici la clé primaire est composée de
loan_id
etuser_id
, et la clé de clustering esttimestamp
. On ajouteWITH CLUSTERING ORDER BY (timestamp DESC)
pour trier les données par ordre décroissant detimestamp
.
Manipulation de données
Une fois que les données sont insérées dans le cluster, il est possible de les manipuler en utilisant des requêtes CQL via les clauses SELECT
, INSERT
, UPDATE
et DELETE
.
- Liste des tables :
DESCRIBE TABLES;
Cette commande permet de lister toutes les tables du keyspace courant.
- Description d’une table :
DESCRIBE TABLE library.users;
Cette commande permet de voir les détails de la table
users
du keyspacelibrary
. - Insertion de données :
INSERT INTO library.users (id, name, age) VALUES (6a6148d1-4a56-4d6a-a610-cdf7b7e3b959, 'Alice', 30); INSERT INTO library.users (id, name, age) VALUES (uuid(), 'Bob', 23);
Ici, l’identifiant de Bob est généré automatiquement par Cassandra via la fonction
uuid()
. - Sélection de données :
SELECT name, age FROM library.users WHERE age > 35;
Cette requête permet de sélectionner le nom et l’âge des utilisateurs de plus de 35 ans.
- Mise à jour de données :
UPDATE library.users SET age = 31 WHERE id = 6a6148d1-4a56-4d6a-a610-cdf7b7e3b959;
Ici, on met à jour l’âge d’Alice (qui possède l’identifiant
6a6148d1-4a56-4d6a-a610-cdf7b7e3b959
) de 30 à 31 ans. - Suppression de données :
DELETE FROM library.users WHERE id = 6a6148d1-4a56-4d6a-a610-cdf7b7e3b959;
De même, qu’il est possible de supprimer les données d’Alice de la table
users
. Dans notre cas, il faudrait également supprimer les emprunts d’Alice dans la tableloan
. - Suppression d’une table :
DROP TABLE IF EXISTS library.users;
Si l’on veut supprimer une table, il suffit d’utiliser la commande
DROP TABLE
comme en SQL.
Index
Les index peuvent être créés pour améliorer les performances des requêtes. Cela permet de rechercher plus rapidement les colonnes qui ne sont pas définies dans la clé de partitionnement.
- Création d’un index :
CREATE INDEX IF NOT EXISTS name_index ON library.users (name);
- Suppression d’un index :
DROP INDEX IF EXISTS name_index;
Clé primaire et partitionnement
Il est important de bien choisir la clé de partition et la clé de clustering pour optimiser les performances de la base de données. Aussi, il peut être nécessaire de dupliquer les données pour répondre à différents types de requêtes.
Toutes les colonnes qui sont dans la PRIMARY KEY doivent être utilisées dans la clauseWHERE
de la requêteSELECT
. Par exemple, si la clé primaire est composée deid
etname
, la requêteSELECT
doit contenir ces deux colonnes dans la clauseWHERE
.SELECT * FROM library.users WHERE id = 6a6148d1-4a56-4d6a-a610-cdf7b7e3b959 AND name = 'Alice';
Documentation :
- Manipulation de données : CREATE, ALTER, DROP (table, keyspace)
- Requêtes : SELECT, INSERT, UPDATE, DELETE