Serveur Debian

Administration con centré . com !

Serveur Debian

SQL

Divers

SELECT  CONCAT_WS(' ', `champ_1`, `champ_2`) AS `nom_complet`,
  IF(`champ_1`, `champ_2`, `champ_3`) AS `champ_a`,
  IFNULL(`champ_2`, 0) AS `champ_safe`,    
  DATE_FORMAT(`created_at`, '%d/%m %H:%i') AS `day`,    
  TIMESTAMPDIFF(SECOND, DATE(NOW()), `created_at`) * 1000 AS `duration`,
  ST_X(`map_gps`) AS `lat`,ST_Y(`map_gps`) AS `lng`,
  ROUND(123.456, 2),
  FLOOR(RAND() * 100) + 1,
  GROUP_CONCAT(`produit` SEPARATOR ', ')
      CASE 
        WHEN age < 18 THEN 'Mineur'
        WHEN age BETWEEN 18 AND 65 THEN 'Adulte'
        ELSE 'Senior'
    END AS categorie_age
  FROM `table`;
SELECT * FROM `table` WHERE `champ` = 'valeur' AND `date_creation` BETWEEN '2024-01-01' AND '2024-12-31' AND `status` IN ('actif', 'inactif')
,AND NOT EXISTS (SELECT 1 FROM `table` WHERE `table` = `table_externe`.`id`)
DATE_ADD(`table`.`created_at`, INTERVAL 1 MONTH) // YEAR
SELECT DATE_SUB(NOW(), INTERVAL 1 YEAR)
SELECT ABS('-456')
SELECT LPAD('TTTT',10,'A')
SELECT     COUNT(*) AS total,    MAX(`id`) AS max_id,    MIN(`prix`) AS min_prix,  AVG(`salaire`) AS salaire_moyen,  SUM(`montant`) AS total_montant FROM `table`
, `table`.`champ` IN (SELECT `champ` FROM `table2` WHERE `champ` LIKE :term)
SELECT TIMEDIFF('12:30:00', '10:00:00'); -- Résultat : 02:30:00

Fenêtrage et Analytique
SELECT id, nom, salaire,RANK() OVER (ORDER BY salaire DESC) AS classement FROM employes;
  SELECT id, client_id, montant,SUM(montant) OVER (PARTITION BY client_id ORDER BY id) AS total_cumulé FROM ventes;

 Forcer l'utilisation d'un index
SELECT * FROM utilisateurs FORCE INDEX (idx_utilisateur_email) WHERE email = 'exemple@email.com';

Utilisation de JSON en SQL
SELECT JSON_EXTRACT('{ "nom": "Michel", "age": 35 }', '$.nom'); -- Retourne "Michel"

Transactions SQL (ACID) pour assurer l'intégrité des données
START TRANSACTION;
UPDATE comptes SET solde = solde - 100 WHERE id = 1;
UPDATE comptes SET solde = solde + 100 WHERE id = 2;
COMMIT;  -- Confirme la transaction
-- ROLLBACK; -- Annule la transaction en cas d'erreur

Triggers pour Automatiser des Actions
CREATE TRIGGER after_insert_client
AFTER INSERT ON clients
FOR EACH ROW
INSERT INTO logs (message) VALUES (CONCAT('Nouveau client ajouté : ', NEW.nom));

Jointure
SELECT * FROM `table_t1` LEFT JOIN `table_t2` ON `table_t2`.`id` = `table_t1`.`clef_id`;

Recherche sur des données de type 'SET' 
$attr["champ"] = ["value" => "aaaa","param" => \PDO::PARAM_STR];
WHERE FIND_IN_SET(:champ, `table`.`champ`)

Supprime les doublons :
DELETE p1 FROM `table` p1 JOIN `table` p2 ON p1.`ref` = p2.`ref` AND p1.id > p2.id;
SELECT COUNT(*),`ref`,`libelle` FROM `table` GROUP BY `ref` HAVING COUNT(*)>1

Orphelins
SELECT * FROM commandes c LEFT JOIN clients cl ON c.client_id = cl.id WHERE cl.id IS NULL;

Fonction récursive
DELIMITER $$

CREATE FUNCTION factorial(n INT) RETURNS INT
DETERMINISTIC
BEGIN
    IF n <= 1 THEN
        RETURN 1;
    ELSE
        RETURN n * factorial(n - 1);
    END IF;
END $$

DELIMITER ;

SELECT factorial(5);

 table partitionnée
CREATE TABLE logs (
    id INT NOT NULL,
    date_log DATE NOT NULL,
    message TEXT,
    PRIMARY KEY (id, date_log)
)
PARTITION BY RANGE (YEAR(date_log)) (
    PARTITION p1 VALUES LESS THAN (2023),
    PARTITION p2 VALUES LESS THAN (2024),
    PARTITION p3 VALUES LESS THAN (2025)
);


WITH RECURSIVE months AS (
    SELECT DATE_FORMAT('2024-01-01', '%Y-%m') AS mois
    UNION ALL
    SELECT DATE_FORMAT(DATE_ADD(mois, INTERVAL 1 MONTH), '%Y-%m')
    FROM months WHERE mois < DATE_FORMAT('2024-12-01', '%Y-%m')
)
SELECT * FROM months;




Séquences Numériques
WITH RECURSIVE sequence AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM sequence WHERE n < 10
)
SELECT * FROM sequence;

Comparer Deux Tables
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);

Vérifier si une Colonne Contient Uniquement des Nombres
SELECT * FROM table WHERE colonne REGEXP '[^0-9]';

Transformer une Ligne en Colonnes (Pivot Table)
SELECT 
    id_client,
    SUM(CASE WHEN type = 'achat' THEN montant ELSE 0 END) AS total_achats,
    SUM(CASE WHEN type = 'remboursement' THEN montant ELSE 0 END) AS total_remboursements
FROM transactions
GROUP BY id_client;

Optimiser les Recherches Plein Texte
ALTER TABLE articles ADD FULLTEXT(titre, contenu);
SELECT * FROM articles WHERE MATCH(titre, contenu) AGAINST('intelligence artificielle');

Identifiants Uniques
SELECT CONCAT('CMD-', LPAD(id, 6, '0')) AS ref_commande FROM commandes;

CLONAGE
CREATE TABLE nouvelle_table AS SELECT * FROM ancienne_table;  // structure et données
CREATE TABLE nouvelle_table LIKE ancienne_table; // structure seul

Analyser les Performances
EXPLAIN SELECT * FROM utilisateurs WHERE email = 'exemple@email.com';

Détecter les Valeurs Manquantes dans une Séquence
WITH RECURSIVE missing_numbers AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM missing_numbers WHERE n < (SELECT MAX(id) FROM commandes)
)
SELECT n FROM missing_numbers
WHERE n NOT IN (SELECT id FROM commandes);

WITH RECURSIVE dates AS (
    SELECT '2024-01-01' AS date_jour
    UNION ALL
    SELECT DATE_ADD(date_jour, INTERVAL 1 DAY) FROM dates WHERE date_jour < '2024-12-31'
)
SELECT * FROM dates;


Date Aléatoire dans un Intervalle
SELECT DATE_ADD('2024-01-01', INTERVAL FLOOR(RAND() * 365) DAY) AS random_date;

Supprimer les Espaces Inutiles dans un Champ Texte
SELECT TRIM(nom) FROM utilisateurs;
SELECT REPLACE(REGEXP_REPLACE('   Hello   World  ', '\\s+', ' '), ' ', ' '); 

Extraire Une Partie d’un Texte
SELECT 
    SUBSTRING(nom, 1, 3) AS debut_nom, -- 3 premières lettres
    LOCATE('@', email) AS position_arobase, -- Position du @ dans un email
    LEFT(nom, 5) AS debut, -- 5 premières lettres
    RIGHT(nom, 4) AS fin -- 4 dernières lettres
FROM utilisateurs;

Vérifier Si Une Valeur Existe Avant De L’Insérer
INSERT INTO clients (nom, email) 
SELECT 'Dupont', 'dupont@email.com' 
WHERE NOT EXISTS (SELECT 1 FROM clients WHERE email = 'dupont@email.com');

Remplacer Un Mot
SELECT REPLACE(texte, 'ancien_mot', 'nouveau_mot') FROM articles;

Mesurer Le Temps D’Exécution D’Une Requête
SET @debut = NOW();
SELECT * FROM utilisateurs;
SELECT TIMESTAMPDIFF(SECOND, @debut, NOW()) AS duree_execution;

Lister Les Tables D’une Base de Données
SHOW TABLES FROM `{$db_name}` LIKE '_prefix_%'
SHOW DATABASES WHERE `Database` NOT IN ('mysql', 'performance_schema', 'sys') AND `Database` LIKE 'table_%'
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'table_toto'
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'gestion_ventes';
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'gestion_ventes' AND TABLE_NAME = 'clients';
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'email';
SELECT TABLE_NAME, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS taille_MB FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'gestion_ventes' ORDER BY taille_MB DESC;
SELECT INDEX_NAME, COLUMN_NAME, NON_UNIQUE FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'gestion_ventes' AND TABLE_NAME = 'clients';
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_SCHEMA = 'gestion_ventes' AND REFERENCED_TABLE_NAME IS NOT NULL;

Empêcher Une Insertion Duplicata avec INSERT IGNORE
INSERT IGNORE INTO utilisateurs (email) VALUES ('exemple@email.com');

Afficher Un Résumé de la Base de Données
SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'nom_de_la_base';

Calculer La Médiane
SELECT AVG(valeur) AS mediane FROM (
    SELECT valeur FROM transactions ORDER BY valeur LIMIT 1 OFFSET (SELECT COUNT(*)/2 FROM transactions)
) AS temp;

Calculer La Médiane
SELECT COUNT(DISTINCT email) FROM utilisateurs;

Email Valide
SELECT * FROM utilisateurs WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z]{2,}$';
SELECT * FROM utilisateurs WHERE telephone REGEXP '^[0-9]+$';

Trouver La Date Du Premier Et Du Dernier Jour D’Un Mois
SELECT 
    LAST_DAY(NOW()) AS dernier_jour,
    DATE_FORMAT(NOW(), '%Y-%m-01') AS premier_jour;

Extraire L’Extension D’Un Fichier
SELECT SUBSTRING_INDEX('document.pdf', '.', -1) AS extension;