数据库-Mysql使用学习笔记(命令行及图形化界面)(2)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 数据库-Mysql使用学习笔记(命令行及图形化界面)(2)

条件查询

根据条件进行筛选。

SELECT〈目标列组〉

    FROM〈数据源〉

    [WHERE 条件1 [AND [OR]] 条件2 ...]

设A为10、B为20。

                                                 操作符

image.png

查询工资大于等于2000的员工名字

select ename from emp where sal >= 2000;

2020062310470442.png

查询工资在1100到5000的员工名及工资,包含1100和5000

select ename,sal from emp where sal between 1100 and 5000;

2020062310470442.png

between and 适合某值在闭区间中

查询津贴为NULL的员工名,工资和津贴

select ename,sal,comm from emp where comm is null;

2020062310470442.png

在前面查询这个表所有信息的时候,TURNER的津贴为0.00,注意,数据库中null表示有或没有,不能当做数值使用"="等操作符,0.00可以认为是有津贴,但是员工犯错误,扣光了。

查询津贴扣光或没有津贴的可以这样写

select ename,sal,comm from emp where comm is null or comm = 0.00;

select ename,sal,comm from emp where comm > 0.00; 

读者自行尝试,不再截图。

查询薪资大于1000并且部门编号为20或30的员工名,薪资,部门编号

select ename,sal,deptno from emp where sal>1000 and deptno=20 or deptno=30;

2020062310470442.png

看似没有问题,但是实际查询的是薪资大于1000并且部门编号为20的员工,以及部门编号为30的所有员工。原因是and的优先级高于or, sal>1000和deptno=20两个条件合并了。

可以通过加小括号的方式来进行限制,括号的优先级最高。

select ename,sal,deptno from emp where sal>1000 and (deptno=20 or deptno=30);

2020062310470442.png

in 等同于 or,in 后面加的是等于多少的值所构成的数值元组,也可解决上面的问题

select ename,sal,deptno from emp where sal>1000 and deptno in (20,30);

2020062310470442.png

select ename,sal,deptno from emp where sal>1000 and deptno in (20,30); 

not in 就是不在元组中

2020062310470442.png

模糊查询like

  • %:任意多个
  • _:任意一个

查询名字中包含O的员工名

select ename from emp where ename like '%O%';

2020062310470442.png

查询名字第二个字母是'A'的员工名

select ename from emp where ename like '_A%';

2020062310470442.png

如果查找名字中含下划线或百分号的,可以使用转义字符 '\'

select ename from emp where ename like '%\_%';

当然,本数据表里面没有,以后碰到了记得使用转义字符即可。

排序查询

SELECT〈目标列组〉
     FROM〈数据源〉
     [WHERE 条件1 [AND [OR]] 条件2 ...]
     [ORDER BY {列名 | 表达式 | 位置}

查询工作岗位是 'MANAGER'的员工,并按工资升序排列

select * from emp where job = 'MANAGER' order by sal;

2020062310470442.png

默认升序,需要降序添加关键字 desc 即可。 使用asc是升序,你可以像我一样省略。

多条件,逗号隔开,先按前,再按后。

查询员工姓名和工资,并按工资升序排列,如果工资相同,按名字降序排列。

select ename,sal from emp order by sal,ename desc;

2020062310470442.png

位置,按结果的第几列排序,健壮性太差,位置一换就不行了,尽量不用。

select ename,sal from emp order by 2;

2020062310470442.png

分组查询

SELECT〈目标列组〉
     FROM〈数据源〉
     [WHERE 条件1 [AND [OR]] 条件2 ...]
     [ORDER BY {列名 | 表达式 | 位置}
     [GROUP BY {列名 | 表达式 | 位置}
     [HAVING  条件子句]

分组函

  • count 计数
  • sum 求和
  • avg 平均值
  • max 最大值
  • min 最小值

分组函数自动忽略null

查询津贴有几种情况

select count(comm) from emp;

2020062310470442.png

从前面可以看到,comm除了null还有四个。

当出现group by时,select 之后只能加分组字段以及分组函数

2020062310470442.png

    数据错误

    按多个字段分组

    查询每个部门不同工作岗位的最高薪资


      分组函数自动忽略null
    select deptno,job,max(sal) from emp group by deptno,job;

    2020062310470442.png

    分组函数不可直接使用在where子句中

    查询工资高于平均工资的员工的名字和工资。

    select ename,sal from emp where sal > avg(sal);

    2020062310470442.png

    解决办法见子查询一节

    查询每个工作岗位的最高薪资

    select max(sal) from emp group by job;

    2020062310470442.png

    分组函数在分组之后运行,先按job分组,之后再算每一组的最大值。

    having 分组后的数据再次过滤

    查询每个部门最高薪资,仅显示大于2900的部门编号及最大薪资。

    select deptno,max(sal) from emp group by deptno having max(sal) > 2900;

    2020062310470442.png

    运行顺序:

    from 子句 -> where 子句 -> group by 子句 ->having子句 -> select列 子句 -> order by 子句

    where 和having的选择

    having的效率是比较低的

     select deptno,max(sal) from emp where sal > 2900 group by deptno;

    上面也可以完成“查询每个部门最高薪资,仅显示大于2900的部门编号及最大薪资”, 而且where子句在 group by 子句前执行,过滤掉后再进行分组时会少写数据,但是having是在分组之后再运行。

    所以,能用where优先使用where,不行再使用having

    查询每个部门平均薪资,仅显示大于2900的部门编号及平均薪资

    select deptno,avg(sal) from emp group by deptno having avg(sal) > 2900;

    where子句是无法办到的,原因还是执行顺序。

    2020062310470442.png

    去重

    除了分组,还可以使用关键字 distinct 来进行去重。

    select distinct job from emp;

    2020062310470442.png

    注:distinct只能出现在所有字段的最前方,多个字段则表示后面所有字段看做合并字段进行去重。


    相关实践学习
    每个IT人都想学的“Web应用上云经典架构”实战
    本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
    MySQL数据库入门学习
    本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
    相关文章
    |
    SQL 关系型数据库 MySQL
    SQL命令行退出操作指南:轻松掌握不同数据库环境下的退出技巧
    在数据库管理与开发过程中,经常需要通过SQL命令行工具(如MySQL的mysql客户端、PostgreSQL的psql、SQL Server的sqlcmd等)与数据库进行交互
    1087 59
    |
    10月前
    |
    存储 关系型数据库 MySQL
    MySQL索引学习笔记
    本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
    647 81
    |
    存储 SQL 关系型数据库
    Mysql学习笔记(二):数据库命令行代码总结
    这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
    310 6
    |
    7月前
    |
    SQL Oracle 数据库
    这款免费数据库工具,可能是YashanDB图形化管理的最佳选择
    DBeaver for YashanDB 是一款专为国产自研数据库 YashanDB 定制的图形化管理工具,基于全球流行的开源数据库工具 DBeaver 二次开发而成。它深度适配 YashanDB 的各种架构,支持 HEAP/LSC 多形态表管理和 Oracle 生态兼容,提供高效的对象管理、智能 SQL 开发和工业级 PL/SQL 调试功能。通过可视化操作,开发者可轻松完成物化视图配置、存储过程管理等复杂任务,大幅提升效率。该工具完全免费,支持多平台,为企业级数据库管理提供了成熟解决方案。
    |
    SQL 关系型数据库 MySQL
    Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
    MySQL中用于数据检索的`fetchone()`, `fetchmany()`, `fetchall()`函数的功能、SQL语句示例和应用场景。
    329 3
    Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
    |
    SQL Ubuntu 关系型数据库
    Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
    本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
    231 3
    Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
    |
    关系型数据库 MySQL 数据库
    Mysql学习笔记(四):Python与Mysql交互--实现增删改查
    如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
    175 1
    |
    SQL Go 数据库
    如何通过命令行创建数据库?
    如何通过命令行创建数据库?
    604 14
    |
    SQL NoSQL 数据管理
    超越查询语言:GQL 如何塑造图形数据库的未来
    超越查询语言:GQL 如何塑造图形数据库的未来
    105 0
    |
    2月前
    |
    缓存 关系型数据库 BI
    使用MYSQL Report分析数据库性能(下)
    使用MYSQL Report分析数据库性能
    88 3

    热门文章

    最新文章

    推荐镜像

    更多
    下一篇
    开通oss服务