隐式内连接---看不到join关键字,使用where条件
语法:select 字段列表 from 表名名1,表名名2 where 连接条件
如:
select
e.*,
d.*
from
emp e, --表一
dept d --表二
where e.`dept_id` = d.`id` ; --连接关系
显示内连接---inner join 关键字,inner可以省略
语法:select 字段列表 from 表名名1 inner join 表名名2 on 连接条件;
如:
SELECT
e.*,
d.*
FROM
emp e --表一
INNER JOIN
dept d --表二
ON
e.`dept_id` = d.`id` ; --连接关系
实际开发中:内连接优先使用where隐式内连接(SQL优化的一种)
2)外连接
左外连接(推荐)
语法:select 字段列表 from 表名1 left outer join 表名2 on 连接条件
outer可以省略
右外连接
语法:select 字段列表 from 表名1 right outer join 表名2 on 连接条件
outer可以省略
3)子查询
注意:select 语句嵌套select语句,
这种场景实际开发使用很少
查询的效率比较低
常用where条件使用比较运算符
或者使用in集合语句
或者使用一条select语句的结果作为一个"虚表"和其他表查询
情况1:使用where 条件使用比较运算符
-- 需求:查询最高工资的员工信息
-- 1)查询最高工资是多少
-- select max(salary) from emp ; -- 16000
-- 2)查询员工的工资是16000的员工信息
-- select * from emp where salary = 16000 ;
-- 一步走
SELECT * FROM emp WHERE salary = (SELECT MAX(salary) FROM emp ) ;
情况2:使用in集合语句
-- 需求:查询在市场部或者财务部的员工信息
-- 1)先查询出市场部和财务部的id
-- select id from dept where name = '市场部' or name = '财务部' ;
-- 2)查询dept_id是2或者3的员工信息
-- select * from emp where emp.`dept_id` in(2,3) ;
-- 一步走
SELECT
*
FROM
emp
WHERE emp.`dept_id` IN
(SELECT
id
FROM
dept
WHERE NAME = '市场部'
OR NAME = '财务部') ;
情况3:使用一个select语句查询的结果集 当前一张"虚表"和其他表进行关联查询
-- 需求:查询入职日期大于"2020-01-14"的员工信息以及部门名称信息
-- 1)按照这个条件先查询员工信息
SELECT * FROM emp WHERE join_date > '2020-01-14'
-- 2)将上面查询的结果集当做一张"虚表" 和部门表查询
-- 一步走
SELECT
t.*,
d.name '部门名称'
FROM
(SELECT
*
FROM
emp
WHERE join_date > '2020-01-14') t
LEFT OUTER JOIN dept d
ON t.dept_id = d.id ;
-- 上面这个语法---使用where 内连接查
SELECT
e.*,
d.`name` '部门名称'
FROM
emp e,
dept d
WHERE
e.`join_date` >'2020-01-14'
AND
e.`dept_id` = d.`id` ;