表的内外连接
内连接
内连接实际上就是利用 where 子句对两种表形成的笛卡儿积进行筛选
语法:
select 字段 from 表 1 inner join 表2 on 连接条件 and 其他条件;
案列:
用前面的写法
select ename, dname from emp, dept where emp.deptno=dept.deptno and ename='smith';
用标准的内连接写法
select ename, dname from emp inner join dept on emp.deptno=dept.deptno and ename='smith;
外连接
左外连接
如果联合查询,左侧的表完全显示我们就说是左外连接。
语法:
select 字段名 from 表名1 left join 表名2 on 连接条件;
建两张表 stu 表和 exam 表
create table stu (
id int,
name varchar(30)
); --学生表
insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
create table exam (
id int,
grade int
); --成绩表
insert into exam values(1, 56),(2,76),(11, 8);
查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
当左边表和右边表没有匹配时,也会显示左边表的数据
select * from stu left join exam on stu.id=exam.id;
查询结果:
右外连接
如果联合查询,右侧的表完全显示我们就说是右外连接。
语法:
select 字段 from 表 1 inner join 表2 on 连接条件 and 其他条件;
案例:
对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来
select * from stu right join exam on stu.id=exam.id;
表的索引特性
索引:提高数据库的性能,查询速度的提高是以插入、更 新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度
- 主键索引(primary key)
- 唯一索引(unique)
- 普通索引(index)
- 全文索引(fulltext)
基本原理
说明: 占用磁盘空间、当添加一条记录,除了添加到表中,还要维护二叉树,速度有影响,但不大。
当我们添加一个索引,不能够解决所有查询问题,需要分别给字段建立索引;例如 select * from EMP where ename='abcdef'; 索引是以空间换时间
索引创建
主键索引
直接在字段名后指定
primary key create table user1(id int primary key, name varchar(30));
指定某列或某几列为主键索引
primary key create table user1(id int primary key, name varchar(30));
修改表属性
alter table user3 add primary key(name);
修改表属性:
一个表中,最多有一个主键索引,当然可以使符合主键 主键索引的效率高(主键不可重复) 创建主键索引的列,它的值不能为null,且不能重复 主键索引的列基本上是int
唯一索引(唯一性约束 unique)
在某列后直接指定unique唯一属性。
create table user4(id int primary key, name varchar(30) unique);
在表的后面指定某列或某几列为
unique create table user5(id int primary key, name varchar(30), unique(name));
修改表属性
alter table user6 add unique(name);
修改属性结果:
特点: 一个表中,可以有多个唯一索引 查询效率高 如果在某一列建立唯一索引,必须保证这列不能有重复数据 如果一个唯一索引上指定not null,等价于主键索引
普通索引
同样有三种方法与创建主键索引、唯一性约束语法一致,因此不做讨论(index)
修改表属性
alter table student add index(name);
普通可以有多个;
索引查询
第一种方法:
show keys from 表名;
查询结果:
第二种方法:
show index from 表名;
查询结果:
第三种方法(信息比较简略):
desc 表名;
查询结果:
索引删除
第一种方法-删除主键索引:
alter table 表名 drop primary;
第二种方法-其他索引的删除:
alter table 表名 drop index 索引名;
索引名就是show keys from 表名 中的 Key_name 字段 mysql> alter table user10 drop index idx_name;
第三种方法方法:
drop index 索引名 on 表名 mysql> drop index name on user8
创建规则(原则)
比较频繁作为查询条件的字段应该创建索引
唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
更新非常频繁的字段不适合作创建索引
不会出现在where子句中的字段不该创建索引