Documentation de référence sql de la base de données Shucan 0.2.3

Résumé

La plus petite unité d'opération prise en charge par la base de données de mémoire Shucan est une table, c'est-à-dire qu'il n'y a pas de concept de bibliothèque;La base de données de mémoire Shucan est basée sur le stockage en colonnes et prend en charge les types de structure de données de base C++,Inclure entier (y compris u08, i08, u16, i16, u32, i32, u64, i64)、virgule flottante (y compris float、double)、type de chaîne de caractères(string)、type de date(date)、type d'heure(time)、 type de date et d'heure(datetime)。

Un index arborescent équilibré est implicite pour les champs arbitraires de la base de données de mémoire Shucan,pour plus de détails, voir instruction create,Les instructions save et load de l'instruction SQL prennent en charge l'enregistrement et le chargement des tables.
Description : le langage de requête de base de données de mémoire Shucan (ci-après abrégé en sql) est similaire au langage de requête standard (ci-après abrégé en SQL), la structure de syntaxe de base est compatible et le processus de traitement global n'est pas compatible avec SQL.

Notez que les opérations sql suivantes diffèrent du SQL standard :

  • Shucan sql utilise == pour indiquer l'égalité
  • Shucan sql where instruction ne prend en charge que le jugement de plage et d'intervalle, voir description de la condition where
  • Les paramètres internes du compte sql de Shucan ne prennent pas en charge *, la partie expression ne prend en charge qu'un seul *
  • Fonctionnalités prises en charge par la base de données de mémoire Shucan:

  • Prend en charge la sous-requête sql, la requête multi-tables
  • Prend en charge le plus haut niveau de transactions
  • Prend en charge la correspondance approximative des caractères et la correspondance des expressions régulières
  • Prend en charge l'encodage complet des caractères utf8 (et unique)
  • Bonne forme d'opération d'interface de langage C/C++/JAVA/Python
  • Prend en charge la persistance externe, l'échange csv, la sauvegarde à distance
  • Prise en charge du système Windows, Linux
  • Prend en charge plusieurs modes locaux et réseau
  • Client GUI riche en fonctionnalités
  • Composition du système

    La base de données de mémoire de Shucan contient deux programmes exécutables de mode et le développement SDK et les exemples.

    Le mode local exécute directement le sct_local_mem.exe correspondant; après être entré dans l'environnement d'exécution, entrez la commande "help" pour afficher les informations d'aide ou entrez directement l'instruction sql à exécuter. Pour la spécification sql correspondante, voir guide rapide sql partie.

    Le serveur en mode réseau est sct_s_mem.exe, le serveur utilise sct_mdb.toml comme fichier de configuration, le contenu de la configuration actuelle n'est que le port de liaison et les informations du groupe d'utilisateurs, pour la spécification du fichier toml veuillez vous référer à Spécifications associées (notez que le fichier de configuration utilisé par Shucan ne prend pas en charge les tableaux toml).

    Lorsque le serveur est démarré pour sct_s_mem.exe, il exécute par défaut le fichier "init.sql" dans le répertoire de travail, ce qui est très utile pour le chargement initial des données de la base de données en mémoire.

    Le client en mode réseau est sct_c_mem.exe, le client doit spécifier le nom d'utilisateur, le mot de passe et le port IP facultatif lors de l'exécution. Ce qui suit est un exemple de fonctionnement valide.
    sct_c_mem.exe user user_pwd
    sct_c_mem.exe user user_pwd 192.168.1.11 55555

    La politique d'authentification en mode réseau par défaut est que le nom d'utilisateur et le mot de passe doivent être spécifiés pour la première connexion, le système s’arrête pendant 1 minute pour 3 erreurs, 30 minutes pour 2 erreurs supplémentaires, 15 jours pour 1 erreur supplémentaire et une interdiction permanente jusqu'au redémarrage du service.

    Les fichiers système correspondants peuvent ne pas inclure ce document d'aide,Le document de référence d'aide complet est la référence la plus récente pour le contenu de cette page de site Web.

    sqlprocessus de requête

    Le stockage réel en mémoire est un stockage en colonnes

    méthode de stockage

    Le flux de traitement des données de la base de données Shucan est le suivant :

    Le contenu de l'instruction where doit être une condition de récupération à l'aide d'un index (différent d'une instruction SQL standard) et appliquer des conditions pour filtrer les lignes de données.

    Les informations de ligne extraient le contenu de la colonne et effectuent un calcul d'expression pour générer un ensemble de données.

    L'ensemble de données peut être étendu horizontalement et verticalement (jointure/union) à un ensemble de données unique plus grand.

    Triez, filtrez, groupez-agrégez, projetez, renommez et recalculez plusieurs opérations post-opération sur un seul ensemble.

    trier

    Le filtrage comporte les cinq opérations suivantes :

    Filtrage en ligne

    Filtrage interligne, complexitén*n

    filtrage des lignes voisines

    filtrage de plage de lignes

    existe/filtrage des sous-requêtes

    Agrégation de groupe

    projection

    Renommer

    Recalculer

    sqlspécification de base

    Cet article est utilisé comme un guide rapide pour écrire des instructions SQL simples et efficaces pour la base de données Shucan.
    L'instruction sql se compose de DDL et DML, où DML se compose de selectinsertdeleteupdaterows_ofcols_offields_ofshow tablesetc. ; DDL consiste à createalterdropsaveloadexec etc.
    Chaque expression ou contenu de commentaire non constant de chaque instruction sql peut être suivi d'un nombre quelconque de caractères blancs ou de commentaires, le caractère blanc est compris entre 0x09 et 0x0c (notez que le caractère blanc ne contient pas 0x0d, ce qui signifie que la fin de la ligne d’exécution de l’instruction SQL est au format unix par défaut) ou le caractère ASCII 0x20.
    Toutes les instructions SQL sont strictement sensibles à la casse et le codage des caractères est le codage unique UTF-8.
    Le terminateur de chaque instruction sql est ";", et le terminateur peut être omis lorsqu'il n'affecte pas l'analyse de l'instruction.

    commentaire sur une seule ligne

    //ceci est une remarque

    commentaire sur plusieurs lignes

    /*ceci est une remarque
    */
    

    Nombre entier

    0                      //entier signé ou non signé
    1                      //omettre le signe entier
    100                    //omettre le signe entier
    +1                     //entier signé
    -100                   //entier signé
    -1000                  //entier signé
    +0b000                 //entier binaire signé
    -0xa0b3                //entier hexadécimal signé
    0xA0cD                 //entier hexadécimal à casse mixte non signé
    -847u2                 //Entier signé de deux octets de long
    56u1                   //Entier non signé d’un octet de long
    0x0au1                 //entier hexadécimal non signé d'un octet de long

    nombre à virgule flottante

    +0.                    //Nombre à virgule flottante positif sans partie fractionnaire
    -0.01                  //Nombre à virgule flottante négatif uniquement dans la partie fractionnaire
    -100.0                 //Nombre à virgule flottante négatif uniquement dans la partie entière
    -100e20                //Seuls les nombres entiers et les parties exposantes positives sont des nombres à virgule flottante négatifs
    1.25E-32               //Parties fractionnaire et exposant négatif des nombres à virgule flottante positifs 
    1.25E+20               //Parties fractionnaire et exposant positif des nombres à virgule flottante positifs
    
    1.00E20f               //Nombre à virgule flottante strictement de quatre octets
    1.00E20d               //Nombres à virgule flottante strictement de huit octets

    chaîne de caractères

    "a et chinois bc"                            //Contient des chaînes de caractères valides en chinois et en anglais (encodage UTF-8)
    "ab et chinois c\"\'\\\a\b\f\n\r\t\v"        //une chaîne de caractères valide contenant des échappements de contrôle
    "ab et chinois c\x0a\x0001\uaabb\Uaabbccdd"  //Une chaîne de caractères valide contenant des échappements hexadécimaux et des échappements Unicode
    @"aabbcc(018d7##@!@^_""AA6)aabbcc"    //chaîne de caractères brute divisée par aabbcc

    Type de date

    2020-02-03                              //3 février 2020
    0020-01-31                              //31 janvier 2020

    type d'heure

    18:59:31                                 //18 heures 59 minutes 31 secondes
    00:00:01.100                             //0 heure 0 minute 1,1 seconde

    type de date et d'heure

    2020-02-03 18:59:31.123                  //3 février 2020 18 heures 59 minutes 31.123 secondes

    expression

    L'expression
     utilise l'infrastructure d'expression du langage C et préserve la priorité du symbole de l'opération correspondante
    
    id                           //Les expressions de domaine représentent les valeurs de champ correspondantes
    (id)                         //Les expressions entre parenthèses indiquent que le contenu des parenthèses est évalué en premier
    id+10                        //L'expression additive représente la somme du champ domaine et de la valeur constante de 10
    id+max(grade)                //L’expression additive représente la somme de la valeur maximale du champ de domaine et du domaine grade
    id*sin(id)                   //L'expression positive représente le produit du champ id et de la valeur sin du champ id
    id << 10                     //L'expression de décalage représente la valeur du domaine id décalé vers la gauche de 10 bits
    id&&sin(id)>0                //La logique et l’expression représentent la logique et le résultat de id et sin(id)>0
    id/sin(id)                   //L'expression du produit représente le quotient de id et de sin(id)
    id&min(id)                   //L'expression bit ET représente le résultat bit ET de id et min(id)
    id!=0||id==10                //L'expression OU logique représente le résultat OU logique de id non égal à 0 et id égal à 10
    
    La conversion du type d'expression et le traitement des fonctions suivent les principes suivants
    Si le type de données est implicitement convertible en type cible selon le langage C++, il est implicitement converti en type cible selon C++.
    Le traitement de la fonction est le suivant : si le paramètre de la fonction est un champ, la fonction agit sur la valeur de chaque ligne du champ. Si le paramètre de la fonction est une valeur constante, la valeur constante est utilisée comme paramètre de la fonction.Si deux paramètres
    Si le nombre de lignes des deux paramètres n'est pas égal, le numéro de ligne le plus long est utilisé comme résultat de sortie et le paramètre court qui est insuffisant est rempli avec le dernier chiffre de la même longueur. 

    Peut être utilisé pour les fonctions dans les expressions

    Les fonctions sont suivies d'explications de fonctionnement et d'exemples d'utilisation
    fonction de conversion de type
    x2i08                 //Convertir n'importe quel type de données en un entier signé d'un octet         x2i08(type), x2i08(2.0)
    x2i16                 //Convertir n'importe quel type de données en un entier signé de deux octets         x2i16(type), x2i16(2.0)
    x2i32                 //Convertir n'importe quel type de données en un entier signé de quatre octets         x2i32(type), x2i32(2.0)
    x2i64                 //Convertir n'importe quel type de données en un entier signé de huit octets          x2i64(type), x2i64(2.0)
    x2u08                 //Convertir n'importe quel type de données en un entier non signé d'un octet          x2u08(type), x2u08(2.0)
    x2u16                 //Convertir n'importe quel type de données en un entier non signé de deux octets          x2u16(type), x2u16(2.0)
    x2u32                 //Convertir n'importe quel type de données en un entier non signé de quatre octets          x2u32(type), x2u32(2.0)
    x2u64                 //Convertir n'importe quel type de données en un entier non signé de huit octets         x2u64(type), x2u64(2.0)
    x2flt                 //Convertir n'importe quel type de données en un nombre à virgule flottante de quatre octets             x2flt(id), x2flt(10)
    x2dbl                 //Convertir n'importe quel type de données en un nombre à virgule flottante de huit octets             x2dbl(id), x2dbl(10)
    x2str                 //Convertir n'importe quel type de données en chaîne de caractères                x2str(id), x2str(10)
    x2date                //Convertir n'importe quel type de données en date                    x2date(b_date),x2date("2012-03-05")
    x2time                //Convertir n'importe quel type de données en temps                    x2time(b_time),x2time("18:35:24")
    x2datetime            //Convertir n'importe quel type de données en date/heure               x2datetime(b_dt),x2datetime("2012-03-05 18:35:24")
    
    Fonction d'agrégation
    sum                   //trouver la somme d'une colonne                  sum(id)
    product               //trouver le produit d'une colonne                product(id)
    min                   //trouver la valeur minimale d'une colonne        min(id)
    max                   //trouver la valeur maximale d'une colonne        max(id)
    avg                   //trouver la valeur moyenne d'une colonne         avg(id)
    count                 //trouver le nombre total d'une colonne           count(id)
    sort                  //trier une colonne                               sort(id)
    unique                //dédupliquer une colonne                         unique(sort(id))
    count_unique          //Obtenir le numéro après déduplication           count_unique(sort(id))
    
    fonction de plage
    first                 //obtenir le premier élément d'une colonne                   first(id)
    last                  //obtenir le dernier élément d'une colonne                   last(id)
    first_k               //Prendre les k premiers éléments d'une colonne              first_k(id,10)
    last_k                //Prendre les k derniers éléments d'une colonne              last_k(id,20)
    range                 //Obtenir une plage d'éléments dans une colonne              range(id,1,5)
    nth                   //Prendre le nième élément d'une colonne                     nth(id,10)
    
    Fonctions de chaîne de caractères
    lcase                 //convertir une chaîne de caractères en minuscule                      lcase("Abd")
    ucase                 //convertir une chaîne de caractères en majuscule                       ucase("abc")
    concat                //concaténer deux chaînes de caractères                         concat("abc","012")
    length                //trouver la longueur de la chaîne caractères                         length("NAME")
    substr                //Prendre une chaîne de caractères commençant à l'index jusqu’à un nombre fixe de sous-chaînes caractères     substr(name, 1, 4)
    all_case              //Obtenir toutes les chaînes de caractères combinées en majuscules et minuscules                 all_case("Insert")
    starts                //Déterminer si une chaîne de caractères commence par une chaîne                starts(name, "Jim")
    contain               //Déterminer si la chaîne de caractères contient la cible                   contain(desc, "error")
    ends                  //Déterminer si la chaîne de caractères se termine par une chaîne                ends(word, "es")
    replace               //Remplacer une sous-chaîne d'une chaîne de caractères par une nouvelle chaîne                 replace(name, 2, 4, "abc")
    trim_l                //Supprimer les espaces consécutifs à gauche d'une chaîne de caractères                   trim_l(name)
    trim_r                //Supprimer les espaces consécutifs à droite d'une chaîne de caractères                   trim_r(name)
    trim                  //Supprimer les espaces consécutifs des deux côtés d'une chaîne de caractères                  trim(name)
    reg_match             //Correspondance d'expressions régulières (à l'aide de la norme ECMA-262 (2011)) reg_match(id,"[2-9]+.*")
    fuzzy_match           //Recherche floue pour les différences de caractères correspondantes fuzzy_match(id,"what"),fuzzy_match(type,"system", 5)
    
    Fonctions mathématiques
    abs                   //Trouver la valeur absolue d'un nombre                                              abs(value)
    ceil                  //Trouver le plus petit entier qui n'est pas inférieur à la valeur donnée            ceil(value)
    floor                 //Trouver le plus grand entier qui n'est pas supérieure à la valeur donnée           floor(value)
    round                 //Trouver la valeur arrondie d'un nombre                                             round(3.4)
    exp                   //Élever une valeur à la puissance e                                                 exp(value)
    pow                   //Trouver la puissance d'un nombre                                                   pow(id,2.0)
    pi                    //Valeur constante Π                                                                 pi()
    sqrt                  //Trouver la racine carrée d'une valeur                        sqrt(value)
    log                   //trouver le logarithme naturel d'une valeur                       log(value)
    log2                  //Trouver le logarithme en base 2 d'une valeur                      log2(value)
    log10                 //Trouver le logarithme en base 10 d'une valeur                     log10(value)
    log1p                 //Trouver le logarithme naturel d'une valeur + 1                     log1p(value)
    sin                   //trouver le sinus d'un nombre                         sin(value)
    cos                   //trouver le cosinus d'un nombre                         cos(value)
    tan                   //trouver la tangente d'un nombre                         tan(value)
    asin                  //Trouver l'arc sinus d'un nombre                       asin(value)
    acos                  //Trouver l'arc cosinus d'un nombre                       acos(value)
    atan                  //Trouver l'arc tangente d'un nombre                       atan(value)
    e                     //Constante mathématique e                             e()
    
    fonction interne
    raw2hex               //affichage hexadécimal de la mémoire                       raw2hex(id)
    hex2raw               //Représentation des données hexadécimales en mémoire                 hex2raw("00aabb")
    row_id                //numéro de ligne de sortie                             row_id()
    id                    //ID interne de sortie                           id()
    now_id                //Obtenir le plus grand ID interne inutilisé                  now_id()
    hash_passwd           //Générer un mot de passe hash pour une chaîne de caractères (pour les fichiers de configuration)      hash_passwd("mypass")
    
    Fonctions statistiques
    var                   //écart de sortie                             var(id)
    stddev                //écart-type                               stddev(id)
    
    fonction de séquence
    seq                   //séquence de sortie 0 à n                       seq(10), seq(count(id)), seq(3)*3
    rand                  //Sortie n nombres aléatoires de 0 à 1,0                 rand(10)
    constants             //sortie n constantes                         constants(1,10), constants("sss",10)
    
    fonction date
    last_day              //Renvoie le dernier jour d'une date ou d'un mois                         last_day(date())
    is_leap               //Renvoie s'il s'agit d'une année bissextile                is_leap(date())
    now                   //Renvoie la date et l'heure actuelles                                        now()
    date                  //Renvoie la date actuelle                                   date()
    time                  //Renvoie l'heure actuelle                                  time()
    add_day               //Renvoie une heure ou une date/heure après n jours               add_day(now(),100)
    add_nanosec           //Renvoie une heure ou une date/heure après n nanosecondes        add_nanosec(time(),10000000)
    sub_day               //Renvoie une heure ou une date/heure il y a n jours          sub_day(now(),100)
    sub_nanosec           //Renvoie une heure ou une date/heure il y a n nanosecondes        sub_nanosec(time(),10000000)
    day_diff              //Renvoie la différence entre une date ou une date/heure en jours         day_diff(x2date("2012-01-01"),date())
    nanosec_diff          //Renvoie la différence en nanosecondes d'heure ou de date/heure        nanosec_diff(x2datetime("2012-01-01 18:24:25"),now())
    year_of               //Renvoie la partie année d'une date ou d'une date/heure          year_of(date())
    month_of              //Renvoie la partie mois d'une date ou d'une date/heure          month_of(date())
    day_of                //Renvoie la partie jour d'une date ou d'une date/heure          day_of(date())
    hour_of               //Renvoie la partie heure d'une heure ou d'une date/heure          hour_of(time())
    minute_of             //Renvoie la partie minutes d'une heure ou d'une date/heure         minute_of(time())
    second_of             //Renvoie la partie secondes d'une heure ou d'une date/heure         second_of(time())
    nanosec_of            //Renvoie la partie nanoseconde d'une heure ou d'une date/heure         nanosec_of(time())
    date_of               //Renvoie la partie date d'une date/heure              date_of(now())
    time_of               //Renvoie la partie heure d'une date/heure              time_of(now())
    weekday               //Renvoie le jour de la semaine d'une date ou d'une date/heure (0 pour lundi)     weekday(now())
    weekday_name          //Renvoie le nom de la semaine d'une date ou d'une date/heure         weekday_name(now())
    weekday_cname         //Renvoie le nom chinois de la semaine pour une date ou une date/heure       weekday_cname(now())

    la condition where permet l'utilisation d'opérations relationnelles, les opérations de plage、les opérations in et les opérations logiques

    id>=10                           //Opération logique supérieure ou égale
    id>=all (select id from t2)      //Opération logique supérieure ou égale à tous les résultats de la sous-requête
    id==any (select id from t2)      //Opération logique égale à tout résultat d'une sous-requête
    id==any (1,3,5,7)                //opération logique égale à tout résultat d'un ensemble
    id==10                           //est égal à l'opération logique
    id!=10                           //différent de l'opération logique
    id>=10&&id<=20                   //ET logique entre opérations relationnelles
    id>=10||(id < 5&& id > 1)        //OU logique entre opérations relationnelles
    10 <= id <= 20                   //Inférieur ou égal à, inférieur ou égal à opérations relationnelles
    10 < id <= 20                    //Les opérations inférieure à, inférieure ou égale à des opérations relationnelles
    
    
    first                            //La première opération de plage
    last                             //La dernière opération de plage
    first 100                        //Les 100 premières opérations de plage
    last 100                         //Les 100 dernières opérations de plage
    range 10 100                     //Le 10ème au 100ème des opérations de plage
    nth 10                           //Le 10e chiffre de l'opération de plage
    id max                           //Le plus grand de l'opération de plage de valeurs
    id min                           //Le plus petit de l'opération de plage de valeurs
    id max 100                       //Le plus grand des 100 premières opérations de plage de valeurs
    id min 100                       //La plus petite des 100 premières opérations de plage de valeurs
    id in (1,2,3,4,7)                //L'opération in prend l'id dont l'id est 1,2,3,4,7
    id in (select id from t2);       //Obtenir le résultat dont l'id appartient à la sous-expression
    id not in (select id from t2);   //Obtenir le résultat dont l'id n'appartient pas à la sous-expression
    
    
    Notez que les éléments suivants sont les conditions "where" invalides
    10 < id                          //L'identifiant du nom de champ doit être placé devant

    l'instruction select

    
    select * from table1;
    //Sélectionner tous les champs de table1
    
    select id from tab2;
    //Sélectionnez le champ id de tab2
    
    select id /sin(id) from tab2 where id < 10;
    //Sélectionnez les données d'identification avec un identifiant inférieur à 10 dans tab2 et recherchez la valeur de l'identifiant divisée par sin (id)
    
    select max(id) from tab2 where id < 10&&id > 3;
    //Sélectionnez le plus grand identifiant supérieur à 3 et inférieur à 10 dans tab2
    
    select id << 10 from tab2 where id!=3
    //Sélectionnez l'id dont l'id n'est pas égal à 3 dans tab2 et déplacez-le de 10 chiffres vers la gauche
    
    select sin(id),name into t2 from t1 where id < 10;
    //Sélectionnez id inférieur à 10 à partir de t1 et insérez t2 avec sin(id),name comme colonne
    
    select * from t1 where id in (select id2 from t2 where id2 > 10);
    //Sélectionnez à partir de t1 lorsque l'id est dans t2, lorsque l'id2 est supérieur à 10 dans l'id2, tout t1
    
    select * from t1 where id < 10 order by id, name asc;
    //Sélectionnez à partir de t1 lorsque tous les identifiants sont inférieurs à 10 et triez le dictionnaire par ordre croissant par identifiant et nom
    
    select * from t1 where id < 10 group sum(id) by name;
    //Sélectionnez à partir de t1 lorsque tous les identifiants sont inférieurs à 10 et utilisez "nom" pour regrouper sum(id)
    
    select * from t1 where id < 10 all_each on distinct;
    //Sélectionnez à partir de t1 et filtrez toutes les lignes avec un identifiant inférieur à 10 pour supprimer les doublons
    
    select * from t1 where id < 10 all_each on id==_id && name==_name;
    //A partir de t1, sélectionnez toutes les données dont l'id est inférieur à 10 et filtrez toutes les lignes avec le même id et le même name, _ représente chacun des ensembles précédents
    
    select * from t1 where id < 10 adj on id>_id && name==_name;
    //A partir de t1, sélectionner toutes les données dont l'id est inférieur à 10 et filtrer la ligne dont l'id est supérieur à l'id précédent et de même name, _signifie la ligne précédente
    
    select * from t1 where id < 10 inner on id==name;
    //A partir de t1, sélectionnez toutes les données dont l'id est inférieur à 10 et filtrez les données avec le même id et le meme name dans la ligne
    
    select * from t1 where id < 10 first;
    //Sélectionnez à partir de t1 lorsque l'identifiant est inférieur à 10 et filtrez pour conserver la première ligne
    
    select * from t1 where id < 10 first 30;
    //Sélectionnez à partir de t1 lorsque tous les identifiants sont inférieurs à 10, filtrez et conservez les 30 premières lignes
    
    select * from t1 where id < 10 range 30 40;
    //Sélectionnez à partir de t1 lorsque l'identifiant est inférieur à 10 et filtrez pour conserver les données dans la plage de 30 à 40 lignes
    
    select id1,name from t1 where id < 10 exists (select id from t2 where id==id1);
    //Sélectionnez à partir de t1 l'id1 et le name qui existent dans t2 lorsque l'id est inférieur à 10
    
    select id as nid,name from t1 where id < 10 not exists (select id from t2 where id==nid);
    //Sélectionnez à partir de t1 lorsque id est inférieur à 10 et qu'il n'y a pas de nid et de name avec id égal à nid dans t2
    
    select * from t1 where id < 10 recompute id=id+10;
    //Sélectionnez parmi t1 tous ceux dont l'id est inférieur à 10 et recalculez l'id égal à id plus 10
    
    select * from t1 where id < 10 recompute id+=10,name=x2str(id);
    //Après avoir sélectionné tous les identifiants inférieurs à 10 à partir de t1, recalculez l'identifiant de colonne égal à id plus 10, name égal à l'identifiant converti en chaîne de caractères
    
    select * from t1 where id < 10 project except id;
    //Après avoir sélectionné tous les id inférieurs à 10 à partir de t1, la projection conserve les données de colonne sauf id
    
    select * from t1 where id < 10 project id;
    //Après avoir sélectionné tous les identifiants inférieurs à 10 de t1, la projection conserve l'identifiant de la colonne
    
    select * from t1 where id < 10 rename id newid;
    //Sélectionnez tous ceux dont l'id est inférieur à 10 depuis t1 et renommez l'id en newid
    
    select * from t1 where id < 10 project id range 30 40 group sum(id) by id order by id rand rename id newid;
    //Sélectionnez tous les identifiants de post-projection lorsque l'identifiant est inférieur à 10 à partir de t1, filtrez les données dans la plage de 30 à 40, regroupez la sum(id) par identifiant, triez au hasard par identifiant et renommez l'identifiant en newid
    
    select * from t1 where id1 < 10 join (select * from t2 where id2 < 10 on id1==id2);
    //Tout sélectionner à partir de t1 lorsque id1 est inférieur à 10, puis développer horizontalement, Sélectionner à partir de t2 lorsque id2 est inférieur à 10 lorsque id1 est égal à id2
    
    select sin(seq(count(id))+1), id, name from t1 where id < 10 union (select * from t2 where id < 10);
    //Sélectionnez à partir de t1 lorsque l'id est inférieur à 10 sin(seq(count(id))+1), id, name puis développer verticalement, Sélectionnez tous les id inférieurs à 10 à partir de t2
    
    select sin(id) as sinid,id from t1 where id < 10 inner on sinid < id;
    //Sélectionnez sin(id) avec id inférieur à 10 à partir de t1 comme filtre sinid et id pour conserver les données avec sinid inférieur à id dans la ligne
    
    select * from t1 export as csv split by "," path = "t1.csv";
    //Sélectionnez tous les champs de t1 et exportez vers un fichier t1.csv séparé par des virgules
    
    select * from t1 export as csv split by "," path += "t1.csv";
    //Exportez ou remplacez tous les champs du t1 sélectionné dans un fichier t1.csv séparé par des virgules

    l'instruction insert

    insert into tab1 (name,id) values("Zhang San",100);                      //insertion simple
    insert into tab2 (val,type)values(1.00,1)(2.00,2)(3.00,3);          //plusieurs insertions
    insert into t2 (id,name) select id,name from t1;                    //Insérer le résultat de la sous-requête
    insert into t2 (id,name) select seq(10)+1,"name"+x2str(seq(10)+1);  //Insérer des données personnalisées
    
    Notez que la base de données en mémoire Shucan ne prend pas en charge les champs "null", donc "insert" doit spécifier une valeur pour chaque champ

    l'instruction delete

    delete from tab1 where id < 10;                       //Supprimer toutes les données avec un identifiant inférieur à 10 de tab1

    l'instruction update

    update tab1 set name="Zhang San",id=10 where id==5;
    //Mettre à jour le champ "name" avec un id égal à 5 ​​dans tab1 vers "Zhang San" avec un id de 10
    
    update tab1 set value=10 where __id==5;
    //Mettre à jour "value" de l'identifiant interne du système égal à 5 ​​dans tab1 à 10(Notez que __id est un mot-clé réservé pour le système, qui est le résultat généré par la fonction id(), et n'est utilisé que pour les conditions de requête double égal)

    l'instruction create

    create table tab1 (id u08 (false, false));
    //Créez la table tab1, le champ initial est le type d'identifiant, qui est un entier non signé d'un octet, et aucune répétition n'est autorisée.
    
    create table tab1 (val float(),name string(true));
    //Créez une table tab1, le champ initial val est un type à virgule flottante, aucune répétition n'est autorisée et l'auto-incrémentation n'est pas autorisée, et le nom du champ est un type de chaîne de caractère et peut être répété
    
    Notez que le deuxième paramètre du champ actuel est un paramètre réservé et qu'il n'a aucun effet en utilisation réelle

    l'instruction alter

    alter table tab1 add id u08 (false, false);          //Ajouter un champ d'identification à tab1
    alter table tab1 modify id u08 (false, false);       //Modifiez le type de champ id dans tab1, la modification effacera les données du champ précédent, veuillez sauvegarder
    alter table tab1 rename id newid;                    //Renommez le champ id en newid dans tab1
    alter table tab1 drop id;                            //Supprimer le champ id dans tab1

    l'instruction drop

    drop table tab1                        //supprimer le tableau tab1

    l'instruction truncate

    truncate table t1;                     //Videz rapidement t1 et préservez la structure des données

    l'instruction save

    save tab1 as bin path+="tab1.bin"              //Enregistrez la table tab1 en tant que fichier de données binaires, le nom du fichier enregistré est tab1.bin, s'il existe un fichier, il sera remplacé
    
    save tab1 as sql path="tab1.sql"               //Enregistrez la table tab1 en tant que fichier de données sql et le nom du fichier enregistré est tab1.sql
                        

    l'instruction load

    Remarque : La table ne peut pas exister lors de l'utilisation de load
    
    load tab1 from bin path="tab1.bin"
    //Charger le fichier de données binaires de la table tab1, charger la table tab1 du fichier dans la base de données
    
    load tab1 from sql path="tab1.sql"
    //Chargez le fichier de données sql de la table tab1 et chargez les informations de la table à partir du fichier dans la base de données (notez que le nom de la table tab1 est ignoré et que le nom de la table importée est déterminé par le contenu du fichier sql) 

    l'instruction import

    Remarque : la table doit exister lors de l'utilisation de "import"
    
    import t1 from csv split by "\t" path="t1.csv"    //Importer t1.csv dans t1 avec \t comme délimiteur
    import t1 from csvs path="t1.csvs"                //Importez t1.csvs dans t1 (le fichier csvs représente les chaînes de caractères converties en caractères hexadécimaux ASCII)

    Nom du champ

    abc
    abc0123
    ABC_abc
    [Valide ou non valide @chaîne de caractères(Voir chaîne de caractères)]

    Nom de la table

    abc
    abc0123
    ABC_abc
    [Valide ou non valide @chaîne de caractères(Voir chaîne de caractères)]

    rows_of

    rows_of tab1            //Obtenir le nombre de lignes de tab1

    cols_of

    cols_of tab1            //Obtenir le nombre de colonnes dans tab1

    fields_of

    fields_of tab1          //Obtenir le nom du champ de tab1

    show tables

    show tables             //Obtenir tous les noms de table dans la base de données

    exec

    exec "data.sql"
    //Exécute toutes les instructions du fichier sql

    atom_exec

    atom_exec insert into t1 (id,name) select 1,"sss";delete from t1; commit
    //Exécution transactionnelle de plusieurs instructions séparées par ";" et se terminant par commit (le niveau d'isolement est le niveau le plus élevé, généralement parlant, tous réussissent ou échouent tous, et plusieurs instructions
    ne prennent en charge que insert, update, delete) 

    backup

    backup as bin path="b1.sbk"       //Sauvegardez la base de données entière en tant que données binaires et enregistrez-la dans le fichier b1.sbk
    backup as sql path+="b1.sbk"      //Sauvegardez l'intégralité de la base de données en tant que données sql et remplacez le fichier b1.sbk

    restore

    restore from sql path="b1.sbk"    //Restaurer la base de données entière à partir du fichier de sauvegarde sql b1.sbk
    restore from bin path="b1.sbk"    //Restaurez l'intégralité de la base de données à partir du fichier de sauvegarde binaire b1.sbk

    Propositions d'optimisation

    La base de données en mémoire Shucan utilise BST comme index, Le résultat de la requête est construit par arbre BST pour les données de récupération de chaque colonne, ce qui est très approprié pour une requête à intervalle de petite plage;Le contenu de l’instruction where est le premier niveau de filtrage des critères de recherche et la partie la plus importante qui détermine le nombre de lignes de sortie. Les critères de requête doivent avoir la priorité de garantir que la section where est suffisamment filtrée.

    lors de la requête de la condition where,Utiliser «a» en priorité <=id <=b au lieu de id >= a&&id La condition de requête sous la forme <=b, la première sera complétée directement à l'aide de l'algorithme d'intervalle interne, et la seconde interrogera les deux parties de l'intervalle séparément pour l'opération d'intersection ensembliste.

    La condition where est préférable d'utiliser &&, et essayez d'éviter l'utilisation d'opérations logiques ||.

    La condition where n'utilise pas autant que possible l'expression !=.

    Préférez utiliser rows_of pour obtenir le nombre de lignes dans la table au lieu du champ count.

    Pour les tableaux de données volumineux avec peu de données valides, utilisez le filtre de requête dans pour le filtrage initial.

    pour les grands ensembles de données, les données multi-valides peuvent être filtrées en utilisant exists selon les conditions.

    l’analyse SQL cache l’arborescence syntaxique qui suit l’analyse. Il est recommandé de fusionner autant que possible l’instruction insert pour éviter les analyses multiples.

    privilégiez le filtrage des ensembles de données avec l’instruction where et réduisez,l'utilisation du post-traitement de l'ensemble de données.

    les expressions de l’instruction sql sont évaluées plus lentement que dans le langage C, essayez d’éviter d’utiliser un grand nombre de traitement d’expressions; Un grand nombre de traitements d’expressions peut être retraité en langage C après l’obtention de l’expression analysée.

    utilisez l’instruction load en priorité pour l’importation de gros volumes de données, l’instruction import en second lieu et enfin l’instruction exec ou l'instruction insert séparée.

    Instructions de développement

    La base de données en mémoire Shucan est écrite en C++, et le côté réseau fournit une interface de langage C/C++/Java (y compris JDBC)/Python, et la bibliothèque de développement se trouve dans le répertoire sdk.Le répertoire correspondant contient également un exemple simple de code d’utilisation.

    La bibliothèque de liens dynamiques Windows de vs2019 est fournie dans le package d'installation, qui se trouve dans le répertoire sdk/dll ; il y a aussi la bibliothèque dynamique G++ 8.2.0 pour le système Linux dans le répertoire so. Les fichiers d'en-tête se trouvent dans le répertoire sdk/inc.

    Les fonctions de base incluent la connexion, la sortie du serveur, l'exécution d'instructions sql et l'obtention d'informations sur les lignes et les colonnes de l'ensemble de données et les informations sur les valeurs. Voici un exemple complet d'interface en langage C (situé dans sdk/sql_lib_sample.c) :

    #include <stdlib.h>
    #include <stdio.h>
    #include "sql_lib.h"
    int main(int argc, char** argv) {
      if(!connect_to_server("192.168.5.10", 55555, "user", "user")){ return -1; }
      const char* s = "create table tab1 (id u32(true), name string());";
      void* d = exec(s, strlen(s));
      if (d == NULL) { printf("execute sql failed\n"); return 0; }
      del_datas(d);
      s = "insert into tab1 (id,name) select seq(1000000), x2str(seq(1000000)+10);";
      d = exec(s, strlen(s));
      if (d == NULL) { printf("execute sql failed\n"); return 0; }
      del_datas(d);
      s = "select id,name from tab1;";
      d = exec(s, strlen(s));
      //d = exec("select id,name from tab1 where id < 10;");
      if( d == NULL ){ printf("execute sql failed\n"); return 0; }
      print(d);
      //print_bymyself(d);
      del_datas(d);
      s = "drop table tab1;";
      d = exec(s, strlen(s));
      exit_to_server();
      return 0;
    }

    Problèmes commun

    Connexion réseau échouée
        1,Le côté local de Shucan ne prend pas en charge les fonctions réseau, assurez-vous donc que le côté serveur est ouvert lorsque vous utilisez la connexion client ; dans le fichier de configuration par défaut sct_mdb.toml, port dans la section server spécifie le port de liaison local. Assurez-vous que le port correspondant n'est pas utilisé.
        2,Shucan utilise une politique d'authentification de connexion. Assurez-vous que le nombre d'opérations ne dépasse pas le seuil requis.

    L'Instruction where non prise en charge
    L’instruction where de Shucan n’est pas compatible avec le contenu SQL standard. Les instructions associées telles que le filtrage conditionnel de lignes (id==name), exist, group by, etc., doivent être converties en opérations de post-traitement des données .

    La fonction reg_match ne fonctionne pas correctement
    La bibliothèque d'analyse d'expressions régulières Shucan est une implémentation d'ECMA-262 (version 2011), qui est compatible avec la plupart des grammaires d'expressions régulières, et ajoute \h pour correspondre au chinois \H pour correspondre aux caractères de délimitation non chinois. Afin d'éviter les pièges de performances dans des cas particuliers, la bibliothèque d'expressions régulières utilise une correspondance sans retour arrière par défaut, c'est-à-dire que .* correspondra à tous et .* doit être évité autant que possible lors de son utilisation.

    Fuzzy match particulièrement lent
    La correspondance floue par défaut correspond par défaut à tous les résultats de correspondance dont la longueur de différence est inférieure à la moitié, de sorte que l’algorithme de correspondance n’est pas efficace pour les chaînes de caractères longues.

    Feed-back sur l'erreur
    La base de données de mémoire Shucan a été minutieusement et entièrement testée, mais certaines erreurs inconnues peuvent encore être inévitables. Pour les erreurs connexes, veuillez envoyer la description du problème à admin@shucantech.com. Merci pour vos commentaires!