mysql中内连接冗余删除_MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)...

mysql> create tabletest5(-> id int,-> sname varchar(20)->)engine myisam charset utf8;

Query OK,0 rows affected (0.07sec)

mysql> create tabletest6(-> cat_id int,-> cname varchar(20)->)engine myisam charset utf8;

Query OK,0 rows affected (0.06sec)

mysql> insert intotest5-> values

-> (1, '甲'),-> (2, '乙'),-> (3, '丙');

Query OK,3 rows affected (0.00sec)

Records:3 Duplicates: 0 Warnings: 0mysql> insert intotest6-> values

-> (95, '丁'),-> (96, '戊');

Query OK,2 rows affected (0.00sec)

Records:2 Duplicates: 0 Warnings: 0

先插入两个表,便于之后的学习

274f11635e3f09733756c4bc6b1cd2b4.png

交叉连接

3cc299324662f80a35079aaf83fd9658.png

建立一张小的goods表方便练习

mysql> create table minigoods likegoods;

Query OK,0 rows affected (0.07sec)

mysql> insert intominigoods-> select * from goods limit 3;

Query OK,3 rows affected (0.00sec)

Records:3 Duplicates: 0 Warnings: 0

c5b01a7b15e84397d04d5ac55d2bd37d.png

60a5ad4503f86fa5cc21e034b083181c.png

5757d0d6d568bbfac4fe54bc12159ccc.png

交叉相乘(行数为两表行数相成,列数为两表列相加)

dde2dc4ecb1656a4c0a7e8d6492f7d55.png

字段列表中的“Cat_ID”列不明确。

两张表都存在cat_id列,某一列名,在两张表内都出现,需要指定表名.列名

mysql> selectgoods_id, minigoods.cat_id,goods_name, category.cat_id, cat_name-> fromminigoods, category;+----------+--------+-------------------------------+--------+----------------+

| goods_id | cat_id | goods_name | cat_id | cat_name |

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

| 1 | 4 | KD876 | 1 | 手机类型 |

| 2 | 8 | vivo充电器 | 1 | 手机类型 |

| 3 | 8 | 兰士顿D4 重低音四核双动圈耳机 | 1 | 手机类型 |

| 1 | 4 | KD876 | 2 | CDMA手机 |

| 2 | 8 | vivo充电器 | 2 | CDMA手机 |

| 3 | 8 | 兰士顿D4 重低音四核双动圈耳机 | 2 | CDMA手机 |

| 1 | 4 | KD876 | 3 | 智能手机 |

| 2 | 8 | vivo充电器 | 3 | 智能手机 |

| 3 | 8 | 兰士顿D4 重低音四核双动圈耳机 | 3 | 智能手机 |

| 1 | 4 | KD876 | 4 | 4G手机 |

| 2 | 8 | vivo充电器 | 4 | 4G手机 |

| 3 | 8 | 兰士顿D4 重低音四核双动圈耳机 | 4 | 4G手机 |

| 1 | 4 | KD876 | 5 | **手机 |

| 2 | 8 | vivo充电器 | 5 | **手机 |

| 3 | 8 | 兰士顿D4 重低音四核双动圈耳机 | 5 | **手机 |

| 1 | 4 | KD876 | 6 | 手机配件 |

| 2 | 8 | vivo充电器 | 6 | 手机配件 |

| 3 | 8 | 兰士顿D4 重低音四核双动圈耳机 | 6 | 手机配件 |

| 1 | 4 | KD876 | 7 | 充电器 |

| 2 | 8 | vivo充电器 | 7 | 充电器 |

| 3 | 8 | 兰士顿D4 重低音四核双动圈耳机 | 7 | 充电器 |

| 1 | 4 | KD876 | 8 | 耳机 |

| 2 | 8 | vivo充电器 | 8 | 耳机 |

| 3 | 8 | 兰士顿D4 重低音四核双动圈耳机 | 8 | 耳机 |

| 1 | 4 | KD876 | 9 | 电池 |

| 2 | 8 | vivo充电器 | 9 | 电池 |

| 3 | 8 | 兰士顿D4 重低音四核双动圈耳机 | 9 | 电池 |

| 1 | 4 | KD876 | 11 | 内存卡和读卡器 |

| 2 | 8 | vivo充电器 | 11 | 内存卡和读卡器 |

| 3 | 8 | 兰士顿D4 重低音四核双动圈耳机 | 11 | 内存卡和读卡器 |

| 1 | 4 | KD876 | 12 | 充值卡 |

| 2 | 8 | vivo充电器 | 12 | 充值卡 |

| 3 | 8 | 兰士顿D4 重低音四核双动圈耳机 | 12 | 充值卡

bb294fe0f5ca906a04dc1d0251be2479.png

如果嫌太长了 也可以选择用别名的方式

但在查询中,明显看出有很多数据冗余

如:

e3e53f8faa743952b2d93bfe65c66e0c.png

这三行只说明了这三个商品的cat_id分别是4,8,8 以及在category表中cat_id = 1的cat_name = '手机类型'

这样的数据我们一般认为意义不大

我们需要的数据一般为minigoods的cat_id和category的cat_id相等的数据

mysql> selectminigoods.cat_id, goods_id, goods_name, category.cat_id, cat_name-> fromminigoods, category-> where minigoods.cat_id =category.cat_id;+--------+----------+-------------------------------+--------+----------+

| cat_id | goods_id | goods_name | cat_id | cat_name |

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

| 4 | 1 | KD876 | 4 | 4G手机 |

| 8 | 2 | vivo充电器 | 8 | 耳机 |

| 8 | 3 | 兰士顿D4 重低音四核双动圈耳机 | 8 | 耳机 |

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

3 rows in set (0.00 sec)

这样的数据就不会大量冗余

但是交叉连接,n*m行,再删除,效率不高

建立两张小表,方便比较各种连接的不同

mysql> create tabletest7(-> id int not null default 0,-> name varchar(20) not null default ''

->)engine myisam charset utf8;

Query OK,0 rows affected (0.07sec)

mysql> create tabletest8(-> id int not null default 0,-> name varchar(20) not null default ''

->)engine myisam charset utf8;

Query OK,0 rows affected (0.07sec)

mysql> insert intotest7-> values

-> (1, 't1'),-> (2, 't2'),-> (3, 't3');

Query OK,3 rows affected (0.00sec)

Records:3 Duplicates: 0 Warnings: 0mysql> insert intotest8-> values

-> (1, 't1'),-> (2, 't2'),-> (4, 't4');

Query OK,3 rows affected (0.00sec)

Records:3 Duplicates: 0 Warnings: 0

内连接

bb92208e58a0e8431313eec512d8ad8b.png

显示的是左右两边都有的id记录

左连接

a33b9c1ce6a37dade14e584343c011cf.png

在左连接中可以看到

test7的记录都显示出来了,而id = 3时,匹配不到test8中id,

所以出现了第三行的结果

(左连接是最少显示左边的记录数)

右连接

993ee76ba868e4107e46215e76f10b73.png

而右外接则显示的是全部的右边的信息,如果左边没有补null

(右连接时最少显示右边的行数)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值