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.建立两张表:用户表,账户表,让用户表和账户表之 ...
随机推荐
- c#反射(1)
反射可以读取程序集中代码的内容,程序集一般指(dll或exe文件). 反射中Type类,这个类太强大了,可以获取到另一个类的名称,命名空间,程序集,以及这个类中的字段,属性,方法.可以方便我们查看某个 ...
- (计算几何基础 叉积) nyoj68-三点顺序
68-三点顺序 内存限制:64MB 时间限制:1000ms 特判: No通过数:27 提交数:43 难度:3 题目描述: 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断 ...
- Python网络编程之socket编程
什么是Socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面 ...
- 怎么用ajax下载文件
可能大家都觉得没有必要用ajax来下载东西,用window.open(url)就可以搞定 但是这有一个问题,就是这就限定了只能用GET方式来请求了: 可能你又会说GET很符合REST的要求呀. 但是如 ...
- Hbase学习04
3.2.4 反向时间戳 反向扫描API HBASE-4811(https://issues.apache.org/jira/browse/HBASE-4811)实现了一个API来扫描一个表或范围内的一 ...
- Hbase记录-zookeeper部署
#官网下载二进制包解压到/usr/app下,配置/etc/profile: export ZOOKEEPER_HOME=/usr/app/zookeeper export PATH=$PATH:$ZO ...
- springMVC怎么接受前台传过来的多种类型参数?(集合、实体、单个参数)
创建一个实体:里面包含需要接受的多种类型的参数.如实体.list集合.单个参数.(因为springMVC无法同时接受这几种参数,需要创建一个实体包含它们来接受) 如接收User(bean里面包含Lis ...
- [Android] Android Butterknife 8.8.1 在 Activity 和 Fragment 、 Adapter 中的使用
ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤.是大神JakeW ...
- Python自定义分页组件
为了防止XSS即跨站脚本攻击,需要加上 safe # 路由 from django.conf.urls import url from django.contrib import admin from ...
- javascript中var、let和const的区别
在javascript中,var.let和const都可以用来声明变量,那么三者有什么区别呢?要回答这个问题,我们可以从先想想:三种不同的声明会影响变量的哪些方面?这些方面也就是变量的特性,那么变量有 ...