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

文章目录

  • 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. LeetCode简单题之爬楼梯
  2. tf.stack与tf.unstack
  3. bookstrap 怎么用ajax,bootstrap里怎么用ajax请求数据到table里
  4. 闭包漫谈(从抽象代数及函数式编程角度)
  5. Python实现——二元线性回归(最小二乘法)
  6. 嵌入式Linux系统编程学习之二十六多线程概述
  7. 计算机应用基础 东师 离线,东师1609计算机应用基础离线作业(8页)-原创力文档...
  8. SCOM 2012知识分享-17:创建并管理组
  9. mysql ==0_MySQL关于日期为零值的处理
  10. DIY强大的虚拟化环境-升级存储主机
  11. 使用阿里云Maven仓库
  12. windows下解决mysql secure_file_priv null的问题
  13. Linux下一种 ELF 文件的代码签名验证机制
  14. [球体积交]Girlfriend 2021牛客多校第2场 F
  15. 语法转换_【语法专题】句型转换(下)
  16. 039.简单的文本编辑器
  17. 美国国土安全部预警:放一段声音,你的手机就可能被黑了
  18. 当前年的日历存储到数据库,用于判断某一天是假期还是工作日
  19. Android 上的SSH软件 connectbot
  20. 触发器(基本的SR触发器、同步触发器、D触发器)

热门文章

  1. 隐藏HTML 文字链接,让超链接文字隐藏掉css代码
  2. 说好的30天直播生死呢?--第三章 我所理解的打击感(一)
  3. 国际短信的使用场景有哪些?
  4. php把buffer转化为图片_图片buffer转base64
  5. 基于nodejs+vue的高校作业布置批改管理系统
  6. 数组名与数组名取地址的差异
  7. Java中使用@符号,提示
  8. 轻量级java ee企业应用实战第4版 源码下载
  9. 电脑服务器名称怎么修改,怎么修改云服务器计算机名
  10. 浅谈ViewState