ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

5.5python笔记

2022-05-31 01:00:46  阅读:170  来源: 互联网

标签:dep 级联 5.5 python 笔记 int 外键 key id


约束条件之外键及查询关键字

约束条件之外键

# 创建一张员工表
		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

标签:dep,级联,5.5,python,笔记,int,外键,key,id
来源: https://www.cnblogs.com/zq0408/p/16328953.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有