表连接
内连接
取每个表都能够匹配的值,如果对应的列值不存在,则被抛弃表1 inner join 表2 on 连接条件
#内连接查询员工姓名及部门名称 select e.ename,d.dname from emp e inner join dept d on e.deptno = d.deptno;
外连接
左外连接
以左表为基表(左表为主)
可以查询出左表中的所有记录和右表中匹配连接条件的记录;
如果左表的某行在右表中没有匹配行,那么在返回结果中,右表的字段值均为为空值(null)
左表 left join 右表 on 连接条件;
select * from emp e left join dept d on e.deptno = d.deptno;
右外连接
以右表为基表(右表为主)
可以查询出右表中的所有记录和左表中匹配连接条件的记录;
如果右表的某行在左表红没有匹配行,那么在返回结果中,左表的字段值均为空值(null)
左表 right join 右表 on 连接条件;
select * from emp e right join dept d on e.deptno = d.deptno;
自然连接
会根据表中相同名称的字段进行自动匹配
表1 natural join 表2;
select * from emp natural join dept;
交叉连接
返回连接表的笛卡尔积(两个集合的乘积)
A = {1,2}
B = {3,4,5}
A * B = {(1,3),(1,4),(1,5),(2,3),(2,4),(2,5)}
B * A = {(3,1),(3,2),(4,1),(4,2),(5,1),(5,2)}
以上AB 和 BA的结果就叫做两个集合的笛卡尔积;
容易导致查询结果重复,混乱,效率慢,不建议使用
表1 cross join 表2; 可以加where条件select * from emp cross join dept;
子查询
相当于十查询语句嵌套,在一个查询结果中继续查询想要的数据,子查询进场出现在where 子句中
#查询工资最低的雇员姓名职位及薪资 select ename,job,sal from emp where sal = (select min(sal) from emp); #查询平均薪资最低的部门名称 select dname from dept where deptno = (select deptno from emp group by deptno order by avg(sal) limit 1); #查询薪资高于clark的所有员工的姓名部门名称工作和薪资 select e.ename,d.dname,e.job,e.sal from emp e left join dept d on e.deptno = d.deptno where sal > (select sal from emp where ename = 'clark');
索引
类似于书中的目录,索引可以大大提高mysql的检索速度,依旧是查询性能,
但是索引也不是越多越好,过多的索引会降低更新(插入,修改,删除)速度,
因为索引是更具表中的一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表,
索引越多关系表越多(浪费磁盘空间),同时更新操作不但要更新内容而且要更新索引文件(降低了数据维护速度)
创建索引
#普通索引 create index 索引名 on 表名(字段); #唯一索引 create unique index 索引名 on 表名(字段)
普通索引和唯一索引:
查询操作(影响微乎其微几乎没有影响)
普通:检索到第一个匹配项后会继续往后检索,知道检索到第一个不匹配项停止检索;
唯一:检索到第一个匹配项后停止检索;
更新操作(如果数据不在内存中唯一索引涉及磁盘读取会降低性能)
普通:检索到位置后直接更新
唯一:检索到位置后判断是否是唯一再更新
性能总和考虑建议使用普通索引
删除索引
drop index 索引名 on 表名
视图:
视图就是一张虚拟的表,我们可以将我们需要的表中的数据查出来定义为视图去查看,
视图中的数据随着真实表中的数改变而改变,对试图的操作和对表的操作是一样的;
视图的优点
安全:
用户只能查询和修改他们所能看到的数据,数据库中的其他数据则既看不到,也取不到,保证了数据的安全性;
聚焦特定数据
多个表中数据可能有很多,可是用户想要看的数据可能只是其中的部分,
这样就可以使用视图将用户想要显示的数据进行显示;
创建视图
create view 视图名 as 查询语句;
create view ed_view as select e.ename,e.sal,e.deptno,d.dname from emp e left join dept d on e.deptno = d.deptno;
# 查看视图 select * from ed_view;
修改视图
alter view 视图名 as 查寻语句;
alter table ed_view as select e.ename,d.dname from emp e left join dept d on e.deptno = d.deptno;
删除视图
drop view 视图名; drop view ed_view;



