前期表准备

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. 使用vw进行移动端适配(nuxt项目)

    基于nuxt 2.0.0 一.安装postcss-px-to-viewport npm安装 npm install postcss-px-to-viewport --save-dev 或 yarn安装 ...

  2. 02 . Zabbix配置监控项及聚合图形

    安装Zabbix Agent监控本机 安装agent软件 与server端不同,Agent只需安装zabbix-agent包 cat /etc/yum.repos.d/zabbix.repo [zab ...

  3. 记录一次vue 访问空白的排错

    访问vue项目页面空白 场景 内网访问访问url很快就可以打开页面,外网访问一片浏览器端一片空白 排查思路 [x] 由于不熟悉vue 先看了nginx的配置,以为是nginx的配置导致的 [x] 百度 ...

  4. OKR-Periods of Words【KMP最小前后缀】

    OKR-Periods of Words 传送门:链接    来源:UPC 8180 题目描述 串是有限个小写字符的序列,特别的,一个空序列也可以是一个串.一个串P是串A的前缀,当且仅当存在串B,使得 ...

  5. DML_Data Modification_DELETE

    DML_Data Modification_Delete删除记录比较简单,但是需要特别注意,一不小心,就变成了 “从删库到跑路“ 就掉的大了 /* Microsoft SQL Server 2008 ...

  6. 超详细实战教程丨多场景解析如何迁移Rancher Server

    本文转自Rancher Labs 作者介绍 王海龙,Rancher中国社区技术经理,负责Rancher中国技术社区的维护和运营.拥有6年的云计算领域经验,经历了OpenStack到Kubernetes ...

  7. StringEscapeUtils防止xss攻击详解

    StringUtils和StringEscapeUtils这两个实用类. 1.转义防止xss攻击 1.转义可以分为下面的几种情况 第一用户输入特殊字符的时候,在提及的时候不做任何处理保持到数据库,当用 ...

  8. Redis SDS 深入一点,看到更多!

    1.什么是SDS? Redis 自定的字符串存储结构,关于redis,你需要了解的几点!中我们对此有过简要说明. Redis 底层是用C语言编写的,可是在字符存储上,并未使用C原生的String类型, ...

  9. 如果人生也能存档——C#中的备忘录模式

    大家好,老胡又和大家见面了.首先承认今天的博客有点标题党了,人生是没有存档,也没有后悔药的.有存档和后悔药的,那是游戏,不知道这是不是游戏让人格外放松的原因之一. 今天恰逢端午放假,就让我们来试着做一 ...

  10. xeus-clickhouse: Jupyter 的 ClickHouse 内核

    在科学计算领域,Jupyter 是一个使用非常广泛的集成开发环境,它支持多种主流的编程语言比如 Python, C++, R 或者 Julia.同时,数据科学最重要的还是数据,而 SQL 是操作数据最 ...