MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
mysql> create table test5(
-> id int,
-> sname varchar(20)
-> )engine myisam charset utf8;
Query OK, 0 rows affected (0.07 sec) mysql> create table test6(
-> cat_id int,
-> cname varchar(20)
-> )engine myisam charset utf8;
Query OK, 0 rows affected (0.06 sec) mysql> insert into test5
-> values
-> (1, '甲'),
-> (2, '乙'),
-> (3, '丙');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0 mysql> insert into test6
-> values
-> (95, '丁'),
-> (96, '戊');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
先插入两个表,便于之后的学习

交叉连接

建立一张小的goods表方便练习
mysql> create table minigoods like goods;
Query OK, 0 rows affected (0.07 sec) mysql> insert into minigoods
-> select * from goods limit 3;
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0



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

字段列表中的“Cat_ID”列不明确。
两张表都存在cat_id列,某一列名,在两张表内都出现,需要指定表名.列名
mysql> select goods_id, minigoods.cat_id,goods_name, category.cat_id, cat_name
-> from minigoods, 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 | 充值卡

如果嫌太长了 也可以选择用别名的方式
但在查询中,明显看出有很多数据冗余
如:

这三行只说明了这三个商品的cat_id分别是4,8,8 以及在category表中cat_id = 1的cat_name = '手机类型'
这样的数据我们一般认为意义不大
我们需要的数据一般为minigoods的cat_id和category的cat_id相等的数据
mysql> select minigoods.cat_id, goods_id, goods_name, category.cat_id, cat_name
-> from minigoods, 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 table test7(
-> id int not null default 0,
-> name varchar(20) not null default ''
-> )engine myisam charset utf8;
Query OK, 0 rows affected (0.07 sec) mysql> create table test8(
-> id int not null default 0,
-> name varchar(20) not null default ''
-> )engine myisam charset utf8;
Query OK, 0 rows affected (0.07 sec) mysql> insert into test7
-> values
-> (1, 't1'),
-> (2, 't2'),
-> (3, 't3');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0 mysql> insert into test8
-> values
-> (1, 't1'),
-> (2, 't2'),
-> (4, 't4');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
内连接

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

在左连接中可以看到
test7的记录都显示出来了,而id = 3时,匹配不到test8中id,
所以出现了第三行的结果
(左连接是最少显示左边的记录数)
右连接

而右外接则显示的是全部的右边的信息,如果左边没有补null
(右连接时最少显示右边的行数)
MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)的更多相关文章
- MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)
先建立一张 m 表 mysql> create table m ( -> mid int, -> hid int, -> gid int, ), -> matime da ...
- MySql 在cmd下的学习笔记 —— 有关用户权限的操作(grant)
用户连接到MySQL时: [用户] <----> [服务器] 分为2个阶段: 1:有没有权限连接: 2:有没有执行此操作的权利.(如select, update……) 判断依据:( ...
- MySql cmd下的学习笔记 —— 有关建立表的操作(有关于数据类型)
(01)建表的过程实际上是 声明字段 的过程 一. 列类型(字段): 存储同样的数据时,不同的列类型,所占据的空间和效率是不一样的,这就是建表时要考虑的意义. 二.MySQL三大列类型 数值型 ...
- MySql 在cmd下的学习笔记 —— 有关游标的操作(cursor)
---恢复内容开始--- cursor 指在1条sql,对应N条资源,取出资源的接口/句柄,就是游标 沿着游标,可以一次取出一行 对于游标,必须要先声明一下 fetch 会读取每一条记录,当没有时,会 ...
- MySql 在cmd下的学习笔记 —— 有关储存过程的操作(procedure)
我们把若干条sql封装取来,起个名字------把此过程存储在数据库中叫存储过程 调用procedure 储存过程是可以变成的,意味着可以使用变量,表达式,控制结构 来完成复杂的功能 声明变量 pro ...
- MySQL学习笔记8——多表查询
多表查询 多表查询 *合并结果集 *连接查询 *子查询 合并结果集 *要求被合并的表中,列的类型和列数相同(实际上是查询的结果集列类型和列数相同即可) *UNION,去除重复行 *UNION ALL, ...
- MySql cmd下的学习笔记 —— 有关子查询的操作(where型,from型,exists型子查询)
先找到goods表 查询goods_id最大的商品 where型的子查询 查询goods_id最大的商品(不能用排序) 把两步写成一步,就是子查询 from型子查询 查找出每种cat_id下goods ...
- 《MySQL必知必会学习笔记》:子查询
子查询 在開始了解子查询之前,首先做下准备工作,建立3个表, 一个是customers表,当中包含:客户名字.客户ID.客户Tel等. 一个是orders表,当中包含:订单号.客户ID.订单时间等. ...
- Mybatis学习笔记之---多表查询(1)
Mybatis多表查询(1) (一)举例(用户和账户) 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) (二)步骤 1.建立两张表:用户表,账户表,让用户表和账户表之 ...
随机推荐
- 安卓和java开发环境的安装
java配置安卓需要,sdk,jdk(java),adt,eclipse 对于jdk的配置和安装: 1 卸载原来的jdk,重新配置环境变量只需要:在系统变量中把新的jdkJ安装路径写到“JAVA_HO ...
- pageObject学习
1.java代码层面的pageObject实现 参考:https://www.cnblogs.com/yytesting/p/6973474.html 是用java写的实例,优点是结构很清晰,缺点是p ...
- mysql 变量定义 sql查询
SET @idnoStr:='"idNo":"'; SELECT LOCATE(@idnoStr, param_array), LOCATE('",', par ...
- (链表 双指针) leetcode 141. Linked List Cycle
Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked lis ...
- Level-IP(Linux userspace TCP/IP stack)
转自:github.com/saminiir/level-ip Level-IP is a Linux userspace TCP/IP stack, implemented with TUN/TAP ...
- 爬虫之requests请求库高级应用
1.SSL Cert Verification #证书验证(大部分网站都是https) import requests respone=requests.get('https://www.12306. ...
- JavaSE_坚持读源码_ArrayList对象_Java1.7
底层的数组对象 /** * The array buffer into which the elements of the ArrayList are stored. * The capacity o ...
- 体验Hadoop3.0生态圈-CDH6.1时代的来临
体验Hadoop3.0生态圈-CDH6.1时代的来临 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我在公司使用的是CDH5.15.1这个发行版本,具体的部署文档之前也有给大家分享 ...
- python django基础三 模版渲染
request对象 当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象.Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 reque ...
- python 计算机发展史,线程Process使用 for循环创建 2种传参方式 jion方法 __main__的解释
########################总结################## #一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理.调度进程,并且将多个进程对硬 ...