♥️作者:小刘在C站
♥️个人主页:小刘主页
♥️每天分享云盘算网络运维讲堂笔记,积极不一定有回报,但一定会有劳绩加油!一起积极,共赴精致人生!
♥️树高千尺,落叶归根人生不易,人间真情
前言 我们之前在讲解 SQL 语句的时候,讲解了 DQL 语句,也就是数据查询语句,但是之前讲解的查询都是单 表查询,而本章节我们要学习的则是多表查询利用,主要从以下几个方面举行讲解 目次
MySQL
1、多表关系
1.1 一对多
1.2 多对多
1.3 一对一
2 多表查询概述
2.1 数据准备
2.2 概述
MySQL
MySQL是一个关系型数据库管理体系,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理体系之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理体系) 应用软件之一。
MySQL是一种关系型数据库管理体系,关系数据库将数据保存在不同的表中,而不是将全部数据放在一个大仓库内,这样就增加了速率并进步了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用尺度化语言。MySQL 软件接纳了双授权政策,分为社区版和贸易版,由于其体积小、速率快、总体拥有本钱低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。
1、多表关系
项目开发中,在举行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结 构,由于业务之间相互关联,以是各个表结构之间也存在着各种接洽, 基本上分为三种: 一对多 ( 多对一 ) 多对多 一对一 1.1 一对多
案例 : 部分 与 员工的关系 关系 : 一个部分对应多个员工,一个员工对应一个部分 实现 : 在多的一方创建外键,指向一的一方的主键
1.2 多对多
案例 : 门生 与 课程的关系 关系 : 一个门生可以选修多门课程,一门课程也可以供多个门生选择 实现 : 创建第三张中心表,中心表至少包罗两个外键,分别关联两方主键 对应的SQL脚本:
- create table student(
- id int auto_increment primary key comment '主键ID',
- name varchar(10) comment '姓名',
- no varchar(10) comment '学号'
- ) comment '学生表';
- insert into student values (null, '黛绮丝', '2000100101'),(null, '谢逊',
- '2000100102'),(null, '殷天正', '2000100103'),(null, '韦一笑', '2000100104');
- create table course(
- id int auto_increment primary key comment '主键ID',
- name varchar(10) comment '课程名称'
- ) comment '课程表';
- insert into course values (null, 'Java'), (null, 'PHP'), (null , 'MySQL') ,
- (null, 'Hadoop');
- create table student_course(
- id int auto_increment comment '主键' primary key,
- studentid int not null comment '学生ID',
- courseid int not null comment '课程ID',
- constraint fk_courseid foreign key (courseid) references course (id),
- constraint fk_studentid foreign key (studentid) references student (id)
- )comment '学生课程中间表';
- insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),
- (null,2,3),(null,3,4);
复制代码 1.3 一对一
案例 : 用户 与 用户详情的关系 关系 : 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另 一张表中,以提升利用服从 实现 : 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的 (UNIQUE) 对应的SQL脚本:
- create table tb_user(
- id int auto_increment primary key comment '主键ID',
- name varchar(10) comment '姓名',
- age int comment '年龄',
- gender char(1) comment '1: 男 , 2: 女',
- phone char(11) comment '手机号'
- ) comment '用户基本信息表';
- create table tb_user_edu(
- id int auto_increment primary key comment '主键ID',
- degree varchar(20) comment '学历',
- major varchar(50) comment '专业',
- primaryschool varchar(50) comment '小学',
- middleschool varchar(50) comment '中学',
- university varchar(50) comment '大学',
- userid int unique comment '用户ID',
- constraint fk_userid foreign key (userid) references tb_user(id)
- ) comment '用户教育信息表';
- insert into tb_user(id, name, age, gender, phone) values
- (null,'黄渤',45,'1','18800001111'),
- (null,'冰冰',35,'2','18800002222'),
- (null,'码云',55,'1','18800008888'),
- (null,'李彦宏',50,'1','18800009999');
- insert into tb_user_edu(id, degree, major, primaryschool, middleschool,
- university, userid) values
- (null,'本科','舞蹈','静安区第一小学','静安区第一中学','北京舞蹈学院',1),
- (null,'硕士','表演','朝阳区第一小学','朝阳区第一中学','北京电影学院',2),
- (null,'本科','英语','杭州市第一小学','杭州市第一中学','杭州师范大学',3),
- (null,'本科','应用数学','阳泉第一小学','阳泉区第一中学','清华大学',4);
复制代码 2 多表查询概述
2.1 数据准备
1). 删除之前 emp, dept 表的测试数据 2). 执行如下脚本,创建 emp 表与 dept 表并插入测试数据 - -- 创建dept表,并插入数据
- create table dept(
- id int auto_increment comment 'ID' primary key,
- name varchar(50) not null comment '部门名称'
- )comment '部门表';
- INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4,
- '销售部'), (5, '总经办'), (6, '人事部');
- -- 创建emp表,并插入数据
- create table emp(
- id int auto_increment comment 'ID' primary key,
- name varchar(50) not null comment '姓名',
- age int comment '年龄',
- job varchar(20) comment '职位',
- salary int comment '薪资',
- entrydate date comment '入职时间',
- managerid int comment '直属领导ID',
- dept_id int comment '部门ID'
- )comment '员工表';
- -- 添加外键
- alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
- dept(id);
- INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id)
- VALUES
- (1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
- (2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
- (3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
- (4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
- (5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
- (6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),
- (7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3),
- (8, '周芷若', 19, '会计',48000, '2006-06-02', 7,3),
- (9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3),
- (10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2),
- (11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2),
- (12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2),
- (13, '方东白', 19, '职员',5500, '2009-02-12', 10,2),
- (14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4),
- (15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4),
- (16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4),
- (17, '陈友谅', 42, null,2000, '2011-10-12', 1,null);
复制代码 dept 表共 6 条记载, emp 表共 17 条记载。 2.2 概述
多表查询就是指从多张表中查询数据。 原来查询单表数据,执行的 SQL 形式为: select * from emp; 那么我们要执行多表查询,就只须要使用逗号分隔多张表即可,如: select * from emp , dept ; 详细的执行结果如下 :
此时 , 我们看到查询结果中包罗了大量的结果集,总共 102 条记载,而这实在就是员工表 emp 全部的记载 与 部分表 dept 全部记载 (6) 的全部组合情况,这种征象称之为笛卡尔积。接下来,就来简单 介绍下笛卡尔积。 笛卡尔积 : 笛卡尔乘积是指在数学中,两个聚集 A 聚集 和 B 聚集的全部组合情况
select * from emp , dept where emp.dept_id = dept.id;
♥️关注,就是我创作的动力
♥️点赞,就是对我最大的认可
♥️这里是小刘,励志用心做好每一篇文章,谢谢大家
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |