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语句博 ...
随机推荐
- 利用Python将多个PDF文件合并
from PyPDF2 import PdfFileMerger import os files = os.listdir()#列出目录中的所有文件 merger = PdfFileMerger() ...
- Dedecms 目标仿站的学习视频
目标网站首页的初步仿制(实站仿站)http://vodcdn.video.taobao.com/player/ugc/tb_ugc_bytes_core_player_loader.swf 目标网站首 ...
- 【福利】FL Studio 20 汉化补丁包 _FL Studio 20 汉化包下载
我这两天在网上搜索FL Studio 20汉化包,找了半天也没有找到真正的汉化包,不过好在功夫不负有心人,让我找到了一个不错的FL Studio 20汉化网站,里面提供了FL Studio 20汉化包 ...
- Visible Lattice Points(规律题)【数学规律】
Visible Lattice Points 题目链接(点击) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9031 ...
- IOS 发布 程序截图问题
特别要注意那个有无状态栏时的像素要求 **注意:在截屏模拟器的时候,请把模拟器的Scale设置成100%(Window->Scale->100%) 开模拟器截图,运行每一个iOS型号,然后 ...
- 【Android】使用Appium+python控制真机,碰到的问题以及处理(持续更新)
问题: selenium.common.exceptions.WebDriverException: Message: A new session could not be created. (Ori ...
- selenium获取图片验证码
# encoding:utf-8 from PIL import Image from selenium import webdriver url = '网站地址' driver = webdrive ...
- 十六进制颜色码及其表示-(6 digit color code)
我们知道对于RGB颜色系统,颜色是由三个256位的十进制数值表示的: (R:0-255,G:0-255,B:0-255) 那么一个三元组可以确定一种颜色. 然而,在很多配置文件中颜色并不是直接用十进制 ...
- upd套接字服务器与客户端交互C++代码示范
upd套接字服务器与客户端交互C++代码示范 // vc2_2_4UDPserver_Txwtech.cpp : 定义控制台应用程序的入口点. //服务器端 #include "StdAfx ...
- s7-200高速脉冲输出与高速计数器讲解
s7-200高速脉冲输出与高速计数器讲解