暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql一对多&多对多关联查询

小谢backup 2018-01-31
830

关联查询

首先要知道关联查询和主键&外键相关。

简单场景理解

备注:数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。 一对一例子: 一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然。 学生表:姓名,性别,年龄,身高,体重,籍贯,家庭住址,紧急联系人 其中姓名、性别、年龄、身高,体重属于常用数据,但是籍贯、住址和联系人为不常用数据 如果每次查询都是查询所有数据,不常用的数据就会影响效率,实际又不用 常用信息表:ID(P),姓名,性别,年龄,身高,体重 不常用信息表:ID(P),籍贯,家庭住址,紧急联系人

解决方案:将常用的和不常用的信息分享存储,分成两张表 不常用信息表和常用信息表,保证不常用信息表与常用信息表能够对应上:找一个具有唯一性的 字段来共同连接两张表。 一个常用表中的一条记录永远只能在一张不常用表中匹配一条记录,反之亦然。

一对多例子: 一张表中有一条记录可以对应另外一张表中的多条记录;但是反过来,另外一张表的一条记录 只能对应第一张表的一条记录,这种关系就是一对多或多对一 母亲与孩子的关系:母亲,孩子两个实体 母亲表:ID(P),名字,年龄,性别 孩子表:ID(P),名字,年龄,性别 以上关系:一个妈妈可以在孩子表中找到多条记录(也可能是一条),但是一个孩子只能找到一个妈妈 是一种典型的一(母亲表)对多(孩子表)的关系。 但是以上设计:解决了实体的设计表问题,但是没有解决关系问题,孩子找不到母亲,母亲也找不到孩子

解决方案:在某一张表中增加一个字段,能够找到另外一张表中的记录:在孩子表中增加一个字段 指向母亲表,因为孩子表的记录只能匹配到一条母亲表的记录。 母亲表:ID(P),名字,年龄,性别 孩子表:ID(P),名字,年龄,性别,母亲表ID(母亲表主键)

多对多例子: 一对表中(A)的一条记录能够对应另外一张表(B)中的多条记录;同时B表中的一条记录 也能对应A表中的多条记录

老师和学生 老师表 TID(P),姓名,性别 学生表 SID(P),姓名,性别 以上设计方案:实现了实体的设计,但是没有维护实体的关系 一个老师教过多个学生,一个学生也被多个老师教过

解决方案:增加一张中间关系表 老师与学生的关系表:ID(P),TID,SID 老师表与中间表形成一对多的关系,而中间表是多表;维护了能够唯一找到一表的关系; 同样的学生表与中间表也是一个一对多的关系; 学生找老师:找出学生ID--->中间表寻找匹配记录(多条)--->老师表匹配(一条) 老师找学生:找出老师ID--->中间表寻找匹配记录(多条)--->学生表匹配(一条)

技术点总结

一、使用SELECT子句进行多表查询

SELECT 字段名 FROM 表1,表2 … WHERE 表1.字段 = 表2.字段 AND 其它查询条件SELECT a.id,a.name,a.address,a.date,b.math,

b.english,b.chinese FROM tb_demo065_tel AS b,tb_demo065 AS a WHERE a.id=b.id

注:在上面的的代码中,以两张表的id字段信息相同作为条件建立两表关联,但在实际开发中不应该这样使用,最好用主外键约束来实现。 二、使用表的别名进行多表查询 如:

SELECT a.id,a.name,a.address,b.math,b.english,

b.chinese FROM tb_demo065  a,tb_demo065_tel  b WHERE a.id=b.id AND b.id='$_POST[textid]'

SQL语言中,可以通过两种方式为表指定别名 第一种是通过关键字AS指定,如SELECT a.id,a.name,a.address,b.math,b.english,

b.chinese FROM tb_demo065 AS a,tb_demo065_tel AS b WHERE a.id=b.id

第二种是在表名后直接加表的别名实现SELECT a.id,a.name,a.address,b.math,b.english,

b.chinese FROM tb_demo065  a,tb_demo065_tel  b WHERE a.id=b.id

使用表的别名应注意几下几点 (1)别名通常是一个缩短了的表名,用于在连接中引用表中的特定列,如果连接中的多个表中有相同的名称列存在,必须用表名或表的别名限定列名。 (2)如果定义了表的别名就不能再使用表名! 三、合并多个结果集 SQL语言中,可以通过UNION 或 ALL将多个SELECT语句的查询结果合并输出,这两个关键字的使用说明如下: UNION:利用该关键字可以将多个SELECT 语句的查询结果合并输出,并删除重复行 ALL:利用该关键字可以将多个SELECT 语句的查询结果合并输出,但不会删除重复行 在使用UNION或ALL关键字将多个表合并输出时,查询结果必须具有相同的结构并且数据类型必须兼容,另外使用UNION时两张表的字段数量也必须相同,否则会提示SQL语句有错误。 e.g:

SELECT id,name,pwd FROM tb_demo067 UNION SELECT  

uid,price,date FROM tb_demo067_tel

四、简单嵌套查询 子查询:子查询是一个SELECT查询,返回单个值且嵌套在SELECT、INSERT、UPDATE和DELETE语句或其它查询语句中,任何可以使用表达式的地方都可以使用子查询SELECT id,name,sex,date FROM tb_demo068 WHERE id

in(SELECT id FROM tb_demo068 WHERE id='$_POST[test]')

内连接:把查询结果作为WHERE子句的查询条件即称为内连接。 五、复杂的嵌套查询 多表之间的嵌套查询可以通过谓词IN实现,语法格式如下: testexpression[NOT] IN{ subquery } 参数说明:testexpression指SQL表达式,subquery包含某结果集的子查询 多表嵌套查询的原理:无论是多少张表进行嵌套,表与表之间一定存在某种关联,通过WHERE子句建立此种关联实现查询(区别外键,外键在建好后就只要对父表【单表】操作即可实现关联操作)。 六、利用HAVING语句过滤分组数据 HAVING子句用于指定组或聚合的搜索条件,HAVING通常与GROUP BY 语句一起使用,如果SQL语句中不含GROUP BY子句,则HAVING的行为与WHERE子句一样. e.x:

SELECT name,math FROM tb_demo083 GROUP BY id HAVING math > '95';


总之,实现表与表之间的关联的本质是两表之间存在共同的数据项或者相同的数据项,通过WHERE 子句或内连接INNER JOIN … ON 语句将两表连接起来,实现查询。


文章转载自小谢backup,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论