格式
SELECT * FROM 表1,表2;
,这样所得集合称笛卡尔积,取集合A,B的所有组合情况。这种方式会产生无用的数据,要完成多表查询,需要消除这些无用的数据
分类
-
内链接查询
- 隐式内连接
// employee表中的dep_id与的department表中的id相匹配的查询结果 SELECT * FROM employee,department WHERE employee.`dep_id`=department.`id`; // 查询只显示employee表中的dep_id,department表中的dep_name和dep_location SELECT employee.`dep_id`, department.`dep_name`, department.`dep_location` FROM employee, department WHERE employee.`dep_id`=department.`id`; // 给表employee取别名t1,表department取别名t2 SELECT t1.`dep_id`, t2.`dep_name`, t2.`dep_location` FROM employee t1, department t2 WHERE t1.`dep_id`=t2.`id`;
-
显示内连接
- 语法:
SELECT * FROM 表1 INNER JOIN 表2 ON 条件
,INNER可以省略
- 语法:
SELECT * FROM employee INNER JOIN // INNER可写可不写 department ON employee.`dep_id`=department.`id`; // 条件
- 内链接查询
- 确定查询表
- 确定查询条件
- 确定查询字段
-
外连接查询
- 左外连接
- 语法:
SELECT 显示字段 FROM 表1 LEFT OUTER JOIN 表2 ON 条件
,OUTER可以省略 - 查询的结果是表1的所有数据及表1与表2的交集部分
- 语法:
// employee表中dep_id为null的不会显示 SELECT t1.*, t2.`dep_name` FROM employee t1, department t2 WHERE t1.`dep_id`=t2.`id`; // employee表中dep_id为null的显示出来 SELECT t1.*, t2.`dep_name` FROM employee t1 LEFT JOIN // 省略了OUTER department t2 ON t1.`dep_id`=t2.`id`;
- 右外连接
- 语法:
SELECT 显示字段 FROM 表1 RIGHT OUTER JOIN 表2 ON 条件
,OUTER可以省略 - 查询的结果是表2的所有数据及表1与表2的交集部分
- 语法:
// department表中dep_name所有数据全部显示,包括null SELECT t1.*, t2.`dep_name` FROM employee t1 RIGHT JOIN department t2 ON t1.`dep_id`=t2.`id`;
- 左外连接
-
子查询
- 概念:查询中嵌套查询,称嵌套查询的为子查询
// 查询employee表中salary值最大的一项 SELECT * FROM employee WHERE employee.`salary` = ( SELECT // 子查询 MAX(salary) FROM employee);
- 子查询的不同情况
- 结果是单行单列
- 子查询可以作为条件,使用运算符判断,运算符
> < >= <= =
- 子查询可以作为条件,使用运算符判断,运算符
- 结果是单行单列
// 查询employee表中salary值小于平均值 SELECT * FROM employee WHERE employee.`salary` < ( SELECT AVG(salary) FROM employee);
-
- 结果是多行单列
- 子查询可以作为条件,使用运算符IN判断
- 结果是多行单列
// 查询employee表中dep_id值对应的id值(表department中dep_name等于"研发部"或者"财务部"所对应的id值)的所有数据 SELECT * FROM employee WHERE dep_id IN (SELECT id FROM department WHERE dep_name="研发部" OR dep_name="财务部" );
-
- 结果是多行多列
- 子查询可以作为一张虚拟表
- 结果是多行多列
// 查询employee表中salary值大于3000,并与department表中相对应的id数据关联 SELECT * FROM department t1, (SELECT * FROM employee WHERE employee.`salary` > 3000) t2 WHERE t1.`id`=t2.`dep_id`;