Mysql基础语法2

(接上篇)
六、数据的完整性
作用:保证用户输入的数据保存到数据中是正确。确保数据的完整,就需要在创建表的时候添加约束。
完整性的分类:
1.实体完整性
2.域完整性
3.引用完整性

6.1 实体完整性
实体:即表中的一行(一条记录)就代表一个实体类。
实体完整性的作用:表示每一行数据不能重复。
约束类型:主键约束(primary key)、唯一约束(unique)、自增长列(auto_increment)

6.1.1主键约束(primary key)
注:每个表中最多只能有一个主键。
特点:数据唯一,则不能为null
例如:
第一种添加方式:在创建表的时候去指定哪一个字段是主键
在这里插入图片描述
第二种添加方式:在创建表的时候去指定哪一个字段是主键
在这里插入图片描述

第三种添加方式:在创建表之后去指定哪一个字段是主键。
在这里插入图片描述

6.1.2 唯一约束(unique)
特点:数据不能重复
在这里插入图片描述

6.1.3 自动增长列(auto_increment)
sqlserver数据库(identity) oracle数据库(sequnce)
给主键添加自动增长的数值,列只能整数类型
在这里插入图片描述
6.2.1 域完整性
域完整性的作用:限制此单元格的数据正确的,不对照此列的其他单元比较域代码此单元格。
域完整约束:数据类型,非空约束(not null),默认值约束(default) check约束(mysql不支持) check(sex=‘男’
or sex=‘女’);
6.2.2 非空约束(not null):
在这里插入图片描述

6.2.3 默认值约束(default):
在这里插入图片描述

6.3 引用完整性
外键约束:FOREGIN KEY
例如:
第一种方式:在创建表的时候去指定哪一个字段是外键。
在这里插入图片描述
在这里插入图片描述

6.4 表与表之间的关系
一对一:例如:person表和card表。即人和身份证。这种情况需要找出主从关系,即谁是主表,谁是从表 。
人可以没有身份证,但身份证必须有人才行。所以人是主表,而身份证是从表。设计从表的时候有两种方
案:
1.在card表中添加外键列(相对于person表),并且给外键添加一个唯一约束;
2.在card表中的主键添加外键约束(相对于person表),即card表的主键需要和person中的外键相连接
在这里插入图片描述

一对多:最为常见的就是一对多!一对多和多对一,这是从哪个角度去看的出来。一个老子可以有多个儿
子,但是多个儿子只能一个老子(除了干爹)
在这里插入图片描述

多对多:即一个学生可以有多个老师,而一个老师也可以教多个学生。这种情况通常需要创建中间表来处理
多对多的关系。例如再创建一张stu_tea,给出两个外键,一个相对于student表的外键,一个相对于teacher
表的外键

在这里插入图片描述

多表查询有如下几种:(个人觉得是重点)
合并结果集:UNION、UNION ALL。连接查询:
内连接:[INNER] JOIN ON
外连接:OUTER JOIN ON
左外连接:LEFT [OUTER] JOIN
右外连接:RIGHT [OUTER] JOIN
全外连接(MYSQL不支持):FULL JOIN
自然连接: NATURAL JOIN
子查询

7.1合并结果集
1.作用:合并结果集就是把两个select语句的查询的结果合并到一起。
2.合并结果集有两种方式:
A.UNION:去除重复记录,例如:select * from t1 union select * from t2;
B.UNION ALL:不去出去重复记录,例如:select * from t1 union all select * from t2;

要求:被合并的两个结果:列数、列类型必须相同的

在这里插入图片描述

在这里插入图片描述

7.2连接查询(非常重要)
连接查询就是求出多个表的乘积,例如t1连接t2,那么查询出来的结果就是t1*t2。
在这里插入图片描述

连接查询会出现笛卡尔积,假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积{(a,0),(a,1),(a,2),(b,0)
……}。可以扩展到多个集合的情况。
那么多表查询产生这样的结果并不是我们想要的,那么怎么去除重复数据以及不想要的记录呢?当然是通过条件过
滤。通常要查询的多个表之间都存在着关联关系,那么就通过关联关系去除笛卡尔积。
你能想象到emp表和dept表连接查询的结果吗?emp一共有14条记录,dept一共4条记录,那么连接查询后的结果
必然是56条记录,这56条必然有很多很多是垃圾数据。
如果你只是想在查询emp表的同时,把每个员工的所在的部门信息显示出来,那么就需要主外键来去除无用的信息
了。

使用主外键来去除重复信息
在这里插入图片描述
还可以给表起个别名,然后在引用列时使用别名即可。as也是可以省略的

7.2.1 内连接
上面的连接语句就是内连接,但是它不是SQL标准中的查询方式,可以理解为方言,但是是最为常用的。标准的内
连接为(inner可以省略):
在这里插入图片描述

内连接的特点:查询结果必须满足条件。(划重点)

7.2.2 外连接(左连接、右连接)
外链接的特点:查询出的结果存在不满足条件的可能。
左连接是先查询出左表(以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件为null。
右连接就是先把右表中所有记录查询出来,然后左表满足条件的显示,不满足条件的为null。

个人连接查询心得:
连接不限于两张表,连接查询也可以是三张、四张,甚至是N张表的查询。通常连接查询不可能需要整个笛卡尔积
的,而只是需要其中一部分,那么这是就需要使用条件去除不需要的记录。这个条件大多数情况下都是使用主外键
关系来去除的。
两张表的连接查询有一个主外键关系的,三张表的连接查询就有两个主外键关系,所以在大家不是很熟悉连接查询
时候,首先要学会如何去除无用的笛卡尔积,那么就是用主外键关系来作为条件来处理。如果是两张表的查询,那
么至少有一个主外键的条件,三张表连接至少有两个主外键的条件。

7.2.3 自然连接
在我们连接查询的时候都会生产无用的笛卡尔积,我们通常使用主外键关系等式来去除它。而自然连接无需你给出
主外键等式,它会自动找到这一等式;
两张表的表中名称和类型必须完全一致的列作为条件!!

7.3 子查询(非常重要)
一个select语句中包含另一个完整的select语句。
子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或者两个以上SELECT,那么就是字查
询语句了。
子查询出现的位置:
①where后,作为被查询的条件的一部分。
②from后,作为表;
当子查询出现在where后作为条件时,还可以使用如下关键字:
①any
②all
子查询结果集的形式:
单行单列(用于条件)
单行多列(用于条件)
多行单列(用于条件)
多行多列(用于表)

练习:
1.工资高于周泰的员工
分析:表:emp
条件:查询周泰的工资。
sal>周泰的工资。
在这里插入图片描述

例子2:

在这里插入图片描述

八、触发器(简单介绍)
触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析师来保证数据完整性的一种方
法,它是与表时间相关的特殊的存储过程,它的执行不是由程序调用,也不是手动启动。而是由时间来进行触发。
例如,当对一张表进行操作(insert、delete、update)时就会激活它的执行。
触发器常用于加强数据的完整性约束和业务规则等。触发器创建语句四要素:
1.监听地点(table)
2.监听事件(insert、update、delete)
3.触发时间(after/before)
4.触发事件(insert、update、delete)
事先为某一张表绑定好一段代码,当表中的某些内容发生改变时候(增删改)系统会自动触发代码,执行。一张表
最多能有6个触发器。
8.1创建触发器
在mysql高级结构中没有大括号。都是用对应的字符符号代替
触发器基本语法: Delimter 自定义符号:后续代码中只有碰到自定义符号才算结束。如果不这样的话,当检测到
语句有分号 系统会自动认为是结束语句 临时修改语句结束符 Create trigger 触发器名称 触发时间 事件类型 on 表
名 for each row begin —表示左大括号 开始 类似与java的左大括号{
sql语句;
end —表示右大括号 结束 类似与java的右大括号 } 自定义符号 最后将临时修改修正过来 Delimter ;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.2查看触发器
查看所有触发器或者模糊匹配: show triggers; 查看所有触发器
show create trigger 触发器名字;可以查看触发器创建语句 所有的触发器都会保存在一张表中:
Information_schema.triggers;

8.3修改&删除触发器
触发器不能修改,只能删除,再新建。 Drop trigger 触发器名称;

8.4触发器记录
触发器记录:不管触发是否触发了,只要当某种操作准备执行,系统就会将当前要操作的
记录的当前状态和即将执行之后新的状态给分别保留下来,供触发器使用。其中,要操作的
当前状态保存到old中,操作之后的可能形态保存给new。
old:表示旧记录。插入的时候是没有old的
new:表示新记录。删除的时候是没有new的
old和new都是代表记录本身,任何一条记录除了有数据,还有字段和名字
使用方式:old.字段名 new.字段名
修改之后的版本:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值