对于测试人员来说使用MySQL中高级部分就是多表的查询,平时日常工作中最多用到的还是单表的查询、修改、删除和添加数据。
接下来介绍下多表查询。
多表查询的分类
1、内链接查询:隐式内连查询、显示内连查询
2、外链接查询:左外连接、右外连接
3、子查询(又叫嵌套查询)
4、union查询(一般SQL注入测试时会经常用到)
如下这张图形象的显示了内链接、左链接和右链接:
一、内链接查询
隐式内链接查询
-- 查询员工表的名称,性别。部门表的名称 SELECT t1.name, -- 员工表的姓名 t1.gender,-- 员工表的性别 t2.name -- 部门表的名称 FROM emp t1, dept t2 WHERE t1.`dept_id` = t2.`id`;
显示内链接查询
SELECT emp.name,emp.gender,dept.name FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;
二、外链接查询
左链接查询
-- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称 SELECT t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;
右链接查询
--查询部门信息及所有员工 SELECT * FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;
三、子查询(嵌套查询)
-- 子查询法:查询工资最高的员工信息 SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);
--内链接查询法:查询工资最高的员工信息
SELECT *
from emp,dept
WHERE emp.dept_id = dept.id AND emp.salary > 30000
子查询不同情况:
1. 子查询的结果是单行单列的:
* 子查询可以作为条件,使用运算符去判断。 运算符: > >= < <= =
-- 查询员工工资小于平均工资的人
SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
2. 子查询的结果是多行单列的:
* 子查询可以作为条件,使用运算符in来判断
-- 查询‘财务部‘和‘市场部‘所有的员工信息
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = ‘财务部‘ OR NAME = ‘市场部‘);
3. 子查询的结果是多行多列的:
* 子查询可以作为一张虚拟表参与查询
-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息
SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > ‘2011-11-11‘) t2
WHERE t1.id = t2.dept_id;
四、union查询
union查询一般测试人员用的比较少,web安全测试人员用的是比较多的。
union查询可以连接其他表组合查询把重复的数据去重后展示。
web安全测试人员用的多的就是采用数字占位符的形式,如select 1,2,3,4,5,6,7,8,9
一张图可以见识下union查询的厉害,如下