131.【MySQL_基础篇】(三)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
前端开发 UED 计算机视觉
前端调取摄像头并实现拍照功能
前端调取摄像头并实现拍照功能
1525 0
ES5常见的数组方法:forEach ,map ,filter ,some ,every ,reduce (除了forEach,其他都有回调,都有return)
ES5常见的数组方法:forEach ,map ,filter ,some ,every ,reduce (除了forEach,其他都有回调,都有return)
|
11月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第16天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括配置系统源、安装 SQL Server 2019 软件包以及数据库初始化,确保 SQL Server 正常运行。
503 4
|
12月前
|
存储 Unix C++
c++时间形式转换
【10月更文挑战第29天】在 C++ 中,时间形式转换主要涉及将时间在不同表示形式之间转换,如字符串与 `tm` 结构或 `time_t` 类型之间的转换。常用的基本时间类型包括 `time_t` 和 `tm` 结构,转换函数有 `strftime` 和 `strptime`,可以满足大多数时间处理需求。此外,还可以通过自定义类来扩展时间转换功能。
216 0
|
前端开发
使用Postman导出excel
在本文档中,作者分享了如何使用Postman测试导出Excel接口的两种方法。配以四张图片说明了设置步骤,包括选择接口请求方式、设置Header(Content-Type: multipart/form-data)、Body中选取form-data类型以及指定文件。尽管代码指定了文件名,但在Postman的响应中不会显示,提示需要前端进一步处理。
1372 0
|
Linux Shell Perl
在Linux中,如何使用sed命令进行文本替换?
在Linux中,如何使用sed命令进行文本替换?
|
Python
Pycharm为Python项目配置环境不生效,解决办法
在PyCharm中,项目依赖配置更改后未生效。解决步骤包括:1) 查找`C:\Users\username\AppData\Roaming\JetBrains\PyCharm2022.2\options\jdk.table.xml`,2) 删除`&lt;jdk&gt;&lt;/jdk&gt;`标签内的旧配置内容,然后重启PyCharm以应用新目录。
1320 0
Pycharm为Python项目配置环境不生效,解决办法
|
Shell Linux 开发工具
Anaconda安装后报错 -bash: conda: command not found 如何处理
【6月更文挑战第17天】Anaconda安装后报错 -bash: conda: command not found 如何处理
804 4
|
存储 机器学习/深度学习 API
开源向量数据库比较:Chroma, Milvus, Faiss,Weaviate
该文探讨了向量数据库在语义搜索和RAG中的核心作用,并介绍了四个开源向量数据库:Chroma、Milvus、Faiss和Weaviate。这些数据库用于存储高维向量,支持基于相似性的快速搜索,改变了传统的精确匹配方法。文章详细比较了它们的特性,如Chroma的易用性,Milvus的存储效率,Faiss的GPU加速,和Weaviate的图数据模型。选择合适的数据库取决于具体需求,如数据类型、性能和使用场景。
3106 0
|
Android开发
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。 【5月更文挑战第2天】
757 0