mysql表的关系及数据查询

1、一对多关系

举例:一个班级对应多个学生

1.1、创建一个班级表:

create table classes(classid int primary key auto_increment, classname varchar(20));    

创建一个班级表,包含班级id及班级名字

1.2、创建一个学生表:

 create table student(studentid int primary key auto_increment,studentname varchar(20) not null,classid int,foreign key(classid)  references classes(classid));

创建一个学生表,包括学生id,姓名及classid,classid为外键,与班级表中的id关联

注:外键使用格式:foreign key(外键字段名)  references 表名(关联字段名) 

1.3、插入数据

班级表插入数据:

insert into classes values(0,"101班"),(0,"202班"),(0,"303班");

学生表插入数据:

insert into student values(0,"张三",1); 

insert into student values(0,"李四",1);

insert into student values(0,"王五",2);

insert into student values(0,"赵六",3);

如图所示:同一个班级可以有多个学生

当插入的classid在classes中不存在时:

insert into student values(0,"田七",4);

无法添加数据

2、一对一关系

与一对多关系类似,在外键的限制条件上加上唯一性约束即 unique 即可

3、多对多关系

举例:学生选课,不同的学生可以选一门课,一个学生也可以选择不同的课

3.1、创建一个学生表

create table student2(studentid int primary key auto_increment,studentname varchar(20) not null);

创建一个学生表,包含学生id及学生姓名

3.2、创建一个课程表

create table courses(coursesid int primary key auto_increment,coursesname varchar(20));

创建一个课程表,包含课程的id及课程的名字

3.3、学生选则课表

create table  elective(studentid int,coursesid int,primary key(studentid,coursesid),foreign key(studentid)  references

student2(studentid),foreign key(coursesid)  references courses(coursesid));

primary key(studentid,coursesid):表示学生不能多次选同一节课

3.4、插入数据

学生表插入数据:

insert into student2 values(0,"张三");  

insert into student2 values(0,"李四"); 

insert into student2 values(0,"王五"); 

insert into student2 values(0,"赵六"); 

insert into student2 values(0,"田七"); 

课程表插入数据:

insert into courses values(0,"语文");  

insert into courses values(0,"数学"); 

insert into courses values(0,"英语"); 

insert into courses values(0,"理综"); 

选择课表插入数据:

insert into elective values(1,1);

insert into elective values(1,2);

insert into elective values(1,4);

insert into elective values(3,1);

insert into elective values(3,4);

insert into elective values(1,1);

该语句无法插入

注意:如果关联了外键,而外键的值在关联的表中不存在,则无法成功插入,

数据的查询

1、多表查询数据

例1:查看学生姓名及其所在班级

select student.studentname,classes.classname from student,classes where  student.classid = classes.classid;

注:1、表名.字段名 可以指定到对应表中的某个字段,在多表联合查询的时候使用

        2、.在多表联合查询的时候,from后面可以跟多个表

例2:查看101班的所有学生

select student.studentname,classes.classname from student,classes where student.classid=classes.classid and

classes.classid=1;

例3:展示所有学生的所有信息

select student.*,classes.* from student,classes where student.classid=classes.classid;

2、连接关系查询

注:格式:  select .... from 表1 inner/left/right join 表2  on  条件;

2.1、内链接 inner join

例:查询所有学生及姓名

select student.studentname,classes.classname from student inner join classes on student.classid = classes.classid; 

2.2、右外连接 right join 或 right out join

select student.studentname,classes.classname from student right join classes on student.classid = classes.classid;

2.3、左外连接 left join 或 left out join

select student.studentname,classes.classname from student left join classes on student.classid = classes.classid;

注:当使用左连接,左边数据存在,右边没有与之对应的数据则右边显示NULL,右连接与之同理,内链接显示左右两边匹

配的数据。

猜你喜欢

转载自blog.csdn.net/pyrans/article/details/82386771