前期表准备

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 数据库进阶的更多相关文章

  1. 【Python全栈-后端开发】数据库进阶

    数据库进阶 python关于mysql的API---pymysql模块 pymsql是Python中操作MySQL的模块,其使用方法和py2的MySQLdb几乎相同. 模块安装 pip install ...

  2. MongoDB数据库进阶 --- 增删查改...

    注意: monogdb数据在使用之后必须及时 mongodb.close()否则后台崩溃. 在之前的文章中,我已经介绍了什么事MongoDB以及怎么在windows下安装MongoDB等等基本知识. ...

  3. 数据库学习笔记(二)MySQL数据库进阶

    MySQL 进阶 关于连表 左右连表: join 上下连表: union #自动去重 (当两张表里的数据,有重复的才会自动去重) union all #不去重 #上下连表示例: select sid, ...

  4. Django 数据库进阶操作

    基本操作 # 增 # # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs # obj = models.T ...

  5. 数据库进阶之路(五) - MySQL行锁深入研究

    由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统:假设id=1的这本书库存为1,但是有2个人同时来借这本书,此处的逻辑为: ; --如果restnum大于0,执行u ...

  6. python数据库进阶

    第1节 MySQL基础 一,说明 1,认识MySQL与创建用户 MySQL是最流行的关系型数据库管理系统之一,由瑞典MySQL AB公司开发,目前属于Oracle公司.MySQL是一种关联数据管理系统 ...

  7. Mysql数据库进阶之(分表分库,主从分离)

    前言:数据库的优化是一个程序员的分水岭,作为小白我也得去提前学习这方面的数据的 (一)  三范式和逆范式 听起范式这个迟非常专业我来举个简单的栗子: 第一范式就是:  把能够关联的每条数据都拆分成一个 ...

  8. python的Web框架,Django模型系统二,模型属性,及数据库进阶查询

    原始数据接上篇文章来操作.可能需要查看后才能懂.点击这里查看 1.常用的模型字段类型 官方文档:https://docs.djangoproject.com/en/2.1/ref/models/fie ...

  9. Python操作Mysql数据库进阶篇——查询操作详解(一)

    前面我们已经介绍了在Python3.x中如何连接一个Mysql数据库,以及怎么样对这个数据库创建一个表,增删改查表里的数据.想必大家对Mysql数据库和简单的sql语句有了一定的了解,其实sql语句博 ...

随机推荐

  1. InstallShield 2015 Limited Edition 打包教程

    InstallShield 2015 Limited Edition 打包教程 右键解决方案,新增项目,选择其他项目类型,安装和部署. InstallShield2015可以免费使用,但需要下载.安装 ...

  2. Vue —— VueX精讲(1)

    大纲 这一讲我们最主要的就是学习vue中的数据管理VueX,这个是一个大杀器 一.回顾一些Promise相关的东西 Promise 有几个比较重要的方法,最重要的还是有一个叫做all的方法,这个也是非 ...

  3. Springboot拦截器实现IP黑名单

    Springboot拦截器实现IP黑名单 一·业务场景和需要实现的功能 以redis作为IP存储地址实现. 业务场景:针对秒杀活动或者常规电商业务场景等,防止恶意脚本不停的刷接口. 实现功能:写一个拦 ...

  4. TensorFlow从0到1之浅谈感知机与神经网络(18)

    最近十年以来,神经网络一直处于机器学习研究和应用的前沿.深度神经网络(DNN).迁移学习以及计算高效的图形处理器(GPU)的普及使得图像识别.语音识别甚至文本生成领域取得了重大进展. 神经网络受人类大 ...

  5. 找到了两个联想的OEM XP镜像文件

    今天在收拾移动硬盘的时候发现了两个XP镜像 还都是联想的,一个有OOBE,另一个无OOBE,全传网盘里了,需要的自取 有个疑问 2020年还有多少家庭电脑和ATM机器还在用XP??? link:htt ...

  6. [转载] WLAN:BSS,ESS,SSID

    转载地址:http://blog.sina.com.cn/s/blog_71c6e0ea0100l686.html (2010-05-24 15:20:47) SSID(Service Set Ide ...

  7. Beta冲刺<9/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第九天(05.27) 作业正文 如下 其他参考文献 ... B ...

  8. 9、ssh的集成方式2

    1.在第一种的集成方式中,通过struts2-spring-plugin-2.1.8.1.jar这个插件让spring自动产生对应需要的action类,不需要在对应的spring.xml文件中进行配置 ...

  9. 僵尸扫描-scapy、nmap

    如果不知道僵尸扫描是什么,请参考我的这篇博客 实验环境: kali(攻击者) 192.168.0.103 metasploitable2(目标主机) 192.168.0.104 win xp sp2( ...

  10. python的一些基础知识

    一.函数介绍 二.模块与包 三.面向对象介绍 四.网络编程基础应用了解 五.基于MySQL对数据库的理解及基础操作 六.粗浅学习的前端知识整理