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 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...
随机推荐
- 第六章:Django 综合篇 - 3:使用MySQL数据库
在实际生产环境,Django是不可能使用SQLite这种轻量级的基于文件的数据库作为生产数据库.一般较多的会选择MySQL. 下面介绍一下如何在Django中使用MySQL数据库. 一.安装MySQL ...
- 页面导出Excel
后端: 1.准备要导出的数据 2.利用XSSFWorkbook对象(workbook)创建工作簿行列等并添加数据 3.响应给前端 例: // 获取响应流 OutputStream output = r ...
- Libgdx游戏学习(1)——环境配置及demo运行
原文: Libgdx游戏学习(1)--环境配置及demo运行 - Stars-One的杂货小窝 Libgdx游戏是基于Java的一款游戏引擎,可以发布Android,桌面端,Html,IOS等游戏,出 ...
- P3250 [HNOI2016] 网络 (树剖+堆/整体二分+树上差分+树状数组)
解法1: 本题有插入路径和删除路径,在每个节点维护插入堆和删除堆,查询时两者top一样则一直弹出.如果每个节点维护的是经过他的路径,显然有些不好处理,正难则反,每个点维护不经过他的路径,那么x节点出了 ...
- 洛谷P1640 SCOI2010 连续攻击游戏 (并查集/匹配)
本题介绍两种做法: 1 并查集 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1000005; 4 int ...
- Redis高可用之主从复制原理演进分析
Redis高可用之主从复制原理演进分析 在很久之前写过一篇 Redis 主从复制原理的简略分析,基本是一个笔记类文章. 一.什么是主从复制 1.1 什么是主从复制 主从复制,从名字可以看出,至少需要 ...
- 研一小白入坑Go (time使用)
1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func main() { 9 // 获取当前时间 1 ...
- NodeJS 服务 Docker 镜像极致优化指北
这段时间在开发一个腾讯文档全品类通用的 HTML 动态服务,为了方便各品类接入的生成与部署,也顺应上云的趋势,考虑使用 Docker 的方式来固定服务内容,统一进行制品版本的管理.本篇文章就将我在服务 ...
- 齐博X1忘记管理员密码了怎么办?如何强制进后台?
当你忘记密码,或者是某些原因导致进不了后台的话,这个时候你修改一下根目录的admin.php文件,把文件第二行 //define('SUPER_ADMIN',true); 前面的 // 双斜杠删除,再 ...
- 齐博X1数据表之系统参数
https://v.youku.com/v_show/id_XMzg0MTEzMzEyOA== 不会插入视频 直接发 优酷地址吧= =!