数据库基本语法(增删改查)
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操作数据库要使用驱动。
步骤:
- 引入驱动包
- 连接数据库,得到会话。 中大型数据库需要先用户名、密码验证,再创建数据库,再连接数据库;而轻量级的sqlite省略了前面的过程直接连接,如果这个数据库不存在的话,会新生成一个库,数据保存在一个单db文件中。
(了解) sqlite3.connect(’:memory:’) - 生成游标。 游标:游标是对数据库某一行某一格进行增删改查的操作者,就好像操作excel表格是的鼠标。
- 插入一些数据。注意主键id列不能重复
- 关闭游标。 这一步可以省略。
- 提交 commit。 除了查询,增加、修改、删除操作都需要在执行sql提交,否则不生效,好像平时用软件保存时的确认对话框。
- 断开会话连接,释放资源。
示例2 sqlite示例, 查找、修改、删除
- 查找表格中所有的值
cursor.execute("""
SELECT id,name from student;
""")
student_list = cursor.fetchall()
print(student_list)
- 查询表格中某一个值
cursor.execute("""
SELECT * FROM student WHERE name="小红";
""")
student = cursor.fetchone()
print(student)
- 修改表格中id等于那一行的值
cursor.execute("""
UPDATE student SET name="大云" WHERE id=2;
""")
connect.commit()
cursor.fetchall() 取回结果集,形如[(1, ‘小王’), (2, ‘小红’)] 大列表,列表每一项是元组、是一行,元组里的每一项对应每一列的值。结果空返回[]。
cuesor.fetchone() 取回一条数据,形如 (2, ‘小红’)。结果空返回None类型。如果select符合多条,返回多条结果里的一条。
cursor.fetchxxx() 方法为了节省内存和速度采取了生成器结构,只能取一次
可能出现的异常:
- 唯一约束错误,主键重复。
sqlite3.IntegrityError: UNIQUE constraint failed: student. id - 表已存在重复创建。
sqlite3.OperationalError: table student already exists - 无法操作已关闭的数据库。
sqlite3.ProgrammingError: Cannot operate on a closed cursor.