索引
概述
1.好处:给加完索引的列,提高查询效率
2.坏处:索引本质上就是一张表,如果表的体积太大,比较占内存
3.主键本身就有索引---唯一索引
分类:
单值索引:
#一个索引只包含着一个列
CREATE INDEX index_ename ON emp(ename)
复合索引:
最左特性:如果查找的字段中没有最左边的字段,索引就会失效
#一个索引包含着多个列
ALTER TABLE emp ADD INDEX loc_index(sal,job)
唯一索引:
#创建 唯一索引:索引列的值不能重复
ALTER TABLE emp ADD UNIQUE(hiredate)
展示索引和观察索引有没有生效
show index from 表名 #展示表中的所有索引
expiain#用来观察索引有没有生效,主要看key和possible_key
select * from emp where ename='jack'
多表联合
表的关系:一对一,一对多,多对一,多对多
尽量少使用多表查询,多表查询中会生成一个巨大的结果集,非常耗费内存
笛卡尔积
select * from emp,dept#查出两表中的所有数据
select * from emp,dept
where emp.deptno=dept.deptno#两表的关联关系
and dept.dname='Java开发'#查询时,最好带上前面的表名
#select emp.* from emp,dept#只查询emp表中的数据
SELECT dept.* FROM emp,dept#只查询dept表中的数据
WHERE emp.`deptno`=dept.`deptno` #两张表的关联关系
AND dept.`dname`='java开发'
连接查询
#inner join:两表都满足的数据
#left join:左边所有的数据和右表满足的
#工作中常用的是:小表 left join 大表,小表驱动大表
#right join:右边的所有数据和左表满足的
SELECT * FROM emp e
INNER JOIN dept d
#left JOIN dept d
#right JOIN dept d
ON e.deptno=d.deptno #描述字段
WHERE e.ename='jack'#具体的过滤条件
子查询
#3.子查询:把上次查询的结果作为条件再次查询
#查询部门名称是Java开发的所有信息
#根据部门名称查部门编号
#把查到的编号作为条件,查员工信息
SELECT deptno FROM dept WHERE dname='java开发'
SELECT * FROM emp WHERE deptno=1
#相当于下面的语句
SELECT * FROM emp WHERE deptno=(
SELECT deptno FROM dept WHERE dname='java开发'
)