mysql 多表既有内连接又有外连接_mysql 多表查询,内连接、外连接( left join、right join、full join)union与union all...

学生表数据

57a18c546a8fc0b2c7409966f53448b7.png

班级表数据

0b801e2c474f96458c1252c24411a378.png

部门表数据

2e022b181b7e32df85191f7e7fb82355.png

内连接合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

1. 交叉连接查询(基本不会使用-得到的是两个表的乘积) (这种查询时候会产生笛卡尔积)

多表查询会产生笛卡尔积:

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

实际运行环境线下,应避免使用权笛卡尔积

解决方案:在where加入有效的条件-->等值连接(等值连接找的是列的值一样的数据,跟列名称和列类型无关)

语法:

1.1  select * from A,B;

1.2 select * from A cross join B;

1.3 select * from A natural join B;(自然连接,底层先笛卡尔积,然后按照所有同名同值列自动进行等值筛选。)

2. 内连接查询(使用的关键字 inner join )

隐式内连接: select * from A,B where 条件;

显示内连接: select * from A inner join B on 条件;后面接 两张表中中需要关联的字段 (字段名称不需要一样 A.id = B.id )

select * from A inner join B using 条件;using 后面接 两张表中都存在的字段 (字段名称 一样)

外连接

外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL). 外连接的 WHERE 子句条件类似于内部连接, 但连接条件中没有匹配行的表的列后面要加外连接运算符, 即用圆括号括起来的加号(+).

左连接LEFT JOIN的含义就是求两个表的交集外加左表剩下的数据。依旧从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录

右连接RIGHT JOIN就是求两个表的交集外加右表剩下的数据。再次从笛卡尔积的角度描述,右连接就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上右表中剩余的记录

全连接,MySQL目前不支持此种方式。

union   操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。过滤重复,即重复的数据不显示。同时必须保证 两个表的列数要相同,列的类型要一致。

union all 用于将不同表中相同列中查询的数据展示出来;(包括重复数据)。同时必须保证 两个表的列数要相同,列的类型要一致。

内连接 交叉连接例子

488793aff0412efc9c6c48ea188ce852.png

内连接 隐式内连接 等值连接(等值连接找的是列的值一样的数据,跟列名称和列类型无关)

d305e54d30cefaefc85de56f547695cd.png

d1df4194a345a01650f97b980759861f.png

内连接 自然连接(自然连接,底层先笛卡尔积,然后按照所有同名同值列自动进行等值筛选。)

eac774cf554afd9655f8540f19f1b44b.png

内连接 显示内连接

1f4c737d1465edebdafd07597751481a.png

caf7070ec7f8ea5c564b27f1d187c0b1.png

713c2063007c8ecde4f00772f0376610.png

左外连接(先把dept表的did=3的列的值改为30,让学生表did=3的部门在部门表里不存在)右连接同理。

左外连接的含义:两个表的交集外加左表剩下的数据。依旧从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录

772f3f0f09eff3e23d13827a697eaae6.png

union 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。过滤重复,即重复的数据不显示。同时必须保证 两个表的列数要相同,列的类型要一致

999f11c6c0789ccbd82bac3b2b4a453a.png

a7e7aa4a4808e4ea04771339ffec26db.png

union all 用于将不同表中相同列中查询的数据展示出来;(包括重复数据)。同时必须保证 两个表的列数要相同,列的类型要一致。

6df3658c5764bab20ba5bde9bb7bb817.png

fd22f903e8370b6dde293f01b7369d01.png

group by分组函数 在mysql中没有强调select指定的字段必须属于group by后的条件。若符合条件的字段有多个,则只显示第一次出现的字段。

53f3bebd28b7ed5d31238bb1a812196d.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值