样例数据库:(来源传智播客)
表:emp

表:dept

连接查询
内连接查询
隐式内连接
使用where条件消除无用数据
查询员工表的名称,性别。部门表的名称
select t1.NAME 姓名, t1.gender 性别, t2.NAME 部门from emp t1,dept t2where t1.dept_id = t2.id;
显式内连接
语法:
select 字段列表from 表名1 join 表名2on 条件
例子:
SELECT *FROM empINNER JOIN deptON emp.dept_id = dept.id;
外链接查询
左外连接
查询的是左表所有数据以及其交集部分。
语法:
select 字段列表from 表1left [outer] join 表2on 条件;
例子:
-- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称SELECT t1.*, t2.nameFROM emp t1LEFT JOIN dept t2ON t1.dept_id = t2.id;
右外连接
查询的是右表所有数据以及其交集部分。
语法:
select 字段列表from 表1right join 表2on 条件;
例子:
SELECT *FROM dept t2RIGHT JOIN emp t1ON t1.dept_id = t2.id;
全外连接
查询的是右表所有数据以及其交集部分。(mysql没有full outer join,用union代替)
语法:(分别将左右外连接的结果取并集)
select 字段列表from 表1right join 表2on 条件;unionselect 字段列表from 表1left join 表2on 条件;
例子:
SELECT t1.*, t2.nameFROM emp t1LEFT JOIN dept t2ON t1.dept_id = t2.idunionSELECT t1.*, t2.nameFROM emp t1right JOIN dept t2ON t1.dept_id = t2.id;
总结
内连接:查询的是两表交集部分。
隐式内连接:无join语句,仅用where判断
显式内连接:使用inner join … on
外连接
左外连接:查询的是左表所有数据以及其交集部分。
右外连接:查询的是右表所有数据以及其交集部分。
全外连接:两表并集
子查询
子查询的结果是单行单列
将查询结果当成一个值
例:
-- 查询工资最高的员工信息SELECT *FROM empWHERE emp.salary = (SELECT MAX(salary)FROM emp);-- 查询员工工资小于平均工资的人SELECT *FROM empWHERE emp.salary < (SELECT AVG(salary)FROM emp);
子查询的结果是多行单列
使用关键字关键字:in
例:
-- 查询'财务部'和'市场部'所有的员工信息SELECT *FROM empWHERE dept_id IN (SELECT idFROM deptWHERE NAME = '财务部'OR NAME = '市场部');
子查询的结果是多行多列
将查询结果当成一个表
例:
-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息-- 子查询SELECT *FROM dept t1,(SELECT *FROM empWHERE emp.join_date > '2011-11-11') t2WHERE t1.id = t2.dept_id;-- 普通内连接SELECT *FROM emp t1,dept t2WHERE t1.dept_id = t2.idAND t1.join_date > '2011-11-11';
总结
子查询是一个值(将子查询结果看成一个值)
子查询是一个列(用in关键字判断是否满足)
子查询是一个表(将子查询结果看成一个新表,起一个别名)
文章转载自Hello 帅帅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




