day26
- 一、索引操作
- 1、分类
- 2、索引的创建
- (1)创建表时直接创建索引
- (2)在已有表中创建索引
- (3)主键索引的添加
- (4)查看索引
- (5)删除索引
- 二、外键约束
- 1、语法
- 2、创建表时直接建立外键
- 3、建表后添加外键
- 4、通过外键名称解除外键约束
- 5、添加新的级联动作
- 三、 表的关联关系
- 1、一对多关系
- 2、多对多关系
- 3、ER模型
- 4、表关联的查询
- (1)简单多表查询
- (2)内连接
- (3)左连接
- (4)右连接
一、索引操作
1、分类
- 普通(MUL):字段值无约束,KEY标志为 MUL
- 唯一索引(UNI) :字段值不允许重复,但可为 NULL,KEY标志为 UNI
- 主键索引(PRI):一个表中只能有一个主键字段, 主键字段不允许重复,且不能为NULL,KEY标志为PRI。
2、索引的创建
(1)创建表时直接创建索引
语法:
create table 表名(
字段名 数据类型,
字段名 数据类型,
index 索引名(字段名),
index 索引名(字段名),
unique 索引名(字段名)
);
eg:
create table index_test(
id int primary key auto_increment,
name varchar(30),
unique nameIndex(name)
);
(2)在已有表中创建索引
语法:
create [unique] index 索引名 on 表名(字段名);
eg:
create index nameIndex on class(name);
(3)主键索引的添加
语法:
alter table 表名 add primary key(id);
eg:
alter table class add primary key(id);
(4)查看索引
语法:
1、desc 表名; --> KEY标志为:MUL 、UNI。
2、show index from 表名;
(5)删除索引
语法:
drop index 索引名 on 表名;
alter table 表名 drop primary key; # 删除主键
eg:
drop index nameIndex on class;
alter table class drop primary key;
二、外键约束
foreign key 功能 : 建立表与表之间的某种约束的关系,由于这种关系的存在,能够让表与表之间的数据,更加的完整,关联性更强。
1、语法
[CONSTRAINT 起一个外键名] FOREIGN KEY(外键字段)
REFERENCES tbl_name (主表主键)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] --级联动作
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}] --级联动作
- restrict:默认,与主表关联时不允许删改
- cascade:主表进行删改时,从表随之删改
- set null:主表急性删改时,从表外键字段值变为null
2、创建表时直接建立外键
eg:
CREATE TABLE person (
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(32) NOT NULL,
age tinyint unsigned,
salary decimal(8,2),
dept_id int
constraint dept_fk foreign key(dept_id) references dept(id);
) ;
3、建表后添加外键
eg:
alter table person add
constraint dept_fk
foreign key (dept_id)
references dept(id);
4、通过外键名称解除外键约束
eg:
alter table person drop foreign key dept_fk;
5、添加新的级联动作
eg:
alter table person add
constraint dept_fk
FOREIGN KEY(dept_id)
REFERENCES dept(id)
-- 主表急性删改时,从表外键字段值变为null
ON DELETE set null
ON UPDATE set null;
三、 表的关联关系
1、一对多关系
一张表中有一条记录可以对应另外一张表中的多条记录;但是反过来,另外一张表的一条记录只能对应第一张 表的一条记录,这种关系就是一对多或多对一。
举例: 一个人可以拥有多辆汽车,每辆车登记的车主只有一人。那么人与汽车的关系为1:m。
方法:设立外键。
eg:
create table person(
id varchar(32) primary key,
name varchar(30),
age int
);
create table car(
id varchar(32) primary key,
brand varchar(30),
price decimal(10,2),
pid varchar(32),
foreign key(pid) references person(id)
);
2、多对多关系
一对表中(A)的一条记录能够对应另外一张表(B)中的多条记录,同时B表中的一条记录也能对应A表中的多条记录。
举例:一个运动员可以报多个项目,每个项目也会有多个运动员参加,这时为了表达多对多关系需要单独创建关系表。
eg:
create table athlete(
id int primary key auto_increment,
name varchar(30),
age int,
country varchar(30)
);
create table item(
id int primary key auto_increment,
rname varchar(30)
);
create table athlete_item(
id int primary key auto_increment,
a_id int not null,
t_id int not null,
foreign key (a_id) references athlete(id),
foreign key (t_id) references item(id)
);
athlete_item为关系表,关系表也可以拥有各种属性,可如下添加:
alter table athlete_item add `No` int;
3、ER模型
4、表关联的查询
(1)简单多表查询
多个表数据可以联合查询。
语法:
select 字段1,字段2… from 表1,表2… [where 条件]
eg:
select * from class,hobby where class.name = hobby.name;
此种方法是笛卡尔积。
笛卡尔积现象就是将A表的每一条记录与B表的每一条记录强行拼在一起。所以,如果A表有n条记录,B表有m条记 录,笛卡尔积产生的结果就会产生n*m条记录。
--查看员工所在部门
select name,salary,dname from person,dept where person.dept_id = dept.id;
(2)内连接
只会查找到符合条件的记录。
语法:
SELECT 字段列表
FROM 表1 INNER JOIN 表2
ON 表1.字段 = 表2.字段;
eg:
select *
from person inner join dept
on person.dept_id =dept.id;
(3)左连接
左表全部显示,显示右表中与左表匹配的项。
语法:
SELECT 字段列表
FROM 表1 LEFT JOIN 表2
ON 表1.字段 = 表2.字段;
eg:
-- 查询每个人所在的部门
select name,salary,dname
from person left join dept on person.dept_id = dept.id
where salary>=20000;
-- 没有部门的人也会被筛选进来。
(4)右连接
右表全部显示,显示左表中与右表匹配的项
语法:
SELECT 字段列表
FROM 表1 RIGHT JOIN 表2
ON 表1.字段 = 表2.字段;
eg:
-- 查询所有部门的人数
select dname,count(name)
from person right join dept on person.dept_id = dept.id
group by dname;