131.【MySQL_基础篇】(三)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 131.【MySQL_基础篇】

(三)、函数 - (非聚合函数)

函数: 是指一段可以直接被另一段程序调用的程序或代码。

1. 字符串函数

(1).基础知识
  1. concat(s1,s2...sn),将s1 s2 字符串拼接成新的字符串。
  2. lower(str), 将字符串str全部转化为小写。
  3. upper(str), 将字符串str全部转化为大写。
  4. lpad(str,n,pad), 用字符串pad对str左边进行填充,直到n个字符的长度。
  5. rpad(str,n,pad), 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度。
  6. trim(str),去掉字符串头部和尾部的空格。
  7. substring(str,start,len),返回从字符串str的start位置起的len个长度的字符串。第一位的位置是1。
(2).字符串语法
select 函数;
(3).示列

1. contact

SELECT concat('hello','mysql');
• 1

2. lower 和 upper

select lower('Hello')
select upper('Hello')

3. lpad 和 rpad

select LPAD('李明',10,'_')

4. substring

select SUBSTRING('abcd',1,2)
• 1

5.由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如: 1号员工的工号应该为00001

update emp set WORKNO = LPAD(WORKNO,6,'0')
• 1

2.数值函数

(1).基础知识

常见的数值函数如下:

  1. ceil(x), 向上取整。
  2. floor(x),向下取整。
  3. mod(x,y),返回x/y的模,也就是余数。
  4. rand(),返回0~1内的随机数。
  5. round(x,y),求参数x的四社五入的值,保留y位小数。
(2).示列

通过数据库函数,生成一个随机六位数的密码。

SELECT LPAD(substring(RAND()*1000000,1,6),6,'0')
• 1

3.日期函数

(1).基本知识
  1. curdate(),返回当前日期。
  2. curtime(),返回当前时间。
  3. now(),返回当前日期和时间。
  4. year(date),获取指定date的年份。
  5. month(date),获取指定date的月份。
  6. day(date),获取指定date的日期。
  7. date_add(date,interval expr type)。返回一个日期/时间值间隔expr后的值。
  8. datediff(date1(减数),date2(被减数)),返回起始时间date1和结束时间date之间的天数。
(2).示列

1.返回当前时间

now()

2.返回指定间隔后时间是多少

select date_add(now(), interval 70 day)

3.查询入职时间为多少天

select datediff( '2023-11-08 18:45:17',now())
• 1

4.查询所有员工的入职天数,并根据入职天数倒叙排序

SELECT `NAME`,DATEDIFF(NOW(),ENTRYDATE) FROM emp ORDER BY DATEDIFF(NOW(),ENTRYDATE) DESC
• 1

4.流程函数

流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。

(1).基本知识

1.if(value,t,f),如果value为true,则返回t,否则返回f。

2. ifnull(value1,value2),如果value1不为空,返回value1,否则返回value2。

3. case when [val1] then [res1] ... else [default] end, 如果val1为true,返回res1, …否则返回default默认值。

4. case [expr] when [val1] then [res1] ... else [default] en,如果expr的值等于val1,返回res1,否则返回default默认值。

(2).示列

1.查询emp表的员工姓名和工作地址(北京/上海 --->展示为一线城市,其他的为二线城市) 使用4

SELECT `NAME`,WORKADDRESS,( CASE WORKADDRESS ⭐
  WHEN '北京' THEN 
    '一线城市' 
  WHEN '上海' THEN  
    '一线城市' 
  ELSE 
    '二线城市'  
END ) 
FROM emp;

2.统计班级各个学员的成绩,展示的规则如下: >=85优秀,>=60及格,否则不及格。 使用3

SELECT `NAME`,AGE,CASE ⭐
  WHEN AGE>=70 THEN
    '优秀'
  WHEN AGE>=60 AND AGE<70 THEN
    '及格'
  ELSE
    '不及格'
END FROM emp;
#  也可以设置多条流程函数用于求单科的优秀还是不优秀。⭐
SELECT `NAME`,AGE,
(CASE WHEN AGE>=70 THEN '优秀' WHEN AGE>=60 AND AGE<70 THEN '及格' ELSE '不及格'END),
(CASE WHEN AGE>=70 THEN '优秀' WHEN AGE>=60 AND AGE<70 THEN '及格' ELSE '不及格'END)
FROM emp;

注意

  1. when 和 then 可以写多个代表着 或 的意思。

(四)、约束

1.约束概述

(1).约束的概念

概念: 约束时作用于表中字段上的规则,用于限制存储在表中的数据。

(2).约束的目的

保证数据库中数据的正确、有效性和完整性。

(3).约束的分类
  1. 非空约束(Not Null) 限制字段的数据不能为null
  2. 唯一约束(unique) 保证该字段的所有数据都是唯一、不重复
  3. 主键约束(primary key) 主键是一行数据的唯一标识,要求非空且唯一
  4. 默认约束(Default) 保存数据时,如未指定字段则采用默认值
  5. 检查约束(check_8.0.16版本支持) 保证字段值满足某一个条件
  6. 外键约束(foreign key) 用来让两张表之间建立联系,保证数据的一致性和完整性。

注意: 约束是作用于表中字段上的,可以创建表/修改表的时候添加约束。

2.约束演示

# 会报错,因为的check约束是8.0.16版本以后才支持的,我们的数据库6.0.13版本的,所以会报错
create table user(
  id int PRIMARY key auto_increment comment '主键',
  name varchar(20) not null unique comment '姓名',
  age int check(age>0 && age<=120) comment '年龄',  # 年龄在0~120岁之间
  statu char(1) default '1' comment '状态',
  gender char(1) comment '性别' 
);

3.外键约束

(1).外键约束的概念

外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

(2).SQL语句

创建一个新的数据库: 数据库名字叫做itheima

create table dept(
id int primary key auto_increment,
name varchar(10) );
insert into dept values (null, '研发部'), (null, '市场部'), (null, '财务部'), (null, '销售部'), (null, '总经办'), (null, '人事部');
create table emp( id int primary key auto_increment,
name varchar(10),
age int, job varchar(10), 
salary int, 
entrydate date,
managerid int,
dept_id int, 
constraint fk_dept foreign key (dept_id) references dept(id)
); ⭐
insert into emp values (null, '金庸', 66, '总裁', 20000, '2000-01-01', null, 5), (null, '张无忌', 20, '项目经理', 12500, '2005-12-05', 1, 1), (null, '杨逍', 33, '开发', 8400, '2000-11-03', 2, 1), (null, '韦一笑', 48, '开发', 11000, '2002-02-05', 2, 1), (null, '常遇春', 43, '开发', 10500, '2004-09-07', 3, 1), (null, '小昭', 19, '程序员鼓励师', 6600, '2004-10-12', 2, 1), (null, '灭绝', 60, '财务总监', 8500, '2002-09-12', 1, 3), (null, '周芷若', 19, '会计', 4800, '2006-06-02', 7, 3), (null, '丁敏君', 23, '出纳', 5250, '2009-05-13', 7, 3), (null, '赵敏', 20, '市场部总监', 12500, '2004-10-12', 1, 2), (null, '鹿杖客', 56, '职员', 3750, '2006-10-03', 10, 2), (null, '鹤笔翁', 19, '职员', 3750, '2007-05-09', 10, 2), (null, '方东白', 19, '职员', 5500, '2009-02-12', 10, 2), (null, '张三丰', 88, '销售总监', 14000, '2004-10-12', 1, 4), (null, '俞莲舟', 38, '销售', 4600, '2004-10-12', 14, 4), (null, '宋远桥', 40, '销售', 4600, '2004-10-12', 14, 4), (null, '陈友谅', 42, null, 2000, '2011-10-12', 1, null);
create table salgrade( grade int, losal int, hisal int ); 
insert into salgrade values (1, 0, 3000), (2, 3001, 5000), (3, 5001, 8000), (4, 8001, 10000), (5, 10001, 15000), (6, 15001, 20000), (7, 20001, 25000), (8, 25001, 30000); 
(3).外键约束的语法

具有外键语法的表称为从表、不具有外键语法的表成为主表。

  1. 语法

第一种添加外键- 创建表的时候

create table 表名(
  字段名 数据类型,
  ...
  [constraint] [外键名称] foreign key(外键字段名) references 主表(主表列名)
)

第二种添加外键- 创建表之后

alter table 从表表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名)

删除外键

alter table 从表表名 drop foreign key 外键名称。
(4).有外键约束与外键约束情况
  1. 无外键的情况下

假如两张表数据是相互联系作用的,在没有绑定主外键的情况下,一张表数据的删除将不会影响到另一张表的删除。从而出现了数据不同步的情况。

  1. 有外键的情况下

我们尝试删除主表中的数据,我们发现提示我们删除不了这个字段,因为在从表中有行使用我们这个字段。

4.外键删除更新行为

(1).删除/更新行为
  1. not action : 在主表中删除/更新对应记录时,首先检查该记录是否对应外键,如果有则不允许删除/更新。
  2. restrict : 当在主表中删除/更新记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。
  3. cascade(级联) : 当在主表中删除/更新对应记录时,首先检查记录是否对应外键,如果有,则也删除/更新外键在子表中的记录
  4. set null : 当在主表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null (这就要求前提是外键允许null)
  5. set deffault 主表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)

注意: MySQL默认支持 no action 和 restrict 这两种行为机制。

(2).修改删除/更新行为语法
alter table 从表表名 add constraint 外键名称 foreign key (外键字段) references 主表名(主表字段名) on update xxxx on delete xxxx;
(3).级联删除/更新测试
# 先删除外键
alter table emp drop foreign key fk_dept;
# 再添加外键
alter table emp add constraint fk_dept foreign key (dept_id) references dept(id) on update CASCADE on delete cascade;
  1. 我们将主表的编码为2 更改为6.根据级联的特性,所以从表的字段内容也随着改变。

(4). set null 删除/更新测试
# 先删除外键
alter table emp drop foreign key fk_dept;
# 再添加外键
alter table emp add constraint fk_dept foreign key (dept_id) references dept(id) on update set NULL on delete set null;

1.我们将我们的主键设置成6更改成8,发现从表数据修改为null

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 关系型数据库 MySQL
mysql数据基础(1)
mysql数据基础(1)
24 1
|
8月前
|
存储 关系型数据库 MySQL
第02章 MySQL的数据目录【1.MySQL架构篇】【MySQL高级】
第02章 MySQL的数据目录【1.MySQL架构篇】【MySQL高级】
515 0
|
7月前
|
SQL 关系型数据库 MySQL
【MySQL】 MySQL数据库基础
【MySQL】 MySQL数据库基础
|
7月前
|
SQL 存储 关系型数据库
131.【MySQL_基础篇】(一)
131.【MySQL_基础篇】
43 0
|
7月前
|
SQL 关系型数据库 MySQL
131.【MySQL_基础篇】(五)
131.【MySQL_基础篇】
48 0
|
7月前
|
SQL 关系型数据库 MySQL
131.【MySQL_基础篇】(二)
131.【MySQL_基础篇】
61 0
|
7月前
|
SQL 关系型数据库 MySQL
【MySQL 基础介绍】
【MySQL 基础介绍】
50 0
|
8月前
|
存储 关系型数据库 MySQL
1.MySQL架构篇【mysql高级】
1.MySQL架构篇【mysql高级】
73 0
|
9月前
|
SQL 关系型数据库 MySQL
【MySQL】MySQL的优化(二)
【MySQL】MySQL的优化(二)
76 0
|
7月前
|
SQL
131.【MySQL_基础篇】(四)
131.【MySQL_基础篇】
85 0