Python教程

5.5python笔记

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