一. 表间关联查询(多表联合查询)
内连接
语法:【】表示可选项
表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 条件
- 表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没有效果