MySQL多表查询

补充知识

1.group_concat()方法  用于分组之后

获取除分组以外其他字段数据,本质可以理解为是拼接操作

  select post,group_concat(name) from emp group by post;

  select post,group_concat(name,':',salary) from emp group by post;

 2.concat()方法  用于分组之前

  select post,concat(name,':',salary) from emp;

3.concat_ws()方法  用于分组之前,多个字段相同分隔符情况

  select concat_ws('|',name,age,salary,gender) from emp;

4.as语法

  1.可以给查询出来的字段起别名(as可以省略但是不许省略)

    select id as '序号',name as '姓名' from emp;

  2.还可以给表名起别名(主要用在多表查询中)

    select * from emp as t1 where t1.id > 5;

    (将emp表名起别名为t1,之后使用t1代替emp)

总结:as左边是字段则是字段别名,左边是表名则是表别名

多表查询理论

多表查询:所需数据来源于多张表数据的组合

建表

create table dep(

  id int primary key auto_increment,

  name varchar(20)

);

create table emp(

  id int primary key auto_increment,

  name varchar(20),

  gender enum('male','female') not null default 'male',

  age int,

  dep_id int

);

插入数据

insert into dep values

(200,'技术'),

(201,'人力资源'),

(202,'销售'),

(203,'运营');

insert into emp(name,gender,age,dep_id) values
('jason','male',18,200),
('egon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);

查询各员工姓名及对应的部门名称

  员工姓名在emp表

  部门名称在dep表

  推导过程1

    select * from emp,dep;

  推导过程2

    select * from emp,dep where emp.dep_id=dep.id;

  推导过程3

    select emp.name,dep.name from emp,dep where emp.dep_id=dep.id;

SQL语句查询出来的结果其实也可以看成是一张表
涉及到多表可能会出现字段名冲突需要在字段名前面加上表名作限制

多表查询之联表

(现将多张表拼接成一张大表,然后再基于单表查询完成)

在MySQL中拼接表有专门的关键字

  inner join  内链接(用的最多)

    select * from emp inner join dep on emp.dep_id=dep.id;

    (只链接两个表中都有对应的数据)

  left join  左链接

    select * from emp left join dep on emp.dep_id=dep.id;

    (以关键字左表为基础展示左表所有的数据,没有对应的以null填充)

  right join  右链接

    select * from emp right join dep on emp.dep_id=dep.id;

    (以关键字右表为基础展示右表所有的数据,没有对应的以null填充)

  union

    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;

     (同时以关键字两边为基础,展示两表所有的数据,没有对应的以null填充)

多表查询之子查询

(将一张表的查询结果用括号括起来当成另一条SQL语句的条件)

子查询即日常生活中解决问题的思路:分步操作

1.查询部门是技术或者人力资源的员工信息

  方法1:联表操作

    select emp.name,emp.age,dep.name from emp inner join dep on emp.dep_id=dep.id where dep.name in ('技术','人力资源');

  方法2:子查询

    1.先查询技术和人力资源id号

      select id from dep where name in ('技术','人力资源');

    2.再去员工表里面根据部门id号筛选出员工数据

      select * from emp where dep_id in (select id from dep where name in ('技术','人力资源'));

 总结

涉及到多表查询只有两种方法

  1.联表操作

  2.子查询

并且很多复杂的查询甚至需要两者结合使用

可视化软件之Navicat

在工作中有时候需要更加快速的完成一些基本操作,可视化软件可以大大提升工作效率,Navicat是一款可以操作多种数据库的软件,内部其实就是封装了相应的SQL语句

Navicat软件也是需要收费的,只能免费试用14天,但是我们可以使用破解版本

破解地址:自己百度去(当心垃圾软件)

基本使用

  有些功能如果没有也可以直接在软件内手动修改SQL语句

  1.链接

  2.创建

  3.外键

  4.查询

  5.SQL文件

查询平均年龄在25岁以上的部门名(使用两种方式都完成一下)

联表:

select dep.name,avg(emp.age) from emp inner join dep on emp.dep_id=dep.id group by dep.name having avg(emp.age) > 25;

子查询:

select dep_id from emp group by dep_id having avg(age) > 25;

select name from dep where id in (select dep_id from emp group by dep_id having avg(age) > 25);

posted @ 2021-09-08 16:16  雾雨黑白  阅读(60)  评论(0编辑  收藏  举报