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. Java 实例 - 如何执行指定class文件目录(classpath) Java 实例 J

    Java 实例 - 如何执行指定class文件目录(classpath)  Java 实例 如果我们 Java 编译后的class文件不在当前目录,我们可以使用 -classpath 来指定class ...

  2. python自动化开发-[第二十五天]-scrapy进阶与flask使用

    今日内容概要 1.cookie操作 2.pipeline 3.中间件 4.扩展 5.自定义命令 6.scrapy-redis 7.flask使用 - 路由系统 - 视图 - 模版 - message( ...

  3. 有时候eclipse 导入maven项目 启动的时候回出现这样一个问题

    严重: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catali ...

  4. sql server开发工具

    查询分析器的使用 SQL语言包含四个部分: 1.数据定义语言(DDL) : 例如 create, drop, alter等语句 2.数据操作语言(DML) : 例如 insert,delete, up ...

  5. 16、计算1加到100用两个定义值count=1、sum=0

    #!/user/bin/python# -*- coding:utf-8 -*-count = 1sum = 0while count <= 100: sum = sum + count cou ...

  6. java io系列13之 BufferedOutputStream(缓冲输出流)的认知、源码和示例

    本章内容包括3个部分:BufferedOutputStream介绍,BufferedOutputStream源码,以及BufferedOutputStream使用示例. 转载请注明出处:http:// ...

  7. springMVC的参数检验

    先说应用场景,比如说前台传来一个参数,我们肯定得在后台判断一下,比如id不能为空了,电话号码不能少于11位了等等.如果在service层一个一个判断岂不是要累死个人.代码也不简洁,这时候我们肯定会想到 ...

  8. Mysql:索引实战

    MySQL主要提供2种方式的索引:B-Tree索引,Hash索引 B树索引具有范围查找和前缀查找的能力,对于有N节点的B树,检索一条记录的复杂度为O(LogN).相当于二分查找. 哈希索引只能做等于查 ...

  9. linux chmod命令使用

    chmod:更改文件9个属性 Linux文件属性有两种设置方法,一种是数字,一种是符号. Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/wri ...

  10. 简:Spring中Bean的生命周期及代码示例

    (重要:spring bean的生命周期. spring的bean周期,装配.看过spring 源码吗?(把容器启动过程说了一遍,xml解析,bean装载,bean缓存等)) 完整的生命周期概述(牢记 ...