mysql-多表查询-可视化工具-pymysql模块及使用

本文介绍了MySQL的多表查询技巧,包括笛卡尔积、内连接、左连接、右连接和全连接,并提供了相关练习。同时,讲解了使用可视化工具Navicat进行数据库操作。最后,探讨了Python中使用pymysql模块进行MySQL交互,包括防止SQL注入、增删改等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、多表查询

多表数据
create table dep(
	id int primary key auto_increment,
	name varchar(16),
	work varchar(16)
);
create table emp(
	id int primary key auto_increment,
	name varchar(16),
	salary float,
	dep_id int
);
insert into dep values(1, '市场部', '销售'), (2, '教学部', '授课'), (3, '管理部', '开车');
insert into emp(name, salary, dep_id) values('egon', 3.0, 2),('yanghuhu', 2.0, 2),('sanjiang', 10.0, 1),('owen', 88888.0, 2),('liujie', 8.0, 1),('yingjie', 1.2, 0);
笛卡尔积
# 需求:查看每位员工的部门的所有信息

#子查询,最终结果只能显示单表的信息,但需求是同时显示两张表的信息 => 先将两张表合成一张表
select * from emp where dep_id in (select id from dep); #只能显示单表信息

'''
笛卡尔积: 集合 X{a, b} * Y{o, p, q} => Z{
  
  {a, o}, {a, p}, {a, q}, {b, o}, {b, p}, {b, q}}
交叉查询: select * from emp, dep; | select * from emp course join dep;
'''

''' 做了筛选, 结果<=完整数据, 非笛卡尔积
select * from emp, dep where db2.emp.dep_id = db2.dep.id;  # 同sql语句上表现是从两张表拿数据
# 注意: 同时查询两张表形成新的表,可以称之为虚拟表, 原表与表之间可能存在重复字段, 同时使用时需要明确所属表,必要时还需明确所属数据库
'''
内连接
inner join on
内连接:结果为两张表有对应关系的数据(emp有dep没有,emp没有dep有的记录均不会被虚拟表展示)
语法:左表 inner join 右表 on 两表有关联的字段的条件,on就是产生对于关系的(连接的依据)
select * from emp inner join dep on emp.dep_id = dep.id;
左连接
left join on
左连接:在内连接的基础上还保留左表特有的记录
语法:左表 left join 右表 on 两表有关联的字段的条件
select emp.name '员工', dep.name '部门', dep.work '职责' from emp left join dep on emp.dep_id = dep.id;
右连接
right join on
右连接:在内连接的基础上还保留右表特有的记录
语法:左表 right join 右表 on 两表有关联的字段的条件
select * from emp right join dep on emp.dep_id = dep.id;

'''
在连接语法join 前就是左表,后就是右表
采用的是left关键词就是左连接,right关键词就是右连接,inner关键词就是内连接
'''
全连接
全连接:在内连接的基础上分别保留这左表及右表特有的记录
语法:mysql没有full join on语法,但可以通过去重达到效果
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;
练习
1.查询每一位员工对应的工作职责

# 每一位员工,左表为emp表,那么左表的所有数据均需要被保留,所有采用左连接
select emp.name, dep.work from emp left join dep on emp.dep_id = dep.id;
# 每一位员工,左表为dep表,那么右表的所有数据均需要被保留,所有采用右连接
select emp.name, dep.work from dep right join emp on emp.dep_id = dep.id;

2.查询每一个部门下的员工们及员工职责
'''
分析过程:
每一个部门 => dep的信息要被全部保留,需要分组
员工职责 => dep.work,由于分组不能直接被查询 => 需要用聚合函数处理
员工们 => emp.name做拼接 => group_concat(emp.name)
分组的字段 => 部门 => emp.dep_id => emp.dep_id可以直接被查询,但没有显示意义 => dep.name用来显示 => dep.name需要用聚合函数处理
'''
select max(dep.name), max(dep.work), group_concat(emp.name) from dep left join emp on  emp.dep_id = dep.id group by emp.dep_id;
# 注: on在where条件关键词之左

二、可视化工具

navicat
'''
1.Navicat Premium 12

2.连接数据库,并建库

3.创建表、设置字段、插入数据

4.新建查询
'''

三、pymysql模块

python使用mysql
# 模块pymysql
# 导
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值