SQL函数和约束

devtools/2025/1/18 19:14:10/

函数

字符串函数

函数功能
CONCAT(S1, S2, …, Sn)字符串拼接,将 S1, S2, … Sn 拼接成一个字符串
LOWER(str)将字符串 str 全部转换为小写
UPPER(str)将字符串 str 全部转换为大写
LPAD(str, n, pad)左填充,用字符串 pad 填充 str 的左边直到指定长度
RPAD(str, n, pad)右填充,用字符串 pad 填充 str 的右边直到指定长度
TRIM(str)去掉字符串前后两端的空格
SUBSTRING(str, start, len)返回从字符串 str 开始位置 startlen 长度的子字符串
sql">-- 字符串函数
-- CONCAT(str1,str2,...) 
select concat('hello',' mysql'); -- 'hello mysql'-- LOWER(str)
select lower('HelLO');  -- 'hello'-- UPPER(str)
select upper('Hello');  -- 'HELLO'-- LPAD(str,len,padstr)
select lpad('hua',6,'*');  -- '***hua'-- RPAD(str,len,padstr)
select rpad("hua",6,'*');  -- 'hua***'-- TRIM([remstr FROM] str)
select trim("   my  sql   ");   -- 'my  sql'-- SUBSTRING(str FROM pos FOR len)
select substring('I love mysql',1,8); -- 'I love m'

案例:
企业员工的工号,统一为4位数,不足4位数的全部在前面补0。比如:1号员工的工号应该为0001

sql">-- 企业员工的工号,统一为4位数,不足4位数的全部在前面补0。比如:1号员工的工号应该为0001
update emp set workno = lpad(workno,4,'0');

数值函数

函数功能
CEIL(x)向上取整
FLOOR(x)向下取整
MOD(x, y)返回 x/y 的模
RAND()返回 0~1 内的随机数
ROUND(x, y)求参数 x 四舍五入的值,保留 y 位小数
sql">-- 数值函数
-- CEIL(X)
select ceil(1.25); -- 2-- FLOOR(X)
select floor(1.59); -- 1-- MOD(N,M)
select mod(9,5); -- 4-- RAND()
select rand();-- ROUND(X)
select round(3.49,1); -- 3.5

案例:
通过数据库函数生成一个7位数验证码

sql"> -- 生成7位数验证码select lpad(round(rand()*10000000,0),7,0);

日期函数

函数功能
CURDATE()返回当前日期
CURTIME()返回当前时间
NOW()返回当前日期和时间
YEAR(date)获取指定 date 的年份
MONTH(date)获取指定 date 的月份
DAY(date)获取指定 date 的日期
DATE_ADD(date, INTERVAL expr type)返回一个日期/时间值加上一个时间间隔 expr 后的时间值
DATEDIFF(date1, date2)返回开始时间 date1 (晚)和结束时间 date2(早) 之间的天数
sql">
-- 日期函数
-- CURDATE()
select curdate();  -- 2025-01-16-- CURTIME()
select curtime(); -- 12:29:50-- NOW()
select now();  -- 2025-01-16 15:14:43-- YEAR(date)
select year(now()); -- 2025-- MONTH(date)
select month(now()); -- 1-- `DAY`(date)
select day(curdate()); -- 16-- DATE_ADD(date,INTERVAL expr unit)
select date_add(curdate(),interval 20 day); -- 2025-02-05
select date_add(curdate(),interval 30 month); -- 2027-07-16
select date_add(curdate(),interval 10 year); -- 2035-01-16-- DATEDIFF(expr1,expr2)
select datediff(curdate(),'2018-11-08'); -- 2261

案例:
查询所以员工的入职天数,并根据天数倒序排序

sql">-- 查询所以员工的入职天数,并根据天数倒序排序
select name,datediff(curdate(),entrydate) as 'date' from emp order by date desc;

函数功能
IF(value, t, f)如果 value 为 true,则返回 t,否则返回 f
IFNULL(value1, value2)如果 value1 不为 null,返回 value1,否则返回 value2
CASE WHEN [val] THEN [res] … ELSE [default] END如果 val 为 true,则返回 res,否则返回 default 默认值
CASE [expr] WHEN [val] THEN [res] … ELSE [default] END如果 expr 的值等于 val,返回 res,否者返回 default 默认值
sql">-- 流程控制函数
-- IF(expr1,expr2,expr3)
select if(true,'yes','error'); -- yes
select if(false,'yes','error'); -- no-- IFNULL(expr1,expr2)
select ifnull('yang','hua'); -- yang
select ifnull('','hua'); -- 
select ifnull(null,'hua'); -- hua-- case when then else end
-- 需求:查询emp表的员工姓名和工作地址(北京/上海--->一线城市,其他---->二线城市)
select name,(case workaddress when '北京' then '一线城市' when '上海' then "一线城市" else '二线城市' end) as '工作地址'
from emp; -- 需求:查询emp表的员工姓名和性别(女--->女士,男--->先生)
select name,(case gender when '女' then '女士' else '先生' end) as '尊称'
from emp;

案例:建立一个学生表:统计班级各个学生的成绩,展示规则:
– 100 - 85,优秀
– 85 - 70,良好
– 70 - 60,及格
– else,不及格

sql">-- 创建student表
create table student(id int comment 'ID',name varchar(15) comment '姓名',chinese int comment '语文成绩',english int comment '英语成绩',math int comment '数学成绩') comment '学生成绩表';
insert into student(id,name,chinese,english,math) values(1,'yangyang',85,91,79),(2,'huahua',90,91,96),(3,"taotao",88,72,53);
insert into student values(4,'tangtang',5,80,60)
-- 统计成绩
select name,(case when chinese between 85 and 100 then '优秀' when chinese between 70 and 84 then '良好' when chinese between 60 and 69 then '及格' else '不及格' END) as '语文',(case when english between 85 and 100 then '优秀' when english between 70 and 84 then '良好' when english between 60 and 69 then '及格' else '不及格' END) as '英语',(case when math between 85 and 100 then '优秀' when math between 70 and 84 then '良好' when math between 60 and 69 then '及格' else '不及格' END) as '数学'
from student;

在这里插入图片描述
在这里插入图片描述



约束概述:

  1. 概念:约束是作用于数据库表中字段的规则,用于限制存储在表中的数据。
  2. 目的:确保数据库中数据的正确性、有有效性和完整性。
  3. 分类:约束有不同的类型,根据字段的作用和限制不同。
约束描述关键字
非空约束限制该字段的数据不能为 NULLNOT NULL
唯一约束保证该字段的所有值都是唯一的,不重复UNIQUE
主键约束每一行必须有唯一的主键,要求不能为空PRIMARY KEY
默认约束给字段指定默认值,如果没有指定值时使用默认值DEFAULT
检查约束限制字段的值符合某些条件(例如,值范围等)CHECK
外键约束用于确保表中字段的数据值在其他表中存在,以维护数据完整性FOREIGN KEY

注意:
约束是作用于数据库表字段的,可以在创建或修改表时添加约束。
该表格是数据库设计中的重要组成部分,能够帮助数据库管理员确保数据的一致性和完整性。

示例:

字段名字段含义字段类型约束条件约束关键字
idID唯一标识符int主键,并且自增增长PRIMARY KEY, AUTO_INCREMENT
name姓名varchar(10)不为空,并且唯一NOT NULL, UNIQUE
age年龄int大于0,并且小于等于120CHECK ,仅在5.7以上版本才能使用
status状态char(1)如果没有指定值时,默认值为1DEFAULT
gender性别char(1)-
sql">CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',name VARCHAR(10) NOT NULL UNIQUE COMMENT '姓名',age INT CHECK (age BETWEEN 0 AND 120) COMMENT '年龄',status CHAR(1) DEFAULT '1' COMMENT '状态',gender CHAR(1) COMMENT '性别'
) COMMENT '员工表' ENGINE=InnoDB;
-- 插入信息
insert into user(name,age,status,gender) values ('Anna',26,'0','女');
insert into user(name,age,status,gender) values ('Tina',28,'2','女'); 
insert into user(name,age,gender) values ('Tom',38,'男');

外键约束

sql">-- 建立部门表
create table dept(id int primary key auto_increment comment 'ID',name varchar(20) not null comment '部门名称'
)comment '部门表';
insert into dept (id,name) values (1,'研发部'),(2,'销售部'),(3,'财务部'),(4,'市场部'),(5,'经理部');-- 建立新的员工表
create table employee(id int auto_increment comment 'ID' primary key,name varchar(20) not null comment '姓名',age int comment '年龄',job varchar(20) comment '职位',salary int comment '薪资',entrydate date comment '入职时间',managerid int comment '直属领导ID',dept_id int comment '部门ID') comment '员工表';INSERT INTO employee (name, age, job, salary, entrydate, managerid, dept_id)
VALUES 
('张三', 25, '开发工程师', 8000, '2020-01-01', 1, 1),
('李四', 28, '测试工程师', 7000, '2019-05-15', 1, 1),
('王五', 30, '产品经理', 10000, '2018-03-20', 2, 2),
('赵六', 32, '项目经理', 12000, '2017-08-10', 3, 3),
('孙七', 26, 'UI 设计师', 7500, '2021-02-18', 2, 2),
('周八', 27, '运维工程师', 8500, '2020-11-05', 1, 1),
('吴九', 35, '架构师', 15000, '2016-12-01', 3, 3);

概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性
语法:
添加外键
create table 表名( 字段名 数据类型, ... [constraint] [外键名称] foreign key(外键字段名) references 主表(主表列名) );

alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(主表列名);
删除外键:
alter table 表名 drop foreign key 外键名称;

sql">-- 添加外键
alter table employee add constraint fk_employee_dept_id foreign key (dept_id) references dept(id);-- 删除外键
alter table employee drop foreign  key fk_employee_dept_id;

外键删除更新行为

行为说明
NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致)
RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与NO ACTION一致)
CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
SET NULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)。
SET DEFAULT父表有变更时,子表将外键列设置成一个默认的值(innodb不支持)
sql">-- alter table 表名 add constraint 外键名称 foreign key (外键字段) references (主表字段名) on update cascade on delete cascade;
alter table employee add constraint fk_employee_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade;
alter table employee add constraint fk_employee_dept_id foreign key (dept_id) references dept (id) on update set null on delete set null;

http://www.ppmy.cn/devtools/151631.html

相关文章

【Linux网络编程】高效I/O--I/O的五种类型

目录 I/O的概念 网络通信的本质 I/O的本质 高效I/O 五种I/O模型 阻塞I/O 非阻塞I/O 信号驱动I/O 多路转接/多路复用I/O 异步I/O 非阻塞I/O的实现 I/O的概念 网络通信的本质 网络通信的本质其实就是I/O I:表示input(输入)O:表示ou…

Harmony面试模版

1. 自我介绍 看表达能力、沟通能力 面试记录: 2. 进一步挖掘 2.1. 现状 目前是在职还是离职,如果离职,从上一家公司离职的原因 2.2. 项目经验 如果自我介绍工作项目经验讲的不够清楚,可以根据简历上的信息再进一步了解 面试记…

rhel7.9利用有网络环境打包ansible

RHEL7.9激活(可省略) # 注册 subscription-manager register --usernameyour_username --passwordyour_password --auto-attach # 查看订阅状态 subscription-manager list # 将 “enabled1” 改为 “enabled0” vi /etc/yum/pluginconf.d/subscription-manager.conf 配置阿…

FPGA随记——时钟时序一些基本知识

原文链接:跨时钟域设计-CSDN博客 前言 CDC(clock domain crossing)检查(跨时钟域的检查)是对电路设计中同步电路设计的检查。非同步时钟没有固定的相位关系,这样Setup/Hold不满足而产生了亚稳态是无法避免…

C语言基础-----数组详细解析 持续更新中......

1.在C语言中,我理解的数组类简单划分两大类: a.一般数组 b.字符数组 2.C语言中的数组介绍 2.1.数组的基本概念 (1)数组是一组相同类型的元素的集合。 (2)数组在内存中是连续存储的。 2.2.数组的声明 (1)语法:数据类型 数组名[数组大小]; (2)示例:int a…

【实践】操作系统智能助手OS Copilot新功能测评

一、引言 数字化加速发展,尤其人工智能的发展速度越来越快。操作系统智能助手成为提升用户体验与操作效率的关键因素。OS Copilot借助语言模型,人工智能等,对操作系统的自然语言交互操作 推出很多功能,值得开发,尤其运…

tmux 中鼠标滚动异常:^[[A和^[[B是什么以及如何解决

tmux 中鼠标滚动异常问题及解决方案 在使用 tmux 时,有时我们会遇到一个现象:当尝试使用鼠标滚轮滚动窗口内容时,终端中会出现一串类似 ^[[A^[[A 的字符。这让人困惑,不知道鼠标滚动为什么不起作用,也不清楚这些字符究…

28:CAN总线入门一:CAN的基本介绍

CAN总线入门 1、CAN总线简介和硬件电路1.1、CAN简要介绍1.2、硬件电路1.3、CAN总线的电平标准 2、帧格式2.1、数据帧(掌握)2.2、遥控帧(掌握)2.3、错误帧(了解)2.4、过载帧(了解)2.5…