2 数据库基本语法sqlite3

数据库基本语法(增删改查)

SQL

structured query language 结构化查询语言。专门对数据库进行查找、增加、修改、删除、统计的操作语言。
CURD增删查改 create update retrieve delete
书写风格,关键字大小写都行,建议大写。表名大小写都行,但是在一些数据库中不区分大小写,建议小写。

(重要)基本语法。

1. 查找

SELECT 字段1,字段2,字段3,… FROM 表名; python中返回值如

[(1, 502班, 小明, 男),(2,...,...),(3...,...)]

字段比较多时简写为 SELECT * FROM 表名; 由于数据库执行时会把 * 转换为字段再执行,性能极微小下降。
SELECT * FROM 表名 WHERE 字段1 = 过滤值,字典2=过滤值; where限制条件查找。

比如(在数据库下执行)
SELECT * FROM main.student WHERE name="小芸";         --返回某一个学生
SELECT * FROM student WHERE id=2;      --返回id=2的值
SELECT * FROM student WHERE id>0;      --返回id>0的所有值
select id,name from student;
SELECT "id","name" FROM student;

2. 添加

INSERT 字段1,字段2,… INTO 表名 VALUES (1, “小明”, “男”);
简写 INSERT INTO 表名 VALUES (1, “小明”, “男”);

比如(在数据库下执行)
INSERT INTO student(id,Name) VALUES (3,'倩影');

3. 修改

UPDATE 表名 SET 字段1=新值,字段2=新值 WHERE 字段1 = 要修改的那一行那一个字段的值;
注意没有where条件限制定行的话将会更新整张表。

比如(在数据库下执行)
UPDATE student SET name="小木" WHERE id=2;
--在student整张表中修改名为x的一列
UPDATE student3 SET x="123";

4. 删除

DELETE FROM 表名; 注意会删除整张表。
DELETE FROM 表名 WHERE 字段1 = 值; 限制条件删除某些行。

比如(在数据库下执行)
--删除student3表中的数据
delete from student3;COMMIT ;
--删除student4表格
drop table student2;

5. 创建表

CREATE TABLE 表名 {
字段类型 字段名 其它关键名(主键 备注),
INT id PRIMARY KEY,
VARCHAR(20) username
}

比如(在数据库下执行)
CREATE TABLE students
        (
            id integer PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            sex TEXT,
            age INTEGER
        );

补充

取出列名[id,name,sex]

PRAGMA table_info([student]);

示例 以pycharm中.py为例

sqlite示例; 创建表 ,写数据

import sqlite3			# 引入数据库,驱动包
connect = sqlite3.connect("testsqlite.db")
cursor = connect.cursor()
cursor.execute("""CREATE TABLE student(      
                         id INT PRIMARY KEY,
                         name VARCHAR(10)
          );""")        				# 创建表 ,表名student
          
cursor.execute("""
    INSERT INTO student (id, name) VALUES (4, "小红");
""")								# 添加一个id为4,名为小红的学员

cursor.close()       # 关闭游标
connect.commit()  # 提交
connect.close()      # 关闭连接

(了解)数据库驱动:数据库有自己本身的软件构造和操作语言,数据库暴露出操作接口,方便跟其它各种编程语言对接。编程语言到数据库的对接中介 叫驱动。所以我们用Python操作数据库要使用驱动。

步骤:

  1. 引入驱动包
  2. 连接数据库,得到会话。 中大型数据库需要先用户名、密码验证,再创建数据库,再连接数据库;而轻量级的sqlite省略了前面的过程直接连接,如果这个数据库不存在的话,会新生成一个库,数据保存在一个单db文件中。
    (了解) sqlite3.connect(’:memory:’)
  3. 生成游标。 游标:游标是对数据库某一行某一格进行增删改查的操作者,就好像操作excel表格是的鼠标。
  4. 插入一些数据。注意主键id列不能重复
  5. 关闭游标。 这一步可以省略。
  6. 提交 commit。 除了查询,增加、修改、删除操作都需要在执行sql提交,否则不生效,好像平时用软件保存时的确认对话框。
  7. 断开会话连接,释放资源。

示例2 sqlite示例, 查找、修改、删除

  1. 查找表格中所有的值
cursor.execute("""
    SELECT id,name from student;
""")
student_list = cursor.fetchall()
print(student_list)
  1. 查询表格中某一个值
cursor.execute("""
    SELECT * FROM student WHERE name="小红";
""")
student = cursor.fetchone()
print(student)
  1. 修改表格中id等于那一行的值
cursor.execute("""
    UPDATE student SET name="大云" WHERE id=2;
""")
connect.commit()

cursor.fetchall() 取回结果集,形如[(1, ‘小王’), (2, ‘小红’)] 大列表,列表每一项是元组、是一行,元组里的每一项对应每一列的值。结果空返回[]。

cuesor.fetchone() 取回一条数据,形如 (2, ‘小红’)。结果空返回None类型。如果select符合多条,返回多条结果里的一条。

cursor.fetchxxx() 方法为了节省内存和速度采取了生成器结构,只能取一次

可能出现的异常:

  1. 唯一约束错误,主键重复。
    sqlite3.IntegrityError: UNIQUE constraint failed: student. id
  2. 表已存在重复创建。
    sqlite3.OperationalError: table student already exists
  3. 无法操作已关闭的数据库。
    sqlite3.ProgrammingError: Cannot operate on a closed cursor.

sql基础语法补充:

1. 一张表一般都有一列主键,主键primary key一般名叫 id,字段类型一般为自增整数。当insert行内容时,sql语句可以不插入id列,数据库会帮你自动插入并自增auto increase
主键不能重复,主键好处是确保数据一致性,方便查询。 如果一列为主键,那么必然非空notnull和唯一unique。
2. 如果工作中一个数据库连接实例下有多个库,那么表名要带上命名空间。例如 main, student
3. 丢弃表 drop。 跟delete关键字更加严重,delete删除某行或清空表内容,但是表结构还在,而drop是完全删除丢弃整个表,内容和结构都删除。drop table [表名]。
4. 字段被双引号括住,形如 SELECT “id”,“name” FROM student; 结果一样,好处是避免数据库关键字导致的错误,当数据库解释器遇到双引号时,会认为引号里的名字就是自定义的字段名而不是内置关键字。平时省事可以不加引号。

数据库概念补充:

数据库存储原理:数据按树型结构存储,查找数据时只需要对比几次就能查出来。数据量增大时,查询时间成对数慢速增长。
索引:index,目录。索引会占据一定存储空间,在数据库中以树型结构存储,建立的是目录到硬盘存储的数据的映射,就好像平时看的书籍。创建主键的那一列会自动创建索引。一般在查询经常比较的字段上创建索引(如id列、phone列)。优点大幅度提高select效率。缺点是占据更多的硬盘空间。
事务:transaction。 当有多句sql语句的时候,例如sql1 插入银行交易表一行数据金额100元、sql2 修改刚才插入的一行数据的金额为98元,但执行sql1的时候由于用户拥堵等原因执行失败,这是在执行sql2必然错误或误修改其他的正常数据。为了避免这种情况,把这两句sql都放入一个事务执行,只要一个事务中任意一条sql执行失败,那么其他已执行的sql会回到修改前状态(回滚rolling),只有当所有sql都执行成功,才会一起commit生效。简单来说,事务要么都执行,要么出错都不行。优点保证数据一致性。

猜你喜欢

转载自blog.csdn.net/ai_sxy/article/details/84146194