第一课 了解SQL
1.1.2 表
关键:存储在表中的数据是同一种类型的数据或清单。
数据库中的每个表都有一个名字来标识自己。这个名字是唯一的,即相同数据库中没有两个相同的表名(不同数据库可以有两个相同的表名)。
模式:关于数据库和表的布局及特性的信息。这些特性定义了存储什么样的数据、数据如何分解、各部分信息如何命名等。
1.1.3 列和数据类型
表由列组成。所有表都是由一个或多个列组成的。
正确地将数据分解为多个列极为重要。
数据库中每个列都有相应的数据类型。数据类型(datatype)定义了列可以存储哪些数据种类。
在创建表时必须特别关注所用的数据类型。
注意:数据类型及其名称是SQL不兼容的一个主要原因。
1.1.4 行
行:表中的一个记录。表中的数据是按行存储的。
主键:表中每一行都应该有一列(或几列)可以唯一标识自己。唯一标识表中每行的这个列(或这几列)称为主键。(没有主键,更新或删除表中特定行就极为困难,因为你不能
保证操作只涉及相关的行)
提示:应该总是定义主键。为了以后方便管理。
表中的任何列都可以作为主键,只要它满足以下条件:
任意两行都不具有相同的主键值;
每一行都必须具有一个主键值(主键列不允许NULL值);
主键列中的值不允许修改或更新;
主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)
SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured Query Language)的缩写。SQL是一种专门用来与数据库沟通的语言。SQL的目的是很好地完成一项任务——提供一种从数据库中读写数据的简单有效的方法。
(引入sqlite3模块在python中使用《python程序设计教程》)
Python内建了SQLite数据库。
1. 创建数据库与连接数据库
-
import sqlite3
-
conn = sqlite3.connect('db.sqlite3') # 指定文件名称,存在直接打开,不存在就会创建一个并打开
-
conn # 返回 connection 对象
-
conn.close()
可以使用connection对象的cursor()方法获取cursor对象,利用它的execute()方法来执行创建数据表的SQL语句。例如:
conn = sqlite3.connect('db1.sqlite3') conn <sqlite3.Connection at 0x23069939ab0> c.execute('''CREATE TABLE message( id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,name TEXT NOT NULL, email TEXT NOT NULL,msg TEXT NOT NULL )''') <sqlite3.Cursor at 0x2306b27fdc0> conn.commit() conn.close()
在上面创建了一个message数据表,其中有id,name,email与msg4个字段,id会自动以流水号方式递增字段值,sqlite3模块的实现默认下不会自动提交SQL执行后的变更,必须自行调用Connection的commit()方法变更才会生效。
也可以使用with区块的操作,操作完成后会自动commit()与close(),若发生例外,会自动rollback():
import sqlite3 with sqlite3.connect('db.sqlite3')as conn: c = conn.cursor() c.execute('''CREATE TABLE message( id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,name TEXT NOT NULL, email TEXT NOT NULL,msg TEXT NOT NULL )''')
若要新增数据,也是使用cursor的execte()方法:
with sqlite3.connect('db.sqlite3')as conn: c = conn.cursor() c.execute("INSERT INTO message VALUES(1,'justin','[email protected]','message...')")
3. 查询数据
先使用cursor的execte()执行查询,
再使用fetchone()可以获取结果集合中的一笔数据
使用fetchall()可以获取结果集合中的全部数据
使用fetchmany()指定要从结果集合中获取几笔数据
conn = sqlite3.connect('db1.sqlite3') c = conn.cursor() c.execute('SELECT*FROM message') <sqlite3.Cursor at 0x125fe60cdc0> c.fetchall() [(1, 'justin', '[email protected]', 'message...')] conn.close()