mysql与配偶同性_mysql 左,右,内连接

左右连接

全相乘方法(效率很低)

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 |

+--------------+-----------+---------------+-----------+--------------+------------+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值