前期表准备

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. 使用PD(Power Designer)设计数据库,并且生成可执行的SQL文件创建数据库(本文以SQL Server Management Studio软件执行为例)

    下载和安装PD: 分享我的软件资源,里面包含了对PD汉化包(链接出问题时可以留言,汉化包只能对软件里面部分菜单栏汉化) 链接:https://pan.baidu.com/s/1lNt1UGZhtDV8 ...

  2. Django 构建模板form表单的两种方法

    通常情况下,我们想构建一张表单时会在模板文件login.html中写入 <form action="/your-name/" method="post"& ...

  3. Ehab and a 2-operation task【数论思想】

    Ehab and a 2-operation task 题目链接(点击) You're given an array aa of length nn. You can perform the foll ...

  4. Microsoft SQL Server Migration Assistant for MySQL(从MySQL迁移表数据到MSSQL2008R2)_3

    环境: 英文版(Windows7 64 bit + MySQL8.0.18 64 bit + MSSQL2008R2 64 bit)                           Microso ...

  5. C++核心编程

    C++核心编程 本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓. 1 内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统 ...

  6. C# 什么是泛型 ?以及对泛型各方面的一些知识点的整理

    1.1 理解什么是泛型 在.NET 2.0,可以成为革命性壮举的, 就是引入了激动人心的特性——泛型..NET泛型是CLR和高级语言共同支持的一种全新的结构,实现了一种将类型抽象化的通用处理方式.在泛 ...

  7. 团队进行Alpha冲刺--冲刺总结

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--冲刺总结 作业正文 如下 其他参 ...

  8. MongoDB设计方法及技巧

    MongoDB是一种流行的数据库,可以在不受任何表格schema模式的约束下工作.数据以类似JSON的格式存储,并且可以包含不同类型的数据结构.例如,在同一集合collection 中,我们可以拥有以 ...

  9. PHP利用FTP上传文件连接超时之开启被动模式解决方法

    初始代码: <?php $conn = ftp_connect("localhost") or die("Could not connect"); ftp ...

  10. springboot 集成mybatis时日志输出

    application.properties(yml)中配置的两种方式: 这两种方式的效果是一样的,但是下面一种可以指定某个包下的SQL打印出来,上面这个会全部的都会打印出来.