本文主要是介绍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笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!