时间:2021-05-02
一对多的两张表,一般是一张表的外键关联到另一个表的主键。但也有不一般的情况,也就是两个表并非通过其中一个表的主键关联。 例如: 复制代码 代码如下: create table t_team ( tid int primary key, tname varchar(100) ); create table t_people ( pid int primary key, pname varchar(100), team_name varchar(100) ); team表和people表是一对多的关系,team的tname是唯一的,people的pname也是唯一的,people表中外键team_name和team表的tname关联,并不是和主键id关联。 (PS:先不说这样的设计合不合理,但如果真的摊上这事儿…..很多表的设计是每个表有一个id和uuid,id作为主键,uuid作关联,和上面情况类似) 现在要查询pname是"xxg"的people和team信息: SELECT * FROM t_team t,t_people p WHERE t.tname=p.team_name AND p.pname='xxg' LIMIT 1; 或 SELECT * FROM t_team t INNER JOIN t_people p ON t.tname=p.team_name WHERE p.pname='xxg' LIMIT 1; 执行一下,可以查询出结果,但是如果数据量大的情况下,效率很低,执行很慢。 对于这种连接查询,用子查询来代替,查询结果相同,但会效率更高: SELECT * FROM (SELECT * FROM t_people WHERE pname='xxg' LIMIT 1) p, t_team t WHERE t.tname=p.team_name LIMIT 1; 子查询中过滤了大量的数据(仅保留一条),再将结果来连接查询,效率会大大提高。 (PS:另外,使用LIMIT 1也可以提高查询效率,详细: ) 本人通过3条SQL测试两种查询方式的效率: 准备1万条team数据,准备100万条people数据。 造数据的存储过程: 复制代码 代码如下: BEGIN DECLARE i INT; START TRANSACTION; SET i=0; WHILE i<10000 DO INSERT INTO t_team VALUES(i+1,CONCAT('team',i+1)); SET i=i+1; END WHILE; SET i=0; WHILE i<1000000 DO INSERT INTO t_people VALUES(i+1,CONCAT('people',i+1),CONCAT('team',i%10000+1)); SET i=i+1; END WHILE; COMMIT; END SQL语句执行效率: 连接查询 复制代码 代码如下: SELECT * FROM t_team t,t_people p WHERE t.tname=p.team_nameAND p.pname='people20000' LIMIT 1; Time:12.594 s 连接查询 复制代码 代码如下: SELECT * FROM t_team t INNER JOIN t_peoplep ON t.tname=p.team_name WHERE p.pname='people20000' LIMIT 1; Time:12.360 s 子查询 复制代码 代码如下: SELECT * FROM (SELECT * FROM t_people WHEREpname='people20000' LIMIT 1) p, t_team t WHERE t.tname=p.team_name LIMIT 1; Time:0.016 s
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了mysql连接查询、联合查询、子查询原理与用法。分享给大家供大家参考,具体如下:本文内容:连接查询联合查询子查询from子查询where子查询ex
使用连接(JOIN)来代替子查询(Sub-Queries)MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然
MySQL连接查询相信大家都有所了解,连接查询是在数据库查询操作的时候经常用到的,下面就为您介绍MySQL连接查询mysql连接查询:支持多表连接对同一张表可以
MySQL表子查询表子查询是指子查询返回的结果集是N行N列的一个表数据。MySQL表子查询实例下面是用于例子的两张原始数据表:article表:blog表:SQ
基础知识1,关联子查询和非关联子查询在非关联子查询中,内部查询只执行一次并返回它的值给外部查询,然后外部查询在它的处理中使用内部查询返回给它的值。而在关联子查询