MySQL—连接查询、子查询

一、连接查询

表的关系简介

        现实生活中,实体与实体之间是有关系的,比如:部门和员工,老师和学生等。那么在设计表的时候,我们应该体现出表与表之间的这种关系。

一对多

一对多(1:n)例如:班级和学生,部门和员工,客户和订单,分类和商品

一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键。

多对多

多对多(m :n)例如:老师和学生,学生和课程,用户和角色

多对多关系建表原则:需要创建第三张表,中间表至少两个字段,这两个字段分别作为外键指向各自一方的主键。

SQL实现代码:

-- 学生表
create table stu(
  `学号` int primary key,
  `姓名` varchar(30)
);

insert into stu values(1,'小明');
insert into stu values(2,'小龙');
insert into stu values(3,'小红');

-- 课程表
create table course(
  `课程号` int primary key,
  `课程名` varchar(30)
);

insert into course values(1,'Java');
insert into course values(2,'C++');
insert into course values(3,'MySQL');


-- 学生选课表(中间表)
create table stu_course(
	s_id int,
	c_id int,
	foreign key(s_id)  references stu(`学号`),
	foreign key(c_id)  references course(`课程号`)
);


-- 代表小明选修了Java课程
insert into stu_course values(1,1);

-- 代表小明选修了MySQL课程
insert into stu_course values(1,3);

-- 代表小龙选修了Java课程
insert into stu_course values(2,1);

-- 代表小龙选修了C++课程
insert into stu_course values(2,2);

-- 代表小红选修了C++课程
insert into stu_course values(3,2);

-- 代表小红选修了Java课程
insert into stu_course values(3,1);

 一对一

一对一(1  :1)在实际开发中用的并不多,因为一对一可以创建成一张表。

SQL实现代码:

-- 先创建主表

-- 学生表
create table s2 (
	`学号` int primary key,
	`姓名` varchar(20)
);

-- 个人信息表
create table info(
	`编号` int primary key, -- 主键
	age int,
	addr varchar(20),
	foreign key (`编号`) references s2(`学号`)	-- 创建外键
);

insert into s2 values(1,'小明');
insert into s2 values(2,'小龙');
insert into s2 values(3,'小红');

-- 小明的年龄为23岁,籍贯为江西
insert into info values(1,23,'江西');

-- 小龙的年龄为25岁,籍贯为广西
insert into info values(2,25,'广西');

-- 小红的年龄为34岁,籍贯为山西
insert into info values(3,34,'山西');

表关系小结

表与表的关系 关系的维护
一对多 通过表中外键来维护
多对多 通过中间表,将两个一对多加到一起变成了一个多对多
一对一

1.添加外键约束

2.从表的主键又是外键 可以简化成一张表

笛卡尔积

数据准备:

create database db03;

use db03;

-- 创建部门表
create table dept(
	id int primary key auto_increment,
	name varchar(20)
);

insert into dept(name) values ('研发部'),('销售部'),('财务部');

-- 创建员工表
create table emp (
	id int primary key auto_increment,
	name varchar(10),
	addr varchar(30), 
	age int, 
	sex char(1), 
	dept_id int,
	foreign key (dept_id) references dept(id) -- 外键,关联部门表(部门表的主键)
);

INSERT INTO `emp` VALUES (1, '小明', '南昌', 24, '男', 1);
INSERT INTO `emp` VALUES (2, '小红', '九江', 20, '女', 1);
INSERT INTO `emp` VALUES (3, '小兰', '抚州', 19, '女', 2);
INSERT INTO `emp` 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易拉罐е

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值