建设银行网站可以打印流水吗,重庆网站建设设计,订阅号如何申请,网络营销的核心是什么1.数据库约束
数据库自动对数据的合法性进行校验检查的一系列机制#xff0c;目的是为了保证数据库中能够避免被插入或者修改一些非法数据。
#xff08;1#xff09;mysql中提供了以下的约束#xff1a;
a.NOT NULL#xff1a;指定某列不能为null
b.UNIQUE#xff1…1.数据库约束
数据库自动对数据的合法性进行校验检查的一系列机制目的是为了保证数据库中能够避免被插入或者修改一些非法数据。
1mysql中提供了以下的约束
a.NOT NULL指定某列不能为null
b.UNIQUE该列不能重复的值唯一
通过UNIQUE这个约束会让后续插入修改数据时都会先进行一次查询通过该次查询看数据是否存在从而这个操作就会影响执行效率Mysql数据库是比较吃资源的是一个比较慢的系统相对其他数据库而言。
c.PRIMARY KEY主键是NOT NULL和UNIQUE的结合代表某列既不能为null且是唯一的
一张表中只有一个主键。主键一般会搭配auto_increment自增来进行使用在进行插入数据的时候就不需要手动去赋值mysql会根据当前主键的值自动分配一个值从1开始用来表示主键的唯一性。
使用auto_increment主键一般是int/bigint类型时需要注意
如果此时里面已经有1,2,3,4这几个主键此时插入一个主键9此时后续在进行插入数据时会从9开始往后加中间主键没用到的地方只能通过手动插入的方式来进行设置。
eg现有一张表studentcreate table student values(id int primary key auto_increment,name varchar(20)); 里面有id主键和name属性此时插入数据insert into student values(null,lisi),(null,zhangsan);可以看到这里的主键在添加auto_increment对id传null表示交给mysql去处理给我们自动分配一个值而不是表示null值如果没有这个auto_increment的话就会报错主键不能为null。
d.FOREIGN KEY外键保证一个表中的数据匹配另一个表中的值的参照完整性
ps
外部约束的那一列必须是主键/UNIQUE唯一被外部约束的键放在前面外部进行约束的键放在最后。两张表此时相当于建立了一个父子关系。如果外键创建成功那么每一次插入/修改数据的时候都会先去父表中查询一下是否存在这个过程也会一定程度上影响执行效率。
egclass表父create table class values(classid int primary key, classname varchar(20);)
student表子create table student values(id int,name varchar(20), foreign key(id) references class(classid);)
如果class中classid不是主键创建student表时不会创建成功。如果创建成功student表中id属性将会被class中classid属性给约束id属性进行插入时只能插入classid中有的值没有的插入不成功父类约束子类如果想对class中的classid属性进行修改如果在student中被用了此时修改不会成功子类在一定程度上也会约束父类。
不能直接删除父表如果要删除需要先删除子表然后再进行删除父表。
e.CHECK保证列中的值符合指定条件对于Mysql数据库忽略CHECK字句
f.DEFAULT某列在没有赋值的时候的默认值没有进行修改这个dafault就默认为null
以上约束都是在表创建时所加的约束一旦表已经创建好了就不可在进行约束的更改除非删表重新创建表。
2.查询进阶
1查询搭配插入使用
eginsert into s1 select * from s2; 将s2中的所有数据插入到s1中前提两个表中的数据类型个数顺序要一致。
2聚合查询
前面的表达式查询是针对列与列之间的查询而聚合查询是针对行与行之间的查询。 a.count
egselect count(*) from s1; ( 假如s1表中有8条数据其中有一条为null)
select count(distinct english) from s1;( s1表中有个english属性english属性中一条null记录两条重复的记录)
此时得到的结果为8count(*)这个操作会包含null这条记录且不会进行去重,但单单用count计算某一列的数量如果没加distinct的话此时也是计算的总行数加了去重的话就不一定了不会将null计算进去在这里得到的结果也就是7
b.sum
数字类型求和
egselect sum(english) from s1; (计算s1表中所有english加起来的成绩)
字符窜类型求和
egselect sum(name) from s1;这个操作mysql会尝试把字符串转化成double类型的数据如果转化失败会报错否则可以正常进行运算结果为0并且会报警告可以通过show warnings; 操作进行警告的查看
如果有这样的规则那么插入数据:insert into s1 values(006,95);以数字的这种形式 此时对name进行求和就可以得到6
表达式求和
egselect sum(englishchinese) from s1;s1表中还有个chinese属性此时结果为整个表中chinese和english的总和
其他使用方式大多相似不一一进行列举参考上述两种方式。
3group by
主要有两种用法
加where分组之前的的条件在group by 之前
加having分组之后的条件在group by 之后
eg现有一张工资表一个公司各个职位的工资s(有name,role,salary属性)现要查询除了张三以外所有员工分职位的平均工资应该执行的操作为select name avg(salary) from s where name ! 张三 group by role; 很明显这个条件应该是在分组之前被执行所以用where。现还要查询每个岗位的工资除了工资超过2w的岗位应该执行的操作为select name,avg(salary) group by role having avg(salary) 20000;
4联合查询
前面的查询都是针对一个表进行查询而在实际开发过程中经常可能会对多个表进行查询此时就需要用到联合查询。
关键思路笛卡尔积。笛卡尔积是简单无脑的排列组合把所有情况都列举了一遍需要通过连接条件来筛选出有意义的数据。笛卡尔积的行数是多个表的行数相乘列数是多个表的列数相加。
a.内连接
语法select 列名 from 表1 as 别名1,表2 as 别名2 where 连接条件 and 连接条件;
select 列名 from 表1 as 别名1 [inner] join 表2 as 别名2 on 连接条件 and 连接条件;
b.外连接
分为左外连接和右外连接。左侧的表表1完全显示出来就是左外连接右侧的表表2完全显示出来就是有外连接另一侧表不存在的用null/default填充。
语法select 列名 from 表1 as 别名1 left join 表2 as 别名2 on 连接条件 and 连接条件;
select 列名 from 表1 as 别名1 rightjoin 表2 as 别名2 on 连接条件 and 连接条件;
内连接和外连接的关系
如果两张表中的数据是一一对应的则内连接与外连接没有区别
如果不是一一对应的则内外连接所查询到的结果不同。
5自连接
一张表自己与自己进行笛卡尔积通过此方式可以实现一张表中行与行之间的比较。mysql本身只能进行列与列之间的比较。
6子查询
本质是套娃会把多个简单的sql语句变成一个复杂的sql语句违背了编程设计的一贯原则在实际开发中不建议使用但是还是需要了解一下。
eg:现在有stutdent表(里面有nameclassid等属性)现在要查询“张三”(假设张三所在班编号为1)的同班同学应该执行的操作select classid from student where name “张三”; select name,classid from student where classid 1 and name ! 张三; 而用子查询的话sql语句select name,classid from student where classid (select classid from student where name “张三”) and name ! 张三;
7合并查询
使用union关键字把多个sql查询的结果集合合并在一起。合并的前提是两个表的列属性参数类型个数和顺序列名可以不同要相同。