目录
SQL语句查询关键词
select
指定需要查询的字段信息
select * *代码所有字段
select id 查询id字段
select id,name 可同时查询多个字段
select char_length(name) 支持对字段做处理
# 查询name字段 每个数据字符的长度
from
指定需要查询的表信息
from L1; 查询数据来源于l1表格
from db2.l1; 通过库名.表名方式表示
SQL语句中关键字的执行顺序和编写顺序并不是一致的 可能会错乱
eg:select id,name from l1;
#查询 id和name 字段 查询的表格是l1;
我们先写的是需要查询的字段 select 后面再写的查那个表 from 但是其实底部执行是 先运行from 找到我们要查询的表 再执行 select进行筛选
编写查询sql语句小技巧
针对select 后面具体要查询的字段名可以先不确定 from写完后再来填写也可以
"""
SQL语句的编写类似于代码的编写 不是一蹴而就的 也需要反反复复的修修补补
"""
查询关键字之where筛选
where筛选之 and or not in like is
1.查询id大于等于3 小于等于6的数据
select id from l1 where id >=3 and id<=6;
# 需要查询的字段 id 查询数据来源 from L1 筛选 id >=3 and id<=6;
# 支持逻辑运算符 and or not
关键词 between (之间)
select id from l1 where id between 3 and 6;
# 查询id 来源于L1表 筛选 id 在 3到6之间的
2.查询薪资是200或者1800或者1700的数据
select salary from l1 where salary in (200,1800,1700)
# in 方法 等于 salary=20000 or salary=18000 or salary=17000
3.查询id小于3和大于6的数据
select id from l1 where id<3 or id>6;
# or 方法 和 或 的意思
4.查询员工姓名中包含字母o的员工姓名与薪资
select name,salary from l1 where name like '%o%';
模糊查询关键字:like
like '模糊查询条件'
% 匹配任意个数字符 '%o' 已o结尾的任意数据
'o%' 已o开头的任意数据
'%o%' 包含o的任意数据
5.查询员工姓名是由四个字符组成的员工姓名与其薪资
select name,salary from l1 where name like '____';
_ 表示任意的一个字符
'___' 匹配3个字符
'o___' 已o开头后任意3个字符 eg:owen
select name,salary from l1 where char_length(name) = 4;
# 也可以通过显示长度方法 char_length(name) = 4;
6. 查询岗位描述为空的员工名与岗位名
select name,post_comment from l1 where post_comment is null;
# 针对关键词查询需要用 is 而不是 =
查询关键字之分组 group by
聚合函数 max\min\sun\avg\count
分组:按照指定的条件将单个单个的数据组成一个个整体
eg: 将班级学生 按照 性别分组
将员工按照 等级 分组
将人员按照地区分组
分组的目的是为了更好的统计相关数据
eg: 查看班级男女比例
查看员工 等级占比
查看地区人员 平均收入
分组后可以使用聚合函数
集合函数专业用语分组之后的数据统计
max 最大值 min 最小值
sun 求和 avg 平均值
count 计数
1.将员工数据按照部门分组
select post from l1 group by post;
# 查询post字段 来源L1 根据post字段 分组
# 分组之后 select后面默认只能直接填写分组的依据 不能再写其他字段
select * from l1 group by post;
"""
MySQL5.6默认不会报错
set global sql_mode='strict_trans_tables,only_full_group_by'
MySQL5.7及8.0默认都会直接报错
原因是分组之后 select后面默认只能直接填写分组的依据 不能再写其他字段
select post from emp group by post;
select age from emp group by age;
分组之后默认的最小单位就应该是组 而不应该再是组内的单个数据单个字段
"""
2.获取每个部门的最高工资
select post,max(salary) from l1 group by post;
# 查询post字段中 最高的工资 来源于 l1表 post组
如果遇到需求 每个 平均 基本可以考虑使用分组
针对sql语句执行之后的结果 我们是可以修改字段名称的 关键字as 也可以省略
select post '部门',max(salary) '最高工资' from l1 group by post;
可以使用别名显示
3.一次获取部门薪资相关统计(最高 最低 平均 和)
select post'部门',max(salary)'最高薪资',min(salary)'最低薪资',
avg(salary)'平均值',sum(salary)'和' from l1 group by post;
Group_concat 方法
4.统计每个部门的人数
select post'部门',count(id)'部门人数' from l1 group by post;
5.统计每个部门的部门名称以及部门下的员工姓名
select post'部门名称',name'员工姓名 'from l1 group by post; # 报错
'''分组以外的字段无法直接填写 需要借助于方法'''
select post'部门名称', group_concat(name)'员工姓名 'from l1 group by post;
# 获得每个部门下的所有员工姓名
+-----------------------------+---------------------
| 部门名称 | 员工姓名
+-----------------------------+----------------------
| operation | 僧龙,程咬金,程咬银,程咬铜,程咬铁 |
| sale | 哈哈,呵呵,西西,乐乐,拉拉 |
| teacher | tom,kevin,tony,owen,jack,jenny,sank |
| 浦东第一帅形象代言 | jason
group_concat 方法:该函数返回一个字符串结果,该字符串结果是通过分组串联的非NULL数据值。、
通常配合 group by 一起使用
也可以单独使用,比如需要每个表里面的全部 姓名等
select group_concat(name) from l1;
# 会得到一个很长的字符串 里面就是所有的姓名了
select group_concat('拼接字符串',name) from l1;
# 会得到字符串[子公司jason,子公司tom,子公司kevin,子公司tony,子公司owen]
查询关键字之having过滤
having与where本质是一样的 都是用来对数据做筛选的
where是用在分组之前 首次筛选
having用在分组之后的 二次筛选
1.统计各部门年龄在30岁以上的员工平均工资,并保留大于10000的数据
'针对稍微复杂一点你的SQL 我们可以像编写代码一样 先思考一下逻辑思路'
1.先筛选出所有年龄大于30的员工
2.然后在按照部门分组统计平均薪资
3.最后在筛选大于10000的
select port,avg(salary) from l1 where age>30 group by port having avg(salary) > 10000;
查询关键字之去重distinct
去重:
去除字段中一模一样的数据,只保留一个
单字段去重
select distinct age from l1;
# 列表单字段去重
多字段联合去重
select disiinct name,post from l1;
# 列表内 name字段 + post字段 相加结果相同去重
关键字之order by排序
1.单字段排序 默认升序
select * from l1 order by age;
# 根据age字段排序 从小到大
单字段排序 降序 desc
select * from l1 order by age desc:
# 根据age字段排序 从大到小
2.依据多字段排序
select * from l1 order by age,salary
# 首先依据第一个添加的字段 age进行排序 当age相同时 根据 salary排序
统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序.
select post,avg(salary) from l1 where age > 10
# 展示 部门 和 部门平均工资 数据来源 表l1 对年龄大于10的人根据部门分组,然后二次筛选组内 平均薪资大于1000的 然后 按照从小达大 排序
group by post having avg(salary) > 1000 order by avg(salary);
当一条SQL语句中很多地方都需要使用聚合函数计算之后的结果 我们可以节省操作(主要是节省了底层运行效率 代码看不出来)
select post,avg(salary) as a_salary from l1 where age>10
group by post having a_salary >1000 order by a_salary
多次重复使用的数据可以起别名 然后用别名代替,这样系统底层不需要多次计算
提高运行效率
查询关键字之limit分页
标签:语句,salary,group,SQL,关键词,查询,l1,post,select
From: https://www.cnblogs.com/moongodnnn/p/16926396.html