Python 数据库操作之连表查询

举报
Yuchuan 发表于 2020/06/08 18:19:25 2020/06/08
【摘要】 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;

image.png

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;

image.png

#上述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;

image.png

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;

image.png

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;

image.png

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
    -> ;
#查看结果

image.png

#注意 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;

image.png

#示例2:以内连接的方式查询employee和department表,并且以age字段的升序方式显示
mysql> select * from employee_1,department where employee_1.dep_id=department.id and age>25 order by age asc;

image.png



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。