欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MYSQL数据库操作——多表操作

程序员文章站 2022-05-10 19:56:20
...

多表操作

一、多表连接

将多张表连在一起进行查询。通过两个表共有的列去进行拼接。多表连接,首先要在表之间建立连接。
连接查询一共分为以下几类:

  1. 交叉连接
  2. 内连接
  3. 外连接
  4. 自然连接

(一)交叉连接

将一张表的数据与另外一张表中的数据彼此交叉。也就是说把一张表中的每一行逐个与另一张表去进行匹配。没有任何连接条件,所有的记录都会被保留。

SELECT 字段1,字段2 FROM 表1 JOIN 表2

交叉连接产生的结果是笛卡尔积,没有实际应用。

(二)内连接

使用比较运算符设置连接条件,将一个表中的所有行与另外一张表中的行进行匹配,只返回满足条件的行。

SELECT 字段1,字段2 FROM 表1 JOIN 表2 WHERE 连接(检索条件)

注:内连接一次可以连接很多张表,只需要在在建立连接的时候连接多张表,在设置检索条件的时候把需要检索的信息都设置好就可以。

(三)外连接

在查询时所有的表有主从之分。把作为主表的表的行与从表中的行一一进行匹配,如果匹配成功返回到主表中,如果匹配不成功,则仍然保留主表中的行,相应的从表中的行也被填上null值。
左外连接:LEFT JOIN ON
把左表作为主表去连接右表

SELECT * FROM 表1 LEFT JOIN 表2
ON条件表达式

右外连接:RIGHT JOIN ON
把右表作为主表去连接左边的表

SELECT * FROM 表1 RIGHT JOIN 表2 ON 条件表达式

MYSQL不支持全外连接
全外连接:即都为主表。左表中未匹配的行仍保留,同时赋给右表NULL值,右表的未匹配的行仍然保留同时赋给左表值NULL。

SELECT * FROM  表1 FULL JOIN 表2 ON 条件表达式

(四)自连接

自连接,就是两个表的两个副本进行连接,为了区别,对表设置别名

二、多表连接查询

子查询是指嵌套到其它查询里的SELECT语句,也称为嵌套查询。字查询一般不使用ORDER BY 语句
当子查询的返回值只有一个时,可以使用比较运算符等将父查询和子查询连接起来。
如果子查询的返回结果不止一个,是有很多个时不能直接使用比较运算符进行连接,可以在比较运算符和子查询之间插入ANY,SOME,ALL。其中等值关系可以用IN操作。

普通子查询

SELECT boys.`boyName` FROM boys 
WHERE boys.id
= (SELECT girls.boyfriend_id FROM girls WHERE girls.id<2);

带有ANY,ALL 谓词的子查询

父查询和子查询需要使用比较运算符进行连接
ANY只要有一个为TRUE则结果为TRUE
ALL如果一系列的比较都为TRUE,结果才为true

SELECT boys.`boyName` FROM boys 
WHERE boys.boysAGE
 >(SELECT girls.age FROM girls WHERE girls.`id`<2);

带有IN谓词的子查询

IN关键字的子查询用于判断父查询的表达式是否在子查询返回的多个值的列表中。

SELECT boys.`boyName` FROM boys WHERE boys.id
IN (SELECT girls.boyfriend_id FROM girls WHERE girls.id<4); 

带有EXISTS 谓词的子查询

判断是有存在有或者只要有有个。EXISTS和后边的查询语句共同构成一个EXISTS语句,只要在EXISTS语句中查询到有一个满足条件,返回结果为TRUE。否则返回结果为FALSE。

SELECT  * FROM boys 
WHERE EXISTS  (SELECT * FROM girls WHERE girls.id=4);

联合查询UNION

把多个查询语句的查询结果结合在一起。使用UNION 关键字

SELECT * FROM 表1
UNION * FROM 表2

UNION 联合查询的返回结果会自动去除重复项,如果不需要去除重复项需要使用 UNION ALL