多个表关联表如何查询?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多个表关联表如何查询?相关的知识,希望对你有一定的参考价值。

有4个表
user 字段 user_id,user_name , user_age
info 字段 info_id , user_age
tyu 字段 tyu_dd , info_id
如何用left join 进行关联表查询
select * from user left join info on user.user_age = info.user_age left join tyu ...
left join tyu 后是否可以写where 语句可以通过info 查询出相应的tyu?

先要把所有的表都关联起来,在写where,on后面是关联条件,where是筛选条件

select * from user 

left join info on user.user_age = info.user_age 

left join tyu on tyu.info_id=info.info_id --从第一行到这一行,把三个表关联起来了,但可能会有重复。

where 你需要的筛选条件,         

这里写你需要的筛选条件。

    关系表:

关联关系必然有一个参照表,例如:

有一个员工档案管理系统项目,这个项目要包括下面的一些数据表:基本信息表、员工档案表、部门表、项目组表、银行卡表(用来记录员工的银行卡资料)。

这些数据表之间存在一定的关联关系,我们以员工基本信息表为参照来分析和其他表之间的关联:

每个员工必然有对应的员工档案资料,所以属于HAS_ONE关联;

每个员工必须属于某个部门,所以属于BELONGS_TO关联;

每个员工可以有多个银行卡,但是每张银行卡只可能属于一个员工,因此属于HAS_MANY关联;

每个员工可以同时在多个项目组,每个项目组同时有多个员工,因此属于MANY_TO_MANY关联;

分析清楚数据表之前的关联关系后,我们才可以进行关联定义和关联操作。

    数据库:

两个数据库及其(数据)表之间的数据的相互依赖和影响关系。

比如现有某学校三个数据表:学生(学号,姓名),课程(课程名,课程编号),选课(学号,课程号,成绩)。选课表中的“学号”,“课程号”必须是另外两个表中存在的数据,才有意义;而且一旦另外两表中的某一学生或课程被删除,选课表中的相应学号或课程号必须自动删除。这就是一种关联关系。它实际上是保证数据完整性的一种做法。

参考技术A

先要把所有的表都关联起来,在写where,on后面是关联条件,where是筛选条件
select * from user
left join info on user.user_age = info.user_age
left join tyu on tyu.info_id=info.info_id;从第一行到这一行,把三个表关联起来了。但可能会有重复
where你需要的筛选条件

多表关联查询语法分为 内、外连接。

外连接分为左连接(left join 或left outer join)、右连接(right join 或者 right outer join)、和完整外部连接 (full join 或者 full outer join)
左连接:select * from  table1 left join table2 on table1.条件列名 = table2.条件列名
右连接:select *from table1 right join table2 on table1. 条件列= table2.条件列

完全外部连接:select *fron table1 join table2  on table1.条件列名 = table2.条件列名
交叉连接(完全):select *from  table1 cross join table.

数据库扩展性设计:使用二进制解决一条记录关联多个状态的问题

程序开发中,经常遇到一条记录有多个状态位,比如一条商品,他属于热门,新品,特卖。我们的数据库如何设计呢?
一般有几种方法
(1)建立关联表
关联表字段:关系Id,商品Id,属性Id
查询:使用关联表的方式,查询某属性的商品。
程序:写入时,写商品表和关联表;
 
(2)将多个属性存在一个字段中,用|分割
状态存储在一个字段中,比如某条商品属于热卖,新品和特卖,则字段存储的值:01|02|03
SQL查询:使用like
程序处理:(1)取值需要先将01,02,03分割,再处理。(2)写入需要先将01,02,03组合为一个字符串再存储。
 
以上两种方法可以可以解决多个状态关联的问题,但是存在以下问题
(1)增加了表和程序复杂度;
(2)需要改代码,不利于扩展;
 
有没有更好的方法,处理一条记录多个状态的问题呢?
使用二进制位,每个位置,代表一个状态,多个位置代表多个状态,存储的时候转换为int类型存储。
 
以产品属性存储为例。
热门:0000 0001
新品:0000 0010
特卖:0000 0100
 
多个状态的组合
热门+新品:0000 0011
热门+特卖:0000 0101
热门+新品+特卖:0000 0111
 
存储时将二进制转换为int数值。
 
二进制位的查询
以Oracle为例,使用bitadd函数,如:
SELECT * FROM T_PRODUCT WHERE bitand(property,1)=1
 
java中对二进制位的处理
1)是否包含:&与运算符,比如:(1&3)==1
2)组装:|或运算符,比如 1|2=3
 
如果再扩展,清仓状态,可以使用 0000 1000
 
二进制实现的好处
以上内容讲解了使用二进制位来表示状态的方式,实现数据库设计和程序调用。有以下好处
1)存储精简
2)扩展性强
 
缺点:
1)增加了理解复杂度;
 
以下是四个状态情况的二进制与十进制存储对照表:
技术分享
 技术分享
参考:
http://www.cnblogs.com/itfly8/p/6062757.html

以上是关于多个表关联表如何查询?的主要内容,如果未能解决你的问题,请参考以下文章

一个表里有多个字段需要同时使用字典表进行关联显示,如何写sql查询语句

oracle02--多表关联查询

多个关联表多字段多条件模糊查询

当两个或多个表关联在一起时,如何在查询中得到有空值的行?

excel两个工作表如何关联

如何实现多表关联查询