《数据库查询:解锁数据宝藏的魔法之钥》

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 《数据库查询:解锁数据宝藏的魔法之钥》

前言


MySQL查询是一种用于检索、筛选和分析数据的数据库操作技术。作为一个强大的关系型数据库管理系统(RDBMS),MySQL支持多种查询方法,包括使用SQL(Structured Query Language)编写的查询语句。



查询


用户对于数据表或视图最常用的操作就是查询,也叫检索。通过select 语句来实现。


语法:

select {columns}
from {table|view|other select}
[where 条件]
[group by 分组条件]
[having 分组后再限定]
[order by 排序]


准备环境:

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for bonus
-- ----------------------------
DROP TABLE IF EXISTS `bonus`;
CREATE TABLE `bonus` (
  `ENAME` varchar(10) DEFAULT NULL,
  `JOB` varchar(9) DEFAULT NULL,
  `SAL` decimal(10,0) DEFAULT NULL,
  `COMM` decimal(10,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of bonus
-- ----------------------------
-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `DEPTNO` int(4) NOT NULL,
  `DNAME` varchar(14) DEFAULT NULL,
  `LOC` varchar(13) DEFAULT NULL,
  PRIMARY KEY (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES ('10', 'ACCOUNTING', 'NEW YORK');
INSERT INTO `dept` VALUES ('20', 'RESEARCH', 'DALLAS');
INSERT INTO `dept` VALUES ('30', 'SALES', 'CHICAGO');
INSERT INTO `dept` VALUES ('40', 'OPERATIONS', 'BOSTON');
-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
  `EMPNO` int(4) NOT NULL,
  `ENAME` varchar(10) DEFAULT NULL,
  `JOB` varchar(9) DEFAULT NULL,
  `MGR` int(4) DEFAULT NULL,
  `HIREDATE` date DEFAULT NULL,
  `SAL` float(7,2) DEFAULT NULL,
  `COMM` float(7,2) DEFAULT NULL,
  `DEPTNO` int(4) DEFAULT NULL,
  PRIMARY KEY (`EMPNO`),
  KEY `FK_DEPTNO` (`DEPTNO`) USING BTREE,
  CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`DEPTNO`) REFERENCES `dept` (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800.00', null, '20');
INSERT INTO `emp` VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600.00', '300.00', '30');
INSERT INTO `emp` VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250.00', '500.00', '30');
INSERT INTO `emp` VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975.00', null, '20');
INSERT INTO `emp` VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250.00', '1400.00', '30');
INSERT INTO `emp` VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850.00', null, '30');
INSERT INTO `emp` VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450.00', null, '10');
INSERT INTO `emp` VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-04-19', '3000.00', null, '20');
INSERT INTO `emp` VALUES ('7839', 'KING', 'PRESIDENT', null, '1981-11-17', '5000.00', null, '20');
INSERT INTO `emp` VALUES ('7844', 'TURNER', 'SALESMAN', '7698', '1981-09-08', '1500.00', '0.00', '30');
INSERT INTO `emp` VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-05-23', '1100.00', null, '20');
INSERT INTO `emp` VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950.00', null, '30');
INSERT INTO `emp` VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000.00', null, '20');
INSERT INTO `emp` VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300.00', null, '10');
-- ----------------------------
-- Table structure for salgrade
-- ----------------------------
DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (
  `GRADE` decimal(10,0) DEFAULT NULL,
  `LOSAL` decimal(10,0) DEFAULT NULL,
  `HISAL` decimal(10,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of salgrade
-- ----------------------------
INSERT INTO `salgrade` VALUES ('1', '700', '1200');
INSERT INTO `salgrade` VALUES ('2', '1201', '1400');
INSERT INTO `salgrade` VALUES ('3', '1401', '2000');
INSERT INTO `salgrade` VALUES ('4', '2001', '3000');
INSERT INTO `salgrade` VALUES ('5', '3001', '9999');



简单查询


1.查询指定的列:

select 列1,列2,列3.。。 from 表名
select empno,ename,hiredate from emp;


2.起别名:as 可以省略不写

select 列1 as 别名 from 表名
select empno as 员工编号,ename '员工 姓名' from emp;


3.字符串类型可以做连续运算

concat("我的名字是",name,'我今年。。。');

select concat('我的名字是',ename,',喔喔') from emp;


4.去重:distinct

select distinct job from emp;
select distinct job,deptno from emp;


distinct 列名1,列名2,一行数据都相同,才会被认为是重复的数据,去除。



条件查询

在检索数据库中的数据时候,需要满足某些条件,才能被检索到,使用where关键字,来限制检索的条件。

比较运算符:=,!=,<>,>,<,>=,<=
逻辑运算符:and ,or, not
范围:between and,in,not in
null:is null,is not null
练习1:查询1981年以后入职的员工信息
select * from emp where hiredate>='1981-1-1';
练习2:查询部门编号为30或者工资大于2000的员工信息。
select ename,sal,deptno from emp where sal>2000 or deptno=30;
练习3:在emp表中,使用in关键字查询职务为”president”,”manager”和”analyst”中任意一种的员工信息。
SELECT * FROM emp WHERE job IN('president','manager','analyst');



模糊查询:like

%:匹配0-多个任意的字符

_:匹配1个任意字符

//名字的第三个字母为a的员工信息
mysql> select * from emp where ename like '__a%';

like '_a';只有两个字符

like '%a%';包含a

like 'a%';以a 字母开头的

select * from emp where ename like 'A%';



排序:orderby

asc:升序,默认

desc:降序

select查询完后,排序要写在整个sql语句的最后。

select * from emp order by sal;
select * from emp order by sal desc;




统计函数


也叫聚合函数,通常用于求整个表中某列的数据的:总和,平均值,最大值,最小值。通常不搭配表中的字段一起查询。

sum(),

avg(),

max()

min(),

count(*/主键)

练习1:求部门编号20中员工的平均工资,工资总和,工资最大值,最小值,人数。

select ename,sum(sal),avg(sal),max(sal),min(sal) ,count(empno),count(comm)from emp where deptno=20;




分组


group by 列名,按照指定的列进行分组,值相同的会分在一组。


语法:

select 列名 from 表名 group by 列名

或者

select 列名1,列名2 from 表名 group by 列名1,列名2



说明:

  1. select 后面跟的列名和group by 后的列名一致
  2. 当group by 单独使用的时候,只显示每组的第一条记录。所以group by单独使用的意义不大,大多要配合聚合函数。
  3. group by 后面也可以跟多个列进行分组,表示这些列都相同的时候在一组。

按照某列分组,该列有几种取值,就分为几组。



分组后使用聚合函数

select sex,count(*) from stu group by sex;


注意:

  1. 如果没有分组,那么聚合函数(sum,count,max,min)作用在整张表上
  2. 如果有分组,组函数作用在分组后的数据上
  3. 在写select子句中列,如果没有在组函数里,那么一定要group by 后边。
select a,b,sum(c),count(d) from 表 group by a,b


分组后限定查询:having

二次筛选:就是分组后再对数据进行筛选,需要having子句来完成。

select 列名 from 表名 group by 列名 having 条件


having子句和where 子句:都是用于限定条件

对比:

  1. where 和having后面都是跟条件
  2. where是对表中数据进行原始筛选
  3. having是对group by 的结果的二次筛选
  4. having必须配合group by使用,一般也会跟着聚合函数一起使用
  5. 可以先有where,后面跟着group by和having



区别和结论:

  1. 语法上:在having中使用组函数(max,min,avg,count...),而where后不能用组函数。
  2. 执行上:where是先过滤再分组。having是先分组再过滤。



练习1:按照部门来分组,查询每个部门的最高工资,最低工资,平均工资。

select deptno, max(sal),min(sal),avg(sal) from emp group by deptno;


练习2:求每种工作的最高薪资,最低薪资,以及人数。

select job,max(sal),min(sal),count(empno)
 from emp group by job;


练习3:查询部门人数超过5人的部门。

select deptno,count(*) from emp group by deptno having count(*) >5;




分页


limit是mysql特有的。方言。

limit用于限定查询结果的起始行,以及总行数。

select * from 表名 limit start,count;


例如:查询起始行为第5行,一共查询3行

select * from stu limit 4,3;

其中4表示从第5行开始,其中3表示是查询3行。即5,6,7行

select * from emp limit 2,3;




最后


本期结束咱们下次再见👋~

🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9月前
|
关系型数据库 MySQL 数据库
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
182 0
|
2月前
|
数据采集 机器学习/深度学习 存储
解锁unlist在网页爬取中的另类用法
本文介绍了一种结合unlist、代理IP和多线程技术的高效网页爬取方法,以今日头条为例,展示了如何采集新闻热点数据。通过使用unlist展平嵌套HTML结构,简化数据解析;利用代理IP规避IP限制,确保抓取安全;采用多线程提高效率。代码实现包括安装依赖库、配置代理、任务分发及数据解析,最终实现了高效的数据抓取与处理。
解锁unlist在网页爬取中的另类用法
|
6月前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
122 0
|
6月前
|
人工智能 小程序 Java
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
本文介绍了一款名为PyWxDump的开源工具,它可以获取微信账户信息、解密SQLite数据库以查看和备份聊天记录。此工具适用于已登录电脑版微信的用户,通过GitHub下载后简单几步即可操作。适合对数据恢复感兴趣的开发者,但请注意合法合规使用并尊重隐私。
819 2
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
|
6月前
|
SQL 关系型数据库 MySQL
"告别蜗牛速度!解锁批量插入数据新姿势,15秒狂插35万条,数据库优化就该这么玩!"
【8月更文挑战第11天】在数据密集型应用中,高效的批量插入是性能优化的关键。传统单条记录插入方式在网络开销、数据库I/O及事务处理上存在明显瓶颈。批量插入则通过减少网络请求次数和数据库I/O操作,显著提升效率。以Python+pymysql为例,通过`executemany`方法,可实现在15秒内将35万条数据快速入库,相较于传统方法,性能提升显著,是处理大规模数据的理想选择。
305 5
|
6月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶实战:解锁性能飙升秘籍,从菜鸟到高手的华丽蜕变,让数据操作如行云流水!
【8月更文挑战第5天】MySQL是最流行的开源关系型数据库之一,在Web开发与数据分析等领域广泛应用。本文通过实战代码示例,深入探讨MySQL进阶技能:包括索引优化以提升查询性能;利用JOIN与子查询处理多表关联数据;通过事务处理确保数据一致性;使用存储过程与函数封装复杂逻辑以便重用;设置触发器自动执行特定任务以维护数据完整性。掌握这些技能能显著提高数据处理效率与系统性能。
199 5
|
6月前
|
Java 开发者
解锁Java并发编程的秘密武器!揭秘AQS,让你的代码从此告别‘锁’事烦恼,多线程同步不再是梦!
【8月更文挑战第25天】AbstractQueuedSynchronizer(AQS)是Java并发包中的核心组件,作为多种同步工具类(如ReentrantLock和CountDownLatch等)的基础。AQS通过维护一个表示同步状态的`state`变量和一个FIFO线程等待队列,提供了一种高效灵活的同步机制。它支持独占式和共享式两种资源访问模式。内部使用CLH锁队列管理等待线程,当线程尝试获取已持有的锁时,会被放入队列并阻塞,直至锁被释放。AQS的巧妙设计极大地丰富了Java并发编程的能力。
60 0
|
6月前
|
缓存 关系型数据库 MySQL
MySQL调优秘籍曝光!从索引到事务,全方位解锁高可用秘诀,让你的数据库性能飞起来!
【8月更文挑战第6天】MySQL是顶级关系型数据库之一,其性能直接影响应用的高可用性与用户体验。本文聚焦MySQL的高性能调优,从索引设计到事务管理,逐一解析。介绍如何构建高效索引,如联合索引`CREATE INDEX idx_order_customer ON orders(order_id, customer_id);`,以及索引覆盖查询等技术。
94 0
|
SQL 数据库
数据库实验三——数据更新操作中经典题、难题以及易错题合集(含数据导入导出操作详细教程)
数据库实验三——数据更新操作中经典题、难题以及易错题合集(含数据导入导出操作详细教程)
230 0
数据库实验三——数据更新操作中经典题、难题以及易错题合集(含数据导入导出操作详细教程)
|
缓存 NoSQL Java
Redis缓存技术(第二课)
Redis缓存技术(第二课)
83 0