查询关键字补充、多表查询思路、可视化软件navicat
查询关键字之having过滤
HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法。
1.一般情况下,WHERE 用于过滤数据行,而 HAVING 用于过滤分组。
2.WHERE 查询条件中不可以使用聚合函数,而 HAVING 查询条件中可以使用聚合函数。
3.WHERE 在数据分组前进行过滤,而 HAVING 在数据分组后进行过滤 。
4.WHERE 针对数据库文件进行过滤,而 HAVING 针对查询结果进行过滤。也就是说,WHERE 根据数据表中的字段直接进行过滤,而HAVING 是根据前面已经查询出的字段进行过滤。
5.WHERE 查询条件中不可以使用字段别名,而 HAVING 查询条件中可以使用字段别名。
# 统计每个部门年龄在30岁以上的员工的平均薪资并且保留平均薪资大于10000的部门
1.先获取每个部门年龄在30岁以上的员工的平均薪资
# 获取每个部门要按部门分组,分组之前筛选30岁以上用where
select post,avg(salary) from emp where age>30 group by post;
2.在过滤出平均薪资大于10000的数据
# 分组之后筛选数据用having
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去重
采用DISTINCT关键字去除返回结果中的重复项,NULL也是一类数据,返回结果中如果有多个null,使用distinct将多个null合并为一条。
select shop_car from emp;
#select DISTINCT shop_car from emp;
多列使用
多列数据都相同的情况下会被合并,(distinct只能放在第一个字段名之前)
#select DISTINCT shop_car,data from emp;
order by排序
# 1.按照薪资高低排序
select * from emp order by salary asc; # 关键字asc,可以省略,不写默认是asc升序
select * from emp order by salary desc; # 降序(从大到小)
# 2.先按照年龄升序排序,其中如果年龄相同,则再按照薪资降序排序
select * from emp order by age asc,salary desc # 后面再加一个代表对第一次排序后重复的进行二次排序
# 3.统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门并按照从大到小的顺序排序
select post,avg(salary) as avg_salary from emp
where age>10
group by post
having avg_salary>1000
order by avg_salary desc;
limit分页
# 1.限制只展示五条数据
select * from emp limit 5;
# 2.分页效果
select * from emp limit 5,5; # 从第6个开始展示6条数据
# 3.查询工资最高的人的详细信息
select * from emp order by salary desc limit 1; # 先排序然后限制展示第一个
"""
当数据特别多的时候 经常使用limit来限制展示条数 节省资源 防止系统崩溃
"""
regexp正则
select * from emp where name regexp '^j.*(n|y)$' # 晒徐娜以j开头,以n或y结尾的不限长度的字段name对应的值
"""
补充说明:我们目前所讲的是MySQL查询关键字中使用频率较高的一些;
其实还有一些关键字目前无需讲解,并且SQL语句里面同样还支持流程控制语法;
可自行研究
"""
多表查询思路
将一条SQL语句的查询结果 “加括号” 当作另外一条SQL语句的查询条件,即为子查询;
eg:以员工表和部门表为例 >>> 查询jason所在的部门名称
步骤>>>:
子查询
1.先在员工表查询jason所在的部门编号;
select dep_id from emp where name='jason';
2.根据部门编号去部门表中查找部门名称;
select dep_name from dep
where id=(select dep_id from emp where name='jason')
# 可见将子查询的结果放入查询条件可以进行使用
连表操作
先将多张表拼接在一起,形成一张大表,然后基于单表查询获取数据
eg:以员工表和部门表为例 >>> 查询jason所在的部门名称
步骤>>>:
连表操作
1.先将员工表和部门表按照某个字段拼接到一起
2.基于单表查询
可视化软件之Navicat
Navicat是一款可以操作很多数据库的软件,提供了图形化的界面窗口,方便我们更加快速地操作数据库;
下载地址:https://www.navicat.com.cn/download/navicat-premium
(1)navicat有很多版本,并且默认都是收费使用;
(2)正版可以免费体验14天
(3)针对这种图形化软件,版本越新越好(不同版本图标颜色不一样 但是主题功能是一样的);
使用
1.连接数据库 创建库和表 录入数据 操作数据
2.外键
创建表时或者右键进入设计表吗添加或修改外键
3.SQL文件
创建新库>>>运行SQL文件>>>导入SQL文件
4.逆向数据库到模型
查询表之间的关系
5.查询(自己写SQL语句)
可以自己写SQL语句并且可以直接验证结果
# 使用navicat编写SQL 如果自动补全语句 那么关键字都会变大写
# SQL语句注释语法(快捷键与pycharm中的一致 ctrl+?)
# 注释方式:
1.#
2.--