MySQL多表查询

外键

外键是一个约束
关键字:foreign key
学生信息和老师的信息?
	为什么是两个表?
	如果把两个不同类型的数据放到一个表中 那么维护性将变得很差
	所以我们在设计表的时候 会把不同类型的数据分别储存到不同的表中
判断表与表的关系
	一个表的非主键列 是另一个表的主键 那么认为这两个表是有关系的表	
# 一旦设置了外键关系 那么一定有主次之分
# 外键是建立在次表中
# 主表不能删除数据 次表能删除数据 
# 主表能不能删除数据和外键的动作有关系
# 外键的关系列名 不一定是一样的
作用1:让表与表之间建立联系~~
作用2:可以限制次表中外键列的数据存储
	次表的外键列的取值范围只能在主表的外键列之中

设置外键的语法:
	表已经创建好之后 设置外键
		# constraint 外键名 可以不写 会自动生成 但是名字很复杂
		
		# on update 动作 on delete 动作; 如果不写 默认是restrice动作
		alter table 表名 add constraint 外键名 foreign key(列名) references 主表名称(列名) on update 动作 on delete 动作;
	创建表的时候设置外键
		create table 表名(
		列1,
		列2,
		列3,
		....,
		constraint 外键名 foreign key(列名) references 主表名称(列名) on update 动作 on delete 动作
		);
# 查询外键
	show create table 表名;
# 删除外键
	alter table 表名 drop foreign key 外键名;
# 外键的动作
	set null: 当删除或者更新主表的外键列时 次表的外键列会被设置为null (次表的列 允许为null)
	cascade: 级联 当主表的外键列更新或者删除的时候 次表的外键列也会跟着变化
	restrice: 默认的动作 不允许删除或者更新主表的数据~~~

	动作分两种类型 
		1.更新  update
		2.删除  delete

子查询

在select语句中, 嵌套另一个select语句

在where子句中 , 嵌套一个select语句

as:对表名或者字段名进行重命名(区别名)

-- 在select语句中, 嵌套另一个select语句 
-- 查询得到的结果作为一个新的表 吗交给外层查询 , 此时得到的新版用as对器进行取名 , 方便后续操作
select * from (select * from 表名 where 条件) as 表名 where 表名.条件;

-- 在where子句中 , 嵌套一个select语句
-- 查询得到的结果必须是一个确切的数据 , 不能是多行多列的表格 , 返回的结果就是交给外层进行条件筛选
select * from 表名 where 条件(select * from 表名 where 条件);

联结表

联结表 就是把有关系的表拼接成一个表来进行查询
inner join  -- 内连接
left join 	-- 左连接
right join	-- 右连接

-- 内连接 , 将两表关联的数据拼接在一起
select * from 表1 inner join 表2 on 连接条件
select * from book inner join author 
on book.b_id=author.a_id;

select book.b_name,author.a_name from book 
inner join author on book.b_id=author.a_id;

-- 左连接 , 以左表为主 ,左表有数据没有对应到 , 会出现为NULL
select * from (左)表1 left join 表2 on 连接条件

select * from  author left join book 
on book.b_id=author.a_id;

-- 右连接 , 以右表为主, 右表有数据没有对应到 , 会出现为NULL
select * from (左)表1 right join 表(右)2 on 连接条件

select * from  author right join book 
on book.b_id=author.a_id;

自然联结
在一个表中 有联结关系的多个列 可以使用自然联结来解决这个问题
模拟多表查询。 自然联结可以把一个表当成两个表来查询。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值