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. IIS 错误:由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

    HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 可能是缺少处理程序映射.默认情况 ...

  2. python自动化开发-[第六天]-常用模块、面向对象

    今日概要: 1.常用模块 - os模块 - random模块 - shutil模块 - hashlib模块 - pickle/json模块 - shelve模块 - configparser模块 - ...

  3. Linux中rpm的使用

    1.安装 rpm -i 需要安装的包文件名 举例如下: rpm -i example.rpm 安装 example.rpm 包: rpm -iv example.rpm 安装 example.rpm ...

  4. Storm常用的类

    BaseRichSpout (消息生产者)BaseBasicBolt (消息处理者)TopologyBuilder (拓扑的构建器)Values (将数据存放到values ,发送到下个组件)Tupl ...

  5. linux proc

    /proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用.可以使用的文件随系统配置的变化而变化. /proc/cmdline 这个文件给出了内核启动的命 ...

  6. 网络编程基础【day10】:我是一个进程(三)

    本节内容 1.引子 2.进程的诞生 3.线程 4.争吵 一.引子 我听说我的祖先们生活在专用计算机里, 一生只帮助人类做一件事情,比说微积分运算 了.人口统计了 .生成密码.甚至通过织布机印花 !   ...

  7. 5句话搞定ES5作用域

    JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C# ...

  8. DirectX11 With Windows SDK--03 索引缓冲区、常量缓冲区

    前言 一个立方体有8个顶点,然而绘制一个立方体需要画12个三角形,如果按照前面的方法绘制的话,则需要提供36个顶点,而且这里面的顶点数据会重复4次甚至5次.这样的绘制方法会占用大量的内存空间. 接下来 ...

  9. sqlalchemy外键和relationship查询

    前面的文章中讲解了外键的基础知识和操作,上一篇文章讲解了sqlalchemy的基本操作.前面两篇文章都是作为铺垫,为下面的文章打好基础.记得初一时第一次期中考试时考的不好,老爸安慰我说:“学习是一个循 ...

  10. 搭建idea下的vue工程

    需要先安装好nodejs和npm 输入下面的命令查看是否成功安装 node -v npm -v 一.开始 工作目录:IdeaProjects使用idea新建Static Web项目:demo 在dem ...