提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
1.多表查询
1.1 概述
- 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。
- 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个 关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进 行关联。
1.2 内连接查询(inner join)
原理: 内连接查询的是两张表有交集的部分数据(有主外键关联的数据)
语法格式
SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 等其他子句;
代码演示
# 1.查询部门表和员工表的内连接查询
select * from employee inner join dept on dept.deptno = employee.deptno;
1.3 外连接查询(outer join)
获取的结果是一张表的全部, 以及两张表的交集.
语法格式
# 1.左外连接查询
# 查询左表的全部数据,和左右两张表有交集部分的数据
SELECT 字段列表 FROM 表A LEFT OUTER JOIN 表B ON 连接条件 WHERE 等其它语句;
# 2.右外连接查询
# 查询右表的全部数据,和左右两张表有交集部分的数据
SELECT 字段列表 FROM 表A RIGHT OUTER JOIN 表B ON 连接条件 WHERE 等其它语句;
代码演示
#查询部门表和员工表查询
#1.使用左外连接查询
select * from employee left outer join dept on dept.deptno = employee.deptno;
#2.使用右外连接查询
select * from employee right outer join dept on dept.deptno = employee.deptno;
1.4 union查询
概述: 利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并 时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。
语法格式
# 1.去重的方式
SELECT 语句1 UNION SELECT 语句2;
# 2.不去重方式
SELECT 语句1 UNION ALL SELECT 语句2;
代码演示
#查询部门表和员工表查询
select deptno from dept union select deptno from employee;
2.子查询
2.1 基本概述
查询语句中嵌套了查询语句。我们就将嵌套查询称为子查询!
子查询的基本语法结构:
select * from where exper operator (select * from ...)
子查询(内查询)在主查询之前一次执行完成。
子查询的结果被主查询(外查询)使用 。
子查询的注意事项:
- 子查询要包含在括号内
- 将子查询放在比较条件的右侧
- 单行操作符对应单行子查询,多行操作符对应多行子查询
2.2 where子查询
2.2.1 标量子查询
概述: 子查询在where关键字后面, 子查询的结果集只有一行一列(一个值)
语法格式
-- 标准语法
SELECT 列名 FROM 表名 WHERE 列名=(SELECT 聚合函数(列名) FROM 表名 [WHERE 条件]);
代码演示
#①查询sal比关羽高的员工信息
#1.1查询张飞的sal
select sal from employee where ename = '关羽';
#1.2 查询比关羽高的员工信息
select * from employee where sal > (select sal from employee where ename = '关羽');
#②查询job和程普相同,sal比周泰高的员工信息
# 1.1 查看程普的工作
select job from employee where ename = '程普';
# 1.2 查看周泰的工资
select sal from employee where ename = '周泰';
# 1.3 查询job和程普相同,sal比周泰高的员工信息
select * from employee where
job = (select job from employee where ename = '程普')
and
sal > (select sal from employee where ename = '周泰');
2.2.2 列子查询
概述: 子查询在where关键字后面, 子查询的结果集只有多行一列(多个值),配合in ,any/some, all使用
语法格式
SELECT 列名 FROM 表名 WHERE 列名 [NOT] IN (SELECT 列名 FROM 表名 [WHERE 条件]);
SELECT 列名 FROM 表名 WHERE 列名 [NOT] ANY/SOME (SELECT 列名 FROM 表名 [WHERE 条件]);
SELECT 列名 FROM 表名 WHERE 列名 [NOT] ALL (SELECT 列名 FROM 表名 [WHERE 条件]);
代码演示
# ①查询办公地点在武汉和北京的员工信息
# 1.1 查办公地点在北京或武汉的部门
select deptno from dept where loc in('北京','武汉');
# 1.2 查询员工信息
select * from employee where deptno in (select deptno from dept where loc in('北京','武汉'));
#②查询比20号部门任意一个员工工资低的员工信息
# 1.1 查看20号工资信息
select sal from employee where deptno = 20;
# 1.2 查员工信息
select * from employee where sal < any(select sal from employee where deptno = 20);
2.2.3 行子查询
概述: 主查询的结果集是一行多列
语法格式
SELECT * FROM 表名 WHERE
字段 = (SELECT 字段 FROM 表名)
AND
字段 = (SELECT 字段 FROM 表名);
代码演示
#查询员工编号最小且薪资最高的员工信息
# 1.1 找到员工编号最小
select min(empno) from employee;
# 1.2 找到工资最高的
select max(sal) from employee;
# 1.3 查询员工编号最小且薪资最高的员工信息
select * from employee where
empno = (select min(empno) from employee)
and
sal = (select max(sal) from employee);
2.3 select 子查询
概述: 子查询在select关键字后面.
语法格式
SELECT 字段列表,
(SELECT 列表 FROM 表名 [WHERE 条件])
FROM 表名 [WHERE 条件];
代码演示
#查询员工姓名及所在部门名称及办公地点
select ename ,
(select dname from dept where dept.deptno = employee.deptno) '部门名称',
(select loc from dept where dept.deptno = employee.deptno) '地点'
from employee;
2.4 from 子查询
概述: 子查询在from后面
语法格式
SELECT 列名 FROM 表名 [别名],(SELECT 列名 FROM 表名 [WHERE 条件]) [别名] [WHERE条件];
代码演示
#查询每个部门的平均工资的工资等级和部门名称
#1.获取每个部门的平均工资
select avg(sal) '部门平均工资'from employee group by deptno;
#2.获取平均工资的工资等级
select t1.avg_sal, t2.grade, t3.dname from
(select deptno, avg(sal) avg_sal from employee group by deptno) t1
left outer join salgrade t2 on t1.avg_sal between t2.losal and t2.hisal
left outer join dept t3 on t1.deptno = t3.deptno;
3.本节示例数据
CREATE TABLE `dept` (
`deptno` int(11) NOT NULL AUTO_INCREMENT,
`dname` varchar(30) DEFAULT NULL,
`loc` varchar(30) DEFAULT NULL,
PRIMARY KEY (`deptno`)
) ;
INSERT INTO `dept` VALUES ('10', '财务部', '上海');
INSERT INTO `dept` VALUES ('20', '研发部', '北京');
INSERT INTO `dept` VALUES ('30', '销售部', '香港');
INSERT INTO `dept` VALUES ('40', '运营部', '武汉');
CREATE TABLE `employee` (
`empno` int(11) NOT NULL AUTO_INCREMENT,
`ename` varchar(30) DEFAULT NULL,
`job` varchar(30) DEFAULT NULL,
`mgr` int(11) DEFAULT NULL,
`hiredate` date DEFAULT NULL,
`sal` double DEFAULT NULL,
`comm` int(11) DEFAULT NULL,
`deptno` int(11) DEFAULT NULL,
PRIMARY KEY (`empno`)
) ;
INSERT INTO `employee` VALUES ('1000', '老邱', '董事长', null, '1989-10-25',
'50000', null, '10');
INSERT INTO `employee` VALUES ('1001', '甘宁', '文员', '1013', '1983-12-16',
'11000', null, '20');
INSERT INTO `employee` VALUES ('1002', '黛绮丝', '销售员', '1006', '1980-02-
12', '16000', '3000', '30');
INSERT INTO `employee` VALUES ('1003', '殷天正', '销售员', '1006', '1981-02-
22', '12500', '5000', '30');
INSERT INTO `employee` VALUES ('1004', '刘备', '经理', '1000', '1981-04-02',
'29750', null, '20');
INSERT INTO `employee` VALUES ('1005', '谢逊', '销售员', '1006', '1981-09-
28', '12500', '14000', '40');
INSERT INTO `employee` VALUES ('1006', '关羽', '经理', '1008', '1981-05-02',
'20050', null, '30');
INSERT INTO `employee` VALUES ('1007', '张飞', '经理', '1008', '1981-06-29',
INSERT INTO `employee` VALUES ('1008', '诸葛亮', '分析师', '1004', '1987-07-
03', '30000', '20000', '20');
INSERT INTO `employee` VALUES ('1010', '韦一笑', '销售员', '1006', '1981-11-
03', '15000', '500', '30');
INSERT INTO `employee` VALUES ('1011', '周泰', '文员', '1008', '1987-07-13',
'10500', null, '20');
INSERT INTO `employee` VALUES ('1012', '程普', '文员', '1006', '1981-12-03',
'10250', null, '40');
INSERT INTO `employee` VALUES ('1013', '庞统', '分析师', '1004', '2002-01-
16', '18000', null, '10');
INSERT INTO `employee` VALUES ('1014', '黄盖', '文员', '1007', '2022-01-06',
'13000', null, '20');
CREATE TABLE `salgrade` (
`grade` int(11) DEFAULT NULL,
`losal` double DEFAULT NULL,
`hisal` double DEFAULT NULL
) ;
INSERT INTO `salgrade` VALUES ('1', '5000', '10000');
INSERT INTO `salgrade` VALUES ('2', '10001', '15000');
INSERT INTO `salgrade` VALUES ('3', '15001', '20000');
INSERT INTO `salgrade` VALUES ('4', '20001', '30000');
INSERT INTO `salgrade` VALUES ('5', '30001', '99999');
本文含有隐藏内容,请 开通VIP 后查看