MySQL- 05 SLQ高级查询

发布于:2022-12-31 ⋅ 阅读:(539) ⋅ 点赞:(0)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


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 后查看

网站公告

今日签到

点亮在社区的每一天
去签到