• 多表操作


    外键

    ①外键是指引用另一个表中的一列或多列(被引用的列应具有主键约束或唯一性约束),建立和加强两个表数据之间的链接

    首先,创建两个名为student和class的表并给表添加数据

    (student表中的class_id是引入了class表中的主键id,从而建立了两个表数据之间的连接。即class_id作为student表的外键)

    (被引用的表class是主表,引用外键的表student是从表,两表是主从关系)

    (注意:建立的表都必须是INNODB型,不能是临时表,不然不能使用外键)

     

     

     

    (注意:引入外键后,外键列只能插入参照列存在的值,参照列被参照的值不能被删除,保证了数据的参照完整性)

    (例:下图class表中的id被student表中的class_id引用,那么class表中的id列就不能被删除。如果将student表中class_id列的1913都改为1923或者把1913的那几条学生信息都删掉,那class表中id列的1913那一行就可以成功删除了。可以用语句DELETE FROM class WHERE 条件;进行删除)

     

     

    ②为表添加外键约束

    ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段名) REFERENCES 外表表名(主键字段名);

    (注意:定义外键名时,不能加引号。如:constraint 'FK_ID' 或 constraint " FK_ID "都是错误的)

     

     

    添加外键约束的参数说明

    ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段名) REFERENCES 外表表名(主键字段名);

    【ON DELETE {CASCADE或SET NULL或NO ACTION或RESTRICT }】

    【ON UPDATA {CASCADE或SET NULL或NO ACTION或RESTRICT }】

     

    ③删除外键约束

    ALTER TABLE表名DROP FOREIGN KEY 外键名;

     

    关联关系

    ①多对一

    比如,学生与班级之间的关系,一个班级可以有多个学生,而一个学生不能属于多个班级,也就是说班级表中的一行在学生表中可以有许多匹配行,但学生表中的一行在班级表中只能有一个匹配行。

    在多对一的表关系中,应该将外键建在多的一方,否则会造成数据的冗余。

    ②多对多

    比如学生与课程之间的关系,一个学生可以选择多门课程,当然一门课程也供多个学生选择,也就是说学生表中的一行在课程表中可以有许多匹配行,课程表中的一行在学生表中也有许多匹配行。

    通常情况下,为了实现这种关系需要定义一张中间表(称为连接表),该表会存在两个外键。连接表的两个外键都是可以重复的,但是两个外键之间的关系是不能重复的,所以这两个外键又是连接表的联合主键。

    ③一对一

    比如人与身份证之间就是一对一的关系,一个人对应一张身份证,一张身份证只能匹配一个人。

    一对一关系的两张表在建立外键时,首先要分清主从关系。从表需要主表的存在才有意义,就像身份证需要人的存在才有意义。因此人为主表,身份证为从表,要在身份证表中建立外键。由实际经验可知,身份证中的外键必须是非空唯一的,因此通常会直接用从表中的主键作为外键。

    在实际开发中,一对一关联关系可以应用于:分割具有很多列的表、由于安全原因而隔离表的一部分、保存临时的数据,并且可以毫不费力地通过删除该表而删除这些数据。

    连接查询

    ①交叉连接

    交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积。例如department表中有4个部门,employee表中有4个员工,则交叉连接的结果就有4*4=16条数据。

     

     

     

    SELECT * from 表1 CROSS JOIN 表2;

     

    ②内连接又称简单连接或自然连接

    内连接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组合成新的记录。

    SELECT 查询字段 FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段=表2.关系字段;

    例:在department表和employee表之间使用内连接查询

     

    例:在department表和employee表之间使用WHERE

     

    例:在department表和employee表之间使用自连接查询

     

    ③外连接分为左连接和右连接

    SELECT 所查字段 FROM 表1(左表) LEFT或RIGHT【OUTER】JOIN 表2(右表) ON 表1.关系字段=表2.关系字段 WHERE 条件;

    LEFT JOIN(左连接):左连接的结果包括LEFT JOIN子句中指定的左表的所有记录,和所有满足连接条件的记录。如果左表的某条记录在右表中不存在,则在右表中显示为空。

    RIGHT JOIN(右连接):右连接与左连接正好相反,返回右表中所有指定的记录和所有满足连接条件的记录。如果右表的某条记录在左表中没有匹配,则左表将返回空值。

    例:在department表和employee表之间使用左连接查询

     

    例:在department表和employee表之间使用右连接查询

     

    ④复合条件连接查询

    复合条件连接查询就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确。

    例:在department表和employee表之间使用内连接查询并将查询结果按照年龄的升序排序

     

    ⑤子查询

    1.带IN关键字的子查询

    使用IN关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列中的值将供外层查询语句进行比较操作。

    例:查询存在年龄为20岁的员工的部门

     

    例:查询不存在年龄为20岁的员工的部门

     

    2.带EXISTS关键字的子查询

    EXISTS关键字后面的参数可以是任意一个子查询,这个子查询的作用相当于测试,它不产生任何数据,只返回TRUE或FALSE,当返回值为TRUE时,外层查询才会执行。

    例:查询employee表中是否存在年龄大于21岁的员工,如果存在,则查询department表中的所有记录

     

    3.带ANY关键字的子查询

    ANY关键字表示满足其中任意一个条件,它允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件。

    例:使用带ANY关键字的子查询,查询满足条件的部门

     

    4.带ALL关键字的子查询

    ALL关键字与ANY有点类似,只不过带ALL关键字的子查询返回的结果需同时满足所有内层查询条件。

    例:使用带ALL关键字的子查询,查询满足条件的部门。

     

    5.带比较运算符的子查询

    例:使用带比较运算符的子查询,查询赵四是哪个部门的员工

  • 相关阅读:
    Linux上统计文件夹下文件个数
    linux----tail 过滤日志文件中的关键字
    Linux----Makefile
    Python--day 3
    Python--day 2
    Python--day 1
    Ubuntu14.04 64位网易云播放器
    qt 串口通信学习的目录
    qt layout 注意要点
    模拟电子第一章半导体
  • 原文地址:https://www.cnblogs.com/zhajiye/p/11961555.html
Copyright © 2020-2023  润新知