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

消费者方法

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

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

这些就是经常用的消费者方法
可以直接写在后面。这样emps就是一个数值
2020/02/02 05-消费者方法聚合分组关联查询
all,前面emps就是一个列表
2020/02/02 05-消费者方法聚合分组关联查询
消费者方法一旦执行,相当于前面想懒都不行,一旦有消费者方法就会触发它立即执行,产生sql语句,把数据拿回来

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

聚合、分组

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

关联查询

2020/02/02 05-消费者方法聚合分组关联查询
这三个表比较复杂
2020/02/02 05-消费者方法聚合分组关联查询
1 个员工可以对应多个部门,1个部门可以多个员工,n:n,多对多
2020/02/02 05-消费者方法聚合分组关联查询
还有一种情况是,一个员工只属于一个部门,部门里有多个员工,一对多1:n
2020/02/02 05-消费者方法聚合分组关联查询
多对多设计的套路需要建立第三张表,把employee和department的值放进去

2020/02/02 05-消费者方法聚合分组关联查询
一个员工可以到多个部门
2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询
2020/02/02 05-消费者方法聚合分组关联查询
还有索引
2020/02/02 05-消费者方法聚合分组关联查询
先把表构建成类
2020/02/02 05-消费者方法聚合分组关联查询
dept_emp的表比较特殊,是个多对多关系,emp_no来自employee的主键,dept_no来自于dept的主键,这两个主键在这个表里作为联合主键,一个部门职能出现同一个员工,合起来决定唯一性2020/02/02 05-消费者方法聚合分组关联查询
索引
2020/02/02 05-消费者方法聚合分组关联查询
这个索引是自动创建的,test数据库有两个栏位,分别引用自employees的emp_no和departments的dept_no,两个外键,做了级联删除,更新是限制,删除是级联2020/02/02 05-消费者方法聚合分组关联查询
但是生产不这么用,都是假删除2020/02/02 05-消费者方法聚合分组关联查询
现在需要使用外键foreignkey
2020/02/02 05-消费者方法聚合分组关联查询
指定Dept_emp的外键
2020/02/02 05-消费者方法聚合分组关联查询、注释掉上面的
2020/02/02 05-消费者方法聚合分组关联查询
查找10009号员工的部门id
先试试用这种方式能否查找这样的结果,复合主键,适合用all
2020/02/02 05-消费者方法聚合分组关联查询
现在是没有问题的
2020/02/02 05-消费者方法聚合分组关联查询
如果想要员工的姓名
2020/02/02 05-消费者方法聚合分组关联查询
把sql语句放到navicat,现在两表关联,没有条件,肯定出了问题
2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询
所以缺了条件
2020/02/02 05-消费者方法聚合分组关联查询
做隐式关联的话,就还需要filter
2020/02/02 05-消费者方法聚合分组关联查询
返回的列表是一项,里面有两个元素,这其实是两个对象,都可以拿到你想要的东西
2020/02/02 05-消费者方法聚合分组关联查询
因为遍历all,一解构,就拿到两个实例,就可以看实例的属性了
2020/02/02 05-消费者方法聚合分组关联查询
这里全是属性,描述器实例也可以用
2020/02/02 05-消费者方法聚合分组关联查询
现在用这样可以,但是现在更多的是使用join
2020/02/02 05-消费者方法聚合分组关联查询
现在试试能否join,filter是控制where语句
2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询
还有其他的写法,filter是管where的
2020/02/02 05-消费者方法聚合分组关联查询
也可以加&,把这两个表达式括号起来,连接在一起
2020/02/02 05-消费者方法聚合分组关联查询
不推荐写这种方式
2020/02/02 05-消费者方法聚合分组关联查询
因为把条件写在这里,相当于阻止了on条件自己的创建,用你自己加的on条件2020/02/02 05-消费者方法聚合分组关联查询
推荐上面这种,下面的效率要低一点,用join方式把表关联了,把数据拿出来
2020/02/02 05-消费者方法聚合分组关联查询
在上面的基础上再做些改变,但是可能并不是每种情况都适用,要具体看业务意思
2020/02/02 05-消费者方法聚合分组关联查询
最保险的写法是这样
2020/02/02 05-消费者方法聚合分组关联查询
但是现在还拿不到部门信息2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询
要想显示部门信息,,需要学习relationship技术,orm做对象关系映射,管session。管关系映射
2020/02/02 05-消费者方法聚合分组关联查询
这个不属于字段,这是一种关系,不参与字段建设,关系建立好了,交给外键2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询
试试有什么变化
2020/02/02 05-消费者方法聚合分组关联查询
2020/02/02 05-消费者方法聚合分组关联查询
现在list里打印需要调用repr,拿到了这个数据
2020/02/02 05-消费者方法聚合分组关联查询
去掉再次看结果
2020/02/02 05-消费者方法聚合分组关联查询
随便写个数值可以打印,跟部门没有关系2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询
现在语句是两条
2020/02/02 05-消费者方法聚合分组关联查询
员工只有一个,但是departments可以有多个2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询
等于这条里分l了两个数据2020/02/02 05-消费者方法聚合分组关联查询
看下ondelete加什么
2020/02/02 05-消费者方法聚合分组关联查询
CASCADE其实是数据库来做的事情,如果要create_alll所有表的时候,在创建外键的时候就帮你全部建立好
2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询
隐式关联相当于把这两个表字段都需要打印的
2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询
join的方法就比较复杂,默认写的不要作数,后面.all()是立马生成一个列表
2020/02/02 05-消费者方法聚合分组关联查询
join的时候最好加条件
2020/02/02 05-消费者方法聚合分组关联查询
relationship一条还是多条就是看对应关系,在哪张表里要看另外一张表的数据,就在另外一张表里定义relationship
2020/02/02 05-消费者方法聚合分组关联查询
2020/02/02 05-消费者方法聚合分组关联查询
用这种方式就阻止了帮你创建条件
2020/02/02 05-消费者方法聚合分组关联查询
可以把条件写在一起,具体看业务情况
2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询
数据出不来就需要填空,你不用就不查,用了再查,它用懒的方式可以节约资源
2020/02/02 05-消费者方法聚合分组关联查询
开发中一般用到ORM框架,表对应类,字段对应类属性,实例里的数据封装到类属性里,多表关联需要用到relationship

2020/02/02 05-消费者方法聚合分组关联查询
外键可以阻止数据出现一些错误,不会出现一些不该有的数据,但是加了外键增加对数据库的约束,大数据量会影响插入修改,删除效率
2020/02/02 05-消费者方法聚合分组关联查询
主表里的数据删除,从表也要删除,没有级联删除,就手动删除,需要保证在整个删除过程中不会出现任何问题,删除成功就commit,持久化,这就是在代码中用事务控制主表和从表之间的外键约束
2020/02/02 05-消费者方法聚合分组关联查询
2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询2020/02/02 05-消费者方法聚合分组关联查询