在本文中,我们将为您详细介绍是SQL联接的相关知识,并且为您解答关于JOIN的结果是“表”,还是多对多表之间的表?的疑问,此外,我们还会提供一些关于df.groupby.apply(join)与df.
在本文中,我们将为您详细介绍是SQL联接的相关知识,并且为您解答关于JOIN的结果是“表”,还是多对多表之间的表?的疑问,此外,我们还会提供一些关于df.groupby.apply(join)与df.groupby.agg(join)的输出差异、flask 中 多对多的关系 主从表之间的的增删改查、hive 连接(join)查询、Hql,如何在具有一对多关系的表之间编写联接查询?的有用信息。
本文目录一览:- 是SQL联接(JOIN)的结果是“表”,还是多对多表之间的表?(sql join on 多表连接结果问题)
- df.groupby.apply(join)与df.groupby.agg(join)的输出差异
- flask 中 多对多的关系 主从表之间的的增删改查
- hive 连接(join)查询
- Hql,如何在具有一对多关系的表之间编写联接查询?
是SQL联接(JOIN)的结果是“表”,还是多对多表之间的表?(sql join on 多表连接结果问题)
这是关于正确“命名事物”的问题。具体来说,您如何区分:
- 中多到多的关系表“之间”时(例如
users
,users_questions
,questions
) - 在SQL期间创建的(临时)表
JOIN
(例如’SELECT * FROM users INNER JOIN users_questions.user_id ON users.id WHERE users_question.question_id = 37016694;`)
答案1
小编典典许多数据库设计人员从您的第一个意义上使用术语 联接表 :实现实体之间的多对多关系。它也称为 联结表 , 关联表
和其他内容。更多信息:https://en.wikipedia.org/wiki/Associative_entity
我从未听说过使用第二种感觉。(但是,嘿,我的工作并不多。:-)如果您在编写文档或教学,我建议您将单词 表 保留为实际的物理表。避免使用单词 表
作为结果集,除非您通过说出 虚拟表 或某些类似的短语来对其进行限定。这样,您的读者和学生就不会浪费时间尝试在架构中查找这些非真正表的定义。
df.groupby.apply(join)与df.groupby.agg(join)的输出差异
如何解决df.groupby.apply(join)与df.groupby.agg(join)的输出差异?
我是Pandas的新手,目前正在学习groupby.agg()和groupby.apply()。以为我已经了解了,直到遇到以下输出为止。
Python版本3.7.3 Pandas版本0.24.2
数据框
In [46]: rng = np.random.RandomState(0)
...: df = pd.DataFrame({''key'': [''A'',''B'',''C'',''A'',''C''],...: ''data1'': [0,1,2,4,5],...: ''data2'': rng.randint(0,10,6)},...: columns = [''key'',''data1'',''data2''])
In [47]: df
Out[47]:
key data1 data2
0 A 0 5
1 B 1 0
2 C 2 3
3 A 0 3
4 B 4 7
5 C 5 9
输出
In [50]: df.groupby(''key'').agg(lambda x: '',''.join(x.astype(str)))
Out[50]:
data1 data2
key
A 0,0 5,3
B 1,4 0,7
C 2,5 3,9
In [49]: df.groupby(''key'').apply(lambda x: '',''.join(x.astype(str)))
Out[49]:
key
A key,data1,data2
B key,data2
C key,data2
dtype: object
我的问题是:
- 在上述情况下,为什么使用groupby.apply()和groupby.agg()在输出上会有区别?
- 为什么groupby.apply()方法提取列标题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
flask 中 多对多的关系 主从表之间的的增删改查
# 角色表模型
class Role(db.Model):
r_id = db.Column(db.Integer, primary_key=True)
r_name = db.Column(db.String(10))
__tablename__ = ''role''
# 角色表和权限表的中间表
# r_p为关联表的表名
r_p = db.Table(''r_p'',
db.Column(''role_id'',db.Integer,db.ForeignKey(''role.r_id''),primary_key=True),
db.Column(''permission_id'', db.Integer, db.ForeignKey(''permission.p_id''),primary_key=True)
)
# 权限表模型
class Permission(db.Model):
p_id = db.Column(db.Integer, autoincrement=True, primary_key=True)
p_name = db.Column(db.String(16), unique=True)
p_er = db.Column(db.String(16), unique=True)
# 添加多对多的反向引用,必须用secondary指定中间关联表
# 用权限查询角色时用查询到的权限对象:“权限对象.roles.all()”得到其对应的所有角色
roles =db.relationship(''Role'', secondary = r_p, backref = db.backref(''permission'', lazy = True))
__tablename__ = ''permission''
# db.backref(''permission'', 中的permission用来反向关联,用角色查询其对应的所有权限。用查询到的 ''角色对象.permission.all()''得到。
# relationship可以放到任意一个类中都行,与之相反。
views视图函数:
# 多对多查询
@user.route(''/userperlist/'', methods=[''GET'', ''POST''])
@is_login
def userperlist():
# 首先获得主表角色的ID
r_id = request.args.get(''r_id'')
# 使用ID来获取该角色对象
roles = Role.query.get(r_id)
# 然后通过角色,找权限
pers = roles.permission
#多对多添加
# 权限管理/角色列表/添加权限
@user.route(''/adduserper/'', methods=[''GET'', ''POST''])
@is_login
def adduserper():
r_id = request.args.get(''r_id'')
permissions = Permission.query.all()
if request.method == ''GET'':
return render_template(''add_user_per.html'',permissions = permissions)
if request.method == ''POST'':
p_id = request.form[''p_id'']
# 找出对应权限
# 此处用get(id)获取, 不要使用filter_by
# 对多关系中获取对象,只能用get(id)方法,不能通过filter或者filter_by来获取
permission = Permission.query.get(p_id)
# 找出对应角色
role = Role.query.get(r_id)
# 然后添加权限
role.permission.append(permission)
# 保存数据库
db.session.commit()
return redirect(url_for(''user.roles''))
#多对多删除
# 权限管理/角色列表/减少权限
@user.route(''/subuserper/'', methods=[''GET'', ''POST''])
@is_login
def subuserper():
r_id = request.args.get(''r_id'')
roles = Role.query.get(r_id)
pers = roles.permission
if request.method == ''GET'':
return render_template(''user_per_list.html'',pers=pers)
if request.method == ''POST'':
p_id = request.form[''p_id'']
permission = Permission.query.get(p_id)
role = Role.query.get(r_id)
# 和添加一样,只是此处用的是remove()
role.permission.remove(permission)
db.session.commit()
return redirect(url_for(''user.roles''))
总结:ORM操作时,多对多关系的角色权限表(中间关联表),不需要用户维护.
hive 连接(join)查询
1、内连接
hive> select b.*,a.name from userinfo2 b,userinfo a where a.userid=b.userid;
hive> select b.*,a.name from userinfo2 b join userinfo a on a.userid=b.userid;
2、外连接
#左联
select b.*,a.name from userinfo2 b left join userinfo a on a.userid=b.userid;
#右联
hive> select a.*,b.name from userinfo b right join userinfo2 a on a.userid=b.userid;
全连接,两边都全显示
hive> select a.*,b.name from userinfo b right join userinfo2 a on a.userid=b.userid;
3、半连接
hive> select * from userinfo2 a where a.userid in (select userid from userinfo);
#left semi join必须遵守一个规则:右表(userinfo)只能在on子句里出现,也不能在where子句以及select中出现
hive> select * from userinfo2 a left semi join userinfo b on (a.userid=b.userid);
4、map连接
在之前的内联查询中:
select b.*,a.name from userinfo2 b join userinfo a on a.userid=b.userid;
如果有一个连接表小到可以放入内存,例如userinfo表,hive就可以较小的表放入每个mapper的内存中来执行连接,这就是map连接。
执行这个查询不使用reducer,因此这个查询对right和full join无效,因为只有在对所有输入上进行聚集的步骤(即reduce)才能检测到哪个数据行无法匹配。
map连接可以利用分桶表,需要设置hive.optimize.bucketmapjoin=true
5、子查询,Hive只支持在FROM子句中使用子查询,子查询必须有名字,并且列必须唯一:SELECT ... FROM(subquery) name ...
某些情况子查询可以出现在where子句中,本文中第三点半连接就是子查询,子查询可以出现在where的in或者是exists中。
#子查询的列名必须有唯一的列名。
hive> select year,avg(max_data) from (select year,max(data) as max_data from weather_data group by year) mt group by year;
Hql,如何在具有一对多关系的表之间编写联接查询?
我有2
桌子。与… 1st
有oneToMany
关系2nd
。
类作者
@Entity@Table(name = "Author")Public class Author{ @Id @Column(name = "AuthorId") private int autherId; @Column(name = "AuthorName") private String authorName; @OneToMany @JoinColumn(name="AuthorId",referencedColumnName="AuthorId") List<Book> Books; //getter and setter}
课堂书
@Entity@Table(name = "Book")Public class Book{ @Id @Column(name = "BookId") private int bookId; @Column(name = "BookName") private String bookName; @Column(name = "AuthorId") private int authorId; //getter and setter}
如何编写Hql
查询,以便能获得所有作者和那里的书,而且书名应以hello
我知道使用这样的查询,
from Author;
我可以获取所有作者和那里的书,但是如何在书上注明条件?
答案1
小编典典我认为是这样的:
select a from Author as a join a.Book as ab where ab.AuthorId like ''%"hello"%'';
虽然不确定a.Book,也可能是a.Books,因为您的列名就是这样命名的。
关于是SQL联接和JOIN的结果是“表”,还是多对多表之间的表?的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于df.groupby.apply(join)与df.groupby.agg(join)的输出差异、flask 中 多对多的关系 主从表之间的的增删改查、hive 连接(join)查询、Hql,如何在具有一对多关系的表之间编写联接查询?等相关内容,可以在本站寻找。
本文标签: