mysql 子查询 主键外键_MySQL之外键、联合查询、子查询

外键(foreign key):

外面的键(键不在自己表中),如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称之为外键。

外键可以在创建表的时候或者创建表之后增加(但是要考虑数据的问题)。一张表可以有多个外键。

创建表的时候增加外键:在所有的表字段之后,使用foreign key(外键字段) reference 外部表(主键字段)

fecfd588e0e2fed5561ce8231df79ec7.png

在新增表之后增加外键:修改表结构

Alter table 表名 add[constraint 外键名字] foreign key(外键字段)reference 父表(主键字段);

7008faac394f912e929d6e993e14d824.png

修改外键与删除外键

外键不可以修改,只能先删除后新增

删除外键语法

Alter table 表名 drop foreign key 外键名;  ---一张表中可以有多个外键,但是名字不能相同。

148925b65a20cd9ba9a52fdc0a9b329c.png

外键作用

外键默认的作用有两点:一个对父表,一个对字表(外键字段所在的表)

对子表的约束:子表数据进行写操作的时候,如果对应的外键字段在父表找不到对应的匹配,那么操作会失败(约束子表数据操作)。

ebb6d96f21b3c258ce0858a2dc0f4fd0.png

对父表的约束:父表数据进行写操作(删和改:都必须涉及到主键本身),如果对应的主键在子表中已经被数据所引用,那么就不允许操作。

3cb42daec637cdc2bac9f11486326c14.png

外键条件:

1、外键要存在:首先必须保证表的存储引擎是innodb(默认的存储引擎),如果不是innodb存储引擎,那么外键可以创建成功,但是没有约束效果。

2、外键字段的字段类型(列类型)必须与父表的主键类型完全一致。

3、一张表中的外键名字不能重复。

4、增加外键的字段(数据已经存在),必须保证数据与父表主键要求对应。

a233bc410774d113cb96d53e0b832061.png

外键约束:就是指外键的作用。

aead194196999679d36de08f807e0397.png

8e35f9cc8d3161b92a93d3a52773d161.png

0cf0299a7cad849becdec2620a917ee4.png

删除后置空:

删除置空的前提条件:外键字段允许为空(如果不满足条件,外键无法创建)

27d6bb90ca556774b804940247134a2b.png

联合查询:

将多次查询(多条select语句),在记录上进行拼接(字段不会增加)。

基本语法:

多条select语句构成,每一条select语句获取的字段数必须严格一致(但是字段类型无关)

select  语句1  Union[union选项] select 语句2……

Union选项:与select选项一样有两个

All:保留所有(不管重复)

Distinct:去重(整个重复),默认的。

1709033aebc8e49c25215cf0655b55b2.png

联合查询只要求字段一样,跟数据类型无关

49a6026160155902335fe08990704da7.png

意义:

联合查询的意义分为两种:

1、查询同一张表,但是需求不同:如查询学生信息,男生身高升序,女生身高降序。

2、多表查询:多张表的结构是完全一样的,保存的数据(结构)也是一样的。

Order by 使用:

在联合查询中:order by不能直接使用,需要对查询语句使用括号才行。

7c5f98658f859fdf4630313d65100328.png

之上的查询方式也是不成功的,如果需要order by生效,必须搭配limit,limit使用限定的最大数即可。

e43337ff599e5f1258430b97218989db.png

子查询(sub query):

查询实在某个查询结果之上进行的。(一个select语句内部包含另外一条select语句)。

子查询分类:

子查询有两种分类方式:按位置分类、按结果分类。

按位置分类:子查询(select语句)在外部查询(select语句)中出现的位置。

From子查询:子查询跟在from之后。

Where子查询:子查询出现在where条件中。

Exists子查询:子查询出现在exists中。

按结果分类:根据子查询得到的数据进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)

标量子查询:子查询得到的结果是一行一列。

列子查询:子查询得到的结果是一列一行。

行子查询:子查询得到的结果是多列一行(多行多列)。

上面几个出现的位置是在where之后。

表子查询:子查询得到的结果是多行多列(出现的位置是在from之后)

c2bb973fb07fbc04bb83ac63ca583c5e.png

b7a306ac7e9228970c097174218608d1.png

ea52ddf62bf56f2b8879a19156a4b0c8.png

33790d574b8f9b62c697eaf35001b2b4.png

列子查询返回的结果比较:一列多行,需要使用in作为条件匹配,其中在mysql中还有几个类似的条件:all、some、any

=any —— in;  其中一个即可

any  —— some;  any跟some是一样

=all  —— 为全部

肯定结果:

0a28fb620cc34c461f91df5371dbfa5c.png

否定结果:

fcc0f1dd0e41f23dbfd7283cf24a8041.png

行子查询:

返回的结果可以是多行多列(一行多列)

0e82565c590651503d55b3a7f4c06f71.png

行子查询需要构造行元素,行元素由多个字段构成。

807e9c7f50adeba501f8b67fffd4d1dd.png

表子查询:

子查询返回的结果是多行多列的二维表:子查询返回的结果是当做二维表来使用。

4d2f32e966382e4233dd54b0bc17c726.png

表子查询:from子查询,得到的结果作为form的数据源。

d2f6c6262c2958c94bcc0c72c0cd14fc.png

Exists子查询:

Exists:是否存在的意思,Exists子查询就是用来判断某些条件是否满足(跨表),Exists是接在where之后,Exists返回的结果只有0和1;

fba8df6f076761192c5e7243d02805b3.png

cd8ab9ec79e4a410194e7525da3dcc47.png

原文:https://www.cnblogs.com/soft2018/p/10895057.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值