sql,SELECT students.name, students.age, scores.score,FROM students,JOIN scores ON students.id = scores.student_id,WHERE scores.subject = '语文';,
“,,执行以上SQL语句后,将得到以下结果:,,| name | age | score |,||||,| 张三 | 18 | 80 |,| 李四 | 19 | 85 |MySQL多表设计与查询
多表设计
1、一对多关系:
定义:一个实体中的某一项数据可以与另一实体中的多项数据相关联,一个部门可以有多个员工,但每个员工只能属于一个部门。
实现方法:在“多”的一方(如员工表)添加外键,关联到“一”的一方(如部门表)。
示例代码:
“`sql
create table department(
id tinyint unsigned primary key comment ‘序号’,
name varchar(10) not null comment ‘部门名称’
);
create table employee(
id tinyint unsigned primary key comment ‘员工编号’,
name varchar(10) not null comment ‘员工姓名’,
department_id tinyint unsigned comment ‘部门编号’,
foreign key (department_id) references department(id)
);
“`
2、一对一关系:
定义:两个实体之间存在一一对应的关系,一个用户有一个唯一的身份证号。
实现方法:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一(UNIQUE)。
示例代码:
“`sql
create table user(
id tinyint unsigned primary key comment ‘用户编号’,
name varchar(10) not null comment ‘用户名’,
phone varchar(11) comment ‘电话号码’,
degree varchar(10) comment ‘学历’
);
create table user_id_card(
id_card varchar(18) primary key comment ‘身份证号码’,
issued varchar(10) not null,
fk_id tinyint unsigned unique,
constraint fk foreign key (fk_id) references user(id)
);
“`
3、多对多关系:
定义:两个实体之间的关系中,每个实体可以有多个对应的其他实体,一个学生可以选修多门课程,一门课程也可以被多个学生选择。
实现方法:通过中间表来维护多对多关系,中间表至少包含两个外键,分别关联两方主键。
示例代码:
“`sql
create table student(
id tinyint unsigned primary key comment ‘学生编号’,
name varchar(10) not null comment ‘学生姓名’
);
create table course(
id tinyint unsigned primary key comment ‘课程编号’,
name varchar(10) not null comment ‘课程名称’
);
create table enrollment(
student_id tinyint unsigned,
course_id tinyint unsigned,
primary key (student_id, course_id),
foreign key (student_id) references student(id),
foreign key (course_id) references course(id)
);
“`
多表查询
1、内连接:
隐式内连接:通过条件直接指定表之间的关联条件。
“`sql
select tb_emp.name, tb_dept.name
from tb_emp, tb_dept
where tb_emp.dept_id = tb_dept.id;
“`
显式内连接:使用JOIN关键字明确指定连接条件。
“`sql
select tb_emp.name, tb_dept.name
from tb_emp
inner join tb_dept on tb_emp.dept_id = tb_dept.id;
“`
2、外连接:
左外连接:返回左表中的所有记录以及右表中匹配的记录,如果右表没有匹配则结果为NULL。
“`sql
select e.name, d.name
from tb_emp e
left join tb_dept d on e.dept_id = d.id;
“`
右外连接:返回右表中的所有记录以及左表中匹配的记录,如果左表没有匹配则结果为NULL。
“`sql
select e.name, d.name
from tb_emp e
right join tb_dept d on e.dept_id = d.id;
“`
3、子查询:
标量子查询:子查询返回单个值。
“`sql
select * from tb_emp where dept_id = (select id from tb_dept where name = ‘教研部’);
“`
列子查询:子查询返回一列值。
“`sql
select name from tb_emp where dept_id in (select id from tb_dept where name = ‘教研部’);
“`
行子查询:子查询返回一行数据。
“`sql
select * from tb_emp where (dept_id, name) in (select id, name from tb_dept where name = ‘教研部’);
“`
表子查询:子查询返回多行多列数据。
“`sql
select emp_name
from (select name as emp_name, dept_id from tb_emp) as subquery
where dept_id in (select id from tb_dept where name = ‘教研部’);
“`
FAQs
1、问题:如何在多对多关系中进行删除操作?
解答: 在多对多关系中,删除操作需要谨慎处理,以确保数据的一致性和完整性,通常的做法是先删除中间表中的相关记录,然后再删除原表中的记录,要删除某个学生的所有选课记录,可以先从enrollment表中删除该学生的记录,再从student表中删除该学生的信息。
2、问题:如何优化多表查询的性能?
解答: 多表查询的性能优化可以通过以下几种方法实现:确保所有用于连接的字段都建立了索引;尽量避免在连接条件中使用函数或表达式,这会导致索引失效;对于大数据量的表,可以考虑分区或分表来减少单次查询的数据量。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1081725.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复