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. 浏览器的 JavaScript 控制台功能调试vue

    原始显示结果: 调试其中一个变量的值: 页面上呈现出调试后的效果了

  2. 高光谱图像分类简述+《Deep Learning for Hyperspectral Image Classification: An Overview》综述论文笔记

    论文题目<Deep Learning for Hyperspectral Image Classification: An Overview> 论文作者:Shutao Li, Weiwei ...

  3. python_flask开发环境设置

    flask开发环境设置,在powershell终端窗口,可以通过一下方式设置: # 设置当前app实例 $env:FLASK_APP="app:create_app()" #将当前 ...

  4. Vu3.x如何给v-for循环出来的输入框绑定v-mode的值,以及实现父子组件传值、双向绑定

    观前须知:本人演示使用的input是自己手敲的,如果使用的是element-ui等表单组建的input框请选择性参考,不保证我的方法对你们也完全有效. 父组件代码: 这里我的MiniInput是以组件 ...

  5. 华为路由器OSPF配置常用命令

    OSPF单区域配置 ospf 1 进入ospf视图1代表进程号 area 0 创建区域并进入OSPF区域视图,输入要创建的区域ID,骨干区域即区域0 network +IP +匹配码 display ...

  6. Shading-JDBC、ShadingSphere、ShardingProxy 使用详解

    ShadingSphere ​ShardingSphere是一款起源于当当网内部的应用框架,2015年在当当网内部诞生,2016年由主要开发人员张亮带入京东数科,在国内经历了当当网.电信翼支付.京东数 ...

  7. 1.关于SPring Boot项目的创建

    一.引入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  8. html点击a标签弹窗QQ聊天界面

    以为很难.以为要第三方.谁知道不用.一句话的事情. 1 <a hfer="tencent://message/?uin=12345&Site=&Menu-=yes&qu ...

  9. Windows7下驱动开发与调试体系构建——5.实战反调试标记位(NtGlobalFlag)

    目录/参考资料:https://www.cnblogs.com/railgunRG/p/14412321.html <加密与解密>P670中,介绍了检查程序是否被调试的第二种方法:查看进程 ...

  10. Vue router简单配置入门案例

    { 注意驼峰命名法,不然会报错 } 1.在Views文件夹下创建Vue路由文件,例如: <template> </template>  <script> </ ...