十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
定义:查询中嵌套查询就是子查询
天桥网站制作公司哪家好,找创新互联建站!从网页设计、网站建设、微信开发、APP开发、响应式网站开发等网站项目制作,到程序开发,运营维护。创新互联建站于2013年开始到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联建站。
子查询的本质:
找出工资大于Mark的员工名字和工资
分析:
1.查询出Mark的工资是多少
2.查询出高于1450工资的人
整合成子查询
子查询的特点:
为什么相关子查询的效率极其低下?
结论:
性能排序/优先使用
关联/分组查询无关子查询相关子查询
1. 找出工资比'BLAKE'多的员工
2. 列出薪金高于公司平均薪金的所有员工,所在部门
3. 查询出工资最低的员工的姓名,工作,工资
4. 列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称
或者
5.查找出职位和'MARTIN' 或者'SMITH'一样的员工的平均工资
6. 列出薪金比“BLAKE”或“WARD”多的所有员工的编号、姓名、部门名称、其领导姓名。
7. 找出各个部门中大于他所在部门平均工资的员工名和工资
8. 查找出收入(工资加上奖金),下级比自己上级还高的员工编号,员工名字,员工收入
9. 得到每个月工资总数最少的那个部门的部门编号,部门名称,部门位置
10. 查找出部门10和部门20中,工资最高第3名到工资第5名的员工的员工名字,部门名字,部门位置
11. 以职位分组,找出平均工资最高的两种职位
12. 查询出各部门总薪资,平均薪资,总人数,显示部门编号,部门名称与部门总薪资(没有员工的部门也需要统计)
这个需要用程序递归处理
$dept_tree=[];
$deptid = 19;
while($deptid0){
//假设你的数据库查询是这个函数,根据条件直接查询一条记录返回
$dept = getone('department',['id'=$deptid]);
//防止数据丢失出错
if(empty($dept))break;
array_unshift($dept_tree,$dept);
$deptid = $dept['dep_parentid'];
//如果需要防止数据错乱出现递归,这里可以判断一下
if(in_array($deptid,array_column($dept_tree,'id') !== false){
//说明职位关系乱了,有死循环
break;
}
}
可以把这段代码封装成一个函数使用。这里就不论从哪一级开始查询了,总是能把该职位及其上级全部查询出来,按顺序放进数组里
$dept_tree 类似这样
array(
0=array(
'id'=1,
'dep_parentid'=0,
'dep_name'='顶级',
),
1=array(
'id'=2,
'dep_parentid'=1,
'dep_name'='国灿金融',
),
2=array(
'id'=4,
'dep_parentid'=2,
'dep_name'='招聘部',
),
3=array(
'id'=19,
'dep_parentid'=4,
'dep_name'='经理助理',
),
)
是两张表,一张员工表user含有字段用户ID,部门ID,职位ID,一张职位career表含有部门/职位ID,部门/职位名称,对吧?求员工的职位和部门
select u.id,u.name,c.name as 部门,cc.name as 职位 form user as u
join career as c on u.部门ID=c.id
join career as cc on u.职位ID=c.id
假设有
职工表(工号,姓名,部门,生日,性别)
查询既不在业务科也不在财务科的职工姓名,性别和所在部门
SQL选择查询语句如下:
select 姓名,性别,部门 from 职工表 where 部门'业务科' and 部门'财务科' ;
或者
select 姓名,性别,部门 from 职工表 where 部门 not in ('业务科','财务科') ;