day47 数据库进阶
前期表准备
create table emp(
id int not null unique auto_increment,
name varchar(20) not null,
sex 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,sex,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);
补充:如果把字符编码全都修改成utf8还是不能插入中文,修改成GBK即可
一、select查询扩展
1 几个重要关键字的执行顺序
- 书写顺序
- select id,name from emp where id>3;
- 执行顺序
- from、where、select
2 where筛选条件
# where是对我们拿到整个表数据最先的筛选操作
# 1 查询id大于等于3小于等于6的数据
select * from emp where 3<id<6;
select * from emp where id between 3 and 6;
# 2 查询薪资是20000或者18000或者17000的数据
select * from emp where salary in (2000,18000,17000);
'''
模糊查询
like
% 匹配任意多个字符
_ 匹配任意单个字符
'''
# 3 查询员工姓名中包含字母o的员工的姓名和薪资
select name,salary from emp where name like '%o%';
# 4 查询员工姓名是由四个字符组成的 姓名和薪资
select name,salary from emp where name like'____';
# 5 查询id小于3或者id大于6的数据
select * from emp where id<3 or id >6;
# 6 查询薪资不在20000,18000,17000范围的数据
select * from emp where salary not in (20000,18000,17000);
# 7 查询岗位描述为空的员工姓名和岗位名 针对null不用等号 用is
select name,post from emp where post_comment is null;
3 group by分组
分组的实际应用场景
- 男女分组
- 薪资分组
- 秃头不秃头分组
- 国家分组
代码测试
'''
分组之后 最小可操作单位是组,不是组内的单个数据
'''
set global sql_mode = 'strict_trans_tables,only_full_group_by'
# 这句代码可以让我们只能拿到分组,不拿到分组内的数据
# 1 获取每个部门最高薪资
# as可以起别名
select post as '部门',max(salary) as '最高薪资' from emp group by post;
# 2 获取每个部门最低薪资
select post as '部门',min(salary) as '最低薪资' from emp group by post;
# 3 获取每个部门平均薪资
select post as '部门',avg(salary) as '平均薪资' from emp group by post;
# 4 获取每个部门的工资总和
select post as '部门',sum(salary) as '总和薪资' from emp group by post;
# 5 获取每个部门总人数
select post as '部门',count(salary) as '总人数' from emp group by post;
# 注意 count后面的字段最好用id 其他也行但是不能有null
# 6 获取分组之后的部门名称和每个部门下所有的员工姓名
# group_concat 不单单可以支持获取分组后的其他字段的集合,还可以支持拼接操作
select post,group_concat(name) from emp group by post;
select post,group_concat(name,'nb') from emp group by post;
select post,group_concat(name,":",salary) from emp group by post;
# concat 不分组的时候用
select concat('NAME:',name),concat("SAL:",salary) from emp;
# 补充 as语法不单单可以给字段起别名,还可以给表起别名
select * from emp as t1;
# 查询每个人的年薪 12薪
select name,salary*12 from emp;
分组的注意事项
'''
关键字where和group by同时出现的时候group by必须在where的后面
where筛选条件内不能出现聚合函数
where max(salary) 错误示范
'''
# 统计各部们年龄在30岁以上的员工的平均薪资
select post,avg(salary) from emp where age>30 group by post;
4 having 分组之后的筛选条件
having的语法是跟where一致的,不过having是在分组之后的过滤操作,且可以用聚合函数
# 统计各部门年龄在30岁以上的员工的平均工资,且保留平均工资大于10000的部门
select post,avg(salary) from emp where age >30 group by post having avg(salary)>10000;
5 distinct去重
去重的关键是重的定义
当数据完全一样的时候,才可以执行去重操作
结论:我们在去重时不能有主键!!!
select distinct age from emp;
6 order by 排序
'''
order by默认升序 asc(可不写)
desc降序
order可以有多重排序
'''
# 先用age降序,如果age相同,用salary升序排列
select * from emp order by age desc,salary asc;
# 统计各部门年龄在10岁以上的员工平均工资并且保留平均薪资大于1000的部门,然后对平均工资降序排序
select post,avg(salary) from emp where age>10 group by post having avg(salary)>1000 order by avg(salary) desc;
7 limit限制展示条数
# 当我们遇到数据过多的情况下,通常用分页处理
select * from emp limit 3 ; # 只显示前三条数据
select * from emp limit 0,5 ;
# 第一个0是起始位置,第二个5是展示条数
8 正则
select * from emp where name regexp '^j.*(n|y)$';
9 多表操作
前期表准备
#建表
create table dep(
id int,
name varchar(20)
) charset GBK;
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,'运营');
insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('egon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);
表查询
select * from dep,emp;
# 得到的结果是dep的每个数据和emp数据的意义对应 : 笛卡尔积
# 这种拼接得到的结果是不合理的,我们可以用下面这种方法
select * from emp,dep where emp.dep_id = dep.id;
# 还有更智能的操作
'''
inner join 内链接
left join 左链接
right join 右链接
union 全连接
'''
# inner join 内链接
select * form emp inner join dep on emp.dep_id = dep.id;
# 只拼接两张表共有的部分
# left join 左连接
select * from emp left join dep on emp.dep_id = dep.id;
# 左边表全部显示,没有就用mull对应上
# right join 右连接
select * from emp right join dep on emp.dep_id = dep.id;
# 右表所有的数据都展示出来 没有对应的项就用NULL
# union 全连接 左右两表所有的数据都展示出来
select * from emp left join dep on emp.dep_id = dep.id
union
select * from emp right join dep on emp.dep_id = dep.id;
总结:
我们在以后的查询中可能会遇到很多很复杂的结构,我们要把复杂的问题简单化,分析出哪一步先,哪一步后,然后用我们的语句拼接起来
多表查询的两种方式:
- 先拼接后查询
- 子查询,一步一步来
day47 数据库进阶的更多相关文章
- 【Python全栈-后端开发】数据库进阶
数据库进阶 python关于mysql的API---pymysql模块 pymsql是Python中操作MySQL的模块,其使用方法和py2的MySQLdb几乎相同. 模块安装 pip install ...
- MongoDB数据库进阶 --- 增删查改...
注意: monogdb数据在使用之后必须及时 mongodb.close()否则后台崩溃. 在之前的文章中,我已经介绍了什么事MongoDB以及怎么在windows下安装MongoDB等等基本知识. ...
- 数据库学习笔记(二)MySQL数据库进阶
MySQL 进阶 关于连表 左右连表: join 上下连表: union #自动去重 (当两张表里的数据,有重复的才会自动去重) union all #不去重 #上下连表示例: select sid, ...
- Django 数据库进阶操作
基本操作 # 增 # # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs # obj = models.T ...
- 数据库进阶之路(五) - MySQL行锁深入研究
由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统:假设id=1的这本书库存为1,但是有2个人同时来借这本书,此处的逻辑为: ; --如果restnum大于0,执行u ...
- python数据库进阶
第1节 MySQL基础 一,说明 1,认识MySQL与创建用户 MySQL是最流行的关系型数据库管理系统之一,由瑞典MySQL AB公司开发,目前属于Oracle公司.MySQL是一种关联数据管理系统 ...
- Mysql数据库进阶之(分表分库,主从分离)
前言:数据库的优化是一个程序员的分水岭,作为小白我也得去提前学习这方面的数据的 (一) 三范式和逆范式 听起范式这个迟非常专业我来举个简单的栗子: 第一范式就是: 把能够关联的每条数据都拆分成一个 ...
- python的Web框架,Django模型系统二,模型属性,及数据库进阶查询
原始数据接上篇文章来操作.可能需要查看后才能懂.点击这里查看 1.常用的模型字段类型 官方文档:https://docs.djangoproject.com/en/2.1/ref/models/fie ...
- Python操作Mysql数据库进阶篇——查询操作详解(一)
前面我们已经介绍了在Python3.x中如何连接一个Mysql数据库,以及怎么样对这个数据库创建一个表,增删改查表里的数据.想必大家对Mysql数据库和简单的sql语句有了一定的了解,其实sql语句博 ...
随机推荐
- 95题--不同的二叉搜索树II(java、中等难度)
题目描述:给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 . 示例如下: 分析:这一题需要对比LeetCode96题来分析:https://www.cnblogs.com/K ...
- pdf文件处理--QPDF
1.分割pdf文件 从原文件中取出n-m页,保留原文件的目录格式: qpdf infile.pdf --pages . n-m -- outfile.pdf 从原文件中取出n-m页,不保留原文件的目录 ...
- win10系统下office 2019激活
1.新建一个文本文件,创建批处理文件office.bat @echo off (cd /d "%~dp0")&&(NET FILE||(powershell sta ...
- kali系统安装后乱码的解决
1.先添加kaili的源地址*(这里推荐了几个源,选一个就可以.打开/etc/apt/sources.list 删除里面自带的所有内容,把你复制的内容添加进去保存就ok了) #中科大 deb http ...
- Java复习目录
还是寒假用了十多天的时间在b站把基础部分学习完了,现在刚开学开始上Java课,以博客的方式复习前面学习的内容. 总结: ①吸取前面MySQL学习的教训,每天固定学习的内容,学习效果很有提升,但临近开学 ...
- 域名注册诈骗邮件We are an agency engaging in registering brand name and domain names
最近收到了一封自称是某公司的邮件,说有人要注册我已经申请的域名,需要我回复确认,看邮件发件人是个人邮箱,通篇没有提到公司,也不是什么正规机构,大概率就是诈骗邮件了. 为了完全确认这封诈骗邮件,我登陆了 ...
- jmeter的参数化
[4种参数化] 用户参数 适用于参数取值范围很小的时候使用 CSV数据文件设置 适用于参数取值范围较大的时候使用,该方法具有更大的灵活性 用户定义的变量 一般用于测试计划中不需要随请求迭代的参数设置, ...
- HTTP参数污染学习
HTTP参数污染 --- HPP 参考: 参数污染漏洞(HPP)挖掘技巧及实战案例全汇总 视频内容 HPP,简而言之,就是给参数赋上多个值. 比如: https://www.baidu.com/s?w ...
- 微信小程序-页面栈
在小程序中以栈的形式维护了当前的所有页面 当发生路由切换的时候,页面栈的表现如下: 初始化:新页面入栈 打开新页面:新页面入栈(调用 API wx.navigateTo 或使用组件 <navig ...
- 微信小程序-APP生命周期与运行机制
QQ讨论群:785071190 开发微信小程序之前需要先了解微信小程序运行机制以及其生命周期,小程序APP生命周期需要先从app.js这个文件开始. 阅读过"微信小程序-代码构成" ...