• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • SQLite3 學習筆記總結

    標簽: 數據庫  sqlite  sql

    SQLite3導圖

    總結

    命令

    終端命令
    sqlite3 [databaseName.db]
    sqlite3 test.db .dump > db.sql
    sqlite3 test.db < db.sql
    
    sqlite 命令
    .help
    .exit 或 .quit
    .import <file> <table>
    .mode <mode>
    .show
    .databases
    .tables
    .schema <table>         # 例: .schema sqlite_master
    .indices [table]
    

    子句

    DISTINCT
    表達式
    WHERE
    AND/OR
    GROUP BY/HAVING
    ORDER BY
    OFFSET/LIMIT
    運算符
    算術運算符:+-*/%
    比較運算符
    ==
    =
    !=
    >
    <
    >=
    <=
    !<
    !>
    
    邏輯運算符
    AND
    
    BETWEEN
    
    EXISTS
    例:
     AGE 存在于子查詢返回的結果中的所有記錄
    SELECT AGE FROM COMPANY 
            WHERE EXISTS (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
    IN
    NOT IN
    LIKE:
      % 代表零/一/多個數字或字符
      _ 代表一個單一的數字或字符
    例:
    SELECT column_list 
    FROM table_name
    WHERE column LIKE 'XXXX%'
    
    SELECT column_list 
    FROM table_name
    WHERE column LIKE 'XXXX_’
    
    GLOB:與 LIKE 作用相同,不同之處在于它是大小寫敏感的
      * 代表零/一/多個數字或字符
      ? 代表一個單一的數字或字符
    例:
    SELECT FROM table_name
    WHERE column GLOB '*XXXX*'
    
    SELECT FROM table_name
    WHERE column GLOB 'XXXX?'
    
    NOT
    
    OR
    
    IS NULL
    
    IS
    
    IS NOT
    
    ||:連接兩個不同的字符串,得到一個新的字符串
    
    UNIQUE
    
    位運算符:&|~<<>>

    DDL

    數據類型
    • NULL
    • INTEGER
    • REAL(浮點數)
    • TEXT
    • BLOB
    數據庫操作
    ATTACH DATABASE ‘test.db’ AS ‘mydb’
    DETACH DATABASE ‘mydb’
    
    表操作
    • CREATE
    CREATE TABLE <dbName.tableName> (
    	colName1 dataType colAttr,
    	colName2 dataType colAttr
    );
    
    • DROP
    DROP TABLE <dbName.tableName>;
    
    • ALTER
    重命名表:
    ALTER TABLE database_name.table_name RENAME TO new_table_name;ALTER TABLE COMPANY RENAME TO OLD_COMPANY;
    
    添加列:
    ALTER TABLE database_name.table_name ADD COLUMN column_def...;ALTER TABLE OLD_COMPANY ADD COLUMN SEX char(1);
    
    注:新添加的列是以 NULL 值來填充的
    

    DML

    INSERT
    INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]  
    VALUES (value1, value2, value3,...valueN);
    
    INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
    
    INSERT INTO first_table_name [(column1, column2, ... columnN)] 
       SELECT column1, column2, ...columnN 
       FROM second_table_name
       [WHERE condition];
    
    UPDATE
    UPDATE table_name
    SET column1 = value1, column2 = value2...., columnN = valueN
    WHERE [condition];
    
    DELETE
    DELETE FROM table_name
    WHERE [condition];
    
    實現 TRUNCATE 功能:
    在 SQLite 中,并沒有 TRUNCATE TABLE 命令,但可以使用 SQLite 的 DELETE 命令從已有的表中刪除全部的數據。
    
    DELETE FROM table_name;
    DELETE FROM sqlite_sequence WHERE name = 'table_name';
    
    當 SQLite 數據庫中包含自增列時,會自動建立一個名為 sqlite_sequence 的表。這個表包含兩個列:name 和 seq。name 記錄自增列所在的表,seq 記錄當前序號(下一條記錄的編號就是當前序號加 1)。如果想把某個自增列的序號歸零,只需要修改 sqlite_sequence 表就可以了。
    UPDATE sqlite_sequence SET seq = 0 WHERE name = 'table_name';
    
    • DQL:SELECT
    SELECT column1, column2, columnN FROM table_name;
    SELECT * FROM table_name;
    

    高級

    PRAGMA

    PRAGMA pragma_name;
    PRAGMA pragma_name = value;

    字段約束
    • NOT NULL
    • DEFAULT
    • UNIQUE
    • PRIMARY KEY 只能用于 INTEGER 字段
    • AUTOINCREMENT
    • CHECK
    例:
    CREATE TABLE COMPANY3(
       ID INT PRIMARY KEY     NOT NULL,
       NAME TEXT NOT NULL UNIQUE,
       AGE INT NOT NULL DEFAULT 0,
       ADDRES  CHAR(50),
       SALARY REAL CHECK(SALARY > 0)
    );
    

    不能更改列:重命名列,刪除一列,或從一個表中添加或刪除約束都是不可能的。

    JOIN
    CROSS JOIN:笛卡爾積
    >SELECT ... FROM table1 CROSS JOIN table2 ...
    
    
    INNER JOIN:默認的連接類型
    >SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
    
    自然連接(NATURAL JOIN)類似于 JOIN...USING,只是它會自動測試存在兩個表中的每一列的值之間相等值:
    SELECT ... FROM table1 NATURAL JOIN table2...
    
    OUTER JOIN:SQLite3 只支持 LEFTLEFT/RIGHT/FULL>SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
    ···
    
    ##### UNION
    ···sql
    UNIONSELECT column1 [, column2 ]
    FROM table1 [, table2 ]
    [WHERE condition]
    UNION
    SELECT column1 [, column2 ]
    FROM table1 [, table2 ]
    [WHERE condition]
    
    UNION ALLSELECT column1 [, column2 ]
    FROM table1 [, table2 ]
    [WHERE condition]
    UNION ALL
    SELECT column1 [, column2 ]
    FROM table1 [, table2 ]
    [WHERE condition]
    
    別名
    表別名:
    SELECT column1, column2....
    FROM table_name AS alias_name
    WHERE [condition];
    
    字段別名:
    ELECT column_name AS alias_name
    FROM table_name
    WHERE [condition];
    
    關鍵字 AS 可被省略
    SELECT id AS identification, name AS nickname FROM company;
    SELECT id identification, name AS nickname FROM company;
    
    觸發器
    是數據庫的回調函數,它會在指定的數據庫事件發生時自動執行/調用
    SQLite 只支持 FOR EACH ROW 觸發器(Trigger- 如果提供 WHEN 子句,則只針對 WHEN 子句為真的指定行執行 SQL 語句
    - BEFORE 或 AFTER 關鍵字決定何時執行觸發器動作
    - 當觸發器相關聯的表刪除時,自動刪除觸發器(Trigger- 要修改的表必須存在于同一數據庫中
    - 一個特殊的 SQL 函數 RAISE() 可用于觸發器程序內拋出異常
    
    語法
    CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name 
    ON table_name
    BEGIN
     -- 觸發器邏輯....
    END;
    
    CREATE  TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
    ON table_name
    BEGIN
     -- 觸發器邏輯....
    END;
    
    — 刪除觸發器
    DROP TRIGGER trigger_name;
    
    例:
    CREATE TRIGGER audit_log AFTER INSERT 
    ON COMPANY
    BEGIN
       INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
    END;
    
    sqlite_master
    查看所有觸發器:
    SELECT name FROM sqlite_master
    WHERE type = 'trigger';
    
    SELECT name FROM sqlite_master
    WHERE type = 'trigger' AND tbl_name = 'COMPANY';
    
    查看所有索引:
    SELECT * FROM sqlite_master WHERE type = 'index';
    
    索引
    索引有助于加快 SELECT 查詢和 WHERE 子句,但它會減慢使用 UPDATEINSERT 語句時的數據輸入
    使用 CREATE INDEX 語句創建索引,它允許命名索引,指定表及要索引的一列或多列,并指示索引是升序排列還是降序排列。
    
    
    CREATE INDEX index_name ON table_name;
    
    否要創建一個單列索引還是組合索引,要考慮到您在作為查詢過濾條件的 WHERE 子句中使用非常頻繁的列。
    
    ===
    單列索引:
    CREATE INDEX index_name
    ON table_name (column_name);
    
    唯一索引:
    CREATE UNIQUE INDEX index_name
    on table_name (column_name);
    
    組合索引:
    CREATE INDEX index_name
    on table_name (column1, column2);
    
    隱式索引:
    列添加 UNIQUE 約束后會自動創建隱式索引
    	?	INDEXD BY
    INDEXD BY 指定必須需要命名的索引來查找前面表中值。
    
    如果索引名 index-name 不存在或不能用于查詢,然后 SQLite 語句的準備失敗
    
    "NOT INDEXED" 子句規定當訪問前面的表(包括由 UNIQUEPRIMARY KEY 約束創建的隱式索引)時,沒有使用索引
    使指定了 "NOT INDEXED"INTEGER PRIMARY KEY 仍然可以被用于查找條目
    
    
    SELECT|DELETE|UPDATE column1, column2...
    FROM table_name
    INDEXED BY (index_name)
    WHERE (CONDITION);
    
    例:
    SELECT * FROM COMPANY INDEXED BY salary_index WHERE salary > 5000;
    
    視圖
    預定義的 SQLite 語句
    
    SQLite 視圖是只讀的,因此可能無法在視圖上執行 DELETEINSERTUPDATE 語句
    但是可以在視圖上創建一個觸發器,當嘗試 DELETEINSERTUPDATE 視圖時觸發,需要做的動作在觸發器內容中定義。
    
    語法:
    CREATE [TEMP | TEMPORARY] VIEW view_name AS
    SELECT column1, column2.....
    FROM table_name
    WHERE [condition];
    
    如果使用了可選的 TEMPTEMPORARY 關鍵字,則將在臨時數據庫中創建視圖。
    
    刪除視圖:
    DROP VIEW view_name;
    
    事務
    事務屬性:
    ACID
    
    事務控制:只與 DML 命令 INSERTUPDATEDELETE 一起使用。他們不能在創建表或刪除表時使用,因為這些操作在數據庫中是自動提交的
    
    BEGIN;BEGIN TRANSACTION;
    
    COMMIT;END TRANSACTION;
    
    ROLLBACK;
    
    子查詢
    SQL 注入
    EXPLAIN
    用于交互式分析和排除故障:
    
    EXPLAIN [SQLite Query]
    
    EXPLAIN  QUERY PLAN [SQLite Query]
    
    VACUUM
    通過復制主數據庫中的內容到一個臨時數據庫文件,然后清空主數據庫,并從副本中重新載入原始的數據庫文件。這消除了空閑頁,把表中的數據排列為連續的,另外會清理數據庫文件結構。
    
    如果表中沒有明確的整型主鍵(INTEGER PRIMARY KEY),VACUUM 命令可能會改變表中條目的行 ID(ROWID)。VACUUM 命令只適用于主數據庫,附加的數據庫文件是不可能使用 VACUUM 命令。
    
    如果有一個活動的事務,VACUUM 命令就會失敗。VACUUM 命令是一個用于內存數據庫的任何操作。由于 VACUUM 命令從頭開始重新創建數據庫文件,所以 VACUUM 也可以用于修改許多數據庫特定的配置參數。
    
    $ sqlite3 database_name "VACUUM;"
    
    sqlite> VACUUM;
    
    sqlite> VACUUM table_name;
    其它:AUTO_VACUUM
    
    函數
    日期與時間函數
    date(timestring, modifier, modifier, ...)
    time(timestring, modifier, modifier, ...)
    strftime(format, timestring, modifier, modifier, ...)	
    julianday(timestring, modifier, modifier, ...)	
    
    數學與字符串函數
    數學函數:
    
    COUNT
    MAX/MIN
    AVG
    SUM
    RANDOM
    ABS
    
    字符串函數:
    UPPER
    LOWER
    LENGTH
    
    其它函數
    sqlite_version
    
    接口:與編程語言交互

    參考

    • https://www.runoob.com/sqlite/sqlite-tutorial.html
    • http://songti.net/thread-636-1-1.html
    版權聲明:本文為xchenhao原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/xchenhao/article/details/107430649

    智能推薦

    IOS學習筆記28—SQLite3第三方庫之FMDB

    SQLite是一種小型的輕量級的關系型數據庫,在移動設備上使用是非常好的選擇,無論是Android還是IOS,都內置了SQLite數據庫,現在的版本都是SQLite3。在IOS中使用SQLite如果使用SDK提供的方法,特別麻煩也不利于理解和使用,在之前的http://blog.csdn.net/tangren03/article/details/7781930文章中就是使用IOS的SDK自帶的S...

    Electron + Vue3 + Vite + Ts + Sqlite3 + Sequelize搭建筆記

    1、安裝node -v16.16.0安裝參考 2、安裝全局包 3、vite框架構建 vite官網 4、 安裝代碼檢查、格式化(開發環境) eslint prettier  配置根目錄下.prttierric文件(部分配置) 5、安裝sass(需要就裝) 6、安裝router 官網(需要就裝) 7、引入electron 官網 (以上都是正常的vite + vue3配置) 這一步命...

    SQLite3的基礎學習以及Python實踐讀寫db文件

    Python集成自帶的最精巧的數據庫管理方案。 基礎命令行操作 鏈接:https://pan.baidu.com/s/1hU1nYRSdm8K0JOeQZVMvJQ 密碼:2cyq為Xmind文件。這里的命令雖然全是大寫,但是sqlite3并不區分大小寫,都用小寫也可以。  python基礎操作 這里寫了一個將Name這一個列表進行寫入db文件的操作,首先創建,添加等。 然后將文件導入的...

    Synopse mORMot框架樣例學習02 - Embedded SQLite3 ORM

    通過樣例01,學習到了數據單元的定義方法,靜態服務器的創建方式,以及ORM的基本使用方法,現在來看看樣例02 - Embedded SQLite3 ORM,同樣從字面意思猜測它應該是介紹嵌入式SQLite3數據庫的ORM方法. 通過例02的源碼,可以發現只有Project02.dpr工程文件源碼,并沒有pas單元文件,在例01里邊簡單做過說明,是因為例02共用01的所有單元,所以看到的項目管理界面...

    SQLite3源碼學習(32) WAL日志詳細分析

    在前面2篇文章講了有關WAL日志相關的一些基礎知識: SQLite3源碼學習(31) WAL日志的鎖機制 SQLite3源碼學習(30)WAL-Index文件中的hash表 接下來分析一下在WAL日志模式下,整個事務的處理機制和流程 1.原子提交 事務管理最核心的特性就是滿足原子提交特性,之前的回滾日志模式實現了這個特性,而WAL日志模式也實現了原子提交的特性。 在WAL日志模式下有3個文件,分別...

    猜你喜歡

    SQLite3源碼學習(28) Pager模塊之事務管理

           事務管理是Pager模塊中最核心的要素,所有對數據庫數據的讀寫操作都在事務中進行。一個數據庫需要在多線程的使用環境下保持數據的一致性,雖然操作系統對磁盤的讀寫操作并不是原子,但是通過事務以及日志的回滾機制使每一個事務的執行都是原子的,所以即使出現系統崩潰或斷電,數據庫并不會因此而損壞。        在一...

    SQLite3源碼學習(25) Pager模塊之事務鎖的實現2

    在上一篇文章中介紹了SQLite怎么用Linux中的記錄鎖來實現每一種類型的事務鎖。但這只適合多進程間的互斥,不適合多線程,在Linux中每一個進程只能擁有一把鎖,也就是說一個進程里的多個線程共用一把鎖,這時會出現一個線程擁有共享鎖,另一個線程再獲取獨占鎖時并不會出現排斥,僅僅是把當前進程的鎖改為獨占鎖,還有當一個線程占有鎖的時候可能被另一個線程釋放等等,這就破壞了數據庫中多事務的隔離性。所以SQ...

    SQLite3源碼學習(17) test_vfs的共享內存機制

    VFS的IO接口里提供了文件的共享緩存機制,在test_vfs里內置了一個Shared memory模塊用來模擬測試文件的共享緩存,而不是使用原來的VFS提供的接口。 1.結構定義 pFd結構 每一個數據庫文件的連接都對應著一個連接句柄pFile,上層函數調用VFS接口時會傳入pFile,在test_vfs里pFile會被強制轉換為TestvfsFile*類型,相當于sqlite3_file*的一...

    SQLite3源碼學習(21) pcache1分析

    學習本章之前要先復習以下2篇文章: SQLite3源碼學習(9)Page Cache概述 SQLite3源碼學習(10)testpcache分析 之前講到page cache是一種可插入式的管理方式,在sqlite3GlobalConfig.pcache2里定義了對page cache管理的一系列方法接口,并且介紹了最簡單的一種接口testpcache,現在我們來分析一下默認的接口pache1,這...

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

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

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