[mysql新增空格字段]MySQL-2-函数和约束(结合案例学习)
表达式是指几段能间接被另几段业务流程初始化的业务流程或标识符。 也就意味著,这几段业务流程或标识符在MySQL中早已给他们提供更多了,他们要做的是在最合适的销售业务情景初始化相关联的表达式顺利完成相关联的销售业务市场需求方可。
MySQL中的表达式主要就分成下列五类: 数组表达式、值表达式、年份表达式、业务流程表达式。
其用语是
表达式机能CONCAT(s1, s2, …, sn)数组堆叠,将s1, s2, …, sn堆叠成两个数组CONCAT_WS(s,s1, s2, …, sn)以s做为连接符展开数组堆叠,将s1, s2, …, sn堆叠成两个数组,尾端的连接符是sLOWER(str)将数组全数转成小写UPPER(str)将数组全数转成小写LPAD(str, n, pad)左充填,用数组pad对str的右边展开充填,达至n个数组宽度RPAD(str, n, pad)右充填,用数组pad对str的右边展开充填,达至n个数组宽度TRIM(str)拿掉数组颈部和前部的字符(数组尾端的不处置),相近的有LTRIM和RTRIMSUBSTRING(str, start, len)回到从数组str从start边线起的len个宽度的数组,检索从1早已开始
堆叠
用双引号堆叠
小写
小写
左充填
右充填
除去字符
切碎(初始检索为1)
特别注意这儿的检索从1早已开始的,而并非0。
数组表达式的数组如果是纯数字(值型数据)的话,MySQL会在内部自动转化为数组展开操作。
充填时的宽度5是充填到宽度5,并非充填5个。
充填时如果pad太长,会依次从左早已开始选择n-len(str)个字符做为要充填的部分。
充填时如果n>len(str),则会依次对str从左早已开始选择n个字符做为最终结果。
rpad与lap对于上面特殊情况处置规则相同。
这些都是数组表达式,所以生成的一定是数组型数据,比如如果对 id 这一列使用此标识符,就不会生效,因为生成的是数组,但是id这一列储存是是值型数据,所以不会将生成的结果赋值给id,但是就会生效,因为生成的数组能打印出来。
由于销售业务市场需求变更,企业员工的工号,统一为5位数,目前不足8位数的全数在前面补0。比如: 1号员工的工号应该为00000001。
表达式机能CEIL(x)向上取整FLOOR(x)向下取整MOD(x, y)回到x/y的模RAND()回到0~1内的随机数ROUND(x, y)求参数x的四舍五入值,保留y位小数pow(x, y)求exp(x)求sqrt(x)求
ceil:向上取整
floor:向下取整
mod:取模
rand:获取随机数
round:四舍五入
通过数据库的表达式,生成两个六位数的随机验证码。
思路: 获取随机数能通过rand()表达式,但是获取出来的随机数是在0-1之间的,所以能在其基础
上乘以1000000,然后舍弃小数部分,如果宽度不足6位,补0。
or
表达式机能CURDATE()回到当前年份CURTIME()回到当前时间NOW()回到当前年份和时间DATE(date)获取指定date的年份 ‘year-month-day’TIME(date)获取指定date的时间 ‘hour:minute:second’YEAR(date)获取指定date的年份MONTH(date)获取指定date的月份DAY(date)获取指定date的天数HOUR(date)获取指定date的小时MINUTE(date)获取指定date的分钟SECOND(date)获取指定date的秒数DATE_ADD(date, INTERVAL expr type)回到两个年份/时间值加上两个时间间隔expr后的时间值ADDTIME(date, time)回到两个年份/时间加两个时间的结果,加的时间形式为’day hour:minute:second’DATE_SUB(date, INTERVAL expr type)回到两个年份/时间值减去两个时间间隔expr后的时间值DATEDIFF(date1, date2)回到初始时间date1和结束时间date2之间的天数,回到整数TIMEDIFF(time1, time2)回到初始时间time1和结束时间time2之间的时间差,回到 hour:minute:secondTIME_TO_SEC(time)将时间转化为秒数,输入的时间格式为 hour:minute:second ,回到整数second
curdate:当前年份
curtime:当前时间
now:当前年份和时间
YEAR , MONTH , DAY , HOUR , MINUTE , SECOND:年、月、日、时、分、秒。
date_add:增加指定的时间间隔
type有很多,如:YEAR , MONTH , DAY , HOUR , MINUTE , SECOND,YEAR_MONTH,MONTH_DAY等
其中YEAR_MONTH的使用方法为(表示增加4年2个月)addtime:增加指定的时间间隔
增加5天后增加240个小时(一共15天)datediff:获取两个年份相差的天数
timediff:获取两个年份相差的时间
查询所有员工的入职天数,并根据入职年份倒序排序。
思路: 入职天数,是通过当前年份 - 入职年份,所以需要使用datediff表达式来顺利完成。对于在同一天入职的员工,他们能使用相同的方法首先用timediff表达式获得时间差,然后再通过time_to_sec来换成秒数展开比较入职的时间就能了。
当然MySQL也能自动排序
表达式机能IF(value, t, f)如果value为true,则回到t,否则回到fIFNULL(value1, value2)如果value1不为空,回到value1,否则回到value2CASE WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END如果val1为true,回到res1,… 否则回到default默认值CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END如果expr的值等于val1,回到res1,… 否则回到default默认值
if
ifnull
case when then else end
查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)
统计班级各个学员的成绩,展示的规则如下:
>=85 : 展示优秀
>=60:展示及格
否则 :不及格
导入成绩:
本事例的语句如下:
概念:束缚是作用于表中表头上的规则,用于限制存储在表中的数据,能再创建表/修改表的时候添加束缚。
目的:保证数据库中数据的正确、有效性和完整性。
分类:
束缚描述关键字非空束缚限制该表头的数据不能为nullNOT NULL唯一束缚保证该表头的所有数据都是唯一、不重复的UNIQUE主键束缚主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY默认束缚保存数据时,如果未指定该表头的值,则采用默认值DEFAULT检查束缚(8.0.1版本后)保证表头值满足某两个条件CHECK外键束缚用来让两张图的数据之间建立连接,保证数据的一致性和完整性FOREIGN KEY
语法:在表头类型之后加上束缚的关键字方可
创建
修改
验证
特别注意:唯一键冲突和事务回滚都会导致自增主键id不连续的情况。
外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性
如图所示:
左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职年份、上级主管ID、部门ID,
在员工的信息中存储的是部门的ID dept_id ,
而这个部门的ID dept_id 关联着右侧的部门表dept的主键 id,
那emp表的dept_id是外键,关联的是dept表的主键。
emp表被称为子表或者从表;
dept表被称为父表或者主表。
特别注意:目前上述两张表,只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的,看下面的例子。
1. 准备数据:
2. 测试,删除id为1的部门信息。
此时emp表不再有主键id=1的部门,但是dept中还有外键dept_id=1,所以如果不降两张表关联,就会导致数据的不完整性。
创建
修改
删除
举例
创建:
修改
修改完能在emp表中看到下面的变化:
此时如果执行上面的删除命令,会报错
即告诉他们不能删除两个父表的记录,因为子表中外键与其关联。
删除刚刚创建的外键
如果在子表中添加的数据外键不在父表中,则会报错,但是外键能为NULL,表示待分配。
添加了外键之后,再删除父表数据时产生的束缚行为,他们就称为删除/更新行为。具体的删除/更新行为有下列几种:
行为说明NO ACTION当在父表中删除/更新相关联记录时,首先检查该记录是否有相关联外键,如果有则不允许删除/更新(与RESTRICT一致)RESTRICT当在父表中删除/更新相关联记录时,首先检查该记录是否有相关联外键,如果有则不允许删除/更新(与NO ACTION一致)CASCADE(串联)当在父表中删除/更新相关联记录时,首先检查该记录是否有相关联外键,如果有则也删除/更新外键在子表中的记录SET NULL当在父表中删除/更新相关联记录时,首先检查该记录是否有相关联外键,如果有则设置子表中该外键值为null(要求该外键允许为null)SET DEFAULT父表有变更时,子表将外键设为两个默认值(Innodb不支持)
由于NO ACTION 是默认行为,他们前面语法演示的时候,早已测试过了,就不再演示了,这儿他们演示其他的两种行为:CASCADE、SET NULL。
删除和更新——cascade
执行:
执行:
SET NULL
先手动删除、重新创建一下两表,然后创建外键。
执行: