首页 > 数据库 >SQL语句查询关键字

SQL语句查询关键字

时间:2022-11-25 18:26:10浏览次数:41  
标签:语句 salary group 查询 关键字 emp SQL post select

目录

SQL语句查询关键字

1.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
        
对应关键字的编写顺序和执行顺序我们没有必要过多的在意,熟练之后会非常自然的编写
我们只需要把注意力放在每个关键字的功能上即可

2.前期数据准备

create table emp(
  id int primary key auto_increment,
  name varchar(20) 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(50),
  post_comment varchar(100),
  salary double(15,2),
  office int, 
  depart_id int
);

#插入记录
#三个部门:教学,销售,运营
insert into emp(name,gender,age,hire_date,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);

3.查询关键字之where筛选

1).查询id大于等于3小于等于6的数据

select * from emp where id >= 3 and id <=6;  支持逻辑运算符
select * from emp where id between 3 and 6;

image

2).查询薪资是20000或者18000或者17000的数据

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

image

3).查询id小于3大于6的数据

select * from emp where id<3 or id>6;
select * from emp where id not between 3 and 6;

image

4).查询员工姓名中包含字母o的员姓名与薪资

条件不够精确的查询 称之为>>>:模糊查询
	模糊查询的关键字是>>>:
		like
	模糊查询的关键字是>>>:
		%:匹配任意个数的任意字符
		eg:
			%o%(o jason tony tom owen)
			%o(o aaao bbbo)
			_:匹配单个个数得到任意字符
			_o_(aox wob lol)
			o_(oi ok ol)
	select * from emp where name like '%o%';

image

5).查询员工姓名是由四个字符组成的员工姓名与薪资

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

image

6).查询岗位秒速为空的员工名与岗位名称针对null不能用等号,只能用is

select * from emp where post_comment=NULL;		不可以
select * from emp where post_comment is NULL;		可以
"""
在MySQL中也有很多内置方法 我们可以通过帮助手册学习
	help 方法名
"""

image

4.查询关键字之group by分组

分组:按照指定的条件将单个单个的数据组成一个个整体
	eg:
		将班级学生按照性别分组
		将全国人民按照民族分组
		将全世界人民按照肤色分组

分组的目的是为了更好的统计相关数据
	eg:
		每个班级的男女比例
		每个民族的总占比
		每个部门的平均薪资

聚合函数
	专门用于分组之后的数据统计
    max、min、sum、avg、count
    最大值、最小值、求和、平均值、计数

1).将员工数据按照部门分组

select * from emp 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;
	分组之后默认的最小单位就应该是组 而不应该再是组内的单个数据单个字段
"

image

2).获取每个部门的最高工资

'要不要分组我们完全可以从题目的需求中分析出来尤其是出现关键字 每个 平均'
select post,max(salary) from emp group by post;
针对sql语句执行后之后的结果 我们是可以修改字段名称的 关键字as 也可以省略
select post as '部门',max(salary) as '最高薪资' from emp group by post;

image

3).一次获取部门薪资相关统计

select post,max(salary) '最高薪',min(salary) '最低薪',avg(salary) '平均薪资',sum(salary) '月支出' from emp group by post;

image

4).统计每个部门的人数

select post,count(id) from emp group by post;

image

5).统计每个部门的部门名称以及部门下的员工姓名

'分组以外的字段无法直接填写 需要借助于方法'
1.select post,name from emp group by post		不可以
2.select post,group_concat(name) from emp group by post;
3.可以使用各种拼接符
select post,group_concat(name,'|',age) from emp group by post;
post,group_concat(name,'_NB') from emp group by post;
select post,group_concat('DSB_',name,'_NB') from emp group by post;

image

image

5.查询关键字之having过滤

having与where本质是一样的 都是用来对数据做筛选
只不过where用在分组之前(首次筛选),having用在分组之后(二次筛选)

统计各部门年龄在30岁以上的员工平均工资 并且保留大于10000的数据
'
稍微复杂一点的SQL,跟写代码几乎一样,也需要提前想好大致思路
	每条SQL的结果可以直接看成是一张表,基于该表如果还想继续操作则直接在产生该表的SQL语句上添加即可
'
步骤1:先筛选出年龄大于30岁30的员工数据
	select * from emp where age > 30;

步骤2:再对筛选出来的数据按照部门分组统计平均薪资
	select post,avg(salary) from emp where age > 30 group by post;

步骤3:针对分组统计之后的结果做二次筛选
	select post,avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;

image
image
image

6.查询关键字之distinct去重

去重有一个必须得到条件也是很容易被忽略的条件
	数据必须一模一样也才可以去重

select distinct id,age from emp;  没有意义
关键字针对的是多个字段组合的结果
select distinct age from emp;  达不到明确的目的,获取数据不清晰
select distinct age,post from emp;

image

7.查询关键字之order by排序

1).可以是单个字段排序

select * from emp order by age;  默认升序
select * from emp order by age asc; 默认升序(asc可以省略)
select * from emp order by age desc;  默认降序

image

2).也可以是多个字段排序

先按年龄排序,相同情况下在按照薪资排序
select * from emp order by age,salary desc; 

image

3).统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序

1.先筛选所有年龄大于10岁的员工
	select * from emp where age > 10;

2.在对他们按照部门分组统计平均薪资
	select post,avg(salary) 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;
"""	

image

8.查询关键字之limit分页

当表中数据特别多的情况下 我们很少会一次性获取所有的数据
	很多网站也是做了分页处理 一次性只能看一点点
  
select * from emp limit 5;  直接限制展示的条数
select * from emp limit 5,5;  从第5条开始往后读取5条

查询工资最高的人的详细信息
'''千万不要关系思维 一看到工资最高就想着用分组聚合'''
select * from emp order by salary desc limit 1;

9.查询关键字之regexp正则表达式

SQL语句的模糊匹配如果用不习惯 也可以自己写正则批量查询
	select * from emp where name regexp '^j.*?(n|y)$';

10.多表查询的思路

表数据准备
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;
基于上述的操作就可以将多张表合并到一起然后一次性获取更多的数据

标签:语句,salary,group,查询,关键字,emp,SQL,post,select
From: https://www.cnblogs.com/LZXSDM/p/16925974.html

相关文章

  • 11月25日内容总结——sql查询关键字
    目录一、SQL语句查询关键字二、前期数据准备三、编写SQL语句的小技巧四、查询关键字之where筛选1.查询id大于等于3小于等于6的数据2.查询薪资是20000或者18000或者17000的......
  • mysql查询关键字与分组查询
    目录SQL语句查询关键字SQL语句查询关键字select 指定要查询的字段信息 select*查询所有字段 select字段名字 查询指定字段名字 selectchar_lengh(字段名)对......
  • SQL语句查询关键字
    目录SQL语句查询关键字select查询fromwhere筛选groupby分组having过滤distinct去重orderby排序limit分页regexp正则表达式编写SQL语句的小技巧多表查询的思路SQ......
  • MYSQL BUFFER POOL 参数说明及调优
    SHOWENGINEINNODBSTATUS'----------------------BUFFERPOOLANDMEMORY----------------------Totallargememoryallocated137428992bufferpool总大小Di......
  • SQL语句查询关键字:where筛选、group by分组、distinc去重、order by排序、limit分页
    目录SQL语句查询关键字前期数据准备编写SQL语句的小技巧查询关键字之where筛选查询关键字之groupby分组查询关键字之having过滤查询关键字值distinct去重查询关键字值orde......
  • MYSQL数据库之索引
    一、索引的概念索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于c语言的链表通过指针指向数据记录的内存地址)。使用索引后可......
  • docker搭建Elasticsearch、Kibana、Logstash 同步mysql数据到ES
    一、前言在数据量大的企业级实践中,Elasticsearch显得非常常见,特别是数据表超过千万级后,无论怎么优化,还是有点力不从心!使用中,最首先的问题就是怎么把千万级数据同步到Elasti......
  • mysql中表报错Table is read only
    参考链接:https://www.php.cn/mysql-tutorials-63107.html1、进入mysql数据库目录,使用命令"chown-Rmysql<数据库文件夹名称>"和"chgrp-Rmysql<数据库文件夹名称>"......
  • MySQL的多表查询(笛卡尔积原理)
    先确定数据要用到哪些表。将多个表先通过笛卡尔积变成一个表。然后去除不符合逻辑的数据(根据两个表的关系去掉)。最后当做是一个虚拟表一样来加上条件即可。 注意:列名最好......
  • 林晓斌 MySQL实战45讲(学习笔记)
    本系列是学习极客时间林晓斌的《MySQL实战45讲》系列的学习笔记。原文链接:https://time.geekbang.org/column/intro/13901基础架构:一条SQL查询语句是如何执行的?https://bl......