一、数据库管理系统
MySQL、 Qracle、SQLite、Access、MS SQL Server
数据库系统的特点:1.数据结构化
2.数据共享、冗余度低、易扩充
3.数据独立性高
4.数据由DBMS统一管理和控制:数据的安全性保护、数据的完整性检查、并发控制、数据库恢复
二、数据库的优点
程序稳定性:服务的机器崩溃不影响数据和另外的服务。
数据一致性:操作和存储的数据在一起。
并发:支持并发,数据库的操作都是通过网络,数据库支持并发的网络操作,不需要我们手写socket
效率:使用数据库对数据进行增删改查高出我们对文件的处理。
ps:并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间宏观上有多个程序在同时执行,但在单处理机系统中,每一时刻只能有一道程序在执行,所以微观上这些程序只能交替执行。
三、分类
关系型和非关系型
简单的说,关系型数据库需要有表结构,非关系型数据库是key-value存储的,没有表结构
关系型:MySQL、SQLite,db2,Oracle,access,sql server
非关系型:mongodb,redis,memcache
四、初识sql语句
创建表:create+table+表名(字段名 [(宽度) 约束条件])
create table staff_info (id int,name varchar(50),age int(3));
查看表结构:desc+表名 desc即describle
1.操作数据库:增(create)、删(drop)、改(alter)、查(show)+database+库名
2.操作表:同上+table+表名
3.操作字段:增(insert into+表名+values())、删(delete from+表名where+字段)、改(updata+表名+字段)、查(select +字段)
清空表:
delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
truncate table t1;数据量大,删除速度比上一条快,且直接从零开始,
建立表之间的关系:关联方式(foreign key)
如:foreign key(press_id) references press(id)
on delete cascade
on update cascade;
ps:括号里分别为两个表中的一个字段、外键的字段一定要保证unique。cascade表示级联删除和更新
五、表查询
1.单表:select 字段 ...... from 表名/where 条件/Group By field/Having 筛选/Order by field/limit 限制条数 优先级从高到低依次从左往右
2. 多表:
select employee.id,employee.name,employee.age,department.name from employee inner/left/right join department on employee.dep_id=department.id; 内联左联/右联
3.全外联接:
select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id;
4.关键字IN查询
使用IN关键字,进行子查询时,内层查询语句返回一个数据列,这个数据列中的值,将供外层查询语句进行比较操作
#查看技术部员工姓名 select name from employee where dep_id in (select id from department where name='技术');
六、索引
本质:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
数据结构:b+树
聚集索引:按照表中的主键构造一颗b+树,叶子节点存放着所有的数据
辅助索引:每张表上可以有多个辅助索引,但只能有一个聚集索引。辅助索引的叶子节点不包含行记录的全部数据。
覆盖索引:从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录。
使用覆盖索引的一个好处是:辅助索引不包含整行记录的所有信息,故其大小要远小于聚集索引,因此可以减少大量的IO操作
联合索引:联合索引是指对表上的多个列合起来做一个索引,即多个索引列。好处:是在第一个键相同的情况下,已经对第二个键进行了排序处理。
七、操作mysql
mysql的安装:pip install PyMySQL
1.python连接数据库
import pymysql db = pymysql.connect("数据库ip","用户","密码","数据库" ) # 打开数据库连接 cursor.execute("SELECT VERSION()") # 使用 execute() 方法执行 SQL 查询 data = cursor.fetchone() # 使用 fetchone() 方法获取单条数据 print ("Database version : %s " % data) db.close() # 关闭数据库连接
2.创建表操作
import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() # 使用 execute() 方法执行 SQL,如果表存在则删除 cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # 使用预处理语句创建表 sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" cursor.execute(sql) # 关闭数据库连接 db.close()
3.操作数据
import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 插入语句 sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" # SQL 更新语句 sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') # SQL 删除语句 sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20) try: cursor.execute(sql) # 执行sql语句 db.commit() # 提交到数据库执行 except: db.rollback() # 如果发生错误则回滚 # 关闭数据库连接 db.close()
import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 查询语句 sql = "SELECT * FROM EMPLOYEE \ WHERE INCOME > %s" % (1000) try: cursor.execute(sql)# 执行SQL语句 results = cursor.fetchall()# 获取所有记录列表 for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # 打印结果 print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \ (fname, lname, age, sex, income )) except: print ("Error: unable to fetch data") # 关闭数据库连接 db.close()
Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。
- fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
- fetchall(): 接收全部的返回结果行.
- rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。