当前位置: 首页 > ai >正文

第五章 SQLite数据库:5、SQLite 进阶用法:ALTER 命令、TRUNCATE 操作、视图创建、事务控制和子查询的操作

1. SQLite ALTER 命令

SQLite 的 ALTER TABLE 命令允许在不完全重建表的情况下修改现有的表结构。通过 ALTER TABLE,您可以执行如重命名表名、添加新列等操作,但无法执行复杂的修改,如删除列或修改列的数据类型。

语法

  1. 重命名表
    用于重命名现有表的基本语法如下:

    ALTER TABLE table_name RENAME TO new_table_name;
    
  2. 添加新列
    用于在现有表中添加新列的基本语法如下:

    ALTER TABLE table_name ADD COLUMN column_definition;
    

实例

示例 1:重命名表

假设我们有一个名为 EMPLOYEES 的表,其中存储了员工的信息。若要将表名更改为 WORKERS,可以执行以下操作:

ALTER TABLE EMPLOYEES RENAME TO WORKERS;

执行后,表名将被更改为 WORKERS

示例 2:向表中添加列

假设我们有以下 WORKERS 表:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Alice       29          New York    50000.0
2           Bob         34          California  60000.0
3           Charlie     27          Texas       55000.0

若要在此表中添加一个名为 PHONE_NUMBER 的列:

ALTER TABLE WORKERS ADD COLUMN PHONE_NUMBER TEXT;

此操作将为 WORKERS 表添加一个新的 PHONE_NUMBER 列。

查询结果

ID          NAME        AGE         ADDRESS     SALARY      PHONE_NUMBER
----------  ----------  ----------  ----------  ----------  ------------
1           Alice       29          New York    50000.0     NULL
2           Bob         34          California  60000.0     NULL
3           Charlie     27          Texas       55000.0     NULL

新列 PHONE_NUMBER 会被填充为 NULL 值,直到用户提供相关数据。


2. SQLite TRUNCATE TABLE

SQLite 中没有 TRUNCATE TABLE 命令,但可以使用 DELETE 命令来删除表中的所有数据。

语法

删除表中所有记录的基本语法如下:

DELETE FROM table_name;

如果要重置自增列(如果存在)并清空表内容,可以执行以下操作:

DELETE FROM sqlite_sequence WHERE name = 'table_name';

备注:sqlite_sequence 是一个自动创建的表,它存储了所有带有 AUTOINCREMENT 属性的表的当前自增值。

示例

假设我们有一个 CUSTOMERS 表,包含以下数据:

ID          NAME        AGE         ADDRESS     PHONE
----------  ----------  ----------  ----------  --------
1           John        28          London      123456789
2           Mary        35          Paris       987654321
3           Steve       40          New York    555555555

要删除 CUSTOMERS 表中的所有数据并重置自增列,可以执行以下命令:

DELETE FROM CUSTOMERS;
DELETE FROM sqlite_sequence WHERE name = 'CUSTOMERS';

执行后,表将被清空,并且自增列的值会被重置为 1。


3. SQLite 视图 (View)

SQLite 视图是通过查询一个或多个表来创建的虚拟表。视图只是存储的查询结果,而不是实际的数据。它提供了查询数据的便利,并且可以作为数据的虚拟表示。

创建视图

使用 CREATE VIEW 语句创建视图。视图可以从一个或多个表创建,并且通常用于封装复杂的查询逻辑。

基本语法如下:

CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
示例 1:创建视图

假设我们有以下 EMPLOYEES 表:

ID          NAME        AGE         POSITION     SALARY
----------  ----------  ----------  ----------  ----------
1           Alice       29          Developer    70000
2           Bob         34          Manager      80000
3           Charlie     27          Developer    60000

如果要创建一个视图 DEV_EMPLOYEES,只包含职位为 Developer 的员工,可以执行以下 SQL:

CREATE VIEW DEV_EMPLOYEES AS
SELECT ID, NAME, AGE, SALARY
FROM EMPLOYEES
WHERE POSITION = 'Developer';

查询视图:

SELECT * FROM DEV_EMPLOYEES;

结果:

ID          NAME        AGE         SALARY
----------  ----------  ----------  ----------
1           Alice       29          70000
3           Charlie     27          60000
删除视图

若要删除视图,可以使用 DROP VIEW 语句:

DROP VIEW DEV_EMPLOYEES;

4. SQLite 事务 (Transaction)

事务是数据库中执行的一系列操作,这些操作要么全部成功,要么全部失败。事务确保了数据库操作的完整性和一致性。

事务有四个核心属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称 ACID

语法

  1. 开始事务

    BEGIN TRANSACTION;
    
  2. 提交事务

    COMMIT;
    
  3. 回滚事务

    ROLLBACK;
    
示例 1:事务的使用

假设我们有一个 ORDERS 表,存储了客户的订单信息。我们要执行一个事务来添加新的订单记录,并在过程中处理错误。

BEGIN TRANSACTION;-- 插入新订单
INSERT INTO ORDERS (customer_id, order_date, total_amount)
VALUES (1, '2025-04-20', 250.00);-- 提交事务
COMMIT;

如果发生错误,事务将回滚,所有的插入操作都将撤销:

ROLLBACK;

5. SQLite 子查询

子查询是嵌套在另一个查询中的查询,可以用于 SELECTINSERTUPDATEDELETE 语句中。

语法

  1. SELECT 语句中的子查询

    SELECT column_name
    FROM table_name
    WHERE column_name OPERATOR
    (SELECT column_name FROM table_name WHERE condition);
    
  2. INSERT 语句中的子查询

    INSERT INTO table_name (column1, column2)
    SELECT column1, column2 FROM table_name WHERE condition;
    
示例 1:子查询与 SELECT 语句

假设我们有一个 ORDERS 表,记录了客户的订单信息,我们要查询那些订单金额大于 500 的客户。

SELECT * FROM ORDERS
WHERE customer_id IN (SELECT customer_id FROM ORDERS WHERE total_amount > 500);

SQLite 综合案例:使用 ALTER、TRUNCATE 和 视图

假设我们有一个电商平台的数据库,下面是针对 PRODUCTS 表的管理操作,并结合 ALTER 命令、事务控制和视图的创建。

1. 创建 PRODUCTS

CREATE TABLE PRODUCTS (ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT NOT NULL,PRICE REAL NOT NULL,STOCK INTEGER NOT NULL
);

2. 插入商品记录

INSERT INTO PRODUCTS (NAME, PRICE, STOCK)
VALUES ('Laptop', 1200.00, 50),('Smartphone', 800.00, 100),('Headphones', 150.00, 200);

查询 PRODUCTS

SELECT * FROM PRODUCTS;

查询结果

ID   | NAME        | PRICE  | STOCK
---- | ----------- | ------ | ------
1    | Laptop      | 1200.00| 50
2    | Smartphone  | 800.00 | 100
3    | Headphones  | 150.00 | 200

3. 使用 ALTER 命令添加新列

假设我们要给 PRODUCTS 表添加一个 CATEGORY 列,用于存储商品类别:

ALTER TABLE PRODUCTS ADD COLUMN CATEGORY TEXT;

查询结果

ID   | NAME        | PRICE  | STOCK | CATEGORY
---- | ----------- | ------ | ----- | --------
1    | Laptop      | 1200.00| 50    | NULL
2    | Smartphone  | 800.00 | 100   | NULL
3    | Headphones  | 150.00 | 200   | NULL

4. 删除所有库存记录并重置自增列

假设我们需要清空 PRODUCTS 表中的所有记录,并重置自增列的计数器:

DELETE FROM PRODUCTS;
DELETE FROM sqlite_sequence WHERE name = 'PRODUCTS';

5. 创建视图显示价格高于 500 的商品

假设我们需要创建一个视图,显示所有价格大于 500 的商品:

CREATE VIEW EXPENSIVE_PRODUCTS AS
SELECT NAME, PRICE
FROM PRODUCTS
WHERE PRICE > 500;

查询视图

SELECT * FROM EXPENSIVE_PRODUCTS;

查询结果

NAME        | PRICE
----------- | ------
Laptop      | 1200.00
Smartphone  | 800.00

http://www.xdnf.cn/news/558.html

相关文章:

  • 一文总结通信电路中LC谐振回路中各公式以及对深入解读品质因数Q
  • Retinex系列图像/视频增强算法介绍
  • 损失函数总结
  • OpenLayers:视图变换的方法
  • 【AI论文】ColorBench:视觉语言模型能否看到并理解多彩的世界?一个全面的色彩感知、推理和鲁棒性基准测试
  • 各种诈骗、骚扰电话
  • linux网络管理
  • 【单倍型理解及计算系列之二】单倍型基本概念以及其与遗传定位中Bin的定义区别
  • SOA 核心三要素:服务、构件与对象的深度解析
  • Linux 系统盘制作 | 引导加载器(GRUB 为例)| mount
  • 【刷题Day20】TCP和UDP(浅)
  • 一些C语言常用函数(后续会继续更新)
  • 【GCC】gcc编译学习
  • 指令与权限
  • RK | rk3568开发与学习
  • PrintWriter 类详解
  • liunx日志问题
  • CUDA Tools 常用命令总结与记录 (需要细化)
  • 路由引入、路由过滤及路由策略
  • C++ 用哈希表封装unordered_set/unordered_map
  • Linux进程概念
  • Day95 | 灵神 | 二叉树 二叉树的垂序遍历
  • U-Boot(Universal Bootloader)简介
  • 不带无线网卡的Linux开发板上网方法
  • 英文论文写作:常用AI工具与【新秀笔目鱼】
  • JAVA的泛型
  • jQuery — 动画和事件
  • SpringBoot学习(过滤器Filter。拦截器Interceptor。全局异常捕获处理器GlobalExceptionHandler)(详细使用教程)
  • 哲学家就餐问题(避免死锁)
  • BootStrap:进阶使用(其二)