SQL语句查询关键字:where筛选、group by分组、distinc去重、order by排序、limit分页、操作表的SQL语句布补充
SQL语句查询关键字
select
指定需要查询的字段信息
select * 查所有字段
select name 查name字段
select char_length(name) 支持对字段做处理
from
指定需要查询的表信息
from mysql.user
from t1
SQL语句中关键字的执行和编写顺序并不是一致的 可能会错乱
eg:
select id,name from userinfo;
我们先写的select在写的from 但是执行的时候是先执行的from再执行select
对应关键字的编写顺序和执行顺序没有过多地在意 熟练之后会非常自然的编写 只需要把注意力放在每个关键字的功能上即可
前期数据准备
create table emp(
id int primary key auto_increment,
name varchar(32) not null,
gender enum('male', 'female') not null default 'male' # 大部分是男的
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(64),
post_comment varchar(64),
salary double(15,2),
office int,
depart_id int
);
# 插入记录
insert into emp(name,gender,age,hire_data,post,salary,office,depart_id) values
('jason','male',18,'20170301','浦东第一帅形象代言',7300.33,401,1), #以下是教学部
('tom','male',78,'20150302','teacher',1000000.31,401,1),
('kevin','male',81,'20130305','teacher',8300,401,1),
('tony','male',73,'20140701','teacher',3500,401,1),
('owen','male',28,'20121101','teacher',2100,401,1),
('jack','female',18,'20110211','teacher',9000,401,1),
('jenny','male',18,'19000301','teacher',30000,401,1),
('sank','male',48,'20101111','teacher',10000,401,1),
('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('呵呵','female',38,'20101101','sale',2000.35,402,2),
('西西','female',18,'20110312','sale',1000.37,402,2),
('乐乐','female',18,'20160513','sale',3000.29,402,2),
('拉拉','female',28,'20170127','sale',4000.33,402,2),
('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3);
编写SQL语句的小技巧
针对select后面的字段名可以先用*号占位往后写 最后再回来修改
在实际应用中select后面很少直接写*号 因为*号表示所有 当表中字段和数据都特别多的情况下非常浪费数据库资源
'''
SQL语句的编写类似于代码的编写 不是一蹴而就的 也需要反反复复的修修补补
'''
查询关键字之where筛选
- 查询id大于等于3小于6的数据
select * from emp where id >= 3 and id <= 6; # 支持逻辑运算符
select * from emp where id bewteen 3 and 6;
- 查询薪资是20000或者18000或者17000的数据
select * from emp where salary=20000 or salary=18000 or salary=17000;
select * from emp where salary in (20000,18000,17000); # 支持成员运算
- 查询id小于3大于6的数据
select * from emp where id<3 or id>6;
select * from emp where id not between 3 and 6;
4. 查询员工姓名中包含字母o的员工姓名与薪资
select * from emp where name like '%o%';
条件不够精确的查询 称之为 模糊查询
模糊查询的关键字是: like
迷糊查询的常用符号:
% # 通配符代表零个 一个或多个字符 匹配任意个数的任意字符
eg:
%o% o jason owen loo wwoww 匹配所有带o字符与的
%o o asdasdo asdo 匹配以o结尾的字符
_ # 匹配单个个数的任意字符
eg:
_o_ aox wob iok
o_ oi ok ol
- 查询员工姓名是由字符组成的员工姓名与其薪资
select * from emp where name like '____';
select * from emp where char_length(name)=4;
- 查询岗位描述为空的员工名与岗位名 针对null不能用等号 只能用is
select * from emp where post_comment=NULL; 错误不可以的哟
select * from emp where post_comment is NULL; 可以
在MySQL中也有很多的内置方法 我们可以通过查看帮助手册学习 help 方法名
查询关键字之group by分组
分组:按照指定的条件将单个单个的数据组成一个个整体
如:将班级学生按照指定性别分组
将全国人民按照名族分组
将全世界的按照肤色分组
分组的目的是为了更好的统计相关数据
如:每个班级的男女比例
每个人民族的总占比
每个部门的平均薪资
聚合函数
max:最大值 min:最小值 sum:求和 avg:平均值 count:计数
- 将员工数据按照部门分组
select * from emp group by post;
'''
MySQL5.6默认不会报错
set global sql_mode='strict_tran_tables,only_full_group_by'
MySQL5.7及8.0默认都是会报错的
原因是分组之后 select后面默认只能填写分组的依据 不能再写其他字段
select post from emp group by post;
select age from emp group by age;
分组之后默认的是最小单位就应该是组 而不应该再是组内的单个数据单个字段
'''
- 获取每个部门的最高工资
# 要不要 分组我们完全可以从题目中的需求中分析出来尤其是出现的关键字 每个 平均
select post,max(salary) from emp group by post;
针对sql语句执行之后的结果 我们是可以修改字段名称的 关键字as 也可以省略
select post as '部门',max(salary) as '最高薪资' from emp group by post;
- 一次获取部门薪资相关统计
select post,max(salary) '最高薪资',min(salary) '最低薪资',avg(salary) '平均工资',sum(salary) '月支出' from emp group by post;
- 统计每个部门的人数
select post,count(id) from emp group by post;
- 统计每个部门名称以及部门下的员工姓名
# 分组以外的字段无法直接填写 需要借助于方法
select post,name from emp group by post; 报错
无法直接填写name select后面直接写post 分组之后只可以,默认可以直接填写分组依据 其他字段只能借助于一些方法 如聚合函数
select post,group_concat(name) from emp group by post;
内置方法group_concat:(针对分组之后对其他字段做数据拼接)
select post,group_concat(name,age) from emp group by post;
select post,group_concat(name,'|',age) from emp group by post;
select post,group_concat(name,'_NB') from emp group by post;
select post,group_concat('DSB_',name,'_NB') from emp group by post;
查询关键字之having过滤
having与where本质是一样的 都是用来当对数据做筛选
只不过where用在分组之前(首次筛选)
having用在分组之后(二次筛选)
- 统计各部门年龄在30岁以上的员工平均工资 并且保留大于10000的数据
对于复杂的点的SQL 跟写代码几乎一样 也是需要提前想好大致思路
# 没一条的结果可以直接看成就是一张表 基于该表如果还想继续操作则直接在生产该表的SQL语句上添加即可
NO1.先筛选出所有年龄大于30岁的员工数据
select * from emp where age > 30;
NO2.再对筛选出来的数据按照部门分组并统计平均薪资
select post,avg(salary) from emp where age > 30 group by post;
NO3.针对分组统计之后的结果再做筛选
select post,avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;
查询关键字值distinct去重
去重有一个必须的条件也是很容易被忽略的条件 数据必须是一模一样才可以去重
select distinct id,age from emp; # 无法去重 关键字针对的得是多个字段组合的结果
select distinct age from emp;
select distinct age,post from emp;
查询关键字值order by排序
- 可以是单个字段排序
1.可以是单个字段排序
select * from emp order by age; 默认升序
select * from emp order by age asc; 默认升序(asc可以省略)
select * from emp order by age desc; 降序
在age字段名后面加上desc查找就是 按年龄降序去排
- 也可以是多个字段排序
select * from emp order by age,salary desc; # 先按照年龄升序排 相同的情况下就再按照薪资降序排
统计各部年龄在10岁以上的员工平均工资 并且保留平均工资大于1000的部门 然后对平均工资进行排序
1.先筛选出所有年龄大于10岁的员工
select * from emp where age > 10;
2.再对他们按照部门分组统计平均薪资
select post,avg(salaey) from emp where age > 10 group by post;
3.针对分组的结果二次筛选
select post,avg(salary) from emp where age > 10 group by post having avg(salary)>1000;
4.最后按照指定字段排序
select post,avg(salary) from emp where age > 10 group by post having avg(salary)>1000 order by avg(salary);
'''
当一条SQL语句中很多都需要使用聚合函数计算之后的结果 可以节省操作(主要是节省的底层的运行效率 代码看不出来)
select post,avg(salary) as avg_salary from emp where age > 10 group by post having avg_salary>1000 order by avg_salary;
'''
查询关键字之limit分页
当表中数据特别多的情况下 很少会一次性获取所有的数据 很多网站也是做了分页处理一次性只能看一点点
select * from emp limit 5; 直接限制展示的条数
select * from emp limit 5,5; 从第5条开始往后读取5条
查询工资最高的人的详细信息
# 不要惯性思维 一看到工资就想着用分组聚合
select * from emp order by salary decs limit 1;
查询关键字之regexp正则表达式
SQL语句的模糊匹配如果不习惯 可以自己写正则批量查询
select * from emp where name regexp '^j.*?(n|y)$';(这里有? 在8.0版本不报错 5.6会报错ERROR 1139 (42000): Got error 'repetition-operator operand invalid' from regexp)
多表查询的思路
数据
表数据准备
create table dep(
id int primary key auto_increment,
name varchar(20)
);
create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);
#插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营'),
(205,'财务');
insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('dragon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);
select * from emp,dep;
会将两张表中所有的数据对应一遍
这个现象我们也称之'笛卡尔积'无脑的对应没有意义 应该将有关系的数据对应到一起用才合理
基于笛卡尔积可以将部门编号与部门id相同的数据筛选出来
涉及到两张及以上的表时 字段很容易冲突 我们需要字段前面加上表名来指定
select * from emp,dep where emp.dep_id=dep.id;
基于上述的操作就可以将多张表合到一起然后一次性获取更多的数据
mysql里help无法查看内容解决方法
再重启服务端
修改字段名
alter table 表名 change 旧字段名 新字段名 新数据类型;
修改字段类型
alter table 表名 modify 旧字段名 新字段类型;
删除字段名
alter table 表名 drop 旧字段名;
指定位置添加字段名
alter table 表名 add 新字段名 新字段类型 (after:指定位置插入/first:首位。不加就默认尾部) 旧字段名
SQL语句查询关键字:where筛选、group by分组、distinc去重、order by排序、limit分页、操作表的SQL语句布补充的更多相关文章
- SQL语句查询关键字中含有特殊符号怎么处理, 例如 'SMI_'
SQL语句查询关键字中含有特殊符号怎么处理, 例如 'SMI_' 错误:select * from emp where ename like '%SML_%' 正确:select * from em ...
- mysql---select的五种子句学习(where、group by、having、order by、limit)
mysql---select的五种子句学习(where.group by.having.order by.limit) 分类: Mysql学习2012-09-27 16:14 1533人阅读 评论 ...
- sql连接查询中on筛选与where筛选的区别
sql查询这个东西, 要说它简单, 可以很简单, 通常情况下只需使用增删查改配合编程语言的逻辑表达能力,就能实现所有功能. 但是增删查改并不能代表sql语句的所有, 完整的sql功能会另人望而生畏. ...
- mybatis中union可以用if判断连接,但是<select>中第一个select语句不能被if判断,因此可以从dual表中查询null来凑齐。union如果使用order by排序,那么只能放在最后一个查询语句的位置,并且不能带表名。
<!-- 一址多证纳税人分析表 --> <select id="yzdznsrlistPage" parameterType="page" r ...
- mysql查询关键字补充与多表查询
目录 查询关键字补充 having过滤 distinct去重 order by排序 limit分页 regexp正则 多表查询 子查询 连表查询 查询关键字补充 having过滤 关键字having和 ...
- 45、SQL逻辑查询语句执行顺序
一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...
- 9、SQL逻辑查询语句执行顺序
本篇导航: SELECT语句关键字的定义顺序 SELECT语句关键字的执行顺序 准备表和数据 准备SQL逻辑查询测试语句 执行顺序分析 一.SELECT语句关键字的定义顺序 SELECT DISTIN ...
- python 3 mysql sql逻辑查询语句执行顺序
python 3 mysql sql逻辑查询语句执行顺序 一 .SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_t ...
- mysql五补充:SQL逻辑查询语句执行顺序(待完善)
一.SELECT语句关键字的定义顺序(语法顺序) SELECT DISTINCT <select_list> FROM <left_table> <join_type&g ...
- mysql系列九、mysql语句执行过程及运行原理(分组查询和关联查询原理)
一.背景介绍 了解一个sql语句的执行过程,了解一部分都做了什么,更有利于对sql进行优化,因为你知道它的每一个连接.where.分组.子查询是怎么运行的,都干了什么,才会知道怎么写是不合理的. 大致 ...
随机推荐
- 7_Log
一. 引言 1.1 日志介绍 用于记录系统中发生的各种事件. 记录的位置常见的有: 控制台, 磁盘文件等 1.2 日志级别 日志级别由低到高 TRACE, DEBUG, INFO, WARN, ERR ...
- SpringBoot的starter到底是什么?
前言 我们都知道,Spring的功能非常强大,但也有些弊端.比如:我们需要手动去配置大量的参数,没有默认值,需要我们管理大量的jar包和它们的依赖. 为了提升Spring项目的开发效率,简化一些配置, ...
- C++ 右值引用与 const 关键字
C++11 新增了另一种引用:右值引用(rvalue reference),这种引用可指向右值,是使用 && 声明的.使用右值引用可以减少复制操作,延长临时对象生命周期,提升程序性能. ...
- 洛谷P3391 文艺平衡树 (Splay模板)
模板题. 注意标记即可,另外,涉及区间翻转操作,记得设立首尾哨兵. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int ...
- 汇编指令:lea
lea指令变种(按大小分类): leaw #2个字节 leal #4个字节 leaq #8个字节 lea的用法: leaq a(b, c, d), %rax 首先lea指令是mov指令的变种,据说,l ...
- uoj349【WC2018】即时战略
题目链接 WC出了点意外滚粗了,来补补题. \(O(n^2)\)的时间复杂度,\(O(nlogn)\)的询问次数应该还是比较好想的,每次要打通到x的路径,对当前已知的树不断的找重心并询问在重心的哪颗子 ...
- 【JavaWeb】学习笔记——Ajax、Axios
Ajax Ajax 介绍 AJAX(Asynchronous JavaScript And XML):异步的JavaScript 和 XML AJAX 的作用: 与服务器进行数据交换:通过AJAX可以 ...
- Vue3的新特性
总概 1) 性能提升 打包大小减少 41% 初次渲染快 55%,更新渲染快 133% 内存减少 54% 使用 Proxy 代替 defineProperty 实现数据响应式 重写虚拟 DOM 的实现和 ...
- JAVA的File对象
文件 1.File对象 java封装的一个操作文件及文件夹(目录)的对象.可以操作磁盘上的任何一个文件和文件夹. 2.创建文件 方式一:根据路径构建一个File对象new File(path) // ...
- SQLSever数据库基本操作
一.SQLSever数据库基本操作 1.创建数据库 use master if exists(select * from sysdatabases where name='SMDB') drop da ...