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;

时间: 2024-10-26 21:05:57

MySQL学习笔记(六)—— MySQL自连接的相关文章

MySQL学习笔记之一 MySQL入门

本人之前接触的关系型数据库主要是oracle和sqlserver,而对于mysql知之甚少,但查阅网上资料发现,mysql与oracle非常相似,所以学起来应该不会很费劲,在总结的时候可能更多的把关注点放在它与oracle的不同之处. 一.简介 MySQL是一个真正的多用户.多线程SQL数据库服务器.SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言.MySQL是一个客户端/服务器结构的实现, 它由一个服务器守护程序mysqld和很多不同的客户程序和库组成. MySQL的普及并不局限于

MySQL学习笔记 初涉MySQL

1.在Linux下安装MySQL # yum -y install mysql mysql-server mysql-devel        修改字符集:/etc/my.conf配置文件 vi /etc/my.conf [mysqld] default-character-set=utf8 character_set_server=utf8 [client] default-character-set=utf8 2.启动和停止MySQL服务 # service mysqld start 3.登

MySQL学习笔记(六):索引

本文主要介绍MySQL 中关于索引的一些问题,例如:索引的作用:怎么创建索引:设计索引的原则:怎么优化索引等等. 一:索引概述 所有的MySQL列类型都能创建索引,良好设计的所以能够很好地提高查询的性能,但如果索引过多,由于每次更新操作都会对索引进行更新,反而会影响到数据库的整体性能.因而,遵循一定的原则,设计合适的索引是非常重要的. (1):创建索引的语法 CREATE [UNIQUE|FULLTEXT|SPQTIAL] INDEX index_name [USING index_type]

MySQL学习笔记之MySQL安装详解

前言 虽然现在NoSQL发展迅速,但MySQL还是非常受欢迎的,成千上万的公司依旧采用LAMP OR LNMP的搭配来进行开发,因此MYSQL的学习还是有一定的必要. 安装环境:Windows 7,需要.NET FRAMEWORK 4.0的支持 MySQL版本:5.6.10.1 安装 1.双击SETUP安装文件开始安装,前面的三步都是点“下一步”即可. 2.到第四步出现如下图所示界面. 这步我是选择Custom安装类型,比较自由,然后指定安装目录和存放数据目录. 3.接下来的几步都可以直接“下一

MySQL学习笔记1 mysql简介

查询使用sql语言,(结构化查询语言) 传统数据库遵循ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).这是可靠数据库所应具备的几个特性.下面针对这几个特性进行逐个讲解. nosql (不遵循ACID) 关于sql与nosql google bigtable /amazon dynamo 开源 facebook cass

MySQL学习笔记:MySQL: ERROR 1064(42000)

ERROR 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax*** 出现此错误的一般原因为数据库的表名或字段名出现了MySql的关键字.解决方法主要有两种. 一.修改表名 二.加反引号 增加了一个group字段

【MySQL学习笔记】MySQL权限表

MySQL权限表,控制用户对数据库的访问,存在mysql数据库中,由mysql_install_db初始化,包括user,db,host,tables_priv,columns_priv,procs_priv 1.user表,记录允许连接到服务器的账号信息,权限为全局级. 用户列(包括host,user,password,前二者为user表的联合主键). 权限列,描述用户权限,值为N or Y,默认值都为N,修改需要靠grant或update 安全列 n  两个ssl相关,用于加密,show v

【mySQL学习笔记】mySQL远程访问

MySQL 连接方式: TCP/IP 套接字方式 这种方式会在TCP/IP 连接上建立一个基于网络的连接请求,一般是client连接跑在Server上的MySQL实例,2台机器通过一个TCP/IP 网络连接. c:\Users\LiuChao>mysql -h 210.45.250.3 -u remote -p 3925096 错误解决:mySQL不是内部或外部命令:mySQL ERROR 1130

mysql学习笔记之mysql数据库的安装

1.运行mysql安装包选择自定义安装(安装路径不要带中文,否则安装会出错!) 2.一个mysql想要操作成功需要有三部分:服务器端,数据段,数据. 3.服务器软件目录: 4.数据目录: 点击安装即可. 5.到这里mysql已经安装好了,接下来对mysql进行一些配置.比如配置mysql最多允许多少连接,是否可远程登录 7.机器类型: 8.是否支持事务 9.innodb表空间: 10.连接数量 11.字符集设定 最后执行配置即可. 接下里进入mysql安装目录下的bin目录查看下: 连接服务器:

MySQL学习笔记-事务相关话题

事务机制 事务(Transaction)是数据库区别于文件系统的重要特性之一.事务会把数据库从一种一致状态转换为另一个种一致状态.在数据库提交工作时,可以确保其要么所有修改都已经保存了,要么所有修改都不保存. InnoDB存储引擎中的事务完全符合ACID的特性. 原子性(atomicity) 原子性是指整个数据库事务是不可分割的工作单位.只有使事务中所有的数据库操作执行都成功,才算整个事务成功.如果事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行