您的位置:首页 > 健康 > 美食 > 深圳小程序开发公司排名_精准营销模式_厦门人才网官网招聘_微信指数查询入口

深圳小程序开发公司排名_精准营销模式_厦门人才网官网招聘_微信指数查询入口

2025/5/11 12:09:05 来源:https://blog.csdn.net/2501_90609832/article/details/147046682  浏览:    关键词:深圳小程序开发公司排名_精准营销模式_厦门人才网官网招聘_微信指数查询入口
深圳小程序开发公司排名_精准营销模式_厦门人才网官网招聘_微信指数查询入口

自连接

自连接查询

自连接查询,顾名思义,就是自己连接自己,也就是把一张表连接查询多次。我们先来学习一下自连接的查询语法:

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;

而对于自连接查询,可以是内连接查询,也可以是外连接查询。

案例:

A. 查询员工及其所属领导的名字表结构: emp

select a.name , b.name from emp a , emp b where a.managerid = b.id; 

 

B. 查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来表结构: emp a , emp b

select a.name '员工', b.name '领导' from emp a left join emp b on a.managerid =b.id; 

 

注意事项: 在自连接查询中,必须要为表起别名,要不然我们不清楚所指定的条件、返回的字段,到底是哪一张表的字段。  

联合查询

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。

SELECT 字段列表 FROM 表A ...
UNION [ ALL ]
SELECT 字段列表 FROM 表B ....;

对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。

会将全部的数据直接合并在一起,union 会对合并之后的数据去重。

案例:

A. 将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来.

当前对于这个需求,我们可以直接使用多条件查询,使用逻辑运算符 or 连接即可。 那这里呢,我们也可以通过union/union all来联合查询.

select * from emp where salary < 5000
union all
select * from emp where age > 50; 

 

 

union all查询出来的结果,仅仅进行简单的合并,并未去重。

select * from emp where salary < 5000
union
select * from emp where age > 50; 

 

 

union 联合查询,会对查询出来的结果进行去重处理。  

注意:

如果多条查询语句查询出来的结果,字段数量不一致,在进行union/union all联合查询时,将会报错。如:

子查询

概述

1). 概念

SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。

SELECT * FROM t1 WHERE column = ( SELECT column1  FROM t2 );

子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。

2). 分类

  • 根据子查询结果不同,分为:

A. 标量子查询(子查询结果为单个值)

B. 列子查询(子查询结果为一列)

C. 行子查询(子查询结果为一行)

D. 表子查询(子查询结果为多行多列)

  • 根据子查询位置,分为:

A. WHERE之后

B. FROM之后

C. SELECT之后

标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。 常用的操作符:= <> > >= < <=

案例:

A. 查询 "销售部" 的所有员工信息

完成这个需求时,我们可以将需求分解为两步:

①. 查询 "销售部" 部门ID

select id from dept where name = '销售部'; 

 

②. 根据 "销售部" 部门ID, 查询员工信息  

 select * from emp where dept_id = (select id from dept where name = '销售部');

B. 查询在 "方东白" 入职之后的员工信息

完成这个需求时,我们可以将需求分解为两步:

①. 查询 方东白 的入职日期

select entrydate from emp where name = '方东白'; 

②. 查询指定入职日期之后入职的员工信息

select * from emp where entrydate > (select entrydate from emp where name = '方东白'); 

列子查询

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。常用的操作符:IN 、NOT IN 、 ANY 、SOME 、 ALL

操作符描述
IN在指定的集合范围之内,多选一
NOT IN不在指定的集合范围之内
ANY子查询返回列表中,有任意一个满足即可
SOME与ANY等同,使用SOME的地方都可以使用ANY
ALL子查询返回列表的所有值都必须满足

案例:

A. 查询 "销售部" 和 "市场部" 的所有员工信息分解为以下两步:

①. 查询 "销售部" 和 "市场部" 的部门ID

select id from dept where name = '销售部' or name = '市场部';

 

②. 根据部门ID, 查询员工信息

select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部'); 

B. 查询比 财务部 所有人工资都高的员工信息

分解为以下两步:

①. 查询所有 财务部人员工资

select id from dept where name = '财务部';
select salary from emp where dept_id = (select id from dept where name = '财务部'); 

②. 比财务部所有人工资都高的员工信息

select * from emp where salary > all( select salary from emp where dept_id =
(select id from dept where name = '财务部') ); 

C. 查询比研发部其中任意一人工资高的员工信息分解为以下两步:

①. 查询研发部所有人工资

select salary from emp where dept_id = (select id from dept where name = '研发部'); 

②. 比研发部其中任意一人工资高的员工信息

select * from emp where salary > any ( select salary from emp where dept_id =
(select id from dept where name = '研发部') ); 

行子查询

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。常用的操作符:= 、<> 、IN 、NOT IN

案例:

A. 查询与 "张无忌" 的薪资及直属领导相同的员工信息 ;

这个需求同样可以拆解为两步进行:

①. 查询 "张无忌" 的薪资及直属领导

select salary, managerid from emp where name = '张无忌';

 

②. 查询与 "张无忌" 的薪资及直属领导相同的员工信息 ;

select * from emp where (salary,managerid) = (select salary, managerid from emp
where name = '张无忌');  

表子查询

子查询返回的结果是多行多列,这种子查询称为表子查询。常用的操作符:IN

案例:

A. 查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息分解为两步执行:

①. 查询 "鹿杖客" , "宋远桥" 的职位和薪资

select job, salary from emp where name = '鹿杖客' or name = '宋远桥';

②. 查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息

select * from emp where (job,salary) in ( select job, salary from emp where name =
'鹿杖客' or name = '宋远桥' ); 

 

B. 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息分解为两步执行:

①. 入职日期是 "2006-01-01" 之后的员工信息

select * from emp where entrydate > '2006-01-01'; 

②. 查询这部分员工, 对应的部门信息;

select e.*, d.* from (select * from emp where entrydate > '2006-01-01') e left
join dept d on e.dept_id = d.id ; 

多表查询案例

数据环境准备:

create table salgrade(
grade int,
losal int,
hisal int
) comment '薪资等级表';
insert into salgrade values (1,0,3000);
insert into salgrade values (2,3001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,25001,30000);

在这个案例中,我们主要运用上面所讲解的多表查询的语法,完成以下的12个需求即可,而这里主要涉及到的表就三张:emp员工表、dept部门表、salgrade薪资等级表 。

1). 查询员工的姓名、年龄、职位、部门信息 (隐式内连接) 表 : emp , dept

连接条件: emp.dept_id = dept.id

select e.name , e.age , e.job , d.name from emp e,dept d where e.dept_id = d.id; 

2). 查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接) 表 : emp , dept

连接条件: emp.dept_id = dept.id

select e.name , e.age , e.job , d.name from emp e inner join dept d on e.dept_id =
d.id where e.age < 30; 

3). 查询拥有员工的部门ID、部门名称表 : emp , dept

连接条件: emp.dept_id = dept.id

select distinct d.id , d.name from emp e , dept d where e.dept_id = d.id; 

4). 查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出来(外连接)表 : emp , dept

连接条件: emp.dept_id = dept.id

select e.*, d.name from emp e left join dept d on e.dept_id = d.id where e.age > 40 ; 

5). 查询所有员工的工资等级表 : emp , salgrade

连接条件 : emp.salary >= salgrade.losal and emp.salary <= salgrade.hisal

-- 方式一
select e.* , s.grade , s.losal, s.hisal from emp e , salgrade s where e.salary >=
s.losal and e.salary <= s.hisal;
-- 方式二
select e.* , s.grade , s.losal, s.hisal from emp e , salgrade s where e.salary
between s.losal and s.hisal; 

6). 查询 "研发部" 所有员工的信息及 工资等级表 : emp , salgrade , dept

连接条件 : emp.salary between salgrade.losal and salgrade.hisal , emp.dept_id = dept.id

查询条件 : dept.name = '研发部'

select e.* , s.grade from emp e , dept d , salgrade s where e.dept_id = d.id and (
e.salary between s.losal and s.hisal ) and d.name = '研发部'; 

7). 查询 "研发部" 员工的平均工资表 : emp , dept

连接条件 : emp.dept_id = dept.id

select avg(e.salary) from emp e, dept d where e.dept_id = d.id and d.name = '研发部'; 

8). 查询工资比 "灭绝" 高的员工信息。

①. 查询 "灭绝" 的薪资

select salary from emp where name = '灭绝'; 

②. 查询比她工资高的员工数据

select * from emp where salary > ( select salary from emp where name = '灭绝' ); 

9). 查询比平均薪资高的员工信息

①. 查询员工的平均薪资

select avg(salary) from emp; 

②. 查询比平均薪资高的员工信息

select * from emp where salary > ( select avg(salary) from emp ); 

10). 查询低于本部门平均工资的员工信息

①. 查询指定部门平均薪资

select avg(e1.salary) from emp e1 where e1.dept_id = 1;
select avg(e1.salary) from emp e1 where e1.dept_id = 2; 

②. 查询低于本部门平均工资的员工信息

select * from emp e2 where e2.salary < ( select avg(e1.salary) from emp e1 where
e1.dept_id = e2.dept_id ); 

11). 查询所有的部门信息, 并统计部门的员工人数

select d.id, d.name , ( select count(*) from emp e where e.dept_id = d.id ) '人数'
from dept d; 

12). 查询所有学生的选课情况, 展示出学生名称, 学号, 课程名称表 : student , course , student_course

连接条件: student.id = student_course.studentid , course.id = student_course.courseid

select s.name , s.no , c.name from student s , student_course sc , course c where
s.id = sc.studentid and sc.courseid = c.id ; 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com