首先我们需要明确两张表中之间的关系是靠外键来维护的,而在哪张表中设置外键呢?
我们的数据库表经常是一对多的关系,比如部门(一)和员工(多),专业(一)和学生(多),这时候我们就需要在多的一方设置一个字段为外键指向另一方的主键。
而当有多对多的关系时,我们就需要建立第三张表作为中间表,表中至少有两个字段,这两个字段作为外键分别指向两张表的主键。
多表查询有以下几种:
1. 合并结果集:UNION 、 UNION ALL
2. 连接查询
2.1内连接 [INNER] JOIN ON
2.2外连接 OUTER JOIN ON
- 左外连接 LEFT [OUTER] JOIN
- 右外连接 RIGHT [OUTER] JOIN
- 全外连接(MySQL不支持)FULL JOIN
2.3 自然连接 NATURAL JOIN
3.子查询
1.合并结果集
SELECT* FROM t1 UNION SELECT * FROM t2;
SELECT * FROM t1 UNION ALL SELECT * FROM t2;
2.连接查询
连接查询就是求出多个表的乘积(笛卡尔积)。
2.1内连接
内连接查询出的结果一定满足条件(和外连接对应,外连接查询出的结果并不一定满足条件)
语法:
select 列名 from 表1 inner join 表2 on 表1.列名=表2.列名 where.....(其他条件)
它等价于:
select 列名 from 表1,表2 where 表1.列名=表2.列名 and ...(其他条件)
其中表1.列名=表2.列名就是两张表中外键列的等值关系。
示例:
//查询学生表中的学生姓名和分数表中的分数 .
select name,score from student as s inner join scores as c on s.studentid=c.stuid
等价于:
select name,score from student as s,scores as c where s.studentid=c.stuid
当有三张表时语法为:
select 列名 from 表1
inner join 表2 on 表1.列名=表2.列名
inner join 表3 on 表1或表2.列名=表3.列名
where...
等价于:
select 列名 from 表1,表2,表3
where 表1.列名=表2.列名 and 表1/表2.列名=表3.列名 and (其他条件)
2.2外连接
比如当我们想要查询员工对应的部门时(员工表和部门表是两张表),我们可以使用内连接,最后显示的结果是每个员工和自己的部门。
而当我们还想要输出没有部门的员工或者没有员工的部门时,这时候内连接就不起作用了,我们就需要外连接。
语法:
//左外连
select 列名 from 主表 left join 次表 on 主表.列名=次表.列名
//右外连
select 列名 from 次表 right join 主表 on 主表.列名=次表.列名
我们可以观察到,在外连接中就有了主表和次表的区分,而主表和次表在外连接中是有严格区分的,不能像内连接一样两个表随意变换位置。
2.3自然连接
3.子查询
子查询就是在一个查询语句中包含另一个完整的查询语句,即嵌套查询。
子查询出现的位置:
- where之后,作为被查询条件的一部分。此时还可以使用any、all关键字
- from之后,作为一个表
示例:
查询工资高于张三的工资的员工信息:
第一步我们需要查询张三的工资:
SELECT sal FROM emp WHERE name='张三';
第二步我们查询高于张三工资的员工信息:
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='张三');