MySQL 约束、表连接、表关联、索引 (3)

MySQL 约束、表连接、表关联、索引

2、外连接:

外连接分类:

左外连接(left [outer] join)

右外连接(right [outer] join)

全外连接(full [outer] join) --(注:MySQL暂不支持)

语法:

select … from table1

(left | right | full) [outer] join table2

 on condition

 where definition 

解释:

不仅列出与连接条件(on)相匹配的行,还列出左表table1(左外连接)、或右表table2(右外连接)、或两个表(全外连接)中所有符合WHERE过滤条件的数据行。一般都是用左连接或者外连接。

其中,[outer]部分可以不写,(left | right | full)部分要写其中一个。

2.1  左外连:左表列出全部,右表只列出匹配的记录

举例:

MySQL 约束、表连接、表关联、索引

2.2  右外连:右表列出全部,左表只列出匹配的记录

举例:

MySQL 约束、表连接、表关联、索引

3、交叉连接(笛卡尔积):

语法:

select … from table1 cross join table2; 

没有on子句和where子句,它返回的是连接表中所有数据行的笛卡尔积。

笛卡尔积举例:假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}

其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

等价于:

select … from table1, table2; 

举例:

MySQL 约束、表连接、表关联、索引

4、自连接:

参与连接的表都是同一张表(通过给表取别名虚拟出两张表)。

注:非常重要,在Web中的目录树中用的特别多。

举例:查询出员工姓名和其leader的姓名(类似于求节点及其父节点)

MySQL 约束、表连接、表关联、索引

我们来详细解释一下上面的代码。对于同一张employee表,我们把e1作为员工表,e2作为领导表。首先把全部的员工列出来(基于左外连接),然后找到我们所需要的条件:员工的经理id(e1.leader)等于经理表的id(e2.id)。

举例:查询出所有leader的姓名。

MySQL 约束、表连接、表关联、索引

分析的道理同上。

其实,上面的两个查询结果都是下面这个查询结果的一部分:

MySQL 约束、表连接、表关联、索引

三、子查询:

作用:某些情况下,当进行查询的时候,需要的条件是另外一个select 语句的结果,这个时候,就要用到子查询。

定义:为了给主查询(外部查询)提供数据而首先执行的查询(内部查询)被叫做子查询。也就是说,先执行子查询,根据子查询的结果,再执行主查询。

关键字:用于子查询的关键字主要包括 IN、NOT IN、EXIST、NOT EXIST、=、<>等(符号“<>”的意思是:不等于)。

备注:MySQL从4.1开始才支持SQL的子查询。一般说子查询的效率低于连接查询(因为子查询至少需要查询两次,即至少两个select语句。子查询嵌套越多,性能越低)。表连接都可以用子查询替换,但反过来说却不一定。

我们一下面的这张员工表举例:

MySQL 约束、表连接、表关联、索引

1、举例:查询月薪最高的员工的名字

MySQL 约束、表连接、表关联、索引

上面的例子中,我们就是先通过聚合函数查出最高的月薪,然后根据这个值查出对应员工的名字。

2、举例:查询出每个部门的平均月薪

MySQL 约束、表连接、表关联、索引

上面的例子中,先将部门进行分类(前提是部门不能为空),然后分别单独求出各类中的薪水平均值。

注:这里我们没有用到子查询,因为比较麻烦。

3、举例:查询月薪比平均月薪高的员工的名字(我们知道,整体的平均工资是250)

MySQL 约束、表连接、表关联、索引

疑问:如果要查询比部门平均工资高的员工,该怎么写呢?下面的这种写法是错误的:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypzpy.html