国家网站备案查询系统,营销型网站建设目标,电子商务加盟网站建设,黄石企业网站设计外键
MySQL可以使用外键来保持表之间的关系完整性。
要设置外键#xff0c;可以按照以下步骤进行操作#xff1a;
在创建表时#xff0c;使用FOREIGN KEY关键字来指定外键列#xff1a;
CREATE TABLE table1 (id INT PRIMARY KEY,name VARCHAR(50),table2_id INT,FOREI…外键
MySQL可以使用外键来保持表之间的关系完整性。
要设置外键可以按照以下步骤进行操作
在创建表时使用FOREIGN KEY关键字来指定外键列
CREATE TABLE table1 (id INT PRIMARY KEY,name VARCHAR(50),table2_id INT,FOREIGN KEY (table2_id) REFERENCES table2(id)
);使用ALTER TABLE语句来添加外键列
ALTER TABLE table1
ADD CONSTRAINT fk_table1_table2_id
FOREIGN KEY (table2_id) REFERENCES table2(id);其中fk_table1_table2_id是外键约束的名称可以自定义但不能与其他约束重名。
使用ALTER TABLE语句来删除外键列
ALTER TABLE table1
DROP FOREIGN KEY fk_table1_table2_id;以上是MySQL设置外键的基本步骤需要注意的是要设置外键必须满足以下条件
表必须使用InnoDB引擎外键列和参考列必须具有相同的数据类型和大小参考列必须具有索引外键约束必须唯一命名。 mysql表与表之间的关系 MySQL表与表之间可以有多种关系包括 一对一关系两个表中的每个记录都对应着另一个表中的一个记录。这种关系很少用到因为可以将这两个表合并成一个表。 一对多关系一个表中的每个记录都对应着另一个表中的多条记录而另一个表中的每个记录只对应着一个表中的记录。比如一个订单可以对应多个商品。 多对一关系一个表中的多个记录对应着另一个表中的一个记录而另一个表中的每个记录只对应着一个表中的记录。比如多个商品可能被添加到同一个订单中。 多对多关系两个表中的记录之间存在多对多的关系。比如一个学生可以选修多门课程而一门课程也可以被多个学生选修。 在MySQL中通过使用外键来建立表与表之间的关系。外键是一个指向另一个表中的一条记录的字段用于确保数据的完整性和一致性。通过在一个表中设置一个外键可以将这个表和另一个表关联起来。 注意事项 1.在创建表的时候 需要先创建被关联表(没有外键字段的表) 2.在插入新数据的时候 应该先确保被关联表中有数据 3.在插入新数据的时候 外键字段只能填写被关联表中已经存在的数据 4.在修改和删除被关联表中的数据的时候 无法直接操作 如果想要数据之间自动修改和删除需要添加额外的配置 一对多的表关系 以员工表和部门表为例 先站在员工表 问一个员工能否有多个部门? 答不能 在站在部门表 问一个部门能否有多个员工? 答可以 结论一个可以一个不可以表关系就是一对多 表关系中没有多对一 如何在SQL层面建立一对多的关系: 先把基础表的中基础字段建立出来然后在考虑外键字段
create table emp(id int primary key auto_increment,name varchar(32),age int,dep_id int,foreign key(dep_id) references dep(id) # 让两张表建立了外键关系on update cascade # 级联更新on delete cascade # 级联删除
);create table dep(id int primary key auto_increment,dep_name varchar(32),dep_desc varchar(32)
);## 录入数据
insert into emp(name, age, dep_id) values(kevin, 20, 1);
insert into dep(dep_name,dep_desc) values(人事部, 管理人才);#删除iddelete from emp where id2;#修改IDupdata dep emp set id200 where id1;
多对多表关系 以图书表和作者表为例 我们站在图书表的角度 问一本图书能不能有多个作者? 答可以 我们再站在作者表的角度 问一个作者能不能写多本书 答可以 得出结论如果两个都可以那么表关系就是多对多 针对于多对多的表关系外键字段建在第三张表中 在SQL层面建立多对多的表关系
create table book(id int primary key auto_increment,title varchar(32),price decimal(8,2)
);create table author(id int primary key auto_increment,name varchar(32),addr varchar(32)
);create table book2author(id int primary key auto_increment,book_id int,author_id int,foreign key(book_id) references author(id) # 让两张表建立了外键关系on update cascade # 级联更新on delete cascade, # 级联删除foreign key(author_id) references book(id) # 让两张表建立了外键关系on update cascade # 级联更新on delete cascade
);insert into book(title, price) values(金瓶梅, 1000);
insert into book(title, price) values(西游记, 2000);
insert into author(name, addr) values(zhangsan, beijing);
insert into author(name, addr) values(lisi, shanghai);insert into book2author(book_id, author_id) values(1, 1);
insert into book2author(book_id, author_id) values(1, 2);
insert into book2author(book_id, author_id) values(2, 1);
insert into book2author(book_id, author_id) values(2, 2);查看列表select * from author;
select * from book;
select * from book2author;查看特定idselect * from book2author where book_id 1; 一对一表关系
以作者表和作者详情表为例
# 以作者表和作者详情表为例
外键关系建在哪里# 两张表都可以但是推荐建在查询频率较高的一张表在SQL层建立一对一的关系create table author1(id int primary key auto_increment,name varchar(32),gender varchar(32),author_detail_id int unique,foreign key(author_detail_id) references author_detail(id)on update cascadeon delete cascade
);create table author_detail(id int primary key auto_increment,qq varchar(32),email varchar(32)
);mysql多表查询
子查询 1. 子查询# 查询kevin的部门名称1. 应该先查询kevin 的部门编号(部门表的id)select dep_id from emp where namekevin;2. 然后拿着查询出来的部门id去dep表中查询部门名称select *from dep where id (select dep_id from emp where namekevin);#Kevin后面没有分号子查询就是一条SQL的执行结果就是另外一条SQL的执行条件!其实就是分步操作 连表查询(重点) 把多张有关系的表链接成一张大的虚拟表连接出来的虚拟表不是实际存在的它是在内存中存储然后按照单表查询.专业的连表语法inner join # 内连接查询的是两张表中都有的数据left join # 左连接以左表为基准查询左表中所有的数据右表没有的数据使用NULL填充right join # 右连接以右表为基准查询右表中所有的数据右表没有的数据使用NULL填充union # 连接两个SQL语句的结果select * from emp left join dep on emp.dep_iddep.idunionselect * from emp right join dep on emp.dep_iddep.id;连表可以连很多张表不只是两张大多数都是两张select * from emp left join dep on emp.dep_iddep.id inner join A on A.iddep.A_id where ...;
mysql多表查询练习题
数据准备
create table dep(id int primary key auto_increment,name varchar(20)
);create table emp(id int primary key auto_increment,name varchar(20),sex enum(male,female) not null default male,age int,dep_id int
);
如果两张表没有建立强制的约束关系就使用逻辑意义上的关联
#插入数据
insert into dep values
(200,技术),
(201,人力资源),
(202,销售),
(203,运营),
(205,保洁)
;insert into emp(name,sex,age,dep_id) values
(jason,male,18,200),
(egon,female,48,201),
(kevin,male,18,201),
(nick,male,28,202),
(owen,male,18,203),
(jerry,female,18,204);
多道练习题 1、查询所有的课程的名称以及对应的任课老师姓名 2、查询平均成绩大于八十分的同学的姓名和平均成绩 3、查询没有报李平老师课的学生姓名 4、查询挂科超过两门(包括两门)的学生姓名和班级 练习题答案 -- 1、查询所有的课程的名称以及对应的任课老师姓名 -- SELECT -- teacher.tname, -- course.cname -- FROM -- teacher -- INNER JOIN course ON teacher.tid course.teacher_id; ------------------------------------------------------------------------------------- -- 2、查询平均成绩大于八十分的同学的姓名和平均成绩 # 1.先确定需要使用到的表 # 2.在思考多表查询的方式 # 第一步先查询成绩表中 平均成绩大于80的学生编号 # 1.1 按照学生id分组并获取平均成绩 -- select student_id,avg(num) from score group by student_id; # 1.2 筛选出平均成绩大于80的数据 (针对聚合函数的字段结果 最好起别名防止冲突) -- select student_id,avg(num) as avg_num from score group by student_id having avg(num) 80; # 1.3 将上述SQL的结果与student表拼接 -- SELECT -- student.sname, -- t1.avg_num -- FROM -- student -- INNER JOIN ( SELECT student_id, avg( num ) AS avg_num FROM score GROUP BY student_id HAVING avg( num ) 80 ) AS t1 ON student.sid t1.student_id; ------------------------------------------------------------------------------------------------ -- 3、查询没有报李平老师课的学生姓名 # 1.先查询李平老师教授的课程编号 -- select course.cid from course where teacher_id -- (select tid from teacher where tname 李平老师); # 2.根据课程id号筛选出所有报了的学生id号 -- select distinct score.student_id from score where course_id in (select course.cid from course where teacher_id -- (select tid from teacher where tname 李平老师)); # 3.去学生表中根据id号取反筛选学生姓名 -- SELECT -- student.sname -- FROM -- student -- WHERE -- sid NOT IN ( -- SELECT DISTINCT -- score.student_id -- FROM -- score -- WHERE -- course_id IN ( SELECT course.cid FROM course WHERE teacher_id ( SELECT tid FROM teacher WHERE tname 李平老师 ) ) -- ); ------------------------------------------------------------------------------------------------ -- 4、查询挂科超过两门(包括两门)的学生姓名和班级 # 1.先筛选出小于60分的数据 -- select * from score where num 60; # 2.按照学生id分组 然后统计挂科数量 -- select student_id,count(course_id) from score where num 60 group by student_id; # 3.筛选出挂科超过两门的学生id -- select student_id from score where num 60 group by student_id -- having count(course_id) 2; # 4.先将上述结果放在一边 去连接student和class表 SELECT student.sname, class.caption FROM class INNER JOIN student ON class.cid student.class_id WHERE student.sid IN ( SELECT student_id FROM score WHERE num 60 GROUP BY student_id HAVING count( course_id ) 2 ); Navicat可视化软件
Navicat是一款非常流行的数据库管理工具它支持多种数据库类型包括MySQL、Oracle、SQL Server、PostgreSQL等。本教程将介绍Navicat 16的使用方法。 1.下载和安装Navicat 16
首先你需要从官网下载Navicat 16的安装程序然后按照提示进行安装。安装完成后打开Navicat 16。 2.连接到数据库
在Navicat 16的主界面中点击左侧的“连接”按钮然后选择你要连接的数据库类型。在弹出的对话框中输入连接的相关信息包括主机名、用户名、密码等。点击“测试连接”按钮确认连接成功后点击“确定”按钮完成连接。 3.创建数据库
在Navicat 16中创建数据库非常简单。在连接成功后右键单击左侧的数据库列表选择“新建数据库”选项。在弹出的对话框中输入数据库的名称和字符集然后点击“确定”按钮即可完成数据库的创建。 3.1创建表
在Navicat 16中创建表非常简单。在连接成功后右键单击你要创建表的数据库选择“新建表”选项。在弹出的对话框中输入表的名称和字段信息然后点击“确定”按钮即可完成表的创建。 3.2导入数据
在Navicat 16中导入数据也非常简单。在连接成功后右键单击你要导入数据的表选择“导入数据”选项。在弹出的对话框中选择需要导入的文件然后点击“确定”按钮即可完成数据导入。 3.3查询数据
在Navicat 16中查询数据非常简单。在连接成功后双击你要查询的表然后在弹出的“数据浏览器”窗口中输入查询条件然后点击“执行查询”按钮即可查询到相关数据。 3.4修改数据
在Navicat 16中修改数据也非常简单。在连接成功后双击你要修改的表在弹出的“数据浏览器”窗口中选择你要修改的数据然后双击对应的单元格进行修改修改完成后点击保存按钮即可完成数据修改。 3.5导出数据
在Navicat 16中导出数据也非常简单。在连接成功后右键单击你要导出数据的表选择“导出数据”选项。在弹出的对话框中选择导出的文件格式和路径然后点击“确定”按钮即可导出数据
END