python学习笔记 day43 多表联合查询+连接查询

首先创建两张表,person表 和dept表(两者关联的字段是dept_id 就是部门号)

第一张表 person 人员信息表

create table person(
  id int not null auto_increment primary key,
  name varchar(50) not null,
  age int not null,
  sex char(2) not null,
  salary int not null,
  hire_date datetime default null,    # insert 数据时 可以手动输入员工入职时间
  create_time timestamp not null default current_timestamp,  # 可以记录创建数据的时间(insert数据时可以不用自己添加,会自动生成)   
  update_time timestamp not null default current_timestamp on update current_timestamp,  # 每次修改数据项,会自动记录 update时间
  dept_id int null)

insert into person(id,name,age,sex,salary,hire_date,dept_id) values(1,"璇璇",22,"女",20000,"2017-09-01",1);
insert into person(id,name,age,sex,salary,hire_date,dept_id) values(2,"西西",22,"女",16000,"2017-09-01",1);
insert into person(id,name,age,sex,salary,hire_date,dept_id) values(3,"楠楠",24,"男",18000,"2017-09-01",1);
insert into person(id,name,age,sex,salary,hire_date,dept_id) values(4,"东东",24,"男",22000,"2017-09-01",2);
insert into person(id,name,age,sex,salary,hire_date,dept_id) values(5,"哈哈",23,"男",21000,"2017-09-01",2);
insert into person(id,name,age,sex,salary,hire_date,dept_id) values(6,"呵呵",24,"女",16000,"2017-09-01",3);
insert into person(id,name,age,sex,salary,hire_date,dept_id) values(7,"梅梅",26,"女",15000,"2016-09-01",3);
insert into person(id,name,age,sex,salary,hire_date,dept_id) values(8,"浩浩",24,"男",18000,"2018-09-01",4);
insert into person(id,name,age,sex,salary,hire_date,dept_id) values(9,"夏夏",27,"女",19000,"2015-09-01",4);
insert into person(id,name,age,sex,salary,hire_date,dept_id) values(10,"星星",29,"女",12000,"2016-09-01",5);
insert into person(id,name,age,sex,salary,hire_date,dept_id) values(11,"alex",26,"男",30000,"2011-09-01",5);
insert into person(id,name,age,sex,salary,hire_date,dept_id) values(12,"Eva-J",29,"女",29000,"2012-09-01",6);
select * from person;

 

运行结果:

 

 第二张表: dept----记录部门id以及对应的部门名称

create table dept(
  did int not null,
  name varchar(50) not null,
  create_time timestamp not null default current_timestamp,
  update_time timestamp not null default current_timestamp on update current_timestamp 
  )
insert into dept(did,name) values(1,"研发部");
insert into dept(did,name) values(2,"事业部");
insert into dept(did,name) values(3,"销售部");
insert into dept(did,name) values(4,"运营部");
insert into dept(did,name) values(5,"美工部");
insert into dept(did,name) values(6,"产品部");
select * from dept;

运行结果:


哦对了,为了后续讲多表联合查询,连接查询的区别,这里我再往person表 和 dept表各自增加一条信息:

insert into person(id,name,age,sex,salary,hire_date) values(13,"萌萌",25,"女",18000,"2015-02-01");  # 新增加的员工没有部门
insert into dept(did,name) values(7,"国际部")  # dept表有个部门7 person表没有员工在这个部门

运行结果:


 

1. 多表联合查询-----两张表的交集

如果是想查询person表的全部人员信息,而且需要显示各自的部门:需要用到联合查询

 

select * from person,dept where person.dept_id=dept.did;   # 可以查找person表中所有员工信息,并且显示每一位员工的部门名称(不单单是部门id)

运行结果:

 

 

 

其实会发现只显示了12条数据(也就是person表中第十三条数据(没有dept_id的)并没有被显示)因为where条件是按照两张表的dept_id 和did对应相等来联合查询的;

注意:

多表联合查询时一定要找到两个表中相互关联的字段,并且作为条件使用(不加条件显示笛卡尔乘积的条数--有重叠)

 

2.连接查询---左连接,右连接,内连接,全连接

2.1 左连接

如果是想显示person表的全部员工信息,有dept_id的就显示部门名称,没有的也显示该条员工信息,只不过部门名称null即可 这时候就需要用到左连接 :

 

select * from person left join dept on person.dept_id = dept.did;  # 左连接,会显示person表的全部信息,有对应的dept_id就显示名称,没有也显示该条信息,只不过部门名称null即可

运行结果:

 

2.2 右连接

 如果是想显示全部部门信息,即使有的部门没有对应的员工在,也进行显示,就需要用到右连接(其实左连接也可以实现,就是把两个表顺序换了)

select * from person right join dept on person.dept_id= dept.did;

运行结果:

 

 2.3 内链接----跟联合查询的效果是一样的,只会显示两张表重叠的信息(交集)

select * from person inner join dept on person.dept_id =dept.did;  #内连接,显示两张表的重叠部门信息

运行结果:

 

 2.4 全连接 UNION

 

select * from person left join dept on person.dept_id =dept.did 
UNION 
select * from person right join dept on person.dept_id = dept.did;  # 全连接,使用UNION关键字,显示两张表的全部信息;

 

 运行结果:

多表联合查询与左右连接的区别:

前者只会找两表关联字段中一一对应的重叠(交集)部门数据,而左右连接查询是不管匹配与否,,只会显示左边表全部信息,能匹配就匹配,匹配不了就不显示(null)

 多表联合查询把符合条件的拿出来,不符合的扔掉,而左右连接查询,一张表作为基准,另一张表去匹配,匹配上的拿过来,匹配不上的用null;

全连接查询是在内连接基础上加左右两边没显示的数据;

注意mysql并不支持full join 关键字,但是mysql提供了union关键字,使用union可以间接实现full join的功能;

 

 

3. 作业

3.1 查询出产品部年龄大于22岁工资小于29000的员工,并且按照薪资倒序排列;

select * from person where age>20 and salary<30000 and dept_id = (select did from dept where name="产品部") order by salary desc;

运行结果:

3.2 查询每个部门中最高工资与最低工资是多少,并且显示部门名称;

其实一看这个题就知道需要用到分组查询每个部门的,group by dept_id。。。)连接查询(因为显示person表可以看到工资,但是只有部门ID 没有部门名称,而dept表只有部门名称 没有人员,工资等)又需要显示前一张表的所有人员信息,所以是左连接查询(person在前)

 

select max(salary),min(salary),dept.name from person left join dept on person.dept_id =dept.did group by dept_id ;  # 连接查询一定要加两张表的关联条件(关键字on)!!group by需要放在后面 limit 倒数第一,froup by倒数第二,另外当两个表字段一样时,需要加上表名.字段名 这样来区分~

 

运行结果:(person表中分组后每一个小组信息都要显示,尽管第一行 数据没有dept_id 也要显示出来,左连接~)


 

posted @ 2018-10-29 17:27  写的BUG代码少  阅读(2528)  评论(0编辑  收藏  举报