首页 / MYSQL / mysql左,右,内连接
mysql左,右,内连接
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql左,右,内连接,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8533字,纯文字阅读大概需要13分钟。
内容图文
![mysql左,右,内连接](/upload/InfoBanner/zyjiaocheng/540/fbb304e3aba146d3a4520b2b5156dc9c.jpg)
全相乘方法(效率很低)
mysql> select * from test10; +------+-------+ | id | sname | +------+-------+ | 1 | 云彩 | | 2 | 月亮 | | 3 | 星星 | +------+-------+
3 rows in set (0.00 sec)
mysql> select * from test11; +--------+-------+ | cat_id | cname | +--------+-------+ | 95 | 猴子 | | 96 | 老虎 | +--------+-------+
2 rows in set (0.00 sec)
数据库中实现两表*的效果
mysql> select * from test10,test11; +------+-------+--------+-------+ | id | sname | cat_id | cname | +------+-------+--------+-------+ | 1 | 云彩 | 95 | 猴子 | | 1 | 云彩 | 96 | 老虎 | | 2 | 月亮 | 95 | 猴子 | | 2 | 月亮 | 96 | 老虎 | | 3 | 星星 | 95 | 猴子 | | 3 | 星星 | 96 | 老虎 | +------+-------+--------+-------+
6 rows in set (0.03 sec)
分析:
test10看成集合有三个元素
test11看成集合有两个元素
test10*test11得到新集合是有六个元素
行 两个表行数相乘
列 两个表列数相加(可以重复)
多表查询时候列名重复的情况时候,需要明确指出取得是那个表
mysql> select goods_id,minigoods.cat_id,goods_name,category.cat_id,cat_name from minigoods,category limit 3; +----------+--------+--------------------+--------+----------+ | goods_id | cat_id | goods_name | cat_id | cat_name | +----------+--------+--------------------+--------+----------+ | 1 | 4 | KD876 | 1 | 手机类型 | | 4 | 8 | htcN85原装充电器 | 1 | 手机类型 | | 3 | 8 | 诺基亚原装5800耳机 | 1 | 手机类型 | +----------+--------+--------------------+--------+----------+
技巧 :创建一个同样结构的表 create table [新表名] like [旧表名]
create table minigoods like goods;
复制一部分表的内容
mysql> insert into minigoods -> select * from goods limit 3;
取得有意义的两个表的对应 minigoods.cat_id=category.cat_id
mysql> select goods_id,minigoods.cat_id,goods_name,category.cat_id,cat_name from minigoods,category where minigoods.cat_id=category.cat_id ; +----------+--------+--------------------+--------+----------+ | goods_id | cat_id | goods_name | cat_id | cat_name | +----------+--------+--------------------+--------+----------+ | 1 | 4 | KD876 | 4 | 3G手机 | | 4 | 8 | htcN85原装充电器 | 8 | 耳机 | | 3 | 8 | 诺基亚原装5800耳机 | 8 | 耳机 | +----------+--------+--------------------+--------+----------+
3 rows in set (0.00 sec)
左连接语法
a表在左,不动
b表在右,动
a表和b表通过一个关系(自己设定),来筛选a所需要的b的行
a left join b on [条件] ----条件为真,取出b的行
a left join b on [条件] 结果集也可以看成表(假设为c表),可以对其再查询
mysql> select goods_id,goods_name,cat_name -> from -> (minigoods left join category on minigoods.cat_id=category.cat_id); +----------+--------------------+----------+ | goods_id | goods_name | cat_name | +----------+--------------------+----------+ | 1 | KD876 | 3G手机 | | 4 | htcN85原装充电器 | 耳机 | | 3 | 诺基亚原装5800耳机 | 耳机 | +----------+--------------------+----------+
[minigoods left join category on minigoods.cat_id=category.cat_id 看做c表]
验证:就是后面依然可以使用where 等等过滤条件
mysql> select goods_id,goods_name,cat_name from (minigoods left join category on minigoods.cat_id=category.cat_id ) where 1 order by goods_id desc limit 2; +----------+--------------------+----------+ | goods_id | goods_name | cat_name | +----------+--------------------+----------+ | 4 | htcN85原装充电器 | 耳机 | | 3 | 诺基亚原装5800耳机 | 耳机 | +----------+--------------------+----------+
2 rows in set (0.00 sec)
可以多张表左连接,就是把结果看成表
看做一张表
{{a left join b on [条件]} left join c on [条件]} mysql> select goods.goods_id,goods.goods_name,goods.cat_id,cat_name -> from -> minigoods left join category on minigoods.cat_id=category.cat_id -> left join goods on minigoods.cat_id=4 limit 4; +----------+--------------------+--------+----------+ | goods_id | goods_name | cat_id | cat_name | +----------+--------------------+--------+----------+ | 1 | KD876 | 4 | 3G手机 | | 4 | htcN85原装充电器 | 8 | 3G手机 | | 3 | 诺基亚原装5800耳机 | 8 | 3G手机 | | 5 | 索爱原装M2卡读卡器 | 11 | 3G手机 | +----------+--------------------+--------+----------+
左右连接的区别===================================================================================================
a left join b on 意思是查询的时候以a为基准查询
a right join b on 意思是查询的时候以b为基准查询
a left join b on 等同于 b right join a (都是以a为基准查询)
技巧:处于移植兼容性和理解上来说,最好一律使用左连接实现
create table boy( bname varchar(20), other char(1) )engine myisam charset utf8; insert into boy values ('屌丝','A'), ('李四','B'), ('王五','C'), ('高富帅','D'), ('郑七','E');
create table girl( gname varchar(20), other char(1) )engine myisam charset utf8; insert into girl values ('空姐','B'), ('大S','C'), ('阿娇','D'), ('张柏芝','D'), ('林黛玉','E'), ('宝钗','F');
取出所有男生的配偶(左连接)
select boy.*,girl.* from boy left join girl on boy.other=girl.other; +--------+-------+--------+-------+ | bname | other | gname | other | +--------+-------+--------+-------+ | 屌丝 | A | NULL | NULL | | 李四 | B | 空姐 | B | | 王五 | C | 大S | C | | 高富帅 | D | 阿娇 | D | | 高富帅 | D | 张柏芝 | D | | 郑七 | E | 林黛玉 | E | +--------+-------+--------+-------+
取出所有女生的配偶(左连接)
mysql> select girl.*,boy.* from -> girl left join boy on -> boy.other=girl.other; +--------+-------+--------+-------+ | gname | other | bname | other | +--------+-------+--------+-------+ | 空姐 | B | 李四 | B | | 大S | C | 王五 | C | | 阿娇 | D | 高富帅 | D | | 张柏芝 | D | 高富帅 | D | | 林黛玉 | E | 郑七 | E | | 宝钗 | F | NULL | NULL | +--------+-------+--------+-------+
取出所有女生的配偶(右连接,和上面左连接一致)
mysql> select girl.* ,boy.* from -> boy right join girl on -> boy.other=girl.other; +--------+-------+--------+-------+ | gname | other | bname | other | +--------+-------+--------+-------+ | 空姐 | B | 李四 | B | | 大S | C | 王五 | C | | 阿娇 | D | 高富帅 | D | | 张柏芝 | D | 高富帅 | D | | 林黛玉 | E | 郑七 | E | | 宝钗 | F | NULL | NULL | +--------+-------+--------+-------+
内连接===================================================================================================
取出有配偶的
select girl.*,boy.* from boy inner join girl on boy.other=girl.other; +--------+-------+--------+-------+ | gname | other | bname | other | +--------+-------+--------+-------+ | 空姐 | B | 李四 | B | | 大S | C | 王五 | C | | 阿娇 | D | 高富帅 | D | | 张柏芝 | D | 高富帅 | D | | 林黛玉 | E | 郑七 | E | +--------+-------+--------+-------+
内连接是左右连接的交集
(外连接是左右连接的并集,mysql不支持)可以使用用union实现
左连接应用===================================================================================================
create table match_t( match_id int primary key auto_increment, host_team_id int, guest_team_id int, match_result varchar(20), match_time date )engine myisam charset utf8; insert into match_t values (1,1,2,'2:0','2006-05-21'), (2,2,3,'1:2','2006-06-21'), (3,3,1,'2:5','2006-07-21'), (4,1,1,'3:2','2006-08-21'); create table team_t( team_id int primary key auto_increment, team_name varchar(20) )engine myisam charset utf8; insert into team_t values (1,'恒大'), (2,'国安'), (3,'申花'), (4,'大连'); mysql> select * from match_t; +----------+--------------+---------------+--------------+------------+ | match_id | host_team_id | guest_team_id | match_result | match_time | +----------+--------------+---------------+--------------+------------+ | 1 | 1 | 2 | 2:0 | 2006-05-21 | | 2 | 2 | 3 | 1:2 | 2006-06-21 | | 3 | 3 | 1 | 2:5 | 2006-07-21 | | 4 | 4 | 1 | 3:2 | 2006-08-21 | +----------+--------------+---------------+--------------+------------+ mysql> select * from team_t; +---------+-----------+ | team_id | team_name | +---------+-----------+ | 1 | 恒大 | | 2 | 国安 | | 3 | 申花 | | 4 | 大连 | +---------+-----------+
技巧 :善与给表其别名
2006-06-21日期之后 把表中对战换成队名
select host_t.team_name,guest_t.team_name,match_result,match_time from match_t left join (team_t as host_t) on match_t.host_team_id=host_t.team_id left join (team_t as guest_t) on match_t.guest_team_id=guest_t.team_id where match_time>='2006-06-21'; +--------------+-----------+---------------+-----------+--------------+------------+ | host_team_id | team_name | guest_team_id | team_name | match_result | match_time | +--------------+-----------+---------------+-----------+--------------+------------+ | 1 | 恒大 | 2 | 国安 | 2:0 | 2006-05-21 | | 2 | 国安 | 3 | 申花 | 1:2 | 2006-06-21 | | 3 | 申花 | 1 | 恒大 | 2:5 | 2006-07-21 | | 4 | 大连 | 1 | 恒大 | 3:2 | 2006-08-21 | +--------------+-----------+---------------+-----------+--------------+------------+
以上就是mysql 左,右,内连接的内容,更多相关内容请关注PHP中文网(www.gxlcms.com)!
内容总结
以上是互联网集市为您收集整理的mysql左,右,内连接全部内容,希望文章能够帮你解决mysql左,右,内连接所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。