前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《数据库查询:解锁数据宝藏的魔法之钥》

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

原创
作者头像
杨不易呀
发布2023-09-27 23:18:51
发布2023-09-27 23:18:51
2540
举报
文章被收录于专栏:杨不易呀杨不易呀

前言

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

查询

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

语法:

代码语言:java
复制
select {columns}
from {table|view|other select}
[where 条件]
[group by 分组条件]
[having 分组后再限定]
[order by 排序]

准备环境:

代码语言:sql
复制
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.查询指定的列:

代码语言:java
复制
select 列1,列2,列3.。。 from 表名
代码语言:java
复制
select empno,ename,hiredate from emp;

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

代码语言:text
复制
select 列1 as 别名 from 表名
代码语言:java
复制
select empno as 员工编号,ename '员工 姓名' from emp;

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

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

代码语言:text
复制
select concat('我的名字是',ename,',喔喔') from emp;

4.去重:distinct

代码语言:java
复制
select distinct job from emp;
select distinct job,deptno from emp;

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

条件查询

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

代码语言:sql
复制
比较运算符:=,!=,<>,>,<,>=,<=

逻辑运算符:and ,or, not

范围:between and,in,not in

null:is null,is not null
代码语言:sql
复制
练习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个任意字符

代码语言:sql
复制
//名字的第三个字母为a的员工信息
mysql> select * from emp where ename like '__a%';

like '_a';只有两个字符

like '%a%';包含a

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

代码语言:java
复制
select * from emp where ename like 'A%';

排序:orderby

asc:升序,默认

desc:降序

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

代码语言:java
复制
select * from emp order by sal;
select * from emp order by sal desc;

统计函数

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

sum(),

avg(),

max()

min(),

count(*/主键)

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

代码语言:text
复制
select ename,sum(sal),avg(sal),max(sal),min(sal) ,count(empno),count(comm)from emp where deptno=20;

分组

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

语法:

代码语言:java
复制
select 列名 from 表名 group by 列名

或者

代码语言:java
复制
select 列名1,列名2 from 表名 group by 列名1,列名2

说明:

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

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

分组后使用聚合函数

代码语言:java
复制
select sex,count(*) from stu group by sex;

注意:

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

分组后限定查询:having

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

代码语言:java
复制
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:按照部门来分组,查询每个部门的最高工资,最低工资,平均工资。

代码语言:text
复制
 select deptno, max(sal),min(sal),avg(sal) from emp group by deptno;

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

代码语言:text
复制
select job,max(sal),min(sal),count(empno)
 from emp group by job;

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

代码语言:text
复制
select deptno,count(*) from emp group by deptno having count(*) >5;

分页

limit是mysql特有的。方言。

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

代码语言:java
复制
select * from 表名 limit start,count;

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

select * from stu limit 4,3;

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

代码语言:text
复制
 select * from emp limit 2,3;
输入图片说明
输入图片说明

最后

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

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

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

输入图片说明
输入图片说明

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 查询
      • 简单查询
      • 条件查询
      • 模糊查询:like
      • 排序:orderby
      • 统计函数
      • 分组
      • 分页
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档