前言
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
说明:
- select 后面跟的列名和group by 后的列名一致
- 当group by 单独使用的时候,只显示每组的第一条记录。所以group by单独使用的意义不大,大多要配合聚合函数。
- group by 后面也可以跟多个列进行分组,表示这些列都相同的时候在一组。
按照某列分组,该列有几种取值,就分为几组。
分组后使用聚合函数
select sex,count(*) from stu group by sex;
注意:
- 如果没有分组,那么聚合函数(sum,count,max,min)作用在整张表上
- 如果有分组,组函数作用在分组后的数据上
- 在写select子句中列,如果没有在组函数里,那么一定要group by 后边。
select a,b,sum(c),count(d) from 表 group by a,b
分组后限定查询:having
二次筛选:就是分组后再对数据进行筛选,需要having子句来完成。
select 列名 from 表名 group by 列名 having 条件
having子句和where 子句:都是用于限定条件
对比:
- where 和having后面都是跟条件
- where是对表中数据进行原始筛选
- having是对group by 的结果的二次筛选
- having必须配合group by使用,一般也会跟着聚合函数一起使用
- 可以先有where,后面跟着group by和having
区别和结论:
- 语法上:在having中使用组函数(max,min,avg,count...),而where后不能用组函数。
- 执行上: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;
最后
本期结束咱们下次再见👋~
🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗