Mysql多表查询
笛卡尔积
两个集合数据组合的所有情况
表连接查询
#内连接 用左边的表匹配右边的表,符合则显示数据,不符合则显示null
#隐式内连接 看不到JOIN 关键字,条件使用 where 指定.
#语法:SELECT 字段名 FROM 左表, 右表 WHERE 条件
SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;
#显式内连接 使用 INNER JOIN … ON语句,可以省略 INNER
#语法:SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件
SELECT * FROM emp e INNER JOIN dept d ON e.`dept_id`=d.`id` WHERE e.`name`='唐僧' ;
#外连接
#左外连接 使用 LEFT OUTER JOIN … ON (OUTER 可以省略)
#语法:SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
SELECT * FROM dept d LEFT JOIN emp e ON d.`id`=e.`dept_id`;
#右外连接 使用 RIGHT OUTER JOIN … ON (OUTER 可以省略)
#语法:SELECT 字段名 FROM 左表 RIGHT OUTER JOIN 右表 ON 条件
SELECT * FROM dept RIGHT JOIN emp ON dept.`id`=emp.`dept_id`;
子查询
概念:
1.一个查询结果作为另一个查询的条件
2.有查询的嵌套,内部的查询称为子查询
3.子查询要使用括号
#子查询的结果是单行单列 |结果只要是单行单列,肯定在 WHERE 后面作为条件,父查询使用:比较运算符,如:> 、<、 <>、 = 等
#语法: SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
SELECT * FROM emp WHERE salary=(SELECT MAX(salary) FROM emp);
#子查询的结果是多行单列|结果集类似一个数组,条件需要使用 IN 运算符
#语法:SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
SELECT dept.`name` FROM dept WHERE dept.`id` IN ( SELECT dept_id FROM emp WHERE emp.`salary`>5000);
# 子查询的结果是多行多列 子查询结果只要是多列,肯定是在 FROM 关键字后作为表使用。子查询作为表需要取别名, 否则这张表没有名称则无法访问表中的字段
#语法:SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;
SELECT * FROM (SELECT * FROM emp WHERE emp.`join_date`>'2011-1-1') e , dept d WHERE e.dept_id=d.id;
总结:子查询结果只要是单列,则在 WHERE 后面作为条件 2)子查询结果只要是多列,则在 FROM 后面作为表进行二次查询