MySQL数据库多表查询理论以及可视化软件navicat
查询关键字的补充知识
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,group_concat(name,':',salary) from emp group by post;
3.concat_ws() 方法 用于分组之前
select concat_ws('|',name,age,salary,gender) from emp;
4.as语法
可以给查询出的字段名起别名(可以省略但不能省略)
select id as '序号',name as '姓名' from emp;
还可以给表名起别名(主要用在多表查询中)
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);
SQL语句查询出来的结果其实也可以看成是一张表
涉及到多表可能会出现字段名冲突需要在字段名前面加上表名作限制
怎么查询员工姓名及对应的部门名称
员工的姓名在emp表
部门的名称在dep表
推导过程:
select * from emp,dep; 笛卡尔积
select * from emp,dep where emp.dep_id=dep.id;
select emp.name,dep.name from emp,dep where emp.dep_id=dep.id;
多表查询:联表
现将多张表拼接成一张大表 然后再基于单表查询完成
在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
select * from emp right join dep on emp.dep_id=dep.id;
多表查询:子查询
将一张表的查询结果括号括起来当成另外一条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
我们在工作中需要更加快速的完成一些MySQL数据库的操作这个时候可视化软件就可以很大程度上提高工作效率
Navicat这个软件可以操作多种不同的数据库 内部本质就是将SQL语句进行了封装
虽然这款软件也是需要收费的 但是可以使用破解版(百度是个好东西)
基本使用:
1.链接
2.创建
3.外键
4.查询
5.SQL文件