MySQL的外键


  1. 什么是外键,很简单保持数据一致性的一个约束键。如果你有两张表,第一张是学生表,第二张表是一个成绩表,我们来看看保持数据一致性,其实在Django等框架的模型中中也能做关联获取对象。

第一张表 成绩表

第二张表 学生表

保持数据一致性

我们来看看,当键不一致的时候,数据是插不进去的哦,保证了数据一致性。

  1. mysql> insert into student(sid,name) values("A0004","Tom");
  2. ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`school`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `score` (`sid`))
  3. mysql> insert into student(sid,name) values("A0001","Tom");
  4. Query OK, 1 row affected (0.00 sec)
  5. mysql> insert into student(sid,name) values("A0002","Bill");
  6. Query OK, 1 row affected (0.01 sec)
  7. mysql> insert into student(sid,name) values("A0003","Jill");
  8. Query OK, 1 row affected (0.00 sec)

高级查询


  1. 还是用上面两张表做例子

连接查询

内连接

没有on条件的时候就是笛卡尔积,有条件的时候按照条件执行,条件关键字on,使用where也可以,但是效率会低很多;

  1. select * from student join score on student.sid=score.sid;

外链接

与内连接相似,但是条件不匹配的项会保留,不匹配字段填写NULL,左和右指得的是以谁为主表

我们做个测试,为了体现不匹配的样子,先向score插入一条数据

  1. insert into score(sid,value) values("A0004",90);

内连接的状态的

左连接

左表为主

  1. select * from score left join student on student.sid=score.sid;

右连接

右表为主

  1. select * from student right join score on student.sid=score.sid;

交叉连接

循环去每一条数据进行匹配,结果是笛卡尔积

  1. select * from student cross join score;
  2. #或者
  3. select * from student,score;

自然连接

联合查询

将多次查询(多条select语句), 在记录上进行拼接(字段不会增加),就是这么简单,但是注意,字段数量要一致,字段数量要一致,字段数量要一致,重要的事情说三遍。一般用于相同结构的多表查询。

  1. select id,name from student union select * from score;

子查询

一般的from where exists后面都是子查询

重点是from 后面可以接select语句、where后面也可以跟select语句,举几个例子

  1. select * from (select sid from score) as a;
  2. select * from score where sid in (select sid from student);



exists可以理解为一个函数,里面是一个条件,如果存在就是返回1,否则是0,exists放在where后面

去重查询

  1. SELECT DISTINCT column1,column2,... FROM table-name;

MySQL外键和高级查询(连接查询、联合查询、子查询、去重查询)的更多相关文章

  1. MYSQL - 外键、约束、多表查询、子查询、视图、事务

    MYSQL - 外键.约束.多表查询.子查询.视图.事务 关系 创建成绩表scores,结构如下 id 学生 科目 成绩 思考:学生列应该存什么信息呢? 答:学生列的数据不是在这里新建的,而应该从学生 ...

  2. mysql 外键和子查询,视图

    1.mysql 外键约束 建表时生成外键   foreing key ('sid') references' student'('id'); 建表后添加外键  alter table' course ...

  3. mysql外键,锁

    mysql外键: 场景:用于建立两个表之间的联系,让A表中一个字段,可以在另一个表中字段值的范围去查找 注意事项: (1)被参照表和参照表字段属性必须一致 (2)参照表必须设置主键 (3)必须选择支持 ...

  4. MySQL外键约束On Delete、On Update各取值的含义

    主键.外键和索引的区别?   主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...

  5. Mysql 外键设置

    MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个:    一个是让数据库自己通过外键来保证数据的完整性和一致性    一个就是能够增加ER图的可读性    有些人认为外键的建立会给 ...

  6. mysql 外键问题

    清空.删除具有外键约束的表时报ERROR 1701(42000)的解决 解决方法: 解除外键约束mysql> set foreign_key_checks=0; 删除表后添加外键约束 mysql ...

  7. mysql 外键约束备注

    梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...

  8. MySQL外键之级联

    简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...

  9. MySQL外键的作用和创建

    MySQL外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据.使两张表形成关联,外键只能引用外表中列的值! 我们来建两个表 CREATE TABLE `example1` ( ` ...

随机推荐

  1. matlabr2015b安装教程

    R2015b MATLAB破解版安装教程 MATLAB和Mathematica.Maple并称为三大数学软件.它在数学类科技应用软件中在数值计算方面首屈一指.MATLAB可以进行矩阵运算.绘制函数和数 ...

  2. 使用 CGContextRef 进行简单内容绘制

    摘要 : CGContextRef 功能强大,我们借助它可以画各种图形.这里所举例子只是简单内容绘制,冰山一角,对此感兴趣的朋友可以举一反三,实现各种酷炫效果. 效果如下: KMDrawView.h ...

  3. 设置wetty不需要账号登录便可进行命令行操作

    前一篇随笔我们将了Linux怎么安装部署Wetty服务,但是我们看到,在浏览器中输入http://127.0.0.1:3000进行访问的时候,还需要我们输入账号密码进行认证(如下图第一行所示). 但在 ...

  4. 自动换行后缩进怎么做(CSS)?(可用于 Li y 元素的排版)

    <style type="text/css">li{ width:100px; border:1px solid #ccc; padding-left:25px; te ...

  5. Java正则表达式的使用和详解(下)

    1.常用正则表达式 规则 正则表达式语法   一个或多个汉字 ^[\u0391-\uFFE5]+$  邮政编码 ^[1-9]\d{5}$ QQ号码 ^[1-9]\d{4,10}$  邮箱 ^[a-zA ...

  6. mysql 连接字符串 CONCAT

    以前用SQL Server 连接字符串是用“+”,现在数据库用mysql,写个累加两个字段值SQL语句居然不支持"+",郁闷了半天在网上查下,才知道mysql里的+是数字相加的操作 ...

  7. 字符编码笔记:ASCII,Unicode 和 UTF-8

    http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

  8. Dubbo -- 系统学习 笔记 -- 示例 -- 只注册

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 只注册 问题 如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部 ...

  9. 对象克隆技术Object.clone()

    Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象. 所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象. ...

  10. zabbix的启动和关闭脚本

    1. zabbix客户端的系统服务脚本 1.1 拷贝启动脚本 zabbix的源码提供了系统服务脚本,在/usr/local/src/zabbix-3.2.6/misc/init.d目录下,我的系统是C ...