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下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)的更多相关文章

  1. MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)

    先建立一张 m 表 mysql> create table m ( -> mid int, -> hid int, -> gid int, ), -> matime da ...

  2. MySql 在cmd下的学习笔记 —— 有关用户权限的操作(grant)

    用户连接到MySQL时: [用户]   <---->   [服务器] 分为2个阶段: 1:有没有权限连接: 2:有没有执行此操作的权利.(如select, update……) 判断依据:( ...

  3. MySql cmd下的学习笔记 —— 有关建立表的操作(有关于数据类型)

    (01)建表的过程实际上是 声明字段 的过程 一. 列类型(字段): 存储同样的数据时,不同的列类型,所占据的空间和效率是不一样的,这就是建表时要考虑的意义. 二.MySQL三大列类型     数值型 ...

  4. MySql 在cmd下的学习笔记 —— 有关游标的操作(cursor)

    ---恢复内容开始--- cursor 指在1条sql,对应N条资源,取出资源的接口/句柄,就是游标 沿着游标,可以一次取出一行 对于游标,必须要先声明一下 fetch 会读取每一条记录,当没有时,会 ...

  5. MySql 在cmd下的学习笔记 —— 有关储存过程的操作(procedure)

    我们把若干条sql封装取来,起个名字------把此过程存储在数据库中叫存储过程 调用procedure 储存过程是可以变成的,意味着可以使用变量,表达式,控制结构 来完成复杂的功能 声明变量 pro ...

  6. MySQL学习笔记8——多表查询

    多表查询 多表查询 *合并结果集 *连接查询 *子查询 合并结果集 *要求被合并的表中,列的类型和列数相同(实际上是查询的结果集列类型和列数相同即可) *UNION,去除重复行 *UNION ALL, ...

  7. MySql cmd下的学习笔记 —— 有关子查询的操作(where型,from型,exists型子查询)

    先找到goods表 查询goods_id最大的商品 where型的子查询 查询goods_id最大的商品(不能用排序) 把两步写成一步,就是子查询 from型子查询 查找出每种cat_id下goods ...

  8. 《MySQL必知必会学习笔记》:子查询

    子查询 在開始了解子查询之前,首先做下准备工作,建立3个表, 一个是customers表,当中包含:客户名字.客户ID.客户Tel等. 一个是orders表,当中包含:订单号.客户ID.订单时间等. ...

  9. Mybatis学习笔记之---多表查询(1)

    Mybatis多表查询(1) (一)举例(用户和账户) 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) (二)步骤 1.建立两张表:用户表,账户表,让用户表和账户表之 ...

随机推荐

  1. Educational Codeforces Round 55 (Rated for Div. 2) B. Vova and Trophies

    传送门 https://www.cnblogs.com/violet-acmer/p/10035971.html 题意: Vova有n个奖杯,这n个奖杯全部是金奖或银奖,Vova将所有奖杯排成一排,你 ...

  2. ArrayList、LinkList、Vector的区别

    ArrayList.LinkedList和Vector均实现了List接口,均为可伸缩数组(均为可动态改变长度的数组).它们是有序的集合,并且其中的元素允许重复. 从底层实现来看: (1)ArrayL ...

  3. (基础) 平方和与立方和 hdu2007

    平方和与立方和 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2007 Time Limit: 2000/1000 MS (Java/Others)     ...

  4. 线程(Thread)

    package cn.gouzao.demo3; public class ThreadDemo extends Thread{ public void run(){ for(int i=0;i< ...

  5. Vue.js 条件与循环

    条件判断: v-if: 条件判断使用 v-if 指令: v-else-if:(其实和Java,c,js的语法差不多) v-show:

  6. docker 基础之操作容器

    Docker子命令分类 Docker 环境信息 info .version 容器生命周期管理 Create.exec.kill.pause.restart.rm.run.start.stop.unpa ...

  7. linux优化之系统参数调优篇

    linux优化之系统参数调优篇 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.用户限制配置文件(首先需要编辑/etc/security/limits.conf文件) 大家可以 ...

  8. CentOS7 下编译 Hadoop

    准备工作 下载 Hadoop 源码 Source (当前最新 2.9.2) https://hadoop.apache.org/releases.html 打开压缩包会看到 BUILDING.txt ...

  9. Golang入门教程(四)变量声明

    Go 语言变量名由字母.数字.下划线组成,其中首个字母不能为数字. 一.Go的语言结构 1.Go的语言基础部分由这几个部分组成 包声明 引入包 函数 变量 语句&表达式 注释 比如下面这个简单 ...

  10. 细说java平台日志组件

    1. java.util.logging JDK自带日志组件,使用方式简单,不需要依赖第三方日志组件.支持将日志打印到控制台,文件,甚至可以将日志通过网络打印到指定主机.相对于第三方独立日志框架来说, ...