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');
%:匹配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%';
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 sex,count(*) from stu group by sex;
注意:
select a,b,sum(c),count(d) from 表 group by a,b
分组后限定查询:having
二次筛选:就是分组后再对数据进行筛选,需要having子句来完成。
select 列名 from 表名 group by 列名 having 条件
having子句和where 子句:都是用于限定条件
对比:
区别和结论:
练习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;
本期结束咱们下次再见👋~
🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。