问题:
数据库本身就是一种文件,用户可以不使用数据而使用普通文件来进行数据的存储吗?从理论上可以,但是相比于普通文件,数据有以下特点:
- 持久化存储;
- 读写速度极高;
- 保证数据的有效性;
- 对程序支持性非常好,容易拓展;
5、非关系型数据库
小结
数据库三部分之间的关系
2、SQL语句
SQL语句的作用是实现数据库客户端和服务端之间的通信;
其表现形式为:带有一定格式的字符串;
SQL(Structured Query Language)是结构化查询语言—是对于RDBMS(关系型)
SQL语句主要分为:
对于web程序员,最重要的就是crud(增删查改),必须熟练编写DQL、 DML, 能够编写DDL完成数据库、 表的操作, 其它语⾔如TPL、 DCL、 CCL了解即可;
3、关系型数据库中核心元素
1、数据库分类
4、参照完整性—父类删除,子类也要跟着删除
5、用户定义完整性(在用户定义的取值范围内,男/女)
6、常见约束介绍
- 目标
- 使用Navicat创建数据库;
- 使用Navicat在数据库中创建数据库表;
- 使用Navicat在数据库中添加数据;
- 数据库客户端工具使用三个方面:
- 1)数据库操作;
- 2)数据表的操作;
- 3)数据库表中数据的操作;
1、数据类型简述
2、数值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f36pbesL-1654428641579)(https://raw.githubusercontent.com/caterpillar-0/picture/main/image-20220528152037284.png)]
- 学习目标
- 说出as的作用;
- 说出distinct的作用;
注意,起了别名,在后面as s,前面就不可以在用students.id了
小结
- 目标
- 说出排序使用的关键字;
- 说出升序和降序分别使用的关键字
- 程序中的排序:
- 以⼤家搜索百度为例。 ⽤户在百度上搜索 MySQL的特点, 作为⼀个⽹站往往需要把和⽤户最为需要的⽹⻚和数据发送给客户, 那么如何才能认定这个数据是⽤户最需要的呢? 百度就会把⽤户搜索的关键字和数据库中已经存在的⽹⻚进⾏关联性的分析, 将关联度⾼的⽹⻚准备发送给⽤户浏览, 但是问题来了 有很多关联性⼏乎⼀致的⽹⻚到底应该给⽤户优先推送哪个⽹⻚呢, 谁在前⾯谁在后⾯呢?
- 答案就是排序。 先将所有的数据的关联程度进⾏排序, 然后将关联程度⼀样的数据 根据 ⽐如⽤户的点击量等属性进⾏排序。
- 目标
- 求出集合中的数据的最大值/最小值;
- 求出集合中的数据的数量;
- 求出集合中数据的和;
- 求出集合中数据的平均值;
- 学习目标
- 分组的目的;
- 使用group by完成对数据的分组;
- 说出group_concat函数的作用;
- 使用聚合函数完成对分组结果的统计;
- 使用having完成对分组结果的条件过滤;
- 学习目标
- 知道limit关键字的作用;
- 知道limit后面两个参数的作用;
当排序经过数据分析之后, 根据关联度和点击量等属性排序后, 所有的数据的⼤⼩对于⽤户来讲是个天⽂数字并且⽤户也不⼀定需要这么⼤量的数据, 所以这个时候就有⼀个想法能不能把这么多数据分成⼀⻚⼀⻚的数据, ⽽ 根据⽤户的需要将数据分为⼀⻚⼀⻚地传输给⽤户的技术就是分⻚。
- 学习目标
- 1)说出连接的作用;
- 2)说出笛卡尔积,内连接,外连接;
- 3)inner join关键字完成对多张表的内连接查询(重点);
- 4)使用left join关键字完成对多张表的左连接查询;
- 5)使用right join关键字完成对多张表的右连接查询;
-- 连接查询(重点)
-- inner join ... on
-- select ... from 表A inner join 表B;
select * from students inner join classes;
-- 查询 有能够对应班级的学生以及班级信息
select * from students inner join classes on students.cls_id = classes.id;
-- 按照要求显示姓名、班级
select students.name, classes.name
from students inner join classes on students.cls_id = classes.id;
-- 给数据表起名字
select s.name, c.name from students s inner join classes c on s.cls_id = c.id;
-- 92写法
select s.name, c.name from students s, classes c where s.cls_id = c.id;
-- 查询学生以及对应班级信息,显示学生的所有信息students.*,只显示班级名称classes.name
select students.*, classes.name
from students inner join classes on students.cls_id = classes.id;
-- 在以上的查询中,将班级名称显示在第1列
select classes.name,students.*
from students inner join classes on students.cls_id = classes.id;
-- 查询 有能够对应班级的学生以及班级信息, 按照班级编号进行排序
-- select c.xxx s.xxx from students as s inner join clssses as c on .... order by ....;
select * from students s inner join classes c on s.cls_id = c.id order by c.id;
-- 当时同一个班级的时候,按照学生的id进行从小到大排序
select * from students s inner join classes c on s.cls_id = c.id order by c.id, s.id;
-- left/right join ....on
-- 查询每位学生对应的班级信息
select * from students left join classes on students.cls_id = classes.id;
-- 查询每班级对应的学生信息
select * from students right join classes on students.cls_id = classes.id;
-- 查询没有对应班级信息的学生
-- select ... from xxx as s left join xxx as c on..... where .....
-- select ... from xxx as s left join xxx as c on..... having ..... 不要使用
select students.*
from students left join classes on students.cls_id = classes.id
where classes.id is null;
- 学习目标
- 说出自连接作用;
- 说出自连接和普通连接上使用的区别;
-- 子查询
-- 标量子查询: 子查询返回的结果是一个数据(一行一列)
-- 列子查询: 返回的结果是一列(一列多行)
-- 行子查询: 返回的结果是一行(一行多列)
-- 查询出高于平均身高的信息(height)
-- 1 查出平均身高
select avg(height) from students;
-- 2 查出高于平均身高的信息
select * from students where height > (select avg(height) from students);
-- 查询学生的学号和班级编号对应的学生信息
-- select name from students where cls_id in (select id from classes);
-- 1 查出所有的班级id
select id from classes;
-- 2 查出能够对应上班级号的学生信息
select * from students where id in (select id from classes);
-- sql强化演练( goods 表练习)
-- 查询类型 cate_name 为 '超级本' 的商品名称 name 、价格 price ( where )
select name, price from goods where cate_name = '超级本';
-- 显示商品的种类
-- 1)分组的方式( group by )
select cate_name from goods group by cate_name;
-- 2)去重的方法( distinct )
select distinct cate_name from goods;
-- 求所有电脑产品的平均价格 avg ,并且保留两位小数( round )
select round(avg(price), 2) from goods;
-- 显示 每种类型 cate_name (由此可知需要分组)的 平均价格
select cate_name, avg(price) from goods group by cate_name;
-- 查询 每种类型 的商品中 最贵 max 、最便宜 min 、平均价 avg 、数量 count
select cate_name, max(price), min(price), avg(price), count(*) from goods group by cate_name;
-- 查询所有价格大于 平均价格 的商品,并且按 价格降序 排序 order desc
-- 1)查询平均价格 avg(price)
select avg(price) from goods;
-- 2)使用子查询
select * from goods where price > (select avg(price) from goods) order by price desc;
-- 查询每种类型中最贵的电脑的所有信息(难)
select * from goods where price in (select max(price) from goods group by cate_name);
-- 1 查找 每种类型 中 最贵的 max_price 价格
select cate_name, max(price), group_concat(name) from goods group by cate_name;
-- 2 关联查询 inner join 每种类型 中最贵的物品信息
select * from goods
inner join
(select cate_name, max(price) as max_price from goods group by cate_name) as max_price_goods
on goods.cate_name = max_price_goods.cate_name and goods.price = max_price_goods.max_price;
show create table goods;
-- 视图的定义方式
-- crete view 视图名 as select ....
-- 查出产品表中产品名称、分类名称以及对应品牌
-- 创建上述结果的视图( v_goods_info)
create view v_goods_info as
select goods.name gname,goods_cates.name gcname,goods_brands.name gbname
from goods
inner join goods_cates on goods.cate_id = goods_cates.id
inner join goods_brands on goods.brand_id = goods_brands.id;
-- 查看所有表和视图
show tables; # v_goods_info;
-- 当原表产品名称改变后,会影响视图(视图是虚拟表)
update goods set name = 'xxx' where id = 24;
-- 删除视图
-- drop view 视图名;
drop view v_goods_info;
-- 注意
-- 视图只能进行搜索
-- 视图作用总结
-- 1 提高了重用性,就像一个函数
-- 2 对数据库重构,却不影响已经编写好的程序运行
-- 3 提高了安全性能,可以对不同的用户
-- 4 让数据更加清
-- 视图最主要解决的问题
-- 程序对数据库操作,一旦数据库发生变化,程序需要修改,这时如果使用视图就可以解决这个问题
- 学习目标
- 说出事务的使用场景;
- 事务的四个特性以及分别含义;
- 学习目标
- 说出commit对事务的作用;
- 说出rollback对事务的作用;
- 学习目标
- 一个表结构设计是否满足范式的要求;
- 学习目标
- 了解E-R模型组成部分;
- 学习目标
- 说出python操作数据库的步骤;
- 能够connect方法创建连接对象;
- 使用连接对象的cursor()方法创建游标对象;
- 使用游标对象的execute()方法执行SQL语句;
- 使用游标对象的close()方法关闭游标对象;
- 使用连接对象的close()方法关闭连接对象;
# 1、导入模块 pymysql
import pymysql
# 2、建立连接对象 pymysql.connect(),默认为3306
conn = pymysql.connect(host='localhost', port=3306, user='root', password='123123', database='jing_dong')
# 3、创建游标对象
cur = conn.cursor()
# 4、使用游标对象执行SQL语句
result = cur.execute("select * from goods order by id desc")
print("查询到:%s条数据" % result)
# 5、获取执行的结果
# cur.fetchone() 从查询的结果中取出一条数据
# result_list = cur.fetchone()
# print(result_list)
result_list = cur.fetchall()
for line in result_list:
# line 一行 是一个元组
print(line)
cur.close()
conn.close()
- 学习目标
- 使用游标对象的fetchall()方法取出所有数据;
- 使用游标对象的fetchone()方法取出一条数据;
- 学习目标
- 能够使用grant创建一个用户并且授权;
2、授权权限
host如果为%。,表示可以使用本地或者任何IP地址登录数据库
authentication_string是存储用户密码的,加密之后的;
4、创建账户、授权
- 学习目标
- 修改一个用户的密码;
- 修改一个用户的权限;