MySQL高级查询汇
检索的结果都是: 当我们连接两张检索数据的时候,检索的方式是首先逐行扫描“员工信息表”中的记录,然后根据连接条件来决定此记录是否被检索。比如对于李小飞,这条记录的 deptid 是 1(部门编号),它在部门表中能找到和它匹配的编号 1,而编号 1 的部门名称(deptname)是“技术部”所以张三这条记录会被检索,最终的结果肯定是:0001 李小飞 技术部。但是朱妙妙的部门编号是 NULL,它在部门信息表中找不到匹配的项(因为部门信息表中不存在部门编号为 NULL 的部门),所以朱妙妙不会被检索。 4 连接查询 左外联结 但是有些情况下,我们需要知道所有员工的信息,即使他不属于任何部门。这样我们就可以采用外连接,在这里为左外连接,也就是连接中的左表的表中的记录,无论能不能在右表中找到匹配的项,都要检索,如果没有匹配的项目,那么右表中的字段值为 NULL(空),在这里就代表,此员工不属于任何部门。 显示所有的员工和部门名称,包括新员工。 检索语句为: select e.eid '员工 ID', e.name '员工姓名', d.dname '部门名称' from employee e left join dept d on e.did=d.id 4 连接查询 检索的结果是: 但是在这里,工程部同样不会被检索,因为,deptname 是在连接的右边的表中,“工程部”在左表中不存在任何的记录,所以不会被检索。这里关注的是“连接中的左边的表”。 4 连接查询 右外连接 有时,我们需要知道,全部部门的信息,即使它没有任何的员工。在我们的查询中部门表在连接的右边,如果我们想知道右边表中的所有记录信息,那么就可以采用右外连接,如果此记录在左边的表中找不到匹配项,则相应字段(employeeid,employeename)为 NULL 检索语句为: select e.eid '员工 ID', e.name '员工姓名', d.dname '部门名称' from employee e right join dept d on e.did=d.id 4 连接查询 检索的结果是: 但在这里,朱妙妙是不会被检索了,因为它在右表中找不到匹配项,这里关注的是“连接中的右边的表” 4 连接查询 这里考虑一下,如果要统计出各部门里员工的人数,如何操作呢? select d.dname as '部门名称 ',count(e.eid) as '员工人数' from employee as e right join dept as d on e.did=d.id group by did; 检索的结果是: 4 连接查询 子查询: 某些情况下,当进行查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就要用到子查询。用于子查询的关键字主要包括 in、not in、=、!=、exists、not exists 等。 例如要查询所有部门的员工信息 select * from employee where did in( select id from dept); 检索的结果是: 5 子查询 如果子查询的结果是唯一的,还可以用=代替 in。 select * from employee where did =(select id from dept); 结果不唯一时会抛错: select * from employee where did =(select id from dept limit 1); 检索的结果是: 5 子查询 某些情况下,子查询是可以转化为表连接的,例如前面的查询所有部门的员工信息就可以转化为表连接。 select employee.* from employee,dept where employee.did=dept.id; 注意: MYSQL4.1 以前的版本不支持子查询,需要用表连接来实现子查询的功能。表连接在很多情况下用于优化子查询。 5 子查询 使用ANY, IN和SOME进行子查询 ANY关键词必须接在一个比较操作符后面。ANY关键词的意思是“对于在子查询返回的列中的任一数值,如果比较结果为TRUE的话,则返回TRUE”。例如: SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2); 假设表t1中有一行包含(10)。如果表t2包含(21,14,7),则表达式为TRUE,因为t2中有一个值为7,该值小于10。如果表t2包含(20,10),或者如果表t2为空表,则表达式为FALSE。如果表t2包含(NULL, NULL, NULL),则表达式为UNKNOWN。 词语IN是=ANY的别名