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

文章目录

  • 1.多表查询
    • 1.1 概述
    • 1.2 内连接查询(inner join)
    • 1.3 外连接查询(outer join)
    • 1.4 union查询
  • 2.子查询
    • 2.1 基本概述
    • 2.2 where子查询
      • 2.2.1 标量子查询
      • 2.2.2 列子查询
      • 2.2.3 行子查询
    • 2.3 select 子查询
    • 2.4 from 子查询
  • 3.本节示例数据

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');

MySQL- 05 SLQ高级查询相关推荐

  1. MySQL简单快速入门 (三)高级查询——JEPLUS软件快速开发平台

    03.SQL高级查询_分组: 1).需求:一条查询,查询出每种商品的最高价格 2).分组的命令:group by 分组字段 3).实现上例: select category_id,max(price) ...

  2. 【MySQL】数据库的高级查询

    前言 上次我们讲了数据库的基本查询,这次继续接上来数据库的高级查询.高级查询是建立在基础查询的基础上面的,如果你还没有看过建议你先去学习数据库的基础查询. 传送门:MySQL数据库的基本查询 数据库的 ...

  3. MySQL 数据库 之 高级 SQL 语句(常用查询,正则表达式,运算符,库函数,存储过程)

    文章目录 前言 一 . 常用查询介绍 1.按关键字排序 1.1默认升序 1.2 降序 1.3 多字段的排序 2. 对结果进行分组 2.1 分组统计 3.限制结果条目 3.1 查看前4行 3.2 查看第 ...

  4. mysql关联查询去重_MySQL外键和高级查询(连接查询、联合查询、子查询、去重查询)...

    MySQL的外键 什么是外键,很简单保持数据一致性的一个约束键.如果你有两张表,第一张是学生表,第二张表是一个成绩表,我们来看看保持数据一致性,其实在Django等框架的模型中中也能做关联获取对象. ...

  5. mysql查询过程从客户端发送查询请求_MySQL查询过程和高级查询

    最近有个需求,要修改现有存储结构,涉及查询条件和查询效率的考量,看了几篇索引和HBase相关的文章,回忆了相关知识,结合项目需求,说说自己的理解和总结. 总体目录如下,上篇介绍了前3小节,分析了索引为 ...

  6. mysql数据库高级查询笔记_MySQL数据库基础——高级查询

    MySQL数据库入门--day08 高级查询 一.聚合函数: 在实际开发过程中经常需要对数据进行统计,为此MySQL中提供了一些函数来实现某些功能如下表所示: 聚合函数 1.COUNT()函数: CO ...

  7. mysql 最值复杂查询_MySQL高级查询

    我们使用SQL查询不能只使用很简单.最基础的SELECT语句查询.如果想从多个表查询比较复杂的信息,就会使用高级查询实现.常见的高级查询包括多表连接查询.内连接查询.外连接查询与组合查询等,今天我们先 ...

  8. MySQL高级 —— 查询性能优化

    引言 承接<MySQL高级 -- 高性能索引>,本篇博客将围绕<高性能MySQL(第三版)>第六章内容进行总结和概括. 与索引的部分一样,SQL优化也是广大程序员深入MySQL ...

  9. mysql子查询sysdate_MySQL T6 数据库操作——查询(三)高级查询

    复习 算术运算符:+ - * / % [针对数值型,select子句,where子句] 查询大于18岁的学生,学生表内存的是生日 birthday where year(sysdate()) - ye ...

最新文章

  1. proftpd登陆速度慢的解决[转]
  2. 昇腾 OSError: [Errno 22] Invalid argument: ‘protocol‘
  3. kudu大量数据更新_Apache Kudu又更新?1.4版改进了Web界面
  4. Ubuntu MTK/RK/AW 编译服务器
  5. python commands用法_python之commands模块(执行Linux Shell命令)
  6. matlab08a调节字体大小,MATLAB低通滤波器的设计代码
  7. springMVC系列之(四) spring+springMVC+hibernate 三大框架整合(转)
  8. 中原地区第一款开源产品SmartAdmin和《Smart前后台代码规范》正式发布
  9. 计算机cpu后面字母代表什么意思,CPU后缀含义是什么意思 AMD/intel处理器后缀字母代表什么涵义...
  10. SAP MM采购订单上的总账科目如何自动带出来
  11. japi项目需求分析阶段
  12. 腾讯云直播一直播连麦实践
  13. 谷歌推出以太坊区块链的大数据视图
  14. 双面女间谍第一至五季/全集Alias迅雷下载
  15. Java:JSON解析工具-json-lib
  16. 智慧农业“黑科技”,FCU1101智能灌溉控制器方案
  17. 解决Qt :libpng warning: iCCP: known incorrect sRGB profile警告信息
  18. 解决Win7中无法使用扫描仪的功能问题
  19. 双底形态识别又又又升级了!这次叠加了突破当日涨幅判断!
  20. Matlab模拟光粒攻击前后的三体运动

热门文章

  1. 手机怎么设置某一天闹钟提醒
  2. 用CorelDRAW制作自己的贺卡(转)
  3. 老站调转新站最笨方法
  4. 测试和性能监控神器 JMH Arthas
  5. 简述基于89c51的8*8LED点阵屏使用方法
  6. 用C语言写的合并BOM和坐标文件的小工具
  7. Windows 下 Red Pitaya SD card image制作过程
  8. 【​观察】探访中国首家高端装备智能工厂 浪潮重新定义计算新未来
  9. AR Kit初步学习总结
  10. 【嵌入式】FS2410移植U-Boot-1.1.6