- 1、本文档共50页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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的别名。因此,这两个语句是一样的: SE
文档评论(0)