首页 > 数据库 >MySQL学习基础篇Day7

MySQL学习基础篇Day7

时间:2023-05-22 16:44:48浏览次数:51  
标签:name Day7 查询 学习 emp MySQL where id select

5.5 自连接

5.5.1 自连接查询

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

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;

注意事项:

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

 

5.5.2 联合查询

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

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

 

  • 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
  • union all 会将全部的数据直接合并在一起,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联合查询时,将会报 错。如:

 

5.6 子查询

1). 概念

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

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

 

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

 

2). 分类

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

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

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

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

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

 

根据子查询位置,分为:

A. WHERE之后

B. FROM之后

C. SELECT之后

 

5.6.2 标量子查询

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

 

案例: 

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 = '方东
白');

 

 

5.6.3 列子查询 

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。

常用的操作符: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 = '研发部') );

 

 

5.6.4 行子查询

 子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。

常用的操作符:= 、<> 、IN 、NOT IN

 

 案例:

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

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

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

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

 

 

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

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

 

 

5.6.5 表子查询

子查询返回的结果是多行多列,这种子查询称为表子查询。

常用的操作符: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 ;

 

标签:name,Day7,查询,学习,emp,MySQL,where,id,select
From: https://www.cnblogs.com/beichens/p/17421022.html

相关文章

  • 性能调优学习
    性能调优攻略测试:两个关键指标:吞吐量,延迟测试之后,定位性能瓶颈查看操作系统负载​看看操作系统的CPU利用率,看看内存使用率,看看操作系统的IO,还有网络的IO,网络链接数,等等​比如linux系统:top命令如果cpu利用率不高,但是两个关键指标上不去了,说明可能IO耗时......
  • 成长笔记二、MySQL数据库--学生管理系统数据库手写SQL实现(实践篇)
    学生对象---->学生表(student)老师对象---->老师表(teacher)课程对象---->课程表(course)成绩对象---->成绩表(score)班级对象---->班级表(前缀_class,因为user或class等英文单词是程序中的关键字.尽量不直接用)等.....数据库设计设计参考上篇博客https://ww......
  • vscode配置远端服务器深度学习项目
    vscode配置远端服务器深度学习项目1.安装vscode官网地址:https://code.visualstudio.com/下载安装程序,运行安装即可2.连接服务器2.1安装相关插件需要安装Remote-SSH和RemoteDevelopment这两个插件2.2配置服务器连接插件安装完成后,在SSH一栏中点击OpenSSHCo......
  • 【研究生学习】Batch Normalization和Layer Normalization
    本篇博客记录一下在深度学习中常用的BatchNormalization和LayerNormalization方法的基本原理,参考的资料的链接如下:独立同分布的数据可以简化常规机器学习模型的训练,提升机器学习模型的预测能力,因此把数据喂给机器学习模型之前,白化是一个重要的数据预处理步骤,......
  • 【MySQL】从数据页的角度看 B+ 树
    1  前言我们都知道MySQL里InnoDB存储引擎是采用B+树来组织数据的。但是大家知道B+树里的节点里存放的是什么呢?查询数据的过程又是怎样的?那么这节我们从数据页的角度看B+树,看看每个节点长啥样。2  InnoDB是如何存储数据的?MySQL支持多种存储引擎,不同的存储引擎,......
  • 第四十天 各种各样的mysql数据查询方法
    一、昨日内容回顾约束条件之主键primarykey1.InnoDB规定表必须有且只有一个主键(单列主键联合主键)idintprimarykey单例主键idint,uidint,primarykey(id,uid)联合主键idintprimarykeyauto_increment主键自增2.如果表中有主键那么基于主键查询数据速度会非......
  • MySql8修改root密码,修改用户名
    usemysql;updateusersetauthentication_string=''whereuser='root';//root设为空ALTERuser'root'@'localhost'IDENTIFIEDBY'root';//root密码设为rootflushprivileges;//刷新权限 usemysql;......
  • 新手如何学习爬虫
    作为一种常见的网络技术,网络爬虫有很多相关的资源可以帮助新手学习。以下是一些有效的学习路径和资源:1、爬虫基础知识网络爬虫的基础知识包括HTTP协议、HTML/CSS/JavaScript,以及Python等编程语言的基础语法和库等。2、掌握Python编程Python是网络爬虫最常用的编程语言之一,新......
  • 一些关于运筹学和机器学习之间协同作用的思考
    几十年来,运筹学(OR)和机器学习(ML)一直作为两个相对独立的研究领域不断发展。数据科学和人工智能领域的专家可能更熟悉机器学习而不是运筹学,尽管每个机器学习实践者都应该至少了解一些优化技术,因为每个机器学习问题本质上都是一个优化问题。在本文中,我将把运筹学和机器学习视为一个整......
  • MySQL常用关键字和函数及部分关键字使用场景
    世间情动,不过盛夏白瓷梅子汤,碎冰碰壁当啷响。一,关键字使用顺序在使用SQL查询时,关键字的顺序并不是非常重要,SQL解释器可以根据查询的语法结构自动推断其执行顺序。但是,为了使查询更加易读,并且能够避免出现在结果中无法预期的重复数据,建议始终按照以下顺序使用关键字:1,SEL......