数据库表的连接查询、子查询

一.连接查询包括:交叉连接,内连接,外连接(左外连,右外连)等。

1.交叉连接:一对多,获取两个表相乘后的数据行。

语法:select * from 表1 cross join 表2;
例如:select * from offices cross join users;


2.内连接:获取与连接条件匹配的数据行。

语法:
select 需要查询的列名列表
from 表1
join 表2 on 表1.关联列名= 表2.关联列名;
例如:

select users.uid,users.uname,offices.name

from users

join offices on users.oid=offices.id;

3.外连接:除获取与连接条件匹配的数据行,还获取左表或右表中其他不匹配的所有数据。

左连接语法:
select 需要查询的列名列表
from 表1
left join 表2 on 表1.关联列名= 表2.关联列名;
显示结果中包含匹配的所有数据和左边表1中不匹配的所有数据,不匹配列显示为NULL。

右连接语法:
select 需要查询的列名列表
from 表1
right join 表2 on 表1.关联列名= 表2.关联列名;
显示结果中包含匹配的所有数据和右边表2中不匹配的所有数据,不匹配列显示为NULL。

二.子查询(嵌套查询):指的是一个查询中嵌套另一个查询,执行时先执行子查询中的语句

使用in关键字进行子查询:该查询in后面返回的是数据集合,将集合的数据作为in前面查询的操作数据。
语法:select 字段名列表 from 表名 where 字段名 in(select 字段名 from 表名 where 条件|字段名 in(...));

使用exists进行测试查询:会先判断exists中查询结果是否为true(即是否存在),为true才执行前面的查询,为false就不执行。exists后面的子查询不会产生任何数据,只会返回true或false。
语法:select 字段名列表 from 表名 where exists(select 字段名 from 表名 where 条件|字段名 in(...));

使用any进行子查询:前面查询的条件可以和any结果集合的条件一一比较,只要满足条件就执行前面的查询返回结果。
语法:select 字段名列表 from 表名 where 字段名 比较运算符 any(select 字段名 from 表名 where 条件|字段名 in(...));
例如:select name from users where age > ANY(select age from users);

使用all进行子查询:all要求全部满足条件才执行前面的查询。
语法:select 字段名列表 from 表名 where 字段名 比较运算符 all(select 字段名 from 表名 where 条件|字段名 in(...));
注:any和all之前可以使用比较运算符,返回的是数据集合:>,<,<>(!=),>=,<=,=。

使用union联合结果集:合并两个或者多个select语句的结果集,union all表示合并时允许重复的值。并且联合后的结果集的列名总是等于union中第一个select语句中的列名。

你可能感兴趣的:(数据库学习)