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筛选

  1. 查询id大于等于3小于6的数据
select * from emp where id >= 3 and id <= 6;  # 支持逻辑运算符

select * from emp where id bewteen 3 and 6;

  1. 查询薪资是20000或者18000或者17000的数据
select * from emp where salary=20000 or salary=18000 or salary=17000;

select * from emp where salary in (20000,18000,17000);  # 支持成员运算

  1. 查询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

  1. 查询员工姓名是由字符组成的员工姓名与其薪资
select * from emp where name like '____';

select * from emp where char_length(name)=4;

  1. 查询岗位描述为空的员工名与岗位名 针对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:计数

  1. 将员工数据按照部门分组
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;
分组之后默认的是最小单位就应该是组 而不应该再是组内的单个数据单个字段
'''

  1. 获取每个部门的最高工资
# 要不要 分组我们完全可以从题目中的需求中分析出来尤其是出现的关键字 每个 平均

select post,max(salary) from emp group by post;

针对sql语句执行之后的结果 我们是可以修改字段名称的 关键字as 也可以省略
select post as '部门',max(salary) as '最高薪资' from emp group by post;
  1. 一次获取部门薪资相关统计
select post,max(salary) '最高薪资',min(salary) '最低薪资',avg(salary) '平均工资',sum(salary) '月支出' from emp group by post;
  1. 统计每个部门的人数
select post,count(id) from emp group by post;
  1. 统计每个部门名称以及部门下的员工姓名
# 分组以外的字段无法直接填写 需要借助于方法
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用在分组之后(二次筛选)

  1. 统计各部门年龄在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. 可以是单个字段排序
1.可以是单个字段排序
select * from emp order by age; 默认升序
select * from emp order by age asc; 默认升序(asc可以省略) select * from emp order by age desc; 降序
在age字段名后面加上desc查找就是 按年龄降序去排
  1. 也可以是多个字段排序
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语句布补充的更多相关文章

  1. SQL语句查询关键字中含有特殊符号怎么处理, 例如 'SMI_'

    SQL语句查询关键字中含有特殊符号怎么处理, 例如 'SMI_' 错误:select * from emp  where ename like '%SML_%' 正确:select * from em ...

  2. 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人阅读 评论 ...

  3. sql连接查询中on筛选与where筛选的区别

    sql查询这个东西, 要说它简单, 可以很简单, 通常情况下只需使用增删查改配合编程语言的逻辑表达能力,就能实现所有功能. 但是增删查改并不能代表sql语句的所有, 完整的sql功能会另人望而生畏. ...

  4. mybatis中union可以用if判断连接,但是<select>中第一个select语句不能被if判断,因此可以从dual表中查询null来凑齐。union如果使用order by排序,那么只能放在最后一个查询语句的位置,并且不能带表名。

    <!-- 一址多证纳税人分析表 --> <select id="yzdznsrlistPage" parameterType="page" r ...

  5. mysql查询关键字补充与多表查询

    目录 查询关键字补充 having过滤 distinct去重 order by排序 limit分页 regexp正则 多表查询 子查询 连表查询 查询关键字补充 having过滤 关键字having和 ...

  6. 45、SQL逻辑查询语句执行顺序

    一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...

  7. 9、SQL逻辑查询语句执行顺序

    本篇导航: SELECT语句关键字的定义顺序 SELECT语句关键字的执行顺序 准备表和数据 准备SQL逻辑查询测试语句 执行顺序分析 一.SELECT语句关键字的定义顺序 SELECT DISTIN ...

  8. python 3 mysql sql逻辑查询语句执行顺序

    python 3 mysql sql逻辑查询语句执行顺序 一 .SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_t ...

  9. mysql五补充:SQL逻辑查询语句执行顺序(待完善)

    一.SELECT语句关键字的定义顺序(语法顺序) SELECT DISTINCT <select_list> FROM <left_table> <join_type&g ...

  10. mysql系列九、mysql语句执行过程及运行原理(分组查询和关联查询原理)

    一.背景介绍 了解一个sql语句的执行过程,了解一部分都做了什么,更有利于对sql进行优化,因为你知道它的每一个连接.where.分组.子查询是怎么运行的,都干了什么,才会知道怎么写是不合理的. 大致 ...

随机推荐

  1. PAT (Basic Level) Practice 1009 说反话 分数 20

    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小 ...

  2. Pytorch及Yolov5环境配置及踩坑

    Pytorch及Yolov5环境配置及踩坑 1.何为Yolov5 yolo是计算机视觉方面用来进行目标检测的一个十分出名的开源框架,我搜不到官方的对此概括性的定义,但实际上也没什么必要,更重要的是会使 ...

  3. 分布式存储系统之Ceph集群存储池操作

    前文我们了解了ceph的存储池.PG.CRUSH.客户端IO的简要工作过程.Ceph客户端计算PG_ID的步骤的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-187 ...

  4. 谣言检测(RDEA)《Rumor Detection on Social Media with Event Augmentations》

    论文信息 论文标题:Rumor Detection on Social Media with Event Augmentations论文作者:Zhenyu He, Ce Li, Fan Zhou, Y ...

  5. uoj349【WC2018】即时战略

    题目链接 WC出了点意外滚粗了,来补补题. \(O(n^2)\)的时间复杂度,\(O(nlogn)\)的询问次数应该还是比较好想的,每次要打通到x的路径,对当前已知的树不断的找重心并询问在重心的哪颗子 ...

  6. golang中的socket编程

    0.1.索引 https://waterflow.link/articles/1664591292871 1.tcp的3次握手(建立连接) 客户端的协议栈向服务器端发送了 SYN 包,并告诉服务器端当 ...

  7. Ruoyi表单构建

    Ruoyi表单构建通过拖动组件就能自动生成前端代码,很方便,所以本文简单通过上层函数源码来梳理一下大致流程,如有需要再自行仔细一行行分析底层代码. 组件拖动 实现组件拖动功能主要依赖第三方库:VueD ...

  8. KNN算法之集美大学

     在本篇文章中,我即将以在集美大学收集到的一些数据集为基础,使用KNN算法进行一系列的操作 一.KNN算法 首先,什么是KNN算法呢,这得用到老祖宗说的一句话"近朱者赤近墨者黑", ...

  9. mysql 子查询 联结 组合查询

    子查询 SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id='T ...

  10. kubernetes之kubectl与YAML详解1

    k8s集群的日志,带有组件的信息,多看日志. kubectl命令汇总 kubectl命令汇总 kubectl命令帮助信息 [root@mcwk8s04 ~]# kubectl -h kubectl c ...