小工具      在线工具  汉语词典  css  js  c++  java

SQLite

数据库,sqlite 额外说明

收录于:152天前

SQLite 简介

SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,不需要在系统中配置。SQLite 直接访问其存储文件。

SQLite优势

  1. SQLite 是一个类似Access的轻量级数据库系统,但是更小、更快、容量更大,并发更高。
  2. 整个数据库存储在一个单个的文件中,数据导入导出备份恢复都是复制文件,维护难度为零。
  3. 不同于mysql等大型数据库系统,它们的应用场景不一样,SQLite 最适合做 CMS (内容管理系统)。
  4. SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中

SQLite 命令

DDL - 数据定义语言

命令 描述
CREATE 创建一个新的表,一个表的视图,或者数据库中的其他对象。
ALTER 修改数据库中的某个已有的数据库对象,比如一个表。
DROP 删除整个表,或者表的视图,或者数据库中的其他对象。

DML - 数据操作语言

命令 描述
INSERT 创建一条记录。
UPDATE 修改记录
DELETE 删除记录

DQL - 数据查询语言

命令 描述
SELECT 从一个或多个表中检索某些记录

SQLite安装

下载界面下载sqlite-tools和sqlite-dll解压后放同一文件下,将文件路径添加到系统环境变量。输入sqlite3验证是否配置成功:
在这里插入图片描述
SQLite点命令
SQLite 的点命令,这些命令的不同之处在于它们不以分号; 结束。
SQLite命令

SQLite语句和SQL语句的区别

sqlite3连接数据库。
.help查看所有点命令
在这里插入图片描述

命令 描述
.backup ?DB? FILE 备份 DB 数据库(默认是 “main”)到 FILE 文件。
.bail ON/OFF 发生错误后停止。默认为 OFF。
.databases 列出数据库的名称及其所依附的文件。
.dump ?TABLE? 以 SQL 文本格式转储数据库。如果指定了 TABLE 表,则只转储匹配 LIKE 模式的 TABLE 表。
.echo ON/OFF 开启或关闭 echo 命令。
.exit 退出 SQLite 提示符。
.explain ON/OFF 开启或关闭适合于 EXPLAIN 的输出模式。如果没有带参数,则为 EXPLAIN on,即开启 EXPLAIN。
.header(s) ON/OFF 开启或关闭头部显示。
.help 显示所有点命令
.import FILE TABLE 导入来自 FILE 文件的数据到 TABLE 表中。
.indices ?TABLE? 显示所有索引的名称。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表的索引。
.load FILE ?ENTRY? 加载一个扩展库。
.log FILE/off 开启或关闭日志。FILE 文件可以是 stderr(标准错误)/stdout(标准输出)。
.mode MODE 设置输出模式,MODE 可以是下列之一:1. csv 逗号分隔的值 2.column 左对齐的列 3. html HTML 的 <table> 代码 4. insert TABLE 表的 SQL 插入(insert)语句 5. line 每行一个值 6. list 由 .separator 字符串分隔的值 7. tabs 由 Tab 分隔的值 8. tcl TCL 列表元素
.nullvalue STRING 在 NULL 值的地方输出 STRING 字符串。
.output FILENAME 发送输出到屏幕。
.print STRING 逐字地输出 STRING 字符串
.prompt MAIN CONTINUE 替换标准提示符。
.quit 退出 SQLite 提示符。
.read FILENAME 执行 FILENAME 文件中的 SQL。
.schema ?TABLE? 显示 CREATE 语句。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表。
.separator STRING 改变输出模式和 .import 所使用的分隔符。
.show 显示各种设置的当前值。
.stats ON/OFF 开启或关闭统计。
.tables ?PATTERN? 列出匹配 LIKE 模式的表的名称。
.timeout MS 尝试打开锁定的表 MS 毫秒。
.width NUM NUM 为 “column” 模式设置列宽度。
.timer ON/OFF 开启或关闭 CPU 定时器。

修改设置值

在这里插入图片描述
设置格式化输出
在这里插入图片描述

SQLite语法

数据库操作

注释
SQL 注释以两个连续的 “-” 字符为注释。

SQLite遵循SQL标准,语法也大致相似。SQLite与SQL差异SQLite语法

数据类型
在这里插入图片描述

创建数据库
sqlite3 database_name.db用于创建一个数据库并进入该数据库。如果sqlite3后面没有参数就会进入默认的main数据库。

也可以通过.open test.dbmain中新建或打开test数据库。
在这里插入图片描述
查看数据库
创建后通过.databses查看
在这里插入图片描述
在这里插入图片描述
退出数据库
.quit退出数据库

导出数据库
.dump命令来导出完整的数据库在一个文本文件中

sqlite3 testDB.db .dump > testDB.sql

可以通过简单的方式从生成的 testDB.sql 恢复,如下所示:

sqlite3 testDB.db < testDB.sql

表操作

创建表
CREATE TABLE 语句的基本语法:

CREATE TABLE database_name.table_name(
   column1 datatype  PRIMARY KEY(one or more columns),
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);

在这里插入图片描述

.tables查看表
在这里插入图片描述

删除表
DROP TABLE 语句:

DROP TABLE COMPANY

在这里插入图片描述
修改表
SQLite 的 ALTER TABLE 命令不通过执行一个完整的转储和数据的重载来修改已有的表。您可以使用 ALTER TABLE 语句重命名表,使用 ALTER TABLE 语句还可以在已有的表中添加额外的列。

在 SQLite 中,除了重命名表和在已有的表中添加列,ALTER TABLE 命令不支持其他操作。

重命名已有的表的 ALTER TABLE 的基本语法如下:

ALTER TABLE database_name.table_name RENAME TO new_table_name;

用来在已有的表中添加一个新的列的 ALTER TABLE 的基本语法如下:

ALTER TABLE database_name.table_name ADD COLUMN column_def...;

删除表
DELETE 命令从已有的表中删除全部的数据。

DELETE FROM table_name;

数据操作

插入数据
INSERT INTO 语句用于向数据库的某个表中添加新的数据行。

INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]  
VALUES (value1, value2, value3,...valueN);

在这里插入图片描述

查询数据

SELECT 语句用于从 SQLite 数据库表中获取数据,以结果表的形式返回数据。这些结果表也被称为结果集。

SELECT column1, column2, columnN FROM table_name;
SELECT * FROM table_name;

可以结合whereandor来实现条件查询

在这里插入图片描述

输出的格式可以通过.mode命令改变。

使用 SELECT 语句获取并显示所有这些记录。可以通过命令来设置格式化的输出。

sqlite>.header on
sqlite>.mode column
sqlite> SELECT * FROM user;

在这里插入图片描述

格式化输出

有时数据宽度比较长,通过命令设置输出列的宽度。由于要显示的列的默认宽度导致 .mode column,这种情况下,输出被截断。此时,您可以使用 .width num, num.... 命令设置显示列的宽度,如下所示:

sqlite>.width 10, 20, 10   --个数对应字段--
sqlite>SELECT * FROM COMPANY;

更新数据
UPDATE 查询用于修改表中已有的记录。可以使用带有 WHERE 子句的 UPDATE 查询来更新选定行,否则所有的行都会被更新。

UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

删除数据
DELETE 查询用于删除表中已有的记录。可以使用带有 WHERE 子句的 DELETE 查询来删除选定行,否则所有的记录都会被删除。

DELETE FROM table_name
WHERE [condition];

可以使用 AND 或 OR 运算符来结合 N 个数量的条件。

Schema视图

点命令只在 SQLite 提示符中可用,所以当您进行带有 SQLite 的编程时,您要使用下面的带有 sqlite_master 表的 SELECT 语句来列出所有在数据库中创建的表:

# 主视图命名
.schema sqlite_master

# 查询表视图
SELECT tbl_name FROM sqlite_master WHERE type = 'table';

# 表的完整信息
SELECT sql FROM sqlite_master WHERE type = 'table' AND tbl_name = 'COMPANY';

SQLite运算符

算术运算符
在这里插入图片描述
比较运算符
在这里插入图片描述

逻辑运算符
在这里插入图片描述

SQLite表达式
avg()、sum()、count(),等等,执行被称为对一个表或一个特定的表列的汇总数据计算。

SELECT COUNT(*) AS "RECORDS" FROM COMPANY; 

日期表达式返回当前系统日期和时间值,这些表达式将被用于各种数据操作。

SELECT CURRENT_TIMESTAMP;

在这里插入图片描述

SQLite复杂查询

模糊查询like
LIKE 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1。这里有两个通配符与 LIKE 运算符一起使用:

  • 百分号 (%)
  • 下划线 (_)

百分号(%)代表零个、一个或多个数字或字符。下划线(_)代表一个单一的数字或字符。这些符号可以被组合使用。

匹配通配符查询
GLOB 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,GLOB 运算符将返回真(true),也就是 1。与 LIKE 运算符不同的是,GLOB 是大小写敏感的。

  • 星号 (*)

  • 问号 (?)

星号(*)代表零个、一个或多个数字或字符。问号(?)代表一个单一的数字或字符。这些符号可以被组合使用。

限制查询
LIMIT 子句用于限制由 SELECT 语句返回的数据数量。

# 从 start+1 开始查
SELECT column1, column2, columnN 
FROM table_name
LIMIT [start]


# 从start+1开始查到end结束
SELECT column1, column2, columnN 
FROM table_name
LIMIT [start] OFFSET [end]

排序查询
ORDER BY 子句是用来基于一个或多个列按升序或降序顺序排列数据。

SELECT column-list 
FROM table_name 
[WHERE condition] 
[ORDER BY column1, column2, .. columnN] [ASC | DESC];

asc升序,desc降序

分组查询
GROUP BY 子句用于与 SELECT 语句一起使用,来对相同的数据进行分组。在 SELECT 语句中,GROUP BY 子句放在 WHERE 子句之后,放在 ORDER BY 子句之前。

SELECT column-list
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2....columnN
ORDER BY column1, column2....columnN

在这里插入图片描述

将group by后的相同字段分为一组

过滤查询
HAVING 子句允许指定条件来过滤将出现在最终结果中的分组结果。WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件。

SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

在这里插入图片描述

对分组查询再一次过滤

去重查询
SQLite 的 DISTINCT 关键字与 SELECT 语句一起使用,来消除所有重复的记录,并只获取唯一一次记录。

SELECT DISTINCT column1, column2,.....columnN 
FROM table_name
WHERE [condition]

在这里插入图片描述

嵌套查询

SQLite 约束

约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性。

约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表。

在这里插入图片描述
NOT NULL 约束
默认情况下,列可以保存 NULL 值。如果您不想某列有 NULL 值,那么需要在该列上定义此约束,指定在该列上不允许 NULL 值。

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

DEFAULT 约束
DEFAULT 约束在 INSERT INTO 语句没有提供一个特定的值时,为列提供一个默认值。

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00
);

UNIQUE 约束
UNIQUE 约束防止在一个特定的列存在两个记录具有相同的值。

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL UNIQUE,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00
);

PRIMARY KEY 约束
PRIMARY KEY 约束唯一标识数据库表中的每个记录。在一个表中可以有多个 UNIQUE 列,但只能有一个主键。在设计数据库表时,主键是很重要的。主键是唯一的 ID。

主键是表中的一个字段,唯一标识数据库表中的各行/记录。主键必须包含唯一值。主键列不能有 NULL 值。

一个表只能有一个主键,它可以由一个或多个字段组成。当多个字段作为主键,它们被称为复合键。

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

CHECK 约束
CHECK 约束启用输入一条记录要检查值的条件。如果条件值为 false,则记录违反了约束,且不能输入到表。

CREATE TABLE COMPANY3(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL    CHECK(SALARY > 0)
);

SQLite 支持 ALTER TABLE 的有限子集。在 SQLite 中,ALTER TABLE 命令允许用户重命名表,或向现有表添加一个新的列。重命名列,删除一列,或从一个表中添加或删除约束都是不可能的。

Autoincrement(自动递增)自增约束
SQLite 的 AUTOINCREMENT 是一个关键字,用于表中的字段值自动递增。我们可以在创建表时在特定的列名称上使用 AUTOINCREMENT 关键字实现该字段值的自动增加。关键字 AUTOINCREMENT 只能用于整型(INTEGER)字段。

CREATE TABLE table_name(
   column1 INTEGER AUTOINCREMENT,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);

SQLite连接查询

SQLite 的 Join 子句用于结合两个或多个数据库中表的记录。JOIN 是一种通过共同值来结合两个表中字段的手段。
在这里插入图片描述

交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 行,则结果表有 x*y 行。由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。

SELECT ... FROM table1 CROSS JOIN table2 ...

交叉连接的操作,它们都返回被连接的两个表所有数据行的笛卡尔积,返回到的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

内连接(INNER JOIN)根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。查询会把 table1 中的每一行与 table2 中的每一行进行比较,找到所有满足连接谓词的行的匹配对。当满足连接谓词时,A 和 B 行的每个匹配对的列值会合并成一个结果行。

内连接(INNER JOIN)是最常见的连接类型,是默认的连接类型。INNER 关键字是可选的。

SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...

外连接(OUTER JOIN)是内连接(INNER JOIN)的扩展。虽然 SQL 标准定义了三种类型的外连接:LEFT、RIGHT、FULL,但 SQLite 只支持 左外连接(LEFT OUTER JOIN)。

外连接(OUTER JOIN)声明条件的方法与内连接(INNER JOIN)是相同的,使用 ON、USING 或 NATURAL 关键字来表达。最初的结果表以相同的方式进行计算。一旦主连接计算完成,外连接(OUTER JOIN)将从一个或两个表中任何未连接的行合并进来,外连接的列使用 NULL 值,将它们附加到结果表中。

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

查询连接

SQLite的 UNION 子句/运算符用于合并两个或多个 SELECT 语句的结果,不返回任何重复的行。

为了使用 UNION,每个 SELECT 被选择的列数必须是相同的,相同数目的列表达式,相同的数据类型,并确保它们有相同的顺序,但它们不必具有相同的长度。

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

UNION

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

UNION ALL 运算符用于结合两个 SELECT 语句的结果,包括重复行。适用于 UNION 的规则同样适用于 UNION ALL 运算符。

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

UNION ALL

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

SQLite 事务

事务(Transaction)是一个对数据库执行工作单元。事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成。

在这里插入图片描述

BEGIN TRANSACTION 命令
事务(Transaction)可以使用 BEGIN TRANSACTION 命令或简单的 BEGIN 命令来启动。此类事务通常会持续执行下去,直到遇到下一个 COMMIT 或 ROLLBACK 命令。不过在数据库关闭或发生错误时,事务处理也会回滚。

BEGIN;

or 

BEGIN TRANSACTION;

COMMIT 命令
COMMIT 命令是用于把事务调用的更改保存到数据库中的事务命令。

COMMIT;

or

END TRANSACTION;

ROLLBACK 命令
ROLLBACK 命令是用于撤消尚未保存到数据库的事务的事务命令。

ROLLBACK;

SQLite常用函数

在这里插入图片描述

--COUNT 聚集函数是用来计算一个数据库表中的行数。
SELECT count(*) FROM COMPANY;

--MAX 聚合函数允许我们选择某列的最大值。
SELECT max(salary) FROM COMPANY;

--MIN 聚合函数允许我们选择某列的最小值。
SELECT min(salary) FROM COMPANY;

时间和日期
在这里插入图片描述

修饰符(Modifier)时间字符串后边可跟着零个或多个的修饰符,这将改变有上述五个函数返回的日期和/或时间。

SQLite接口

Java接口

在 Java 程序中使用 SQLite 之前,我们需要确保机器上已经有 SQLite JDBC Driver 驱动程序。并且在 classpath路径中添加下载的 jar 文件 sqlite-jdbc-(VERSION).jar工具包。

连接sqlite数据库

import java.sql.*;

public class SQLiteJDBC
{
    
  public static void main( String args[] )
  {
    
    Connection c = null;
    try {
    
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
    } catch ( Exception e ) {
    
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
    }
    System.out.println("Opened database successfully");
  }
}

创建表
和JDBC操作差不多。

import java.sql.*;

public class SQLiteJDBC
{
    
  public static void main( String args[] )
  {
    
    Connection c = null;
    Statement stmt = null;
    try {
    
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
      System.out.println("Opened database successfully");

      stmt = c.createStatement();
      String sql = "CREATE TABLE COMPANY " +
                   "(ID INT PRIMARY KEY NOT NULL," +
                   " NAME TEXT NOT NULL, " + 
                   " AGE INT NOT NULL, " + 
                   " ADDRESS CHAR(50), " + 
                   " SALARY REAL)"; 
      stmt.executeUpdate(sql);
      stmt.close();
      c.close();
    } catch ( Exception e ) {
    
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
    }
    System.out.println("Table created successfully");
  }
}

INSERT 操作

import java.sql.*;

public class SQLiteJDBC
{
  public static void main( String args[] )
  {
    Connection c = null;
    Statement stmt = null;
    try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");

      stmt = c.createStatement();
      String sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
                   "VALUES (1, 'Paul', 32, 'California', 20000.00 );"; 
      stmt.executeUpdate(sql);

      sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
            "VALUES (2, 'Allen', 25, 'Texas', 15000.00 );"; 
      stmt.executeUpdate(sql);

      sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
            "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );"; 
      stmt.executeUpdate(sql);

      sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
            "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"; 
      stmt.executeUpdate(sql);

      stmt.close();
      c.commit();
      c.close();
    } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
    }
    System.out.println("Records created successfully");
  }
}

SELECT 操作

import java.sql.*;

public class SQLiteJDBC
{
  public static void main( String args[] )
  {
    Connection c = null;
    Statement stmt = null;
    try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");

      stmt = c.createStatement();
      ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
      while ( rs.next() ) {
         int id = rs.getInt("id");
         String  name = rs.getString("name");
         int age  = rs.getInt("age");
         String  address = rs.getString("address");
         float salary = rs.getFloat("salary");
         System.out.println( "ID = " + id );
         System.out.println( "NAME = " + name );
         System.out.println( "AGE = " + age );
         System.out.println( "ADDRESS = " + address );
         System.out.println( "SALARY = " + salary );
         System.out.println();
      }
      rs.close();
      stmt.close();
      c.close();
    } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
    }
    System.out.println("Operation done successfully");
  }
}

UPDATE 操作

import java.sql.*;

public class SQLiteJDBC
{
  public static void main( String args[] )
  {
    Connection c = null;
    Statement stmt = null;
    try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");

      stmt = c.createStatement();
      String sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1;";
      stmt.executeUpdate(sql);
      c.commit();

      ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
      while ( rs.next() ) {
         int id = rs.getInt("id");
         String  name = rs.getString("name");
         int age  = rs.getInt("age");
         String  address = rs.getString("address");
         float salary = rs.getFloat("salary");
         System.out.println( "ID = " + id );
         System.out.println( "NAME = " + name );
         System.out.println( "AGE = " + age );
         System.out.println( "ADDRESS = " + address );
         System.out.println( "SALARY = " + salary );
         System.out.println();
      }
      rs.close();
      stmt.close();
      c.close();
    } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
    }
    System.out.println("Operation done successfully");
  }
}

DELETE 操作

import java.sql.*;

public class SQLiteJDBC
{
  public static void main( String args[] )
  {
    Connection c = null;
    Statement stmt = null;
    try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");

      stmt = c.createStatement();
      String sql = "DELETE from COMPANY where ID=2;";
      stmt.executeUpdate(sql);
      c.commit();

      ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
      while ( rs.next() ) {
         int id = rs.getInt("id");
         String  name = rs.getString("name");
         int age  = rs.getInt("age");
         String  address = rs.getString("address");
         float salary = rs.getFloat("salary");
         System.out.println( "ID = " + id );
         System.out.println( "NAME = " + name );
         System.out.println( "AGE = " + age );
         System.out.println( "ADDRESS = " + address );
         System.out.println( "SALARY = " + salary );
         System.out.println();
      }
      rs.close();
      stmt.close();
      c.close();
    } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
    }
    System.out.println("Operation done successfully");
  }
}

Python接口

Python定义了一套操作数据库的API接口,任何数据库要连接到Python,只需要提供符合Python标准的数据库驱动即可。由于SQLite的驱动内置在Python标准库中,所以我们可以直接来操作SQLite数据库。

Python sqlite3 模块 API
在这里插入图片描述
在这里插入图片描述

连接数据库

import sqlite3

conn = sqlite3.connect('test.db')

创建表

import sqlite3

conn = sqlite3.connect('test.db')
print ("数据库打开成功")
c = conn.cursor()
c.execute('''CREATE TABLE COMPANY (ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);''')
print ("数据表创建成功")
conn.commit()
conn.close()

INSERT 操作

import sqlite3

conn = sqlite3.connect('test.db')
c = conn.cursor()
print ("数据库打开成功")

c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
      VALUES (1, 'Paul', 32, 'California', 20000.00 )")

c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
      VALUES (2, 'Allen', 25, 'Texas', 15000.00 )")

c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
      VALUES (3, 'Teddy', 23, 'Norway', 20000.00 )")

c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
      VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 )")

conn.commit()
print ("数据插入成功")
conn.close()

SELECT 操作=

import sqlite3

conn = sqlite3.connect('test.db')
c = conn.cursor()
print ("数据库打开成功")

cursor = c.execute("SELECT id, name, address, salary from COMPANY")
for row in cursor:
   print "ID = ", row[0]
   print "NAME = ", row[1]
   print "ADDRESS = ", row[2]
   print "SALARY = ", row[3], "\n"

print ("数据操作成功")
conn.close()

UPDATE 操作

import sqlite3

conn = sqlite3.connect('test.db')
c = conn.cursor()
print ("数据库打开成功")

c.execute("UPDATE COMPANY set SALARY = 25000.00 where ID=1")
conn.commit()
print "Total number of rows updated :", conn.total_changes

cursor = conn.execute("SELECT id, name, address, salary from COMPANY")
for row in cursor:
   print "ID = ", row[0]
   print "NAME = ", row[1]
   print "ADDRESS = ", row[2]
   print "SALARY = ", row[3], "\n"

print ("数据操作成功")
conn.close()

DELETE 操作

import sqlite3

conn = sqlite3.connect('test.db')
c = conn.cursor()
print ("数据库打开成功")

c.execute("DELETE from COMPANY where ID=2;")
conn.commit()
print "Total number of rows deleted :", conn.total_changes

cursor = conn.execute("SELECT id, name, address, salary from COMPANY")
for row in cursor:
   print "ID = ", row[0]
   print "NAME = ", row[1]
   print "ADDRESS = ", row[2]
   print "SALARY = ", row[3], "\n"

print ("数据操作成功")
conn.close()

案例

import os, sqlite3

db_file = os.path.join(os.path.dirname(__file__), 'test.db')
if os.path.isfile(db_file):
    os.remove(db_file)

# 初始数据:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute('create table user(id varchar(20) primary key, name varchar(20), score int)')
cursor.execute(r"insert into user values ('A-001', 'Adam', 95)")
cursor.execute(r"insert into user values ('A-002', 'Bart', 62)")
cursor.execute(r"insert into user values ('A-003', 'Lisa', 78)")
conn.commit()
cursor.close()
conn.close()

def get_score_in(low, high):
	cursor.execute("select * from user where score between(%s,%s)",low,high)
# 测试:
assert get_score_in(80, 95) == ['Adam'], get_score_in(80, 95)
assert get_score_in(60, 80) == ['Bart', 'Lisa'], get_score_in(60, 80)
assert get_score_in(60, 100) == ['Bart', 'Lisa', 'Adam'], get_score_in(60, 100)

print("successful")
. . .

相关推荐

额外说明

JVM详解(InsCode AI创作助手)

JVM是一个虚拟的计算机,它有自己的硬件架构,如处理器、堆栈和寄存器等,也有自己的指令系统。JVM的主要任务是负责加载、验证、编译和执行Java程序。 一、JVM参数默认配置如下 内存设置: 初始堆内存大小:物理内存的1/64 最大堆内存大小:物理内存的

额外说明

尖端技术|人工智能的兴起和发展史

前言: 人工智能的作用是使计算机能够模仿人类智能和学习能力,从而实现自动化、智能化和优化决策的目标。 文章目录 人工智能 背景 介绍 发展状态 未来展望 总结 人工智能 背景 人工智能(Artificial Intelligence,AI)的产生源于人们

额外说明

dubbo原理框架设计

dubbo原理框架设计 (1)config 配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类。 (2)proxy 服务代理层:服务接口透明代

额外说明

【VR】(三)Unity3D中开发VR程序的流程

推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一、前言 最近做VR项目比较多,也学习了很多的东西,现在把开发的流程,已经用到的技术以及软件总结一下,分享出来供大家参考,本文内容

额外说明

【Unity3D-UGUI篇】Unity3D中UGUI的屏幕适配

一、前言 在开发中,常常遇到对于屏幕的UI适配工作,下面就来看一下如何进行屏幕适配。 二、正文 1、游戏屏幕适配 屏幕适配是为了让我们的项目能够跑在各种电子设备上(手机,平板,电脑) 那么了解是适配之前首先要了解两个知识点: 1-1、什么是像素? 单位面

额外说明

《微服务实战》 第二十一、二十二章 Redis发布订阅、事务;HyperLoglog基数统计

系列文章目录 第二十八章 分布式锁框架-Redisson 第二十四章 Spring boot 操作 Redis 第二十三章 Redis RDB AOF 第二十一、二十二章 Redis发布订阅、事务;HyperLoglog基数统计 第二十章 Redis连接

额外说明

论文解读:从自然语言监督学习可转移视觉模型Learning Transferable Visual Models From Natural Language Supervision

一段时间没看论文,又成堆了,抽个时间阅读并做个笔记,水平有限,错误难免,欢迎指正和交流学习提高。 本论文是从自然语言的监督学习中,应用到视觉领域,主要就是图片(视频<这里涉及到耗时太长,也是从视频中截取中心帧组合的图片集>)和文本的组合训练,这种预训练对

额外说明

深度的卷积神经网络CNN(MNIST数据集示例)

        前面篇幅介绍的全连接层和简单卷积神经网络,层数都比较少,现在来加多几层,对于加深了的深度神经网络,其实就是我们常说的深度学习,类似搭积木,只需要叠加层即可。现在来构建一个深度的CNN,这里使用的卷积层全是3x3的小型滤波器,特点是随着层的

额外说明

linux查看某个文件夹的大小(ls命令、du命令详解)

ls 命令:列出当前工作目录下的所有文件/文件夹的名称 使用ls -l,会显示成字节大小,ls- lh会以KB、MB等为单位进行显示更加直观。 du 命令:查看当前目录和子目录文件夹/文件大小情况 du = disk usage 磁盘使用率,输出每个文件

额外说明

系统由于缺失cryptnet.dll文件导致程序无法启动如何解决?

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个cryptnet.dll文件

ads via 小工具