MySQL单表查询和多表查询
查询关键字之having过滤
'having与where的功能是一模一样的 都是对数据进行筛选'
where用在分组之前的筛选
havng用在分组之后的筛选
为了更好的区分 所以将where说成筛选 havng说成过滤
having操作示例
#统计各部门年龄在30岁以上的员工平均工资,并且保留平均工资大于10000的部门
将一个复杂的查询题拆分成多个简单的小题:
1.查看整张表的内容:
select * from emp;
2.统计年龄在30岁以上的员工:
select * from emp where age > 30;
3.给各个部门进行分组:
select post from emp group by post;
4.计算各部门的平均薪资:
select post,avg(salary) from emp group by post
5.各部门30岁以上的平均薪资:
select post,avg(salary) from emp where age > 30 group by post;
6.使用having(分组之后)过滤,并且保留平均工资大于10000的部门:
select post,avg(salary) from emp where age > 30 group by post having avg(salary)>10000;
'''
针对聚合函数 如果还需要在其他地方作为条件使用 可以先起别名
select post,avg(salary) as avg_salary from emp
where age>30
group by post
having avg_salary > 10000
;
'''
查询关键字之distinct去重
1.去重的前提示是存在一模一样的数据
2.如果存在主键肯定无法去重(主键是 非空且唯一)
select distinct age from emp;
"""
等我们学到django orm之后 数据会被封装成对象
那个时候主键很容易被我们忽略 从而导致去重没有效果!!!
"""
查询关键字之order by排序
# order by默认是升序 默认的关键字是asc
升序 : asc
降序 : desc
按照薪资高低排序
select * from emp order by salary; # 默认是升序(从小到大)
select * from emp order by salary asc; # 关键字asc 可以省略
select * from emp order by salary desc; # 降序(从大到小)


order by排序支持多个字段
可以多段排序,可以给多段排序指定(升序 或 降序)
select * from emp order by age asc,salary desc;

查询关键字之limit分页
"""
当数据特别多的时候 经常使用limit来限制展示条数 节省资源 防止系统崩溃
"""
1.只跟一个数字
(从头开始展示几行数据)
select * from emp limit 5;
2.只跟两个数字
(第一个是起始位置 第二个是几行数据)
select * from emp limit 5,5;
# 3.查询工资最高的人的详细信息
'''
1.先按照薪资降序排序
2.在使用limit限制取一行
'''
select * from emp order by salary desc limit 1;

查询关键字之regexp正则
# 使用正则查询 j开头 y或者n结尾的员工
select * from emp where name regexp '^j.*(n|y)$';


多表查询
多表查询思路
# 多表查询的思路总共就两种
1.子查询
就相当于是我们日常生活中解决问题的方式(一步步解决)
将一条SQL语句的查询结果加括号当做另外一条SQL语句的查询条件
eg:以昨天的员工表和部门表为例 查询jason所在的部门名称
子查询的步骤
1.先查jason所在的部门编号
2.根据部门编号去部门表中查找部门名称
2.连表操作
先将多张表拼接到一起 形成一张大表 然后基于单表查询获取数据
eg:以昨天的员工表和部门表为例 查询jason所在的部门名称
连表操作
1.先将员工表和部门表按照某个字段拼接到一起
2.基于单表查询

多表查询案例
建表
create table dep(
id int primary key auto_increment,
name varchar(32)
);
create table emp(
id int primary key auto_increment,
name varchar(32),
gender enum('male','female','others') default 'male',
age int,
dep_id int
);
insert into dep values(200,'技术'),(201,'人力资源'),(202,'销售'),(203,'运营'),(205,'安保');
insert into emp(name,age,dep_id) values('jason',18,200),('tony',28,201),('oscar',38,201),('jerry',29,202),('kevin',39,203),('jack',48,204);
插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),(202,'销售'),
(203,'运营'),
(205,'安保');
insert into emp(name,age,dep_id) values
('jason',18,200),
('tony',28,201),
('oscar',38,201),
('jerry',29,202),
('kevin',39,203),
('jack',48,204);
子查询
使用子查询 获取jason所在的部门名称
# 1.先获取jason的部门编号
select dep_id from emp where name='jason';
# 2.将结果加括号作为查询条件
select name from dep where id=(select dep_id from emp where name='jason');
连表操作
# 连表操作:
先将查询涉及到的表拼接成一张大表 之后基于单表查询
'''
笛卡尔积(了解知识)
select * from emp,dep; # 会讲所有的数据全部对应一遍
select * from emp,dep where emp.dep_id=dep.id; # 效率低下
'''
连表操作四个关键字
# inner join 内连接
select * from emp inner join dep on emp.dep_id=dep.id;
'''只连接两张表中有对应关系的数据'''
# left join 左连接
select * from emp left join dep on emp.dep_id=dep.id;
'''以左表为基准 展示所有的数据 没有对应项则用NULL填充'''
# 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;
'''左右两表数据全部展示 没有对应项则用NULL填充'''
可视化软件Navicat
Navicat可以充当很多数据库软件的客户端 提供了图形化界面能够让我们更加快速的操作数据库
# 下载
navicat有很多版本 并且默认都是收费使用
正版可以免费体验14天
针对这种图形化软件 版本越新越好(不同版本图标颜色不一样 但是主题功能是一样的)
# 使用
内部封装了SQL语句 用户只需要鼠标点点点就可以快速操作
连接数据库 创建库和表 录入数据 操作数据
外键 SQL文件 逆向数据库到模型 查询(自己写SQL语句)
# 使用navicat编写SQL 如果自动补全语句 那么关键字都会变大写
SQL语句注释语法(快捷键与pycharm中的一致 ctrl+?)
#
--
# 运行SQL文件
