文章目录
1. 内连接查询
1.1 内连接查询的概念
查询两表交集部分。有隐式内连接和显式内连接两种写法,功能都是一样的。
1.2 隐式内连接
select 字段列表
from 表名1,表名2
where 表名1.字段名 = 表名2.字段名;
注意:
- 在查询的列出现二义性时,要使用完全限定名。
- 如果没有使用 where 子句过滤,则查询出的行数是两个数据表中的行数的乘积,这称之为“笛卡儿积”,这样会产生很多无用的数据。
1.3 显式内连接
select 字段列表
from 表名1 [inner] join 表名2
on 表名1.字段名 = 表名2.字段名;
注意:inner 可以省略,不影响语义
2. 外链接查询
2.1 外链接查询的概念
查询一个表所有数据以及两表交集部分,分为左外连接和右外连接
2.2 左外连接
查询左表所有数据以及两表交集部分
select 字段列表
from 表名1 left [outer] join 表名2
on 表名1.字段名 = 表名2.字段名;
实例:
-- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称
SELECT emp.* , dept.name
FROM emp LEFT JOIN dept
ON emp.dept_id = dept.id;
注意:outer 可以省略,不影响语义
2.3 右外连接
查询右表所有数据以及两表交集部分
select 字段列表
from 表名1 right [outer] join 表名2
on 表名1.字段名 = 表名2.字段名;
注意:outer 可以省略,不影响语义
3. 子查询
3.1 子查询的概念
查询中嵌套查询,称嵌套查询为子查询。
3.2 子查询的多种情况
-
子查询的结果是单行单列的
子查询可以作为条件,使用运算符去判断
实例:
-- 查询员工工资小于平均工资的人 SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
-
子查询的结果是多行单列的
子查询可以作为条件,使用运算符 IN 来判断
实例:
-- 查询'财务部'和'市场部'所有的员工信息 SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部');
-
子查询的结果是多行多列的
子查询可以作为一张虚拟表参与查询
实例:
-- 查询员工入职日期是 2011-11-11 日之后的员工信息和部门信息 SELECT * FROM dept AS t1 ,(SELECT * FROM emp WHERE emp.join_date > '2011-11-11') AS t2 WHERE t1.id = t2.dept_id;