多表查询不能使用 SELECT * from emp, dept; 会产生笛卡尔积。
笛卡尔积,有A,B两个集合,A中有5条信息,B中有4条信息,那么查询结果就是5*4=20条
一、内连接查询
-- 隐式内连接
SELECT 字段列表 FROM 表1,表2,… WHERE 条件;
例:select emp.name,emp.age,dept.dep_name from emp,dept where emp.dep_id = dept.id;
可以给表起别名将上面的语句转换成下面这种。
select t1.name,t1.age,t2.dep_name from emp t1,dept t2 where t1.dep_id = t2.id;
-- 显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;
如:select emp.name,dept.dep_name from emp inner join dept on emp.dep_id = dept.id;
可以给表起别名将上面的语句转换成下面这种。
select t1.name,t2.dep_name from emp t1 inner join dept t2 on t1.dep_id = t2.id;
二、外连接查询
(1)左外连接:相当于查询A表所有数据和交集部分数据
左外连接:
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
select * from emp left join dept on emp.dep_id = dept.id;
(2)右外连接:相当于查询B表所有数据和交集部分数据
右外连接:
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
select * from emp right join dept on emp.dep_id = dept.id;
三、子查询
(1)子查询概念
查询中嵌套查询,称嵌套查询为子查询;
(2)子查询根据查询结果不同,作用不同:
①单行单列:作为条件值,使用 '=' '!=' '>' '<'等进行条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 = (子查询);
查询年龄大于周八的
select * from emp where age>(select age from emp where name = '周八');
②多行单列:作为条件值,使用in关键字进行条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 in (子查询);
查询研发和销售的所有员工信息
select * from emp where dep_id in (select id from dept where dep_name = '研发部' or dep_name = '销售部' );
③多行多列:作为虚拟表
SELECT 字段列表 FROM (子查询) WHERE 条件;
-- 查询入职日期是‘1998-08-01’之后的员工信息和部门信息
把(SELECT * from emp WHERE join_date>'1998-08-01')这个多行多列表作为虚拟表查询放到from后面
SELECT * FROM (SELECT * from emp WHERE join_date>'1998-08-01') t1,dept WHERE t1.dep_id = dept.id;