表查询

前期准备一张表

  1. create table emp(
  2. id int not null unique auto_increment,
  3. name varchar(32) not null,
  4. gender enum('male','female','other') not null default 'male',
  5. age int(3) unsigned not null default 28,
  6. hire_date date not null,
  7. post varchar(64),
  8. post_comment varchar(100),
  9. salary double(15,2),
  10. office int,
  11. depart_id int
  12. );

  13. # 插入记录 三个部门:教学部 销售部 运营部
  14. insert into emp(name,gender,age,hire_date,post,salary,office,depart_id) values
  15. ('jason','male',18,'','张江第一帅形象代言',7300.33,401,1),

  16. ('egon','male',78,'','teacher',1000000.31,401,1), # 以下是教学部
  17. ('kevin','male',81,'','teacher',8300,401,1),
  18. ('tank','male',73,'','teacher',3500,401,1),
  19. ('owen','male',28,'','teacher',2100,401,1),
  20. ('jerry','female',18,'','teacher',9000,401,1),
  21. ('nick','male',18,'','teacher',30000,401,1),
  22. ('sean','male',48,'','teacher',10000,401,1),

  23. ('歪歪','female',48,'','sale',3000.13,402,2),#以下是销售部门
  24. ('丫丫','female',38,'','sale',2000.35,402,2),
  25. ('丁丁','female',18,'','sale',1000.37,402,2),
  26. ('星星','female',18,'','sale',3000.29,402,2),
  27. ('格格','female',28,'','sale',4000.33,402,2),

  28. ('张野','male',28,'','operation',10000.13,403,3), #以下是运营部门
  29. ('程咬金','male',18,'','operation',20000,403,3),
  30. ('程咬银','female',18,'','operation',19000,403,3),
  31. ('程咬铜','male',18,'','operation',18000,403,3),
  32. ('程咬铁','female',18,'','operation',17000,403,3)
  33. ;

1. 语法执行顺序

  1. # 初识查询语句
  2. select id,name from emp where id >= 3 and id <= 6;
  3. # 翻译:展示emp表中id大于等于3且小于等于6这些数据的id和name
  4. '''
  5. 执行顺序:
  6. from # 确定是那张表
  7. where # 根据条件,筛选数据
  8. group by # 分组
    having  # 对分组后的表筛选
  9. select # 拿出筛选出来的数据中的某些字段
    distinct  # 去重
  1. '''
  2. # 关键字 where group by 同时出现的情况下,group by 必须在 where 之后
  3. # where 先对整张表进行一次筛选,group by 再对筛选后的表进行分组
  4. # 如何验证where是在group by之前执行而不是之后 利用聚合函数 因为聚合函数只能在分组之后才能使用
  5. select id,name,age from emp where max(salary) > 3000; # 报错!

  6. select max(salary) from emp;
  7. # 正常运行,不分组意味着每一个人都是一组,等运行到max(salary)的时候已经经过where,group by操作了,只不过我们都没有写这些条件

2.where约束条件(筛选条件)

  1. # 1.查询id大于等于3小于等于6的数据
  2. 解析:
  3. 筛选条件:id大于等于3小于等于6
  4. 展示字段:没要求展示全部
  5. select * from emp where id >= 3 and id <= 6;
  6. select * from emp where id between 3 and 6; # 另一种写法

  1. # 2.查询薪资是20000或者18000或者17000的数据
  2. 解析:
  3. 筛选条件:薪资是20000或者18000或者17000
  4. 展示字段:没要求展示全部
  5. select * from emp where salary = 20000 or salary = 18000 or salary = 17000;
  6. select * from emp where salary in (20000,18000,17000); # 另一种写法

  1.  

  1. # 3.查询员工姓名中包含o字母的员工姓名和薪资
  2. 解析:
  3. 筛选条件:员工姓名中包含o字母,
  4. 展示字段:姓名和薪资
  5. ps:模糊匹配 like
  6. % 匹配多个任意字符
  7. _ 匹配一个任意字符
  8. select name,salary from emp where name like '%o%';

  1. # 4.查询员工姓名是由四个字符组成的员工姓名与其薪资
  2. 解析:
  3. 筛选条件:员工姓名是由四个字符组成
  4. 展示字段:姓名与薪资
  5. select name,salary from emp where name like '____';
  6. select name,salary from emp where char_length(name) = 4; # 统计字符长度

  1.  

  1. # 5.查询id小于3或大于6的数据
  2. 解析:
  3. 筛选条件:id小于3或大于6
  4. 展示字段:全部
  5. select * from emp where id <3 or id > 6;
  6. select * from emp where id not between 3 and 6;

  1. # 6.查询薪资不在20000,18000,17000范围的数据
  2. 解析:
  3. 筛选条件:薪资不在20000,18000,17000范围
  4. 展示字段:全部
  5. select * from emp where salary not in (20000,18000,17000);

  1.  

  1. # 7.查询岗位描述为空的员工名与岗位名
  2. 解析:
  3. 筛选条件:岗位描述为空
  4. 展示字段:员工名与岗位名
  5. select name,post from emp where post_comment = null; # 查询为空
  6. select name,post from emp where post_comment is null; # 判断空只能用 is
  7. # 查询岗位描述为不空的员工名与岗位名
  8. select name,salary from emp where post_comment is not null;

3.group by 分组

  1. # 数据分组应用场景: 每个部门的平均薪资,男女比例等
  2. 初识语句:
  3. select * from emp group by post; # 分组后拿到的是每组的第一条数据
  4. select id,name,gender from emp group by post; # 对
  5. 分组后应该做到最小单位是组,而不应该在展示组内的单个数据信息
  6. 分组之后,只能拿到分组的字段信息,无法直接获取其他字段信息,但是可以通过(聚合函数)间接获取
  7. '''
  8. 设置sql_mode为only_full_group_by,意味着以后分组,只能取到分组的依据,不应该再取组里面的单个元素值,那样分组就没有意义了,因为不分组就是对单个元素信息的随意获取
  9. '''
  10. show variables like '%mode%';
  11. set global sql_mode="strict_trans_tables,only_full_group_by";
  12. 设置严格模式后要重启mysql
  13. # 注意: 如果一张表没有group by 默认所有的数据就是一个组

  1. # 设置严格模式后
  2. select * from emp group by post; # 报错
  3. select id,name from emp group by post; # 报错
  4. # 1.按部门分组
  5. select post from emp group by post;
  6. # 强调 分组后就不能直接查到单个数据信息了,只能获取组名

  1.  

聚合函数

  1. # 以组为单位,统计组内数据>>>聚合查询(数据聚集到一起计算结果)
  2. # 必须在分组之后使用
  3. # 聚合函数会自动将每一个分组内的单个数据做想要的计算
  4. max() 最大值
  5. min() 最小值
  6. avg() 平均值
  7. sum() 求和
  8. count() 计数,有几个计算几个
  9. concat() 一般用来拼接字符串 # 不在组内使用
  10. group_concat() 用来显式组内指定字段对应的数据或拼接字符串的作用
  1. # 2.获取每个部门的最高工资
  2. 解析:
  3. 筛选条件:无
  4. 分组:按部门
  5. 展示:部门的最高工资
  6. select post,max(salary) from emp group by post;

  1. # 每个部门最低工资
  2. select post,min(salary) from emp group by port;
  3. # 每个部门平均工资
  4. select post,avg(salary) from emp group by post;
  5. # 每个部门工资总和
  6. select post,sum(salary) from emp group by post;
  7. # 每个部门的人数
  8. select post,count(id) from emp group by post; # 按id计数
  9. select post,count(age) from emp group by post; # 按年龄计数
  10. select post,count(salary) from emp group by post; # 按薪资计数
  11. select post,count(post_comment) from emp group by post;
  12. # 注意: 在统计分组内个数的时候,填写任意非空字段都可以完成统计,推荐使用id字段
  1.  

  1. # 3.查询分组之后的部门名称和每个部门下所有的学生姓名
  2. 解析:
  3. 筛选条件:无
  4. 分组:按部门
  5. 展示:部门名称 每个部门下所有的学生姓名
  6. select post,name from emp group by post; # 报错
  7. select post,group_concat(name) from emp group by post;
  8. select post,group_concat('NB_',name) from emp group by post; # 拼接字符串
  9. select post,group_concat(name,':',salary) from emp group by post;

  1. # 4.补充concat(不分组时用)拼接字符串达到更好的显示效果 as语法使用
  2. select concat("NAME: ",name) as 姓名,concat("SAL: ",salary) as '薪资' from emp;
  1.  

  1. # 补充as语法 即可以给字段起别名也可以给表起
  2. select emp.id,emp.name from emp as t1; # 报错 因为表名已经被你改成了t1
  3. select t1.id,t1.name from emp as t1;
  4. # 查询四则运算
  5. # 查询每个人的年薪
  6. select name,salary*12 as '年薪' from emp;

练习题

  1. 1. 查询岗位名以及岗位包含的所有员工名字
  2. 解析:
  3. 筛选条件:无
  4. 分组:按岗位
  5. 展示:岗位名,岗位里的所有员工名字
  6. select post,group_concat(name) from emp group by post;
  7. 2. 查询岗位名以及各岗位内包含的员工个数
  8. 解析:
  9. 筛选条件:无
  10. 分组:按岗位
  11. 展示:岗位名,岗位里的员工个数
  12. select post,count(id)from emp group by post;
  13. 3. 查询公司内男员工和女员工的个数
  14. 解析:
  15. 筛选条件:无
  16. 分组:按性别
  17. 展示:性别,男女个数
  18. select gender,count(id) from emp group by gender;
  19. 4. 查询岗位名以及各岗位的平均薪资
  20. 解析:
  21. 筛选条件:无
  22. 分组:按岗位
  23. 展示:岗位,平均薪资
  24. select post,avg(salary) from emp group by post;
  25. 5. 查询岗位名以及各岗位的最高薪资
  26. 解析:
  27. 筛选条件:无
  28. 分组:按岗位
  29. 展示:岗位,最高薪资
  30. select post,max(salary) from emp group by post;
  31. 6. 查询岗位名以及各岗位的最低薪资
  32. select post,min(salary) from emp group by post;
  33. 7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
  34. 解析:
  35. 筛选条件:无
  36. 分组:按性别
  37. 展示:;性别,平均薪资
  38. select gender,avg(salary) from emp group by gender;
  39. 8.统计各部门年龄在30岁以上的员工平均工资
  40. 解析:
  41. 筛选条件:年龄在30岁以上
  42. 分组:按部门
  43. 展示:;部门,平均薪资
  44. select post,avg(salary) from emp where age > 30 group by post;

4.having 用在group by 之后的筛选

  1. having 的语法格式与 where 一致,只是 having 是在分组之后进行过滤筛选
  2. where 不能用聚合函数,但是 having 可以用聚合函数
  3. 1、统计各部门年龄在30岁以上的员工平均工资,并且保留平均工资大于10000的部门
  4. 解析:
  5. where筛选:年龄在30岁以上
  6. group by分组:部门
  7. having筛选:保留平均工资大于10000部门
  8. select展示:部门,平均薪资
  9. select post,avg(salary) as '平均薪资' from emp
  10. where age > 30
  11. group by post
  12. having avg(salary) > 10000;
  13. select * from emp where salary > 10000; # 对
  14. select avg(salary) from emp having salary > 10000; # 错
  15. select avg(salary) from emp having avg(salary) > 10000; # 对
  16. select post,avg(salary) from emp group by post having avg(salary) > 10000 ; # 对
  17. select max(salary) from emp where age > 20; # 对
  18. select max(salary) from emp having age > 20; # 错

5.distinct 去重

  1. # 对有重复的展示数据进行去重
  2. select distinct post from emp;
  3. select distinct age from emp;
  4. select distinct id,age from emp; # 不能去重,id + age 组合的数据没有重复的
  5. '''
  6. 去重的数据必须是一模一样的,只要有一个不一样都不能去重
  7. distinct 在select之后执行
  8. '''

6.order by 排序

  1. 1.asc 升序
  2. 2.desc 降序
  3. # 1.按salary排序
  4. select * from emp order by salary asc; # 默认升序
  5. select * from emp order by salary desc; # 降序
  6. # 2.按age降序排,年龄相同的情况下按salary升序拍
  7. select * from emp order by age desc,salary asc;


  1. # 3.统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序
  2. 解析:
  3. where筛选:年龄在10岁以上
  4. group by分组:按部门
  5. having筛选:并且保留平均工资大于1000的部门
  6. order by排序:平均工资
  7. select展示:部门,平均工资
  8. select post,avg(salary) from emp
  9. where age > 10
  10. group by post
  11. having avg(salary) > 1000
  12. order by avg(salary) asc;

  1.  

7.limit 限制展示数量

  1. # 限制展示3条数据
  2. select * from emp limit 3;
  3. # 查询工资最高的人的详细信息
  4. 解析:
  5. 按工资降序,再显示一条数据,就是工资最高的人的详情信息
  6. select * from emp order by salary desc limit 1;
  7. # 分页显示
  8. select * from emp limit 0,5; # 第一个参数是起始位置,第二个参数是显示的条数

8.正则

  1. select * from emp where name regexp '^j.*(n|y)$';

MySQL 表查询的更多相关文章

  1. MySQL 表查询语句练习题

    MySQL 表查询语句练习题: 一.  设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表 ...

  2. MySQL表查询

    单表查询 表准备 create table emp( id int not null unique auto_increment, name ) not null, sex enum('male',' ...

  3. mysql表查询、多表查询(增强查询的使用)子查询、合并查询,外连接,mysql5种约束,自增长

    一.查询加强 1.在mysql中,日期类型可以直接比较,需要注意格式 2.%:表示0到多个字符, _:表示单个字符 exp:显示第二个字符为大写O的所有员工的姓名和工资 select  name fr ...

  4. MySQL表-----查询------

    ``模糊查询4.2.1[使用like进行模糊查询]注意:like运算副只用于字符串,所以仅与char和varchar数据类型联合使用例:select * from a where name like ...

  5. mysql 表查询结果 总行数计算

    一般的查询语句是这样的 SELECT  id,name FROM SystemEvents WHERE  1=1 limit 9,10 SELECT  * FROM SystemEvents WHER ...

  6. Python将MySQL表数据写入excel

    背景:将mysql表查询结果写入excel. 1.使用sqlyog工具将查询结果导出到Excel.xml中,用excel打开发现:因为text字段中有回车换行操作,显示结果行是乱的. 2.用mysql ...

  7. day05多表查询01

    多表查询 前面讲过的基本查询都是对一张表进行查询,但在实际的开发中远远不够. 下面使用表emp,dept,salgrade进行多表查询 emp: dept: salgrade: 1.前置-mysql表 ...

  8. Mysql常用表操作 | 单表查询

    160905 常用表操作 1. mysql -u root -p 回车 输入密码   2. 显示数据库列表 show databases     3. 进入某数据库 use database data ...

  9. mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化

    先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...

随机推荐

  1. Vmware问题: 开机提示“虚拟机已被打开,是否获得所有权?”& Vmware检测不到USB

    "一只美丽的小鸟,在绿色的草坪上蹦来跳去,很是可爱"----清风徐来 问题1: Vmware开机提示"虚拟机已被打开,是否获得所有权?" 解决: 关闭虚拟机,用 ...

  2. Nginx里的root/index/alias/proxy_pass的意思

    1.[alias] 别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向[alias]配置的路径.如: location /test/ { alias /home/sftp/i ...

  3. [转帖]我最近研究了hive的相关技术,有点心得,这里和大家分享下。

    我最近研究了hive的相关技术,有点心得,这里和大家分享下. https://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3114180.html 首 ...

  4. 在CentOS7 安装 Redis数据库

    环境说明: 名称 版本 CentOS CentOS Linux release 7.4.1708 (Core) VMware Fusion 专业版 10.1.1 (7520154) SSH Shell ...

  5. (5)Spring Boot web开发 --- Restful CRUD

    文章目录 `@RestController` vs `@Controller` 默认访问首页 设置项目名 国际化 登陆 & 拦截 Restful 风格 @RestController vs @ ...

  6. Spring Cloud Alibaba学习笔记(12) - 使用Spring Cloud Stream 构建消息驱动微服务

    什么是Spring Cloud Stream 一个用于构建消息驱动的微服务的框架 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互, ...

  7. Task 开始 停止

    注意点:需要将每个线程的 MemoryCacheManager 保存,这里我保存在缓存中,需要取消时根据缓存key值取出 MemoryCacheManager //开始Task1 private vo ...

  8. 用.net4中的DynamicObject实现简单AOP

    public class DynamicWrapper : DynamicObject { private readonly object source; public DynamicWrapper( ...

  9. 【转载】为什么我的网站加www是打不开的呢

    在访问网站的过程中,我们发现有些网站访问不带www的主域名可以正常访问,反而访问加www的域名打不开,那为什么有的网站加www是打不开的呢?此情况很大可能是因为没有解析带www的域名记录或者主机Web ...

  10. vue复制textarea文本域内容到粘贴板

    vue实现复制内容到粘贴板   方案:找到textarea对象(input同样适用),获取焦点,选中textarea的所有内容,并调用document.execCommand("copy&q ...