连接查询是同时查询多张表,通过多张表之间的关系得到最终的结果。连接查询又分成内连接、外链接和自然连接。

内连接:从左表中取出每一条记录,去右表中与所有的记录进行匹配;匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留。

注意内连接可以没有on之后的条件,此时查询的结果是笛卡尔积。

外连接:以某张表为主表,取出主表中的所有记录,然后每一条记录都与另外一张表进行连接。主表中的结果将全部保留,从表中内匹配的结果保留,不能匹配的结果都将置为null。
外连接分成两种,左外连接(left join)和右外连接(right join)

自然连接:自动匹配连接条件,系统将以字段名字作为匹配模式(同名字段作为条件)。自然连接分成自然内连接和自然外连接。

-- 自然内连接
select * from s_user natural join s_orderform;-- 自然左外连接
select * from s_user natural left join s_orderform;--自然右外连接
select * from s_user natural right join s_orderform;


使用内连接和外连接来模拟自然连接:
左表 left/right join 右表 using(字段名);

MySQL中增加外键(两种方式):
方式一,在创建表的同时指定外键

-- 创建父表
create table my_class(id int primary key auto_increment,c_name varchar(20) not null,room varchar(20))charset utf8;
--引用外键创建表
create table my_foreign1(id int primary key auto_increment,name varchar(20) not null comment '学生姓名',c_id int comment '班级id',foreign key(c_id) references my_class(id))charset utf8;


方式二:在创建完表之后增加外键:
语法:alter table 表名 add (constraint 外键名字) foreign key(外键字段) references 父表(主键字段);

create table my_foreign2(id int primary key auto_increment,name varchar(20) not null comment '学生姓名',c_id int comment '班级id')charset utf8;alter table my_foreign2 add constraint student_class  foreign key(c_id) references my_class(id);

删除外键:
alter table 表名 drop foreign key 外键名字

alter table my_foreign1 drop foreign key my_foreign1_ibfk_1;

注意:
要使外键创建成功,首先要保证表的存储引擎是innodb(否则即使创建成功也不会有效果)。
注意外键的列类型必须和父表的主键列类型相一致。
外键有三种模式:
District:严格模式(默认的),父表不能更新或删除一个字表已经引用的记录。
cascade:级联模式,父表删除被引用的字段同时字表也会跟着删除引用的字段。
set sull:置空模式,父表删除被引用的字段同时字表会将引用的字段置为空。
通常是将更新的时候模式设置为cascade,删除的时候将模式设置为set null;
指定模式的语法:
foreign key(外键字段) references 父表(主键字段) on delete set null update cascade;

浅谈MySQL连接查询与外键相关推荐

  1. Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束”

    Sql语句中两个比较迷糊的概念:"连接查询" 与 "外键约束 Sql 中的连接查询:就是为了避免笛卡尔积,因为涉及到多表查询的化,不使用连接查询,会先将多个互相乘,求出笛 ...

  2. 浅谈 MySQL 子查询及其优化

    2019独角兽企业重金招聘Python工程师标准>>> 使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动 ...

  3. mysql外键约束查询语句_MySQL数据库 : 查询语句,连接查询及外键约束

    查询指定字段        select 字段1,字段2 from 表名; 消除重复行(重复指的是结果集中的所有完全重复行)             select distinct 字段1,字段2.. ...

  4. js 递归查询所有的叶子结点_浅谈mysql的查询过程

    步骤 查询过程上看,大致步骤如下: 查看缓存中是否存在id 如果有则从内存中访问,否则要访问磁盘 将索引数据存入内存,利用索引来访问数据 对于数据也会检查数据是否存在于内存 如果没有则访问磁盘获取数据 ...

  5. MySQL外键关联(一对多)MySQL连接查询

    MySQL外键关联(一对多) 外键说明 什么是外键? 1)表A中有字段(如身份证号)做了主键,表B中也有这个字段(身份证号),这里的身份证号一定来自表A同样字段里的内容,但再B表中身份证号对应id可以 ...

  6. 浅谈 MySQL 连表查询

    浅谈 MySQL 连表查询 连表查询是一把双刃剑, 优点是适应范式, 减少数据冗余; 缺点是连表查询特别是多张表的连表会增加数据库的负担, 降低查询效率. 简介 连表查询就是 2 张表或者多张表的联合 ...

  7. 浅谈mysql的主键和索引

    在上一篇文章<count(1).count(*).count(字段)哪个更靠谱>中,我们提到过主键是优化不了count的查询效率的,需要建索引才可以,那么,是不是意味着主键的效率还不如一般 ...

  8. MySQL子查询的优缺点_浅谈mysql的子查询

    浅谈mysql的子查询 mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,你可以点击这里 ,这里来获得一些信息,mysql在处理子查询的时候,会 ...

  9. 二、MySQL连接查询学习笔记(多表连接查询:内连接,外连接,交叉连接详解)

    MySQL连接查询(多表连接查询:内连接,外连接,交叉连接详解) 6:多表连接查询 笛卡尔乘积:如果连接条件省略或无效则会出现 解决办法:添加上连接条件 连接查询的分类: 1.按年代分类:1)sql ...

最新文章

  1. 自定义的无数据提示界面
  2. Deployer 的使用
  3. 让你更好使用Vista的设置技巧
  4. Tomcat servlet工作原理
  5. Spring与Rails的jQuery UJS
  6. 用生动的例子花式解释:python类中一定需要有 __init__方法么?没有会怎样?
  7. linux下的socket在哪个头文件,linux下socket编程常用头文件
  8. 第10课:Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考
  9. 【elasticsearch】You AutoComplete Me
  10. OPPO推送:推送消息的字串,用于参数
  11. TTL门电路与CMOS门电路
  12. 蓝牙键盘常用快捷键记录
  13. 当我跑步时我在想什么读后感
  14. 做网站需要用到哪些开发软件——心得分享
  15. 2018年诺贝尔经济学奖揭晓!两位美国教授获奖
  16. 线上教学,师生“网上见”
  17. osg 三维gis开发_OSG三维模型初探
  18. malloc与free函数原型
  19. Matlab/simulink、Saber及PSpice学习比较
  20. 中国的杀毒行业真有意思

热门文章

  1. 商务日语邮件规范和技巧
  2. 利用IDL读取HDF5文件
  3. 11.业余无线电常用网站和软件
  4. BOSH相关术语解释
  5. php 使用tp框架写留言板,基于thinkPHP框架实现留言板的方法
  6. python 吃豆人_用tkinter编写的伪吃豆人
  7. 《Bag of Tricks for Node Classification with Graph Neural Networks》阅读笔记
  8. 无ROOT不安卓Windows11安卓子系统WSA解锁Root并包含谷歌应用商店GMS保姆级手把手安装教程含程序资源
  9. boost intrusive_ptr指针
  10. LTE中的各种ID含义