SQL语句筛选/查询
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 group by post having avg(salary) > 1000 order by avg(salary);
# 展示 部门 和 部门平均工资 数据来源 表l1 对年龄大于10的人根据部门分组,然后二次筛选组内 平均薪资大于1000的 然后 按照从小达大 排序
当一条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分页
当表中数据特别多的情况下 我们很少会一次获取所有的数据 很多网站也都是做了分页吹了,一次性只展示一点点
关键词 limit(丽米特)
select * from l1 limit 5; # 直接限制展示的条数
select * from l1 limit 2,10 # 从第2条开始往后读取10条
例如 以后需要展示最高 或者 最高几条时 都可以考虑 limit 方法
查询工资最高的前三人
select * from l1 order by salary desc limit 3;
# oeder by 排序默认从小到大 加上 desc 降序从大到小 展示3条
查询工资最底的三人
select * from l1 order by salary limit 3;
# 默认排序从小到大
查询关键字之regexp正则表达式
SQL语句的模糊匹配 like 方法不习惯是 也可以使用 regexp 编写正则筛选
可以配合 where 配合使用 针对每个字段进行正则匹配
select * from l1 where name regexp '^j.*n$';
也可以变相理解为搜索:
查找L1表中名字 “张无忌”的所有信息
select * from l1 where name regexp '张无忌'
模糊匹配,以特定字符串开头
select * from l1 where name regexp '^J';
select * from l1 where nane like 'j%';
模糊匹配,以特定字符串结尾
select * from l1 where name regexp 'j$';
select * from l1 where nane like '%j';
模糊匹配 包含 或者
select * from l1 where name regexp '哈哈|嘻嘻|呵呵';
# 简单的模糊查询可以使用like 稍微复杂一点的建议使用 regexp
迷糊匹配 不包含 not regexp
select * from l1 where name not regexp '^j';
# 不包含 已 j开头的所有数据
多表查询的思路
表数据准备
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;
'''这种为交叉连接 交叉联结(笛卡尔积)
指将表1中的每一行与表2中的每一行进行合并,因此合并后得到的行数是两张表行数的乘积。
注意:交叉联结在实际应用中比较少,因为结果行数较多,运算量比较大,实际使用价值也不大'''
如果我们想把对应的数据关联 例如 表一 有表二 的id 可以这样处理
select * from emp,dep where emp.dep_id=dep.id;
# 展示所有字段 数据来源 emp表和dep表 筛选条件 emp.dep_id=dep.id;
其实我们也是把多张表的数据合并到了一起 然后在根据筛选条件进行展示
小练习
1. 查询岗位名以及岗位包含的所有员工名字
select post '部门',group_concat(name)'员工姓名' from l1 group by post;
2. 查询岗位名以及各岗位内包含的员工个数
select post,count(id) from l1 group by post;
3. 查询公司内男员工和女员工的个数
select gender,count(id) from l1 group by gender;
4. 查询岗位名以及各岗位的平均薪资
select post,avg(salary) from l1 group by post;
5. 查询岗位名以及各岗位的最高薪资
select post,max(salary) from l1 group by post;
6. 查询岗位名以及各岗位的最低薪资
select post,min(salary) from l1 group by post;
7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
select gender,avg(salary) from l1 group by gender;
8. 统计各部门年龄在30岁以上的员工平均工资
select post,avg(salary) as a_salary from l1 where age>30 group by post;
SQL语句筛选/查询的更多相关文章
- SQL语句关联查询
一:连接类型: 关联查询:只有存在关联的表才能关联查询,完全独立的表之间无法关联 1.关联的类型:自关联,左关联,右关联,全关联(full join)两张表都是主表 2.关联的表:两张以上,以一张(或 ...
- mysql 常用 sql 语句 - 快速查询
Mysql 常用 sql 语句 - 快速查询 1.mysql 基础 1.1 mysql 交互 1.1.1 mysql 连接 mysql.exe -hPup ...
- SQL语句在查询分析器中可以执行,代码中不能执行
问题:SQL语句在查询分析器中可以执行,代码中不能执行 解答:sql中包含数据库的关键字,将关键字用[]括起来,可以解决. 后记:建数据库的时候尽量避免使用关键字. 例子: sql.Format(&q ...
- 如何在 Linux 上用 SQL 语句来查询 Apache 日志
Linux 有一个显著的特点,在正常情况下,你可以通过日志分析系统日志来了解你的系统中发生了什么,或正在发生什么.的确,系统日志是系统管理员在解决系统和应用问题时最需要的第一手资源.我们将在这篇文章中 ...
- 在Hibernate中使用HibernateTemplate来进行包含sql语句的查询
/** * 使用sql语句进行查询操作 * @param sql * @return */ public List queryWithSql(final Stri ...
- Sql语句之查询所有学生所有科目分数及总分
昨天练Sql语句,数据库建了四个表分别是,学生表,课程表,成绩表以及教师表(教师表不在讨论范围),突然想到以前高中时代老师手上的那张成绩表,然后我就寻思着能不能用Sql语句把表打印出来,以下是我的思考 ...
- Python与开源GIS:在OGR中使用SQL语句进行查询
摘要: 属性选择与空间选择都可以看作是OGR内置的选择功能,这两种功能可以解决大部分实际中的问题.但是也有这种时候,就是进行查询时的条件比较复杂.针对这种情况,OGR也提供了更加灵活的解决方案:支持使 ...
- SQL 语句在查询分析器执行很快,程序 Dapper 参数化查询就很慢(parameter-sniffing)
这个问题困扰我好长时间了,使用SQLSERVER 事务探查器找到执行超时的SQL语句,参数查询都是通过执行exe sp_executesql 的存储过程调用,因为它能够分析并缓存查询计划,从而优化查询 ...
- [Beego模型] 四、使用SQL语句进行查询
[Beego模型] 一.ORM 使用方法 [Beego模型] 二.CRUD 操作 [Beego模型] 三.高级查询 [Beego模型] 四.使用SQL语句进行查询 [Beego模型] 五.构造查询 [ ...
- MySQL的EXPLAIN命令用于SQL语句的查询执行计划
MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...
随机推荐
- docker 生成mysql镜像启动时自动执行sql
文章转载自:https://www.jianshu.com/p/12fc253fa37d 在docker 创建 mysql 容器时,往往需要在创建容器的过程中创建database 实例,代码如下: # ...
- Springboot 之 Mybatis-plus 多数据源
简介 Mybatis-puls 多数据源的使用,采用的是官方提供的dynamic-datasource-spring-boot-starter包的 @DS 注解,具体可以参考官网: https://g ...
- HDU1423 Greatest Common Increasing Subsequence (DP优化)
LIS和LCS的结合. 容易写出方程,复杂度是nm2,但我们可以去掉一层没有必要的枚举,用一个变量val记录前一阶段的最优解,这样优化成nm. 1<=k<j,j增加1,k的上界也增加1,就 ...
- ubuntu安装及使用
ubuntu教程 一. Ubuntu简介 Ubuntu(乌班图)是一个基于Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的"ubuntu"一 ...
- 从源码分析 MGR 的流控机制
Group Replication 是一种 Shared-Nothing 的架构,每个节点都会保留一份数据. 虽然支持多点写入,但实际上系统的吞吐量是由处理能力最弱的那个节点决定的. 如果各个节点的处 ...
- HTTPS实现原理分析
概述 在上一节中介绍了两种加密方法 对称加密 非对称加密 其中对称加密性能高,但是有泄露密钥的风险,而非对称加密相反,加密性能较差,但是密钥不易泄露,那么能不能把他们进行一下结合呢? HTTPS采用混 ...
- 齐博x1关于小程序个性源代码的说明
系统默认推荐商家小程序使用通用型的源码,即框架套壳iframe形式的.这个灵活性更高.但如果有特殊需求的话,也可以设置个性源码,比如配合uni-app使用,针对不同的小程序就使用不同的uni-app风 ...
- 第三方库openPyxl读取excel文件
import openpyxl from openpyxl.worksheet.worksheet import Worksheet def openpyxl_read(): #1.打开文件 work ...
- MySQL 主从复制一主两从环境配置实战
MySQL 初始化 MySQL 主从复制是指数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式;从节点可以复制主数据库中的所有数据库或者特定的数据库 ...
- GlusterFS常用维护操作命令
GlusterFS常用维护操作命令 1.启动/关闭/查看glusterd服务 # /etc/init.d/glusterd start # /etc/init.d/glusterd stop # /e ...