• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • SQLite筆記-基本命令-c語言的使用

    一、數據庫介紹

    1、數據庫的基本概念

    數據

    能夠輸入計算機并能被計算機程序識別和處理的信息集合

    數據庫

    數據庫是在數據庫管理系統管理和控制之下,存放在存儲介質上的數據集合

    2、常用的數據庫

    1)大型數據庫

    1)oracle公司是最早開發數據庫的廠商之一,目前oracle關系數據卡產品的市場占有率名列前茅。
    2)IBM的DB2是第一個具備上網功能的多媒體關系數據庫管理系統,支持linux在內的一系列平臺

    2)中型數據庫

    server是微軟開發的數據庫,主要支持windows

    3)小型數據庫

    mySQL是一個小型關系型數據庫管理系統,開發者為瑞典MySQL AB公司,2008年被Sun收購,開放源碼。后面Sun被oracle收購

    3、基于嵌入式的數據庫

    1)基于嵌入式linux的數據庫有SQLite,Firebird,BerkeleyDB,eXtremeDB
    2)Firebird是關系型數據庫,功能強大,支持存儲過程,SQL兼容
    3)SQLite關系型數據庫,體積小,支持ACID事務。(不支持嚴格的數據類型檢測)
    4)BerkeleyDB沒有數據庫服務器概念,它的程序直接連接到應用程序中
    5)eXtremeDB是內存數據庫,運行效率高

    4、SQLite基礎

    SQLite的源代碼是c,其源代碼完全開放,SQLite第一個Alpha版本誕生于2005年5月,他是一個輕量級的嵌入式數據庫。

    SQLite以下特性

    -零配置-無需安裝和管理配置
    -儲存在單一的磁盤文件中的一個完整的數據庫
    -數據庫文件可以在不同字節順序的機器間自由共享
    -支持數據庫大小至2TB
    -足夠小,全部源碼大致3w的c代碼,250kb
    -比目前流行的大多數數據庫的操作要快

    二、SQLite的安裝

    1.在線安裝
    sudo apt-get install sqlite3

    2.SQLite的基本命令

    sqlite3 student.db 創建一個學生數據庫

    3.系統命令

    以.開頭的命令為系統命令
    .help 幫助
    .quit 退出
    .exit 退出
    .schema 查看表的結構圖
    .databases 查看打開的數據庫
    .table 查看表格

    4.sql命令

    1)基本的sql命令,不以.開頭,以;結尾
    2)創建一張數據庫表stu
    create table stu(id Integer , name char , score Integer);
    3)插入一條記錄
    insert into stu values(1001,'zhangsan',80); //所有字段都有插入
    insert into stu (name, score)values(1003,"wangwu"); //部分字段插入操作
    4)查詢記錄
    select * from stu; //查詢所有字段
    select name,score from stu; //查詢部分字段
    select * from stu where score=80 and id =1001; //按條件查詢 and
    select * from stu where score=80 or id =1001; //按條件查詢 or
    5)刪除記錄
    delete from stu where name='lisi';
    6)更新一條記錄
    update stu set name='wangwu' where id=1001;
    update stu set name='wangwu',score=88 where id=1001;
    7)更改表格插入一列
    alter table stu add column address char; //添加一列地址
    8)刪除一列
    sqlite3不支持,直接刪除一列
    1–創建一張新的表
    create table stu1 as select id,name,score from stu;
    2–刪除原有的表
    drop table stu;
    3–將新表名字改為原來的名字
    alter table stu1 rename to stu;

    三、c語言操作SQLite3數據庫

    1.SQLite3編程接口

    在這里插入圖片描述

    1)打開sqlite數據庫

    int sqlite3_open(char *path, sqlite3 **db)
    -path:數據庫文件路徑
    -db:指向sqlite句柄的指針(指針)
    -返回值,成功為0,失敗為錯誤碼
    -返回值:成功 SQLITE_OK

    int sqlite3_open(
      const char *filename,   /* Database filename (UTF-8) */
      sqlite3 **ppDb          /* OUT: SQLite db handle */
    );
    

    2)關閉sqlite數據庫

    int sqlite3_close(sqlite *db)
    -返回值,成功為0,失敗為錯誤碼
    -返回值:成功 SQLITE_OK

    3)錯誤信息

    const char *sqlite3_errmsg(sqlite3 *db)
    -返回值:返回錯誤信息的首地址

    4)執行一條sql語句

    int sqlite3_exec(
      sqlite3* db,                                  /* An open database */
      const char *sql,                           /* SQL to be evaluated */
      int (*callback)(void*,int,char**,char**),  /* Callback function */
      void *,                                    /* 1st argument to callback */
      char **errmsg                              /* Error msg written here */
    );
    

    功能:執行一條sql語句
    參數:
    -db 數據庫句柄
    -sql 一條sql語句
    -callback 回調函數,只有sql為查詢語句時候,才會執行此句
    -arg 表示給回調函數傳參數
    -errmsg 錯誤消息
    返回值:
    -成功 SQLITE_OK

    回調函數的查詢

    int (*callback)(void*,int,char**,char**), /* Callback function */
    功能:查詢的結果是一個函數指針,傳函數名
    -功能:每找到一條記錄自動執行一次回調函數
    -para :傳遞回調函數的參數
    -f_num: 記錄包含的字段數目
    -f_value: 包含每個字段值的指針數組
    -f_name: 包含每個字段名稱的指針數組
    -返回值:成功為0,失敗為-1

    不使用回調函數的查詢

    int sqite3_get_table(sqlite3 *db,const char *sql, char ****resultp, int *nrow, int *ncolumn, char **errmsg)
    -功能:執行SQL操作
    -db:句柄
    -sql:SQL語句
    -resultp:用來指向sql執行結果的指針
    -nrow:滿足條件的記錄的數目
    -ncolumn:每條記錄包含的字段數目
    -errmsg:錯誤信息指針的地址
    -返回值:成功返回0, 失敗返回值錯誤碼

    c語言的編譯

    gcc student.c -lsqlite3
    在這里插入圖片描述
    描述:找不到頭文件
    原因:系統沒有安裝函數庫
    解決辦法:
    sudo apt-get install libsqlite3-dev

    #include <stdio.h>
    #include <sqlite3.h>
    #include <stdlib.h>
    #define  DATABASE "stu.db"
    int do_insert(sqlite3 *db)
    {
        int id;
        char name[32] = {0};
        int score;
        char sql[128] = {};
        char *errmsg;
        printf("Input id:");
        scanf("%d", &id);
        getchar();
        printf("Input name:");
        scanf("%s", &name[0]);
        getchar();
        printf("Input score:");
        scanf("%d", &score);
        getchar();
        sprintf(sql, "insert into stu values(%d,'%s',%d);",id, name, score); //拼接
        if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
        {
            printf("%s\n",errmsg);
            return -1;
        }
        else
        {
            printf("insert success");
        }
        return 0;
    }
    int do_delete(sqlite3 *db)
    {
        int id;
        char sql[128] = {};
        char *errmsg;
        printf("Input id:");
        scanf("%d", &id);
        getchar();
        sprintf(sql, "delete from stu where id=%d;",id); //拼接
        if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
        {
            printf("%s\n",errmsg);
            return -1;
        }
        else
        {
            printf("delete success");
        }
        return 0;
    }
    int do_update(sqlite3 *db)
    {
        int id;
        char sql[128] = {};
        int score;
        char *errmsg;
        printf("Input id:");
        scanf("%d", &id);
        getchar();
        printf("Upadate score:");
        scanf("%d", &score);
        getchar();
        sprintf(sql, "update stu set score = %d where id=%d;",score, id); //拼接
        if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
        {
            printf("%s\n",errmsg);
            return -1;
        }
        else
        {
            printf("update success");
        }
        return 0;
    }
    int callback(void* para,int f_num,char** f_value,char** f_name)
    {
        int i = 0;
        for (i=0; i < f_num; i++)
        {
            printf("%-11s",f_value[i]);
        }
        putchar(10);
        return 0;
    }
    int do_query(sqlite3 *db)
    {
        char sql[128] = {};
        char *errmsg;
        sprintf(sql, "select * from stu;"); //拼接
        if (sqlite3_exec(db, sql, callback, NULL, &errmsg) != SQLITE_OK)
        {
            printf("%s\n",errmsg);
            return -1;
        }
        else
        {
            printf("query success");
        }
        return 0;
    }
    int do_query1(sqlite3 *db)
    {
        char sql[128] = {};
        char *errmsg;
        char **resultp;
        int nrow;
        int ncloumn;
        int i,j;
        int index;
        sprintf(sql, "select * from stu;"); //拼接
        if (sqlite3_get_table(db, sql, &resultp, &nrow,&ncloumn, &errmsg) != SQLITE_OK)
        {
            printf("%s\n",errmsg);
            return -1;
        }
        else
        {
            printf("query1 success");
        }
        index = ncloumn;
        for (i = 0; i<nrow; i++)
        {
            for(j = 0; j <ncloumn; j++)
            {
                printf("%-11s",resultp[index++]);
            }
            putchar(10);
        }
        return 0;
    }
    int main(int argc, const char *argv[])
    {
        sqlite3 *db;
        char *errmsg = NULL;
        int cmd;
        if (sqlite3_open(DATABASE, &db) != SQLITE_OK)
        {
            printf("%s.\n",sqlite3_errmsg(db));
            return -1;
        }
        else
        {
            printf("open database success.\n");
        }
        // 創建一張數據庫的表格
        if (sqlite3_exec(db, "create table stu (id Intger, name char, score Intger);",NULL,NULL,&errmsg) != SQLITE_OK)
        {
            printf("%s.\n",errmsg);
            return -1;
        }
        else
        {
            printf("create table success.\n");      
        }
        while (1)
        {
            printf("*****************************************\n");
            printf("1:insert 2:delete 3:query 4:updata 5:query1 6:quit \n");
            printf("*****************************************\n");
            scanf("%d", &cmd);
            switch (cmd)
            {
            case 1:
                do_insert(db);
                break;
            case 2:
                do_delete(db);
                break;
            case 3:
                do_query(db);
                break;
            case 4:
                do_update(db);
                break;
            case 5:
                do_query1(db);
                break;
            case 6:
                sqlite3_close(db);
                exit(0);   
            default:
                break;
            }
        }
        return 0;
    }
    
    版權聲明:本文為qq_38190041原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_38190041/article/details/102991531

    智能推薦

    【Git學習筆記】1:Git的基本命令

    Linux環境直接安裝一個git就可以在CLI使用git,在Windows環境下載使用Git bash就可以了。 Git結構 畫張圖記錄。 設置身份 其中--global表示對本機上所有Git倉庫都使用該配置。 創建版本庫 在要管理的目錄下使用: 則在該目錄下會生成一個.git子目錄,即為Git版本庫。若要刪除版本庫,直接移除這個子目錄即可。 添加文件到暫存區 實際是將對文件的修改添加到暫存區st...

    HCIA筆記5 VRP的基本命令

    VRP操作 命令權限等級 0-15 文件系統管理命令 基本查詢命令 目錄操作 文件操作 重點:保存命令 保存命令save(必須在用戶模式下才可以使用) 正在運行的(在內存里的)鍵入save會保存在flash:下的vrpcfg.zip里面 系統啟動文件查詢 display startup查看下次系統啟動的文件 配置系統下次啟動時使用的文件 startup saved-configuration 比較...

    (docker筆記):Docker 鏡像的基本命令

    目錄 Docker 鏡像的基本命令 幫助命令 docker images 鏡像命令 docker search 鏡像搜索 docker pull 下載鏡像 指定版本下載 docker rmi 刪除鏡像 Docker 鏡像的基本命令 幫助命令 查看幫助文檔:https://docs.docker.com/engine/reference/run/ docker images 鏡像命令 查看所有本地主...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    猜你喜歡

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    精品国产乱码久久久久久蜜桃不卡