MySQL学习笔记(六)—— MySQL自连接
有的时候我们需要对同一表中的数据进行多次检索,这个时候我们可以使用之前学习过的子查询,先查询出需要的数据,再进行一次检索。
例如:一张products表,有产品id,供应商id(vend_id),产品名称等等.
mysql> select * from products;
+---------+---------+-----------+------------+-----------+
| prod_id | vend_id | prod_name | prod_price | prod_desc |
+---------+---------+-----------+------------+-----------+
| 1 | 550001 | 苹果 | 30 | NULL |
| 2 | 550002 | 橘子 | 40 | NULL |
| 3 | 550003 | 香蕉 | 50 | NULL |
| 4 | 550004 | 甜梨 | 60 | NULL |
| 6 | 550001 | 柿子 | 50 | NULL |
| 7 | 550001 | 椰子 | 44 | NULL |
+---------+---------+-----------+------------+-----------+
问题:我们了解到苹果这个产品质量存在问题,因此想看下苹果的供应商的其他产品是否存在问题.
分析:我们需要先获取苹果的vend_id,通过这个id获取其他的产品.
方法一: 使用子查询
mysql> select * from products where vend_id = (select vend_id from products where prod_name = '苹果');
+---------+---------+-----------+------------+-----------+
| prod_id | vend_id | prod_name | prod_price | prod_desc |
+---------+---------+-----------+------------+-----------+
| 1 | 550001 | 苹果 | 30 | NULL |
| 6 | 550001 | 柿子 | 50 | NULL |
| 7 | 550001 | 椰子 | 44 | NULL |
+---------+---------+-----------+------------+-----------+
3 rows in set (0.00 sec)
方法二:我们使用自联结,将vend_id与苹果这个产品vend_id相等的产品联结检索出来.
首先我们先引入一个新概念,表别名. 我们在进行表操作的时候为了方便可以给表起个别名,例如:
select * from products as prod where prod.prod_id = 1;
了解了这个我们再看下自联结,还是那个问题,使用自联结:
mysql> select p1.prod_id,p1.prod_name from products as p1,products as p2
-> where p1.vend_id = p2.vend_id and p2.prod_name = '苹果';
+---------+-----------+
| prod_id | prod_name |
+---------+-----------+
| 1 | 苹果 |
| 6 | 柿子 |
| 7 | 椰子 |
+---------+-----------+
3 rows in set (0.00 sec)
分析:我们将products表看成是两个表,一个表中的数据存储的是prod_name为苹果的数据,另一个表中存储的是其他的水果数据,我们将两个表的数据进行联结(其实就是联结的products这一张表)
我们再倒着看,先看sql语句:
select p1.prod_id,p1.prod_name from products as p1,products as p2
where p1.vend_id = p2.vend_id and p2.prod_name = '苹果';
这个语句说明的意思是查找p1表中的id和name,条件是p1的vend_id和p2的vend_id相等,同时p2的prod_name是苹果,那就是说先查看name为苹果的vend_id,把与苹果vend_id相等的数据找出来.
使用自联结而不是使用子查询的原因是,自联结的处理速度和性能更优于子查询.
再举个面试的例子,前几天刚遇到的:
有一张学生成绩表,有学生姓名,分数,科目,找出小明分数大于80分的科目中谁的分数最高.
方法一:
select * from student where student.class = (select student.class from student where student.name = '小明' and student.score >80 ) order by student.score limit 1;
方法二:
select s1.name,s1.score from student as s1,student as s2 where s1.class = s2.calss and s2.name = '小明' and s2.score >80;
MySQL学习笔记(六)—— MySQL自连接的更多相关文章
- 吴裕雄--天生自然MySQL学习笔记:MySQL 安装
所有平台的 MySQL 下载地址为: MySQL 下载:https://dev.mysql.com/downloads/mysql/ 注意:安装过程我们需要通过开启管理员权限来安装,否则会由于权限不足 ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL 运算符
要介绍 MySQL 的运算符及运算符的优先级. MySQL 主要有以下几种运算符: 算术运算符 比较运算符 逻辑运算符 位运算符 算术运算符 MySQL 支持的算术运算符包括: 在除法运算和模运算中, ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL 导入数据
1.mysql 命令导入 使用 mysql 命令导入语法格式为: mysql -u用户名 -p密码 < 要导入的数据库数据(runoob.sql) 实例: # mysql -uroot -p12 ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL 处理重复数据
有些 MySQL 数据表中可能存在重复的记录,有些情况允许重复数据的存在,但有时候我们也需要删除这些重复的数据. 防止表中出现重复数据 可以在 MySQL 数据表中设置指定的字段为 PRIMARY K ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL 临时表
MySQL 临时表在我们需要保存一些临时数据时是非常有用的.临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间. MySQL临时表只在当前连接可见,如果使用PHP脚本来创建My ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL 事务
MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成 ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL GROUP BY 语句
GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT column_name, funct ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL UNION 操作符
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中.多个 SELECT 语句会删除重复的数据. 语法 MySQL UNION 操作符语法格式: SELECT ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL 连接
使用mysql二进制方式连接 您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库. 实例 以下是从命令行中连接mysql服务器的简单实例: [root@host]# my ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL 管理
启动及关闭 MySQL 服务器 Windows 系统下 在 Windows 系统下,打开命令窗口(cmd),进入 MySQL 安装目录的 bin 目录. 启动: cd c:/mysql/bin mys ...
随机推荐
- Loj #125. 除数函数求和(2)
link : https://loj.ac/problem/125 分块calc即可. #include<bits/stdc++.h> #define ll long long using ...
- JavaScript奇技淫巧44招(2)
JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...
- remove xcode recent projects from dock menu 移除xcode dock菜单显示的项目列表
Launch Xcode Select File->Open Recent->Clear Menu Right-click the Xcode icon and select Show A ...
- 简单过下bash/sh脚本基本知识吧
1.sh/bash要注意空格的使用 2. for循环: for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then if [ &q ...
- python为不同的对象如何分配内存的小知识
id方法的返回值就是对象的内存地址. python中会为每个出现的对象分配内存,哪怕他们的值完全相等(注意是相等不是相同).如执行a=2.0,b=2.0这两个语句时会先后为2.0这个Float类型对象 ...
- AngularJS的ng-class示例
程序下载:https://files.cnblogs.com/files/xiandedanteng/angularJSRender.rar 代码: <!DOCTYPE HTML PUBLIC ...
- 百科知识 hta文件如何打开
后缀名为hta是什么文件,谢谢? 2006-10-11 21:36 提问者: tanhailong2006 | 浏览次数:2092次 我来帮他解答 输入内容已经达到长度限制 还能输入 9999 字 插 ...
- hibernate的注解装配
1.多对多,(中间表不用映射) @ManyToMany @JoinTable(name = "中间表名", joinColumns = { @JoinColumn(name = & ...
- C#对象实例化
C#常用的对象实例化有以下几种方式: using System; using System.Collections.Generic; using System.Linq; using System.R ...
- python(36)- 测试题
1.8<<2等于? 32 “<<”位运算 264 132 64 32 16 8 4 2 1 原始位置 0 0 0 0 0 1 0 0 0 想左位移2位 0 0 0 1 0 0 ...