Mysql关联查询的使用

一. 表间关联查询(多表联合查询)

内连接

语法:【】表示可选项

表1 【inner】 join 表2 on 条件

查询员工姓名和其部门的名字

select e.ename, d.dname 
from emp_xu e 
inner join dept_xu d  
on  e.deptno=d.deptno;

注意:内连接的结果集中数据一定是两个表中都能找到的匹配记录(内连接结果集保留匹配上的记录,匹配不上的记录被丢掉)

改动:【了解】

select ename,dname 
from emp_xu e, dept_xu d 
where e.deptno = d.deptno; 

注意:如果不加上where 得到的结果是笛卡尔积的结果

查询员工的姓名和领导的名字

select e1.ename,e1.leader,e2.empo,e2.ename
from emp_xu e1 
inner join emp_xu e2 
on e1.leader = e2.empo;

表1与表2是可以互换的(等值连接)

说明:

内连接:表1 inner join 表2 on 条件

扫描二维码关注公众号,回复: 11931635 查看本文章
  • 表1为驱动表,表2为匹配表
  • 执行过程:不断的遍历驱动表,在匹配表中找匹配记录,匹配的记录保留,匹配不上的记录去掉
  • 等值连接(匹配条件使用等号)中驱动表和匹配表可以互换

查询员工的姓名和其部门的名字,要求没有部门的员工也要查询出来

select e.ename, d.dname 
from emp_xu e 
inner join dept_xu d  
on  e.deptno=d.deptno
union
select ename, deptno
from emp_xu
where deptno is null;

外连接

语法:

左外连接:左边的表是驱动表

表1 left 【outer】join 表2 on 条件

右外连接:右边的表是驱动表

表1 right join 表2 on 条件

查询员工的姓名和其部门的名字,要求没有部门的员工也要被查询出来

要求查询全部的员工,员工表应该为驱动表

select ename,ifnull(dname,"No Dept")
from emp_xu e  
left  join dept_xu d 
on e.deptno=d.deptno;

左右可以互换,必须明确哪个表是驱动表

select ename,ifnull(dname,"No Dept")
from dept_xu d   
right join emp_xu e 
on e.deptno=d.deptno;

外连接特点:

  • 驱动表中数据全部出现外连接的结果集中
  • 如果驱动表在匹配表中找不到匹配记录时,则匹配一行空行

外连接结果集=内连接的结果集(匹配)+驱动表在匹配表中匹配不上的记录(不匹配)

查询部门名称和员工的姓名,要求没有员工的部门也要查询出来

select dname, ename
from dept_xu d left
join emp_xu e on e.deptno=d.deptno;

查询哪些部门没有员工

否定:

非关联、关联、外连接

select dname,ifnull(ename,"no emp")
from emp_xu e right join dept_xu d
on e.deptno = d.deptno
where empo is null;//匹配不上匹配一个

外连接的本质:

驱动表中的数据全部出现在外连接的结果集中

注意:

  • 不要关联不必要的表,处理关联表非常消耗资源
  • 关联的表越多,会导致性能下降
  • 获取同样的结果,可能会有很多的实现方式,找最优的方式

二. 约束条件:

1.主键约束

主键(primary key 简称pk)

  • 重复+不能为空-
  • 一张表只能有一个主键,主键可以是一列或者多列组合

两种定义方式:列级和表级

列级:

create table stu_xu(
	id int primary key,
	name varchar(10)
);

表级:

create table stu_xu(
	id int,
	name varchar(10),
	constraint stu_xu_id_pk primary key(id)
);

stu_xu_id_pk 主键约束的名字

表名_列名__约束名

mysql支持主键自增

primary key auto_increment

2.非空约束(not null)

create table stu_xu(
	id int primary key auto_increment,
	name varchar(10) not null
);

3.唯一约束(unique 简称UK)

列级

create table stu_xu(
	id int primary key auto_increment,
	name varchar(10) not null,
	email varchar(20) unique
);

unique 对于空值没有影响

4.外键约束(foreign key 简称PK)

外键约束定义在两张表的两个字段上,用于保证某种关系的

若表A的主关键字是表B中的字段,则=该字段称为表B的外键,表A为主表,表B为从表

constraint temp_emp_deptno_fk foreign key(deptno) references temp_dept(deptno)

添加外键之后,两个表就会建立依赖关系,创建表或者插入数据时,有先后顺序(主表/从表),主键主要用于保证数据的一致性和完整性

补充:删除

先删除从表,后删除主表

5.检查约束

mysql没有效果

猜你喜欢

转载自blog.csdn.net/qq_41857955/article/details/108037982