首页 > 数据库 >day41MySQl基础(04)

day41MySQl基础(04)

时间:2022-11-25 19:11:31浏览次数:42  
标签:salary day41MySQl group 04 age 基础 emp post select

SQL语句查询关键字

select
from
where
group by
having
distinct
order by
limit
regexp

多表查询的两种方式

子查询
连表操作

报错及作业讲解

报错
	1.粗心大意 单词拼接错误
    2.手忙脚乱 不会看报错思考错误的核心
    
核心讲解
	'''表与表中数据的关系可能会根据业务逻辑的不同发送改变 不是永远固定的'''
    服务器表与应用程序表
    一台服务器可以运行多个应用程序
    一个应用程序也可以在多台服务器上
    多对多
    
    课程表与班级表
    一门课程可以属于多个班级
    一个班级可以拥有多门课程
    多对多
    
    学生表与班级表
    一名学生不能属于多个班级
    一个班级可以拥有多名学生
    一对多
    
    
    老师表与课程表
    一名老师可以教授多门课程
    一门课程可以被多名老师教
    多对多
    
   书籍表与出版社表
  	一本书不可以多个出版社出版
    一个出版社可以出版多本书
    一对多 
    ps:上述关系的确认并不是绝对
对于我们而言不单单要学会关系判断还要非常熟练的敲出SQL语句

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=2000 or salary=18000 or salary=17000;
selecrt * from emp where salary in (20000,17000,18000);支持成员运算

# 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 asasdao asdo  iuo seo 
      # %字符 查找最后一个字符
    _:匹配单个个数的任意字符
    _o_  aox wob iok jason 
    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 postl;

针对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;

查询关键字之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岁以上的员工平均工资,并且保留平均工资大于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;
"""

查询关键字之limit分页

当表中数据特别多的情况下 我们很少会一次性获取所有的数据
	很多网站也是做了分页处理 一次性只能看一点点
  
select * from emp limit 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 regex '^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,day41MySQl,group,04,age,基础,emp,post,select
From: https://www.cnblogs.com/wei0919/p/16926101.html

相关文章

  • JavaScript 基础
    JavaScript使用JS的几种写法行内式的js直接写道元素的内部​​<buttontype="button"value="须弥"onclick="alert('纳西妲')"></button>​​内嵌式js引入式​​<scripts......
  • Java 注解与反射 基础
    注解与反射基础什么是注解Annotation注解Annotation的作用:不是程序本身,可以对程序做出解释。可以被其他程序(比如编译器等)读取annotation的格式:注解是以”@注释名“再代......
  • C语言基础
    (1)栈(stack):由编译器进行管理,自动分配和释放,存放函数调用过程中的各种参数、局部变量、返回值以及函数返回地址。操作方式类似数据结构中的栈。(2)堆(heap):用于程序动态申请分配......
  • 任务11 面向对象基础
    一、理解面向对象1、面向过程:面向过程是一种以过程为中心的编程思想其原理就是将问题分解成一个一个详细的步骤,然后通过函数实现每一个步骤,并依次调用。2、面向对象:......
  • CSS 基础属性篇组成及作用
    ####学习目标-css属性和属性值的定义-css文本属性-css列表属性-css背景属性-css边框属性-css浮动属性#####一、css属性和属性值的定义>属性:属性是指定选择符所具有......
  • 13基础元器件-缓冲器
    一、缓冲器的初步认识1、缓冲器的定义缓冲器是数字元件的其中一种,它对输入值不执行任何运算,其输出值和输入值一样,但它在计算机的设计中有着重要作用。有了缓冲器,就可以使......
  • 0004.JQuery介绍
    一、JQuery介绍1.JQuery介绍JQuery是一个JavaScript库,也是一个JS文件。JQ中封装实现了很多方法,让使用变得更加简单不再像js那样需要使用大量的方法调用。但JQ也只是实现......
  • 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介
    本站文章均为​​ 李华明Himi ​​​原创,转载务必在明显处注明对于游戏公司而言,采用游戏脚本lua、python等进行开发也很常见,但是很多童鞋对脚本并没有很熟悉的概念,本篇则......
  • Linux基础-Vim(二)常用功能
    一、可视区块(Visual Block)       上一期我们讲vim操作都是以字符或行为单位进行的,在vim还有一个以区块为单位进行操作的方法,即可视区块操作。       下面......
  • Linux基础-Vim(一)入门和常用命令
    ps:这是本公众号第一篇推文,小白第一次写作,希望大家支持,如有错误,望批评指正。在所有的UNIX-Like系统中都会内建vi文本编辑器,vi是老式的文本编辑器,其他的文本编辑器则不一定会......