首页 > 数据库 >MySQL查询

MySQL查询

时间:2022-11-25 16:23:10浏览次数:37  
标签:salary group age 查询 emp MySQL post select

目录

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(20) not null,
	gender enum('male','female') not null default 'male',# 大部分是男的
	age int(3) unsigned not null default 28,
	hire_data data 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);

编写SQL语句的小技巧

针对select后面的字段名可以先用*占位往后写 最后再回来修改
在实际应用中select后面很少直接写* 因为*表示所有 当表中字段和数据都特别多的情况下非常浪费数据库资源
"""
SQL语句的编写类似于代码的编写 不是一蹴而就的 也需要反反复复的修修补补
"""

查询关键字之where筛选

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

#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); # 支持成员运算

#3.查询id小于3大于6的数据
select * from emp where id<3 or id>6;
select * from emp where id not between 3 and 6;

#4.查询员工姓名中包含字母o的员工姓名与薪资
	条件不够精确的查询 称之为 模糊查询
	模糊查询的关键字是
						like
	模糊查询的常用符号
						%:匹配任意个数的任意字符
						eg:
						  %o%  o jason owen loo wwoww
						  %o   o  asdsdo  dsdo
						_:匹配单个个数的任意字符
							_o_   aox wob iok
							o_    oi ok ol
select * from emp where name like '%o%';

#5.查询员工姓名是由四个字符组成的员工姓名与其薪资
select * from emp where name like '____';
select * from emp where char_length(name) = 4;

#6.查询岗位描述为空的员工名与岗位名 针对null不能用等号,只能用is
select * from emp where post_comment=NULL;		不可以
select * from emp where post_comment is NULL;	可以

"""
在MySQL中也有很多内置方法 我们可以通过查看帮助手册学习
	help  方法名
"""

查询关键字之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;
	分组之后默认的最小单位就应该是组 而不应该是组内的单个数据单个字段
"""

#2.获取每个部门的最高工资
'''要不要分组我们完全可以从题目的需求中分析出来尤其是出现关键字 每个 平均'''
select post,max(salary) from emp group by post;

针对sql语句执行之后的结果 我们是可以修改字段名称的 关键字as 也可以省略
select post as '部门',max(salary) as '最高薪资' from emp group by post;

#3.一次获取部门薪资相关统计
select post,max(salary) '最高薪资',min(salary) '最低薪资',avg(salary) '平均薪资',sum(salary) '月支出' from emp group by post;

#4.统计每个部门的人数
select post,count(id) from emp group by post;

#5.统计每个部门的部门名称及部门下的员工姓名
'''分组以外的字段无法直接填写 需要借助于方法'''
select post,name from emp group by post;
select post,group_concat(name) from emp group by post;
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的结果可以直接看成是一张表 基于该表如果还想继续操作则直接在产生该表的SQL语句上添加即可
"""
	步骤1:先筛选出所有年龄大于30岁的员工数据
		select * from emp where age >30;
	步骤2:再对筛选出来的数据按照部门分组并统计平均薪资
		select post,avg(salary) from emp where age> 30 gorup by post;
	步骤3:针对分组统计之后的结果做二次筛选
		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.可以是单个字段排序
select * from emp order by age;		默认升序
select * from emp order by age asc;  默认升序(asc可以省略)
select * from emp order by age desc;  降序

2.也可以是多个字段排序
select * from emp order by age,salary desc;
#先按照年龄升序排 相同情况下再按照薪资降序排

统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于10000的部门,然后对平均工资进行排序
	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 avg > 10 group by post having avg_salary>1000 order by avg_salary;
"""

查询关键字之limit分页

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

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

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

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

多表查询的思路

表数据准备
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,age,查询,emp,MySQL,post,select
From: https://www.cnblogs.com/winter-yu1989/p/16925516.html

相关文章

  • mysql增删改查
    目录:SQL语言分类1、DDL:数据定义语言创建新的数据库创建新的表删除指定的数据表删除指定的数据库2、DML管理表中的数据......
  • 阿里云服务(centos8)安装mysql8.0
    注意不同版本间的安装方式不太一样②如果出现:Error:GPGcheckFAILED这是gpg验证不通过的原因,因为我是在centos8系统上安装mysql57-community-release-el7-10.noarc......
  • elasticsearch模糊查询match match_phrase wildcard regexp prefix的区别
    1.match查询会先对搜索词进行分词,比如“白雪公主和苹果”,会分成“白雪”“公主”“苹果”。含有相关内容的字段,都会被检索出来。2.match_phrase查询match_phrase与slop一起......
  • 8、mysql服务器参数设置
    general通用属性datadir=/var/lib/mysql 数据文件存放的目录socket=/var/lib/mysql/mysql.sock mysql.socket表示server和client在同一台服务器,并且使用localhost进行......
  • 6、查询优化
    查询慢的原因网络CPUIO上下文切换系统调用生成统计信息锁等待时间优化数据访问查询性能低下的主要原因是访问的数据太多,某些查询不可避免的需要筛选大量的数据,......
  • 5、mysql索引优化
    B+树想个问题,如果设计一个索引结构,使用哪种数据结构好呢?如果使用hash表肯定不太好,占用空间太大,每个数据下标位置是个链表如果使用二叉树会好一点,但不管是平衡二叉树还是......
  • 4、mysql执行计划
    如图:使用explain查询sql语句的执行计划参考列字段查看执行计划如果sql关连的比较多:通过id查看执行的具体顺序,如果id一样,就是从上往下依次执行的如果id不一样:id值越大......
  • 3、mysql数据类型的优化
    更小的通常更好应该尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期更少,但是要确保没有低......
  • 对比分析PDO和Mysqli
    php操作mysql数据库,大家都知道有三种驱动,mysqlmysqlipdo,其中mysql在php7之后被废除了。不是本文重点。咱现在来分析一下mysqli和PDO的区别,下面一张表用来说明他们的区别 ......
  • 【MySQL】World-writable config file ‘.../mysqld.cnf‘ is ignored.
    今天有同事反映MySQL数据库在修改了配置信息后出现无法启动问题,如下所示:mysql:[Warning]World-writableconfigfile'/etc/mysql/mysql.conf.d/mysqld.cnf'isignored.......