2020/02/02 05-消费者方法聚合分组关联查询

消费者方法

在这里插入图片描述
现在对数据没有任何消费,没执行,够懒在这里插入图片描述
试试集合的count
在这里插入图片描述
showresult,是要执行的,因为里面消费了,直接print是打印语句,不会去执行
在这里插入图片描述
在这里插入图片描述现在这样是子查询,效率低在这里插入图片描述
这两个位置加all都可以,会立即给你返回一个结果在这里插入图片描述
返回一个列表 在这里插入图片描述
all跟list一样立即返回
在这里插入图片描述
如果查无数据返回一个空列表
在这里插入图片描述
这是一个列表
在这里插入图片描述
这里是repr的一种表达方式
在这里插入图片描述
试试count方法,直接返回一个结果
在这里插入图片描述
现在外面没有中括号,搜索一个就没必要
在这里插入图片描述在这里插入图片描述
scalar也可以,也就是跟one相关
在这里插入图片描述
大于10018其实有2个,19和20
在这里插入图片描述
也就是one只能返回一个结果,返回超过一个结果,就抛出异常,只能正好返回一个
在这里插入图片描述
all没查到数据是返回一个空列表,现在没有行被发现,只能发现一个,如果没发现还会排除异常,我们还需要try,所以大多数情况下都会用all在这里插入图片描述
first,就是all里的第一个,没有数据也没有报异常,查无数据返回none在这里插入图片描述
在这里插入图片描述
有数据返回也没有中括号
在这里插入图片描述
其实做的就是limit
在这里插入图片描述
first查到返回一个对象,不是一个容器在这里插入图片描述
最常用的是count,查的结果有多少个,还有all,立即返回一个列表,方便遍历,一般也会使用first,很少使用one,one会带来一些问题。
scalar会拿one一行记录里的第一个元素

all返回全部的一个列表,没有返回空列表;
first,要么拿到,是一个元素,实体实例,不是容器,拿不到就none;
one,只能返回一个元素,不是就抛出异常,只能是一个;
count,里面有一个子查询

这些就是经常用的消费者方法
可以直接写在后面。这样emps就是一个数值
在这里插入图片描述
all,前面emps就是一个列表
在这里插入图片描述
消费者方法一旦执行,相当于前面想懒都不行,一旦有消费者方法就会触发它立即执行,产生sql语句,把数据拿回来

在这里插入图片描述

聚合、分组

在这里插入图片描述
不打印,因为消费者方法也得执行以下
在这里插入图片描述
这里就没有子查询,比之前消费者的count效率高
在这里插入图片描述
返回一个元组,因为count只能有一个元素
在这里插入图片描述
返回的记录是一个元组,代表一行
在这里插入图片描述
scalar拿到序列里的第一项
在这里插入图片描述
在这里插入图片描述
消费者方法每执行一次就会执行一遍,scalar是在one的基础上拿第一项在这里插入图片描述
min最小的
在这里插入图片描述
avg是平均的
在这里插入图片描述
还可以求sum
在这里插入图片描述
准备分组,查看salaries表
在这里插入图片描述
发工资,每天某个人不能重复,所以有个联合主键
在这里插入图片描述
在这里插入图片描述
现在分组了就不是one,就报错了
在这里插入图片描述
有两组数据,每组数据是个元组
在这里插入图片描述
男性从1号开始,女性从2号开始在这里插入图片描述在这里插入图片描述
其实分组字段应该写在前面,一般来讲分组后面用的字段,可以在前面投影的地方保留下来,其他字段都需要聚合函数
在这里插入图片描述
分开写需要写在query中,前面用什么字段,后面group by什么字段
在这里插入图片描述

关联查询

在这里插入图片描述
这三个表比较复杂
在这里插入图片描述
1 个员工可以对应多个部门,1个部门可以多个员工,n:n,多对多
在这里插入图片描述
还有一种情况是,一个员工只属于一个部门,部门里有多个员工,一对多,模式设计一般写1:n
在这里插入图片描述
多对多设计的套路需要建立第三张表,把employee和department的值放进去

在这里插入图片描述
一个员工可以到多个部门
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
还有索引
在这里插入图片描述
先把表构建成类
在这里插入图片描述
dept_emp的表比较特殊,是个多对多关系,emp_no来自employee的主键,dept_no来自于dept的主键,这两个主键在这个表里作为联合主键,一个部门职能出现同一个员工,合起来决定唯一性在这里插入图片描述
索引
在这里插入图片描述
这个索引是自动创建的,test数据库有两个栏位,分别引用自employees的emp_no和departments的dept_no,两个外键,做了级联删除,更新是限制,删除是级联在这里插入图片描述
但是生产不这么用,都是假删除在这里插入图片描述
现在需要使用外键foreignkey,用来指定谁是外键
在这里插入图片描述
部门是唯一的
在这里插入图片描述
指定Dept_emp的外键,写关联表
在这里插入图片描述、注释掉上面的
在这里插入图片描述
查找10009号员工的部门id
先试试用这种方式能否查找这样的结果,复合主键,适合用all
在这里插入图片描述
现在是没有问题的
在这里插入图片描述
如果想要员工的姓名
在这里插入图片描述
把sql语句放到navicat,现在两表关联,没有条件,肯定出了问题
在这里插入图片描述在这里插入图片描述
所以缺了条件
在这里插入图片描述
做隐式关联的话,就还需要filter
在这里插入图片描述
返回的列表是一项,里面有两个元素,这其实是两个对象,都可以拿到你想要的东西
在这里插入图片描述
因为遍历all,一解构,就拿到两个实例,就可以看实例的属性了
在这里插入图片描述
这里全是属性,描述器实例也可以用
在这里插入图片描述
现在用这样可以,但是现在更多的是使用join
在这里插入图片描述
现在试试能否join,filter是控制where语句
在这里插入图片描述

要把关联自己写,帮你写相当于nature join,把关联条件写死,阻止了on条件自动创建
在这里插入图片描述
还有其他的写法,filter是管where的
在这里插入图片描述
也可以加&,把这两个表达式括号起来,连接在一起
在这里插入图片描述
不推荐写这种方式
在这里插入图片描述
因为把条件写在这里,相当于阻止了on条件自己的创建,用你自己加的on条件在这里插入图片描述
推荐上面这种,下面的效率要低一点,用join方式把表关联了,把数据拿出来
在这里插入图片描述
在上面的基础上再做些改变,但是可能并不是每种情况都适用,要具体看业务意思
在这里插入图片描述
最保险的写法是这样
在这里插入图片描述
但是现在还拿不到部门信息在这里插入图片描述在这里插入图片描述
**要想显示部门信息,,需要学习relationship技术,orm做对象关系映射,管session。管关系映射relationship
**
在这里插入图片描述
扩展里管base的

在这里插入图片描述
这个不属于字段,这是一种关系,不参与字段建设,关系(从一张表到另一张表的关系)建立好了,交给外键在这里插入图片描述在这里插入图片描述
试试有什么变化
在这里插入图片描述

加一个depts

在这里插入图片描述
现在list里打印需要调用repr,拿到了这个数据
在这里插入图片描述
去掉再次看结果
在这里插入图片描述
随便写个数值可以打印,跟部门没有关系在这里插入图片描述在这里插入图片描述
现在语句是两条
在这里插入图片描述
员工只有一个,但是departments可以有多个在这里插入图片描述在这里插入图片描述
等于这条里分l了两个数据在这里插入图片描述
看下ondelete加什么
在这里插入图片描述
CASCADE其实是数据库来做的事情,如果要create_alll所有表的时候,在创建外键的时候就帮你全部建立好
在这里插入图片描述在这里插入图片描述
隐式关联相当于把这两个表字段都需要打印的
在这里插入图片描述在这里插入图片描述
join的方法就比较复杂,默认写的不要作数,后面.all()是立马生成一个列表
在这里插入图片描述
join的时候最好加条件
在这里插入图片描述
relationship一条还是多条就是看对应关系,在哪张表里要看另外一张表的数据,就在另外一张表里定义relationship
在这里插入图片描述
在这里插入图片描述
用这种方式就阻止了帮你创建条件
在这里插入图片描述
可以把条件写在一起,具体看业务情况
在这里插入图片描述在这里插入图片描述
数据出不来就需要填空,你不用就不查,用了再查,它用懒的方式可以节约资源
在这里插入图片描述
开发中一般用到ORM框架,表对应类,字段对应类属性,实例里的数据封装到类属性里,多表关联需要用到relationship

在这里插入图片描述
外键可以阻止数据出现一些错误,不会出现一些不该有的数据,但是加了外键增加对数据库的约束,大数据量会影响插入修改,删除效率
在这里插入图片描述
主表里的数据删除,从表也要删除,没有级联删除,就手动删除,需要保证在整个删除过程中不会出现任何问题,删除成功就commit,持久化,这就是在代码中用事务控制主表和从表之间的外键约束
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值