设为首页 收藏本站
查看: 834|回复: 0

[经验分享] mysql 左,右,内连接

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-1-8 09:00:51 | 显示全部楼层 |阅读模式
左右连接

全相乘方法(效率很低)
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 |
+--------------+-----------+---------------+-----------+--------------+------------+



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-161680-1-1.html 上篇帖子: mysql having 下篇帖子: mysql主从复制中slave_net_time参数详解 mysql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表