5.5python笔记
2022/5/31 1:49:54
本文主要是介绍5.5python笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
约束条件之外键及查询关键字
约束条件之外键
# 创建一张员工表 id name age dep_name dep_desc 缺陷>>>: 1.表重点不清晰,可以说是员工表也可以是部门表 2.表中某些字段对应数据重复,浪费存储空间 3.表的扩展性差,牵一发动全身,耦合度太高不利维护 解决>>>: 将这张表分成两张表: 员工表>>>: id name age 部门表>>>: id dep_name dep_desc 解决后缺陷>>>: 致命缺陷:员工与部门没有绑定关系 再次优化>>>: 在员工表中添加一个‘部门编号’字段dep_id,与部门表的主键字段对应 # 引入知识 添加的部门编号字段其实就是外键字段>>>: 记录表与表之间关系的数据
外键关系之一对多
# 换位思考 以员工表与部门表为例 1.先站在员工表的角度 问:一个员工能否对应多个部门 答:不可以 2.再站在部门表的角度 问:一个部门能否对应多个员工 答:可以 结论:换位思考之后得出的答案是一个可以一个不可以 (1)所以关系是"一对多",部门是'一'员工是'多' (2)关系表达只能用一对多,不能用多对一 (3)一对多关系,外键字段建在"多"的一方(员工表) # 外键sql语句 foreign key(dep_id) references dep(id) (1)创建表的时候,应该先创建被关联表(没有外键字段的表) (2)插入数据的时候,应该先插入被关联表(没有外键字段的表);因为外键字段填入的值只能是被关联表中已经存在的主键值 问题:修改、删除被关联表数据都会出现障碍,且报错 解决办法>>>: 级联更新、级联删除 # 级联更新、级联删除 on update cascade # 级联更新,外键关联的表主键更新,另一个表对应数据也更新 on delete cascade # 级联删除,外键关联的表主键删除,另一个表对应数据删除 # 添加外键sql语句总结: create table 员工表( id int; name vrchar(32); ... foreign key(部门表_id) references 部门表(id) on update cascade on delete cascade # 外键+级联更新、删除 ) """ 在实际工作中外键也可能不会使用 因为外键会消耗额外的资源 并且会增加表的复杂度 表很多的情况下 我们也可以通过SQL语句的形式建立逻辑意义上的表关系 """
一对一关系表>>>外键sql语句代码操作:
# 在创建表字段的时候也可以给每个字段添加中文注释>>> comment '注释内容' 员工表>>>: create table emp( id int primary key auto_increment comment '编号', name varchar(32) comment '姓名', age int comment '年龄', dep_id int comment '部门编号', foreign key(dep_id) references dep(id) on update cascade on delete cascade # 添加外键及级联更新、级联删除 ); 部门表>>>: create table dep( id int primary key auto_increment comment '编号', dep_name varchar(32) comment '部门名称', dep_desc varchar(32) comment '部门描述' );
多对多关系
#以图书表和作者表为例 1.先站在图书表的角度 问:一本书籍能否对应多名作者 答:可以 2.再站在作者表的角度 问:一名作者能否对应多本书籍 答:可以 结论:换位思考之后两边都可以 那么就是"多对多"关系 # 针对多对多关系,需要单独开设第三张表专门存储两张表的关系,这两张表叫“基表” 图书表>>>: create table book( id int primary key auto_increment, title varchar(32), price float(10,2) ); 作者表>>>: create table author( id int primary key auto_increment, name varchar(32), gender enum('male','female','others') ); 第三张表>>>: create table book2author( id int primary key auto_increment, author_id int, book_id int, foreign key(author_id) references author(id) on update cascade # 级联更新 on delete cascade, # 级联删除 foreign key(book_id) references book(id) on update cascade # 级联更新 on delete cascade # 级联删除 );
一对一关系
# 数据分析 1.以QQ用户表为例,分析里面的数据分为两类>>>: 热数据:经常使用的数据 >>> qq号码、座右铭、个人简介、爱好等 冷数据:不经常使用的数据 >>> 邮箱、电话、学校等 2.为节省资源并降低数据库压力,将表一分为二>>>: 用户表:存放使用频率较高的数据字段 用户详情表:存放使用频率较低的数据字段 # 换位思考 先站在用户表的角度 问:一个用户数据能否对应多个用户详情数据 答:不可以 再站在用户详情表的角度 问:一个用户详情数据能否对应多个用户数据 答:不可以 结论:换位思考之后两边都不可以,那么关系可能有两种 (1)'没有关系' (2)'一对一关系' 针对'一对一关系'外键字段建在任意一方都可以,但是推荐建在查询频率较高的一方 # sql语句代码 用户表>>>: create table user( id int primary key auto_increment, name varchar(32), gender enum('male','female','others'), user_detail_id int unique, # 加unique是因为数据是一对一的,要保证不能重复 foreign key(user_detail_id) reference userdetail(id) on update cascade on delete cascade ) 用户详情表>>>: create table userdetail( id int primary key auto_increment, phone bigint, age int );
表查询关键字
# 数据准备 创建员工表>>>: create table emp( id int primary key auto_increment, #主键 name varchar(20) not null, # 姓名 非空 sex enum('male','female') not null default 'male', #大部分是男的 age int(3) unsigned not null default 28, # 年龄 非空 默认28 hire_date date not null, # 入职日期 非空 post varchar(50), # 岗位 post_comment varchar(100), salary double(15,2), # 薪资 office int, # 办公室一个部门一个屋子 depart_id int # 部门 );
查询关键字之select与from
select # 用于指定查询的字段 from # 用于指定查询的表 select id,name from mysql.user; # 查询user中的id和name字段 '''查询关键字其实有先后执行顺序 但是无需过多在意!!!'''
查询关键字之where筛选
# 1.查询id大于等于3且小于等于6的数据 select * from emp where id>=3 and id<=6; select * from emp where id between 3 and 6; # 2.查询薪资是20000或者18000或者17000的数据 select * from emp where salary=20000 or salary=18000 or salary=17000; select * from emp where salary in (20000,18000,17000); # 成员运算 # 3.查询id小于3和大于6的数据 select * from emp where id not between 3 and 6; # 数据取反 # 4.查询薪资不在20000,18000,17000的数据 select * from emp where salary not in (20000,18000,17000); # 5.查询岗位描述为空的数据 select * from emp where post_comment=null # 报错!针对null只能用is不能用等号 select * from emp where post_comment is null; # 不报错 # 6.查询员工姓名中包含字母o的员工姓名和薪资 查询条件如果不是很明确的情况下 我们统一称之为'模糊查询' 关键字 like : 开启模糊查询的关键字 关键符号 % : 匹配任意个数的任意字符 _ : 匹配单个个数的任意字符 select name,salary from emp where name like '%o%'; # 前后加%表示匹配任意字符 # 7.查询员工姓名是由四个字符组成的数据 select * from emp where name like '____'; # 用四个下划线可以指代四个字符 select * from emp where char_length(name)=4; # char_length获取字符长度也可以
查询关键字之group by分组
#按照指定的条件将单个单个的个体组织成一个个整体 #为什么需要分组: 分组的好处在于可以快速统计出某些数据 #如何分组: # 按照岗位分组并查询所有数据 select * from emp group by post; 如果是MySQL5.6及以下版本>>>: 有几个组就显示几行数据,且会显示其他字段的信息,但是只显示一条,每条数据默认显示该组的第一条数据 mysql5.7及以上版本>>>: 默认自带sql_mode=only_full_group_by 输入上面代码就会报错! 因为该模式要求分组之后默认只可以直接获取分组的依据,不能直接获取其他字段; 原因是分组的目的就是按照分组的条件来管理诸多数据 最小单位应该是分组的依据而不是单个单个的数据; select post from emp group by post; # 这样才不会报错,且展示的数据仅限分组后的post的数据(单个不重复) # 结论:如果是MySQL5.6及以下版本,需要自己手动添加>>>: sql_mode=only_full_group_by
这篇关于5.5python笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门