文章目录
- 版权声明
- 准备:MYSQL数据库
- 数据库简介
- 数据库分类
- 数据库管理系统
- SQL语句
- 关系型数据库中核心元素
- MySQL环境搭建
- Mysql数据类型
- 数据完整性和约束
- MYSql基本操作
- 登录和退出数据库命令
- 数据库基本操作命令
- 数据表基本操作命令
- 数据表结构修改命令
- 表数据操作命令
- Mysql查询
- 视图
- 事务
- 数据库设计三范式
- Python连接MySQL数据库
- Python连接MySQL数据库
- 演示
- 演示sql库
- 查询操作演示
- 增删改操作演示
- SQL注入
- 语句参数化演示
版权声明
- 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。
- 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。
- 若您是黑马程序员或相关权利人,如有任何侵犯版权的地方,请您及时联系我,我将立即予以删除或进行必要的修改。
- 对于其他读者,请在阅读本博客内容时保持遵守相关法律法规和道德准则,谨慎参考,并自行承担因此产生的风险和责任。
- 本博客中的部分观点和意见仅代表我个人,不代表黑马程序员的立场。
准备:MYSQL数据库
数据库简介
- 数据库就是用户计算机上的一些具有特殊格式的数据文件的集合.
数据库的特点:
- 持久化存储
- 读写速度极高
- 保证数据的有效性
- 对程序支持性非常好,容易扩展
数据库分类
- 关系型数据库
- 非关系型数据库
- 关系数据库,是指采用了关系模型来组织数据的数据库,简单来说,关系模型指的就是二维表格模型
-
关系形数据库
-
MySQL采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体使用成本低,尤其是开源,一般中小型网站的开发都选择MySQL作为网站数据库。
常见的关系型数据库:
- oracle : 银行,电信等项目
- ms sql server:在微软的项目中使用
- sqlite:轻量级数据库,主要应用在移动平台
- mysql:web时代使用最广泛的关系型数据库。
非关系型数据库
- 非关系型数据库,又被称为NoSQL(Not Only SQL ),意为不仅仅是SQL,对NoSQL 最普遍的定义是“非关联型的”,强调Key-Value 的方式存储。
数据库管理系统
- 数据库管理系统( Database Management System,简称DBMS)是为管理数据库而设计的软件系统。包括三大部分构成。
- 数据库文件集合:主要是一系列的数据文件,作用是存储数据。
- 数据库服务器:主要负责对数据文件以及文件中的数据进行管理。
- 数据库客户端:主要负责和服务端通信,向服务端传输数据或者从服务端获取数据。
SQL语句
- SQL(Structured Query Language)是结构化查询语言,是一种用来操作RDBMS的数据库语言。当前几乎所有关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 oracle,sql server,mysql,sqlite 等等所有的关系型的数据库。
- Relational Database Management System ——关系型数据库管理系统RDBMS,是专门用来管理关系型数据库的系统.
关系型数据库中核心元素
MySQL环境搭建
-
centos7环境请参考
- Centos7安装mysql
- linux下安装MySQL上
- linux下安装MySQL
-
Ubuntu20配置Mysql常用操作
-
客户端建议使用Navicat,有关安装和使用教程推荐网络教程,不再赘述
Mysql数据类型
- 数据类型详解【上】
- 数据结构详解【下】
数据完整性和约束
- 数据完整性是指数据库中存储的数据遵循预定义的规则和约束。它确保数据的准确性、一致性和有效性,并防止无效或不一致的数据进入数据库。
MySQL中实现数据完整性的常见方法:
-
主键约束(Primary Key Constraint):通过在表中定义一个唯一标识符字段作为主键,确保每条记录都具有唯一的标识。主键可以由一个或多个字段组成。这样可以防止插入重复的数据。
-
唯一约束(Unique Constraint):通过在表的字段上定义唯一约束,确保该字段中的值在整个表中是唯一的。与主键不同的是,唯一约束可以允许空值。
-
非空约束(Not Null Constraint):通过在表的字段上定义非空约束,确保该字段中的值不能为空。这样可以防止插入空值或缺失值。
-
外键约束(Foreign Key Constraint):通过在表之间建立关联,定义外键约束来维护数据之间的关系。外键约束要求参考表中的值必须存在于主表中的相关字段中。这样可以确保数据的一致性和引用完整性。
-
检查约束(Check Constraint):通过在表的字段上定义检查条件,限制该字段中的值必须满足指定的条件。这样可以确保数据的有效性和一致性。
- 约束 是保证数据的完整性和一致性。把性别字段设置为default “保密”, 当不输入张三性别信息时,依然用”保密”保证张三信息的完整
- 约束可参阅约束详细讲解
MYSql基本操作
登录和退出数据库命令
命令 | 作用 |
---|---|
mysql -u用户名-p密码 | 连接数据库 |
exit / quit / ctrl + d | 退出数据库 |
select version(); | 查看版本信息 |
select now(); | 查看时间 |
数据库基本操作命令
命令 | 作用 | 示例 |
---|---|---|
show databases; | 查看所有数据库 | show databases; |
select database(); | 查看当前使用的数据库 | select database() |
create database 数据库名 charset=utf8; | 创建数据库 | create database python charset=utf8; |
use数据库名; | 使用数据库 | use python; |
drop database 数据库名; | 删除数据库-慎重 | drop database python; |
数据表基本操作命令
命令 | 作用 |
---|---|
show tables; | 查看当前数据库中所有表\ |
desc 表名; | 查看表结构 |
show create table; | 表名查看表的创建语句-详细过程 |
数据表结构修改命令
命令 | 作用 |
---|---|
mysal -u用户名 -p密码 | 连接数据库 |
exit / quit / ctrl + d | 退出数据库 |
select version(); | 查看版本信息 |
select now(); | 查看时间 |
表数据操作命令
- 修改查询数据
- 删除数据
Mysql查询
- 数据库基础篇
视图
- 视图
事务
- https://yuanyou.blog.csdn.net/article/details/124534629
数据库设计三范式
- 数据库的设计规范【上】-1~3范式和反范式化
- 范式:设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,
各种范式呈递次规范,越高的范式数据库冗余越小。 - 三范式:
- 第一范式(1NF): 强调的是列的原子性,即列不能够再分成其他几列。
- 第二范式(2NF): 满足 1NF,另外包含两部分内容,一是表必须有一个主键;二是非主键字段 必须完全依赖于主键,而不能只依赖于主键的一部分。
- 第三范式(3NF): 满足 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
Python连接MySQL数据库
Python连接MySQL数据库
- pymysql使用步骤
-
安装PyMySQL库:
sudo pip3 install pymysql
-
导入PyMySQL库:在Python脚本中导入PyMySQL库
import pymysql
-
建立数据库连接:使用
pymysql.connect()
函数建立与MySQL数据库的连接。connection = pymysql.connect(host='localhost',user='your_username',password='your_password',database='your_database_name')
-
创建游标对象
cursor = connection.cursor()
-
执行SQL语句:使用游标对象的
execute()
方法执行SQL语句。sql = "SELECT * FROM table_name" cursor.execute(sql)
-
获取结果:使用游标对象的
fetchall()
或fetchone()
方法获取执行SQL语句后的结果。fetchall()
返回所有结果,而fetchone()
返回单条结果。
results = cursor.fetchall() for row in results:print(row)
-
提交事务和关闭连接:在完成所有数据库操作后,需要提交事务以保存更改,并关闭数据库连接。
connection.commit()
connection.close()
演示
演示sql库
-- 创建 "京东" 数据库
create database jing_dong charset=utf8;-- 使用 "京东" 数据库
use jing_dong;-- 创建一个商品goods数据表
create table goods(id int unsigned primary key auto_increment not null,name varchar(150) not null,cate_name varchar(40) not null,brand_name varchar(40) not null,price decimal(10,3) not null default 0,is_show bit not null default 1,is_saleoff bit not null default 0
);-- 向goods表中插入数据insert into goods values(0,'r510vc 15.6英寸笔记本','笔记本','华硕','3399',default,default);
insert into goods values(0,'y400n 14.0英寸笔记本电脑','笔记本','联想','4999',default,default);
insert into goods values(0,'g150th 15.6英寸游戏本','游戏本','雷神','8499',default,default);
insert into goods values(0,'x550cc 15.6英寸笔记本','笔记本','华硕','2799',default,default);
insert into goods values(0,'x240 超极本','超级本','联想','4880',default,default);
insert into goods values(0,'u330p 13.3英寸超极本','超级本','联想','4299',default,default);
insert into goods values(0,'svp13226scb 触控超极本','超级本','索尼','7999',default,default);
insert into goods values(0,'ipad mini 7.9英寸平板电脑','平板电脑','苹果','1998',default,default);
insert into goods values(0,'ipad air 9.7英寸平板电脑','平板电脑','苹果','3388',default,default);
insert into goods values(0,'ipad mini 配备 retina 显示屏','平板电脑','苹果','2788',default,default);
insert into goods values(0,'ideacentre c340 20英寸一体电脑 ','台式机','联想','3499',default,default);
insert into goods values(0,'vostro 3800-r1206 台式电脑','台式机','戴尔','2899',default,default);
insert into goods values(0,'imac me086ch/a 21.5英寸一体电脑','台式机','苹果','9188',default,default);
insert into goods values(0,'at7-7414lp 台式电脑 linux )','台式机','宏碁','3699',default,default);
insert into goods values(0,'z220sff f4f06pa工作站','服务器/工作站','惠普','4288',default,default);
insert into goods values(0,'poweredge ii服务器','服务器/工作站','戴尔','5388',default,default);
insert into goods values(0,'mac pro专业级台式电脑','服务器/工作站','苹果','28888',default,default);
insert into goods values(0,'hmz-t3w 头戴显示设备','笔记本配件','索尼','6999',default,default);
insert into goods values(0,'商务双肩背包','笔记本配件','索尼','99',default,default);
insert into goods values(0,'x3250 m4机架式服务器','服务器/工作站','ibm','6888',default,default);
insert into goods values(0,'商务双肩背包','笔记本配件','索尼','99',default,default);
查询操作演示
# 导入pymysql包
import pymysql# 创建连接对象
conn = pymysql.connect(host="192.168.1.30", port=3306,user="root", password="mysql",database="jing_dong", charset="utf8")
# 获取游标对象
cs = conn.cursor()# pymysql完成数据的查询操作
sql = "select name from goods;"
cs.execute(sql)
content = cs.fetchone()print(content)
content = cs.fetchall()
print(content)# 关闭游标和连接
cs.close()
conn.close()
增删改操作演示
# 导入pymysql包
import pymysql# 创建连接对象
conn = pymysql.connect(host="192.168.1.30", port=3306, user="root", password="mysql", database="jing_dong", charset="utf8")
# 获取游标对象
cs = conn.cursor()# 增加数据
sql = "insert into goods values(0,'惠普战x 2023款 15.6英寸笔记本','笔记本','惠普','4999',default,default)"
cs.execute(sql)
# 删除数据
sql = "delete from goods where id=21"
cs.execute(sql)
# 修改数据
sql = "update goods set name='天选 15.6寸笔记本' where id=1;"
cs.execute(sql)# pymysql完成数据的查询操作
sql = "select * from goods;"
# for循环显示数据
cs.execute(sql)
content = cs.fetchall()
for i in content:print(i)# 提交操作
conn.commit()# 关闭游标和连接
cs.close()
conn.close()
SQL注入
- SQL注入:用户提交带有恶意的数据与SQL语句进行字符串方式的拼接,从而影响了SQL语句的语义,最终产生数据泄露的现象。
避免SQL注入的常见方法:
-
使用参数化查询(Prepared Statements):参数化查询是使用占位符(如
?
或%s
)代替直接将用户输入嵌入到SQL查询语句中。数据库引擎会将用户输入作为参数处理,避免了注入攻击。大多数现代的数据库驱动程序和ORM框架都支持参数化查询。例如,在PyMySQL中可以使用参数化查询来避免SQL注入。 -
验证和过滤用户输入:对于接收用户输入的字段,进行输入验证和过滤是非常重要的。检查输入是否符合预期的格式、类型和范围,并拒绝包含可疑字符或特殊字符的输入。可以使用正则表达式或内置的字符串函数进行验证和过滤。
-
最小权限原则:在设置数据库用户权限时,确保每个应用程序只具有其所需的最低权限。避免使用超级用户或具有过多权限的账号来连接数据库。
-
不要将用户输入直接拼接到SQL查询中:避免将用户输入直接嵌入到SQL查询语句中,即使对于简单的查询也要谨慎处理。使用参数化查询或ORM框架可以更安全地构建和执行SQL查询。
-
定期更新和维护数据库软件:及时更新数据库引擎和相关软件补丁,以修复已知的安全漏洞。同时,密切关注数据库供应商和安全专家发布的安全通告和建议。
-
日志记录和监控:实施日志记录和监控机制,以便检测和识别潜在的SQL注入攻击。监视异常查询、错误日志和其他不寻常活动,并及时采取相应的措施。
语句参数化演示
# 导入pymysql包
import pymysql
import binascii# 创建连接对象
conn = pymysql.connect(host="192.168.1.30", port=3306, user="root", password="mysql", database="jing_dong", charset="utf8")
# 获取游标对象
cs = conn.cursor()# 获取用户输入
find_name = input("请输入您要查询的商品姓名: ")# 使用 with 语句自动管理资源
with cs as cursor:# 执行 SQL 查询sql = "SELECT * FROM goods WHERE name LIKE %s"cursor.execute(sql, (f"%{find_name}%",)) # 使用 f-string 格式化占位符的值# 获取结果results = cursor.fetchall()for row in results:# 处理 bit 类型数据readable_bit_data = binascii.hexlify(row[5]).decode('utf-8')# 输出结果print(row[0], row[1], row[2], row[3], row[4], readable_bit_data)# 关闭数据库连接(with 语句会自动处理关闭连接)