Python 数据库操作之连表查询
【摘要】 python mysqls数据库连表查询相关知识。
一、准备
建表与数据准备
sql 示例:
#建表
create table department(
id int,
name varchar(20)
);
create table employee(
id int primary key auto_increment,
name varchar(20),
gende enum('male','female') not null default 'male',
age int,
dep_id int
);
#插入数据
insert into department values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');
insert into employee(name,gender,age,dep_id) values
('egon','male',18,200),
('alex','female',48,201),
('wupeiqi','male',38,201),
('yuanhao','female',28,202),
('liwenzhou','male',18,200),
('jingliyang','female',18,204)
;
#查看表结构和数据
mysql> desc department;
mysql> desc employee_1;
mysql> select * from department;
mysql> select * from employee_1;
表department与employee
二、多表连接查询
#重点:外链接语法
SELECT 字段列表
FROM 表1 INNER|LEFT|RIGHT JOIN 表2
ON 表1.字段 = 表2.字段;
1 交叉连接:不适用任何匹配条件。生成笛卡尔积
mysql> select * from employee_1,department;
2 内连接:只连接匹配的行
#找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果
#department没有204这个部门,因而employee表中关于204这条员工信息没有匹配出来
mysql> select employee_1.id,employee_1.name,employee_1.gender,employee_1.age,department.name from employee_1 inner join department on employee_1.dep_id=department.id;
#上述sql等同于
mysql> select employee_1.id,employee_1.name,employee_1.gender,employee_1.age,department.name from employee_1,department where employee_1.dep_id=department.id;
3 外链接之左连接:优先显示左表全部记录
#以左表为准,即找出所有员工信息,当然包括没有部门的员工
#本质就是:在内连接的基础上增加左边有右边没有的结果
mysql> select employee_1.id,employee_1.name,employee_1.gender,employee_1.age,department.name from employee_1 left join department on employee_1.dep_id=department.id;
4 外链接之右连接:优先显示右表全部记录
#以右表为准,即找出所有部门信息,包括没有员工的部门
#本质就是:在内连接的基础上增加右边有左边没有的结果
mysql> select employee_1.id,employee_1.name,employee_1.gender,employee_1.age,department.name from employee_1 right join department on employee_1.dep_id=department.id;
5 全外连接:显示左右两个表全部记录
全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
#注意:mysql不支持全外连接 full JOIN
#强调:mysql可以使用此种方式间接实现全外连接
mysql> select * from employee_1 left join department on employee_1.dep_id=department.id
-> union
-> select * from employee_1 right join department on employee_1.dep_id=department.id
-> ;
#查看结果
#注意 union与union all的区别:union会去掉相同的纪录
符合条件连接查询
#示例1:以内连接的方式查询employee和department表,并且employee表中的age字段值必须大于25,即找出年龄大于25岁的员工以及员工所在的部门
mysql> select employee_1.id,employee_1.name,employee_1.age,department.name from employee_1 inner join department on employee_1.dep_id=department.id where employee_1.age>25;
#示例2:以内连接的方式查询employee和department表,并且以age字段的升序方式显示
mysql> select * from employee_1,department where employee_1.dep_id=department.id and age>25 order by age asc;
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)