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 :
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
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
select、
insert、
delete、
update、
rows_of、
cols_of、
fields_of、
show tablesetc. ; DDL consiste à
create、
alter、
drop、
save、
load、
exec 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
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" invalides10 < 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) span>
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!