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模型

MySQL mul key是什么_字段

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)左连接

左表全部显示,显示右表中与左表匹配的项。

MySQL mul key是什么_主键_02


语法:

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;