数据库多表连接查询
1.什么是多表连接查询
同时对多张表进行查询操作,表与表之间要通过连接条件来连接。一般这个连接条件是主键列是否等于外键列。
表连接的主要三种方式是:
连接方式 概念说明
内连接 分为显示内连接和隐式内连接,查询的数据必须左右两表都存在才会显示
左连接 以左表为准,即使左表数据在其他表中没有匹配也会查询来,且
会以null补齐
右连接 以右表为准,即使右表数据在其他表中没有匹配也会查询来,且会以null补齐
2.笛卡尔积现象
笛卡尔积:笛卡尔积是指在数学中,两个集合A和B的笛卡尔积,又称直积,表示A x B,第一个对象是A的成员,第
二个对象是B的所有可能有序对的其中一个成员。
在数据库表的连接中的笛卡尔积,指两张表中,以行为最小单位,两张表行的笛卡尔积集。
即:
表A={行1,行2,行3}
表B={行a,行b}
则A x B = {(行1,行a),(行1,行b),(行2,行a),(行2,行b),(行3,行a),(行3,行b)}
简单理解:笛卡尔积的行数=A的行数 乘 B的行数,笛卡尔积的列数=A的列数 + B的列数
3.内连接
用左边表的记录去匹配右边表的记录,如果符合条件的则显示。如:从表.外键=主表.主键
3.1隐式内连接
看不到join关键字,条件使用where指定
格式:
select 字段名 from 左表,右表 where 条件
SELECT * FROM emp,dept WHERE emp.dept_id = ;3.2显式内连接
使用inner join… on语句,可以省略inner
格式:
select 字段名 from 左表 inner join 右表 on 条件 [where 条件]
select * from emp e inner join dept d on e.dept_id = d.id WHERE e.`name`='张三';4外连接
4.1左外连接
使用left outer join … on,outer可以省略,用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示null
格式:
select 字段名 from 左表 left [outer] join 右表 on 条件
select * from dept d left join emp e on d.id = e.dept_id;4.2右外连接
使用right outer join … on 用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示null
格式:
select 字段名 from 左表 right [outer] join 右表 on 条件
select * from dept d right join emp e on d.id = e.dept_id;5子查询
概念:一个查询的结果做为另一个查询的条件;有查询的嵌套,内部的查询称为子查询;子查询要使用括号。
子查询结果的三种情况:结果是单行单列;结果是多行单列;结果是多行多列。
5.1 结果是单行单列
子查询结果只要是单行单列,肯定在 WHERE 后面作为条件,父查询使用:比较运算符,如:> 、<、!=、= 等
格式:select 查询字段 from 表 where 字段=(子查询);
5.2 结果是多行单列
子查询结果是单列多行,结果集类似于一个数组,父查询使用 IN 运算符
格式:select 查询字段 from 表 where 字段 in(子查询);
5.3 结果是多行多列
子查询结果只要是多列,肯定在 FROM 后面作为表
格式:select 查询字段 from (子查询) 表别名 where 条件;

数据库关联关系
1.一对一
概念:一张表的一个字段和另外一张表的一个字段唯一对应。就如同婚姻关系,一个丈夫对应一个妻子
条件:某一张表需要增加一个外键且唯一和主表对应
2.一对多
概念:一张表的一个字段和另外一张表的一个字段对应。但是第一张表的一个字段值,可以对应另外一张表中的一
个字段的多个值
例如:一个学生表和一个班级表
3.多对多
概念:一张表的一个字段和另外一张表的一个字段对应。但是第一张表的一个字段多个值,可以对应另外一张表中
的一个字段的多个值
条件:需要一张中间表作为两个关系表之间的关联表
例如:学生 选课

















