MySQL(四)
MySQL(四)
查询关键字之having过滤
# having作用
类似于where,都是做数据筛选
只不过having用于分组后的数据筛选
# 统计每个部门年龄在30岁以上的员工的平均薪资并且保留平均薪资大于10000的部门
'''拆分法,即把一条长查询差分成多条短查询,再合并'''
# 1.先查出每个部门年龄在30岁以上的员工的平均薪资
select avg(salary) from emp where age > 30 group by post;
# 2.再保留平均薪资大于10000的部门
select avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;
# 字段起别名
对于上述代码,我们可以avg(salary) as 'avg_salary'
即给结果字段avg(salary)命名为avg_salary
后续可以使用avg_salary > 10000替代avg(salary) > 10000

查询关键字之distinct去重
# 作用
查询结果有一毛一样的数据只保留一个
# 使用
# 查询所有员工的年龄,相同的只保留一个
select distinct age from emp;
"""
等我们学到django orm之后 数据会被封装成对象
那个时候主键很容易被我们忽略 从而导致去重没有效果!!!
"""

查询关键字之order by排序
# 作用
控制查询结果的顺序
# 使用
order by 字段名 asc/desc(升序(默认)/降序)
'''order by 字段名 后面不写东西默认是升序的'''
# 查询所有年龄,去重,并按照升序排列
select distinct age from emp order by age;
# 查询所有员工,降序排列,如果年龄相同按工资升序排列
select * from emp order by age desc,salary asc;


查询关键字之limit分页
# 作用
限制展示条数
# 使用
limit 条数
limit 起止位置(不包含),条数
# 查询年龄,去重,取3条数据
select distinct age from emp limit 3;
# 查询年龄,去重,从第5条数据开始取3条数据
select distinct age from emp limit 5,3;
"""
当数据特别多的时候 经常使用limit来限制展示条数 节省资源 防止系统崩溃
"""

查询关键字之regexp正则
# 作用
其实这个可以放到where里讲
作用类似于like,匹配字符的
# 使用
where 字段名 regexp 正则串
# 查找名字j开头n或者y结尾的人的信息
select * from emp where name regexp '^j.*(n|y)$';

查询全家福
select
要查询的字段名
from
待查询的表
where
条件
group by
分组字段
having
筛选数据
distinct
order by
limit
多表查询思路
# 多表查询的思路总共就两种
1.子查询
一张表一张表的查
eg:
# 用户登录后查看购物车里的东西(用户表,购物车表(user_id为主键))
1.用户登录(根据用户名密码获取用户id)
2.查询购物车(根据用户id取购物车表里查数据)
'''
根据已有数据,抽丝剥茧一样,一张表查完了,用查到的数据再去查下一张表
'''
2.连表操作
就是上一篇讲的拆表的逆向思维
把多张表合成一张表,然后直接查
# 连表查购物车
1.用户表和购物车表通过user_id连起来
2.通过用户名密码直接查
# 代码实操
create table user(
id int primary key auto_increment,
username varchar(32),
pwd varchar(32)
);
create table shop_car(
id int primary key auto_increment,
shop_info varchar(32),
user_id int,
foreign key(user_id) references user(id)
);
insert into user(username,pwd) values('petter','123');
insert into shop_car(shop_info,user_id) values('大白菜一斤',1),('粉条一斤',1),('猪肉一斤',1);
# 子查寻
1.先根据账号密码查用户id
select id from user where username = 'petter' and pwd = '123';
2.根据用户id查询购物记录
select * from shop_car where user_id = (select id from user where username = 'petter' and pwd = '123');
# 连表查询
笛卡尔积(了解知识)
select * from user,shop_car; # 会将所有的数据全部对应一遍
select * from user,shop_car where user.id = shop_car.user_id;
1.inner join(内连接)
select * from shop_car inner join user on shop_car.user_id = user.id;
'''只连接两张表中有对应关系的数据'''
2.left join(左连接)
select * from shop_car left join user on shop_car.user_id = user.id;
'''左表数据全展示,右表只展示有关联的数据,左表有右表没有的数据用null填充'''
3.right join(右连接)
select * from shop_car right join user on shop_car.user_id = user.id;
'''右表数据全展示,左表只展示有关联的数据,右表有左表没有的数据用null填充'''
4.union(全连接)
select * from shop_car union user on shop_car.user_id = user.id;
'''两张表的数据全展示出来,没有的用null天成'''
子查询

笛卡尔积

连表查询

可视化软件之Navicat
Navicat可以充当很多数据库软件的客户端 提供了图形化界面能够让我们更加快速的操作数据库
# 下载
navicat有很多版本 并且默认都是收费使用
正版可以免费体验14天
针对这种图形化软件 版本越新越好(不同版本图标颜色不一样 但是主题功能是一样的)
# 使用
内部封装了SQL语句 用户只需要鼠标点点点就可以快速操作
连接数据库 创建库和表 录入数据 操作数据
外键 SQL文件 逆向数据库到模型 查询(自己写SQL语句)
# 使用navicat编写SQL 如果自动补全语句 那么关键字都会变大写
SQL语句注释语法(快捷键与pycharm中的一致 ctrl+?)
#
--
# 运行SQL文件

浙公网安备 33010602011771号