mysql数据库表连接和子查询

一、表连接

在实际工作中,很多时候获取的数据来源于多张表,一个表没法满足需求,就需要进行多表查询工作,而多表查询的实现需要借助于表连接的操作。
表连接的方式:
1)内连接,让多个表进行关联,然后只有表与表之间能匹配到的情况下,才会有查询结果
2)外连接,至少会返回一个表的所有行,先写的时左表,后写的时右表

1. 内连接

1.1 where进行表间关联

格式:

select 表名1.列名1,表名2.列名2,... from 表名1,表名2 where 表名1.列名1=表名2.列名2;

1.2 inner join on进行表间关联

格式:

select 表名1.列名1,表名2.列名2,... from 表名1 [inner] join 表名2 on 表名1.列名1=表名2.列名2;

注意:
多表查询,最关键的一点是表与表之间有能够关联的列,对于关联的列的要求:列名可以不一样,但是这个列的数据类型必须一样。

1.3 额外条件

格式一:

select 表名1.列名1,表名2.列名2,... from 表名1,表名2 where 表名1.列名1=表名2.列名2 and 其他条件;

格式二:

select 表名1.列名1,表名2.列名2,... from 表名1 [inner] join 表名2 on 表名1.列名1=表名2.列名2 and 其他条件;

注:两个表的单独列可以不写列名,相同列要写:表名.列名

1.4 针对多张表查询

表数量大于2,两两结合
格式一:

select 表名1.列名1,表名2.列名2,... from 表名1,表名2,表名3 where 表名1.列名1=表名2.列名1 and 表名2.列名2=表名3.列名2;

格式二:

select 表名1.列名1,表名2.列名2,... 
from 表名1 [inner] join 表名2 
on 表名1.列名1=表名2.列名2 inner join 表名3 
on 表名2.列名2=表名3.列名2 
and 其它条件;

2.外连接

2.1 左外部连接

对左边的表不加限制,返回的是左表所有行
格式:

select 表名1.列名1,表名2.列名2,... 
from 表名1 left [outer] join 表名2 
on 表名1.列名1=表名2.列名2 and 其他条件;

如果左表中数据在右表中没找到匹配信息,对应位置为Null

2.2 右外部连接

对右边的表不加限制,返回的是右表所有行
格式:

select 表名1.列名1,表名2.列名2,... 
from 表名1 right [outer] join 表名2 
on 表名1.列名1=表名2.列名2 and 其他条件;

如果右表中数据在左表中没找到匹配信息,对应位置为Null

二、子查询

1. 查询语句中嵌套查询语句

格式一(in):

select 列名 from 表名 where 列名 in (select子查询语句);

遵循原则:条件要什么,子查询就查什么
格式二(=):

select 列名 from 表名 where 列名 = (select子查询语句);

对于子查询结果有且只有一个

2. 适合子查询的情况

1)给的条件没有明确说明
如:查询和王五同学所在一个系的学生信息
2)因为where后不能直接写聚合函数,那么可以借助于子查询,直接把聚合函数结果查询出来,通过结果来进行操作

3. 嵌套子查询

指的是子查询中还包含另一个子查询

4. 相关子查询

也叫胆汁子查询,子查询结果有且只有一个
insert和select结合:把查询结果插入到某张表中
格式:

insert into 表名 select子查询语句;

update和select结合:

update 表名 set 更新语句 where 列名 in (select子查询语句);

delete和select结合:

delete from 表名 where 列名 in (select子查询语句);

看完点个赞呗!

猜你喜欢

转载自blog.csdn.net/yang_yang_heng/article/details/107494288