Funções e restrições do MySQL-2 (combinadas com estudo de caso)

função

Uma função é um pedaço de programa ou código que pode ser chamado diretamente por outro pedaço de programa. Ou seja, este programa ou código nos foi fornecido no MySQL, tudo o que precisamos fazer é chamar a função correspondente no cenário de negócios apropriado para concluir os requisitos de negócios correspondentes.
As funções no MySQL são divididas principalmente nas quatro categorias a seguir: funções de string, funções numéricas, funções de data e funções de processo.
Seu uso éselect 函数

funções de string

funções comuns

função Função
CONCAT(s1, s2, …, sn) Emenda de string, emendando s1, s2, ..., sn em uma string
CONCAT_WS(s,s1,s2, …,sn) Use s como o conector para emenda de string, emendando s1, s2, ..., sn em uma string, e o conector do meio é s
INFERIOR(str) Converter todas as strings para minúsculas
MAIOR(str) Converter uma string para todas as letras maiúsculas
LPAD(str, n, pad) Preenchimento esquerdo, preencha o lado esquerdo de str com o pad de string para atingir o comprimento de n strings
RPAD(str, n, pad) Preenchimento direito, preencha o lado direito de str com o pad de string para atingir o comprimento de n strings
TRIM(str) Remova os espaços no início e no final da string (o meio da string não é processado), semelhante a LTRIM e RTRIM
SUBSTRING(str, start, len) Retorna uma string de len comprimentos a partir da posição inicial da string str, indexada a partir de 1

uso

  • costura
    SELECT CONCAT('Hello', 'World');
  • concatenar com vírgulas
    SELECT CONCAT_WS(',','Hello', 'World');
  • minúsculas
    SELECT LOWER('Hello');
  • capital
    SELECT UPPER('Hello');
  • preenchimento esquerdo
    SELECT LPAD('01', 5, '-');
  • preenchimento direito
    SELECT RPAD('01', 5, '-');
  • remover espaços
    SELECT TRIM(' Hello World ');
  • Fatia (índice inicial é 1)
    SELECT SUBSTRING('Hello World', 1, 5);Observe que o índice aqui começa em 1, não em 0.

Perceber

  • Se a string da função string for um número puro (dados numéricos), o MySQL irá convertê-lo automaticamente em uma string internamente para operação.
    insira a descrição da imagem aqui

  • Comprimento 5 quando o preenchimento é preenchido no comprimento 5, não no preenchimento 5.

  • Se o preenchimento for muito longo durante o preenchimento, os caracteres n-len(str) serão selecionados à esquerda como a parte a ser preenchida.
    insira a descrição da imagem aqui

  • Ao preencher, se n>len(str), n caracteres serão selecionados à esquerda de str como resultado final.
    insira a descrição da imagem aqui

  • rpad e lap têm as mesmas regras de manuseio para os casos especiais acima .

  • Todas essas são funções de string, portanto, os dados gerados devem ser dados de string. Por exemplo, se você usar esse código para a coluna idupdate emp set id = lpad(id,5,0) , ele não terá efeito, porque a string gerada é uma string, mas a coluna id armazena dados numéricos. Portanto, o resultado gerado não será atribuído ao id, mas select lpad(id,5,0) from emp;terá efeito porque a string gerada pode ser impressa.

O caso

Devido a mudanças nos requisitos de negócios, os números de trabalho dos funcionários da empresa são unificados para 5 dígitos e todos aqueles com menos de 8 dígitos são preenchidos com 0 na frente. Por exemplo: O número do cargo do funcionário nº 1 deve ser 00000001.
update emp set workno = lpad(workno,8,0);

função numérica

funções comuns

função Função
CEIL(x) Arredondado
ANDAR(x) arredondar para baixo
MOD(x, y) Retorna o módulo de x/y
ALEATÓRIO() Retorna um número aleatório entre 0 e 1
ROUND(x, y) Encontre o valor arredondado do parâmetro x, mantenha y casas decimais
po(x, y) xy {x^y}xy
exp(x) Solicitar ex {e^x}ex
quadrado(x) encontrar x {\sqrt x}x

uso

  • teto: arredondar para cima
    select ceil(1.1);
  • chão: arredondar para baixo
    select floor(1.9);
  • modo: módulo
    select mod(7,4);
  • rand: obtém um número aleatório
    select rand();
  • redondo: arredondado
    select round(2.344,2);

O caso

Através da função do banco de dados, um código de verificação aleatório de seis dígitos é gerado.
Ideia: O número aleatório pode ser obtido através da função rand(), mas o número aleatório obtido está entre 0 e 1, então pode ser multiplicado por 1000000,
e depois descartar a parte decimal. Se o comprimento for menor que 6 dígitos, adicione 0.
select lpad(floor(rand()*1000000),6,0);ou
select lpad(round(rand()*1000000,0),6,0);

função de data

funções comuns

função Função
CURDATE() retornar data atual
CURTIME() retornar hora atual
AGORA() retorna a data e hora atual
DATA(data) Obtenha a data 'ano-mês-dia' da data especificada
HORA(data) Obtém a hora 'hora:minuto:segundo' da data especificada
ANO(data) Obter o ano da data especificada
Data do mês) Obter o mês da data especificada
DIA(data) Obter o número de dias da data especificada
HORA(data) Obter a hora da data especificada
MINUTO(data) Obter o minuto da data especificada
SEGUNDO(data) Obter os segundos da data especificada
DATE_ADD(data, tipo de expr INTERVAL) Retorna um valor de data/hora mais um valor de hora após o intervalo expr
ADDTIME(data, hora) Retorna o resultado da adição de uma hora a uma data/hora na forma de 'dia hora:minuto:segundo'
DATE_SUB(data, tipo de expr INTERVAL) Retorna um valor de data/hora menos um intervalo de tempo expr
DATEDIFF(data1, data2) Retorna o número de dias entre a data de início1 e a data de término2, retorna um número inteiro
TIMEDIFF(hora1, hora2) Retorna a diferença de tempo entre a hora inicial time1 e a hora final time2, retorna hora:minuto:segundo
TIME_TO_SEC(tempo) Converta o tempo em segundos, o formato de hora de entrada é hora:minuto:segundo, retorne o segundo inteiro

Uso (apenas parte mostrada)

  • curdate: data atual
    select curdate();
  • curtime: hora atual
    select curtime();
  • agora: data e hora atual
    select now();
  • ANO, MÊS, DIA, HORA, MINUTO, SEGUNDO: ano, mês, dia, hora, minuto, segundo.
    select YEAR(now()),MONTH(now()),DAY(now()),HOUR(now()),MINUTE(now()),SECOND(now());
  • date_add: Existem muitos tipos para adicionar o intervalo de tempo especificado
    select date_add(now(), INTERVAL 2 HOUR);
    , como: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, YEAR_MONTH, MONTH_DAY, etc.
    O método de usar YEAR_MONTH é select date_add(now(), INTERVAL 4.2 YEAR_MONTH );(significa adicionar 4 anos e 2 meses)
  • addtime:增加指定的时间间隔
    select addtime(now(),'5 240:0:0'); 增加5天后增加240个小时(一共15天)
  • datediff:获取两个日期相差的天数
    select datediff('2021-12-01','2021-10-01');
  • timediff:获取两个日期相差的时间
    select timediff('2022-10-05 18:45:09','2022-09-04 18:45:09');

案例

查询所有员工的入职天数,并根据入职日期倒序排序。
思路: 入职天数,就是通过当前日期 - 入职日期,所以需要使用datediff函数来完成。对于在同一天入职的员工,我们可以使用相同的方法首先用timediff函数获得时间差,然后再通过time_to_sec来换成秒数进行比较入职的时间就可以了。

select name, datediff(now(),entrydate) as 'entrydays', entrydate from emp order by entrydays, time_to_sec(timediff(now(),TIME(entrydate)));
当然MySQL也可以自动排序
select name, datediff(now(),entrydate), entrydate from emp order by entrydate desc;

流程函数

常用函数

函数 功能
IF(value, t, f) 如果value为true,则返回t,否则返回f
IFNULL(value1, value2) 如果value1不为空,返回value1,否则返回value2
CASE 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
    select if(true ,'ok','error');
  • ifnull
    select if(true ,'ok','error');
    select ifnull(null,'default');
    select ifnull('','default');
  • case when then else end
    查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)
    select name, workaddress, case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end from emp;

案例

统计班级各个学员的成绩,展示的规则如下:

>=85 : 展示优秀
>=60:展示及格
否则 :不及格

导入成绩:

create table score( id int comment 'ID',
name varchar(20)
    comment '姓名',
    math int comment '数学',
    english int comment '英语',
    chinese int comment '语文' 
    )comment '学员成绩表';
insert into score(id, name, math, english, chinese)
VALUES (1, 'Tom', 67, 88, 95 ),
       (2, 'Rose' , 23, 66, 90),
       (3, 'Jack', 56, 98, 76);

本案例的语句如下:

select name,
       case when math>=85 then '优秀' when math>60 then '及格' else '不及格' end as 'math',
       case when english>=85 then '优秀' when english>60 then '及格' else '不及格' end as 'englise',
       case when chinese>=85 then '优秀' when chinese>60 then '及格' else '不及格' end as 'chinese'
from score;

约束

概述

概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据,可以再创建表/修改表的时候添加约束。
目的:保证数据库中数据的正确、有效性和完整性。
分类:

约束 描述 关键字
非空约束 限制该字段的数据不能为null NOT NULL
唯一约束 保证该字段的所有数据都是唯一、不重复的 UNIQUE
主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY
默认约束 保存数据时,如果未指定该字段的值,则采用默认值 DEFAULT
检查约束(8.0.1版本后) 保证字段值满足某一个条件 CHECK
外键约束 用来让两张图的数据之间建立连接,保证数据的一致性和完整性 FOREIGN KEY

语法:在字段类型之后加上约束的关键字即可 字段 类型 约束关键字1 约束关键字2 约束关键字3...

前五个约束演示

insira a descrição da imagem aqui
创建

create table user_ys(
    id int primary key auto_increment comment '主键',
    name varchar(10) not null unique comment '姓名',
    age int check ( age>0 && age<=120 ) comment '年龄',
    status char(1) default '1' comment '状态',
    gender char(1) comment '性别'
)comment '约束用户表';

修改

alter table user_ys modify status char(1) default '0';
alter table user_ys modify status char(1) default '1';

验证

insert into user_ys(name, age, status, gender)  #主键会自动增长,不需要手动添加
values('Tom1',19,1,'男'),
      ('Tom2',25,0,'男'),
      ('Tom3',19,1,'男');  
          
#测试 NOT NULL
insert into user_ys(name, age, status, gender) values (null,19,'1','男');
#测试 UNIQUE
insert into user_ys(name, age, status, gender) values ('Tom3',20,'0','男');

insert into user_ys(name, age, status, gender) values ('Tom4',80,'1','男');  
#id为5,因为在添加'Tom3'的时候已经向数据库发送了请求,所以主键已经加了1。

#测试 CHECK
insert into user_ys(name, age, status, gender) values ('Tom5',-1,'0','男');
insert into user_ys(name, age, status, gender) values ('Tom5',121,'0','男');

#测试 DEFAULT
insert into user_ys(name, age, gender) values ('Tom5',120,'男');
             

注意:唯一键冲突和事务回滚都会导致自增主键id不连续的情况

外键约束演示

外键解释

外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性
如图所示:
insira a descrição da imagem aqui左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职日期、上级主管ID、部门ID,
在员工的信息中存储的是部门的ID dept_id
而这个部门的ID dept_id 关联着右侧的部门表dept的主键 id
那emp表的dept_id就是外键,关联的是dept表的主键
emp表被称为子表或者从表;
dept表被称为父表或者主表。

注意:目前上述两张表,只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的,看下面的例子。

1. 准备数据:

drop table if exists emp;

create table dept ( id int auto_increment comment 'ID' primary key,
                      name varchar (50) not null comment '部门名称'
) comment '部门表';

INSERT INTO dept ( id,name) VALUES (1,'研发部'), (2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办');

create table emp(
    id int auto_increment comment 'ID' primary key,
    name varchar(50) 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 emp (id, name, age, job,salary, entrydate, managerid, dept_id)
VALUES (1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
       (2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
       (3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
       (4, '韦一笑', 48, '开 发',11000, '2002-02-05', 2,1),
       (5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
       (6, '小昭', 19, '程 序员鼓励师',6600, '2004-10-12', 2,1);

2. 测试,删除id为1的部门信息。

delete from dept where id=1;
此时emp表不再有主键id=1的部门,但是dept中还有外键dept_id=1,所以如果不降两张表关联,就会导致数据的不完整性。insira a descrição da imagem aquiinsira a descrição da imagem aqui

外键约束语法

创建

CREATE TABLE 表名(
	字段名 字段类型,
	...
	[CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)
);
# references 指定的主表只能是已创建的主表。

修改

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名);

删除

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

举例

创建:
create table emp_test(
                    id int auto_increment comment 'ID' primary key,
                    name varchar(50) 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',
                    constraint dk_emp_dept_id foreign key (dept_id) references dept(id)
)comment '员工表';
#上面的只是展示创建语句,删除即可
修改
insert into dept
values(1,'研发部');  #加回来

alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

修改完可以在emp表中看到下面的变化:
insira a descrição da imagem aqui

此时如果执行上面的删除命令delete from dept where id=1;,会报错
insira a descrição da imagem aqui
即告诉我们不能删除一个父表的记录,因为子表中外键与其关联。

删除刚刚创建的外键

alter table emp drop foreign key fk_emp_dept_id;

外键增加数据行为

如果在子表中添加的数据外键不在父表中,则会报错,但是外键可以为NULL,表示待分配。

外键删除更新行为

分类

添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:

行为 说明
NO ACTION Ao excluir/atualizar o registro correspondente na tabela pai, verifique primeiro se o registro possui uma chave estrangeira correspondente e, em caso afirmativo, excluir/atualizar não é permitido (consistente com RESTRICT)
RESTRINGIR Ao excluir/atualizar o registro correspondente na tabela pai, verifique primeiro se o registro possui uma chave estrangeira correspondente e, em caso afirmativo, excluir/atualizar não é permitido (consistente com NO ACTION)
CASCATA (conexão serial) Ao excluir/atualizar o registro correspondente na tabela pai, verifique primeiro se o registro possui uma chave estrangeira correspondente e, em caso afirmativo, exclua/atualize o registro da chave estrangeira na tabela filho
DEFINIR NULO Ao excluir/atualizar o registro correspondente na tabela pai, primeiro verifique se o registro possui uma chave estrangeira correspondente e, em caso afirmativo, defina o valor da chave estrangeira na tabela filha como nulo (a chave estrangeira é necessária para permitir nulo)
CONJUNTO PADRÃO Quando a tabela pai é alterada, a tabela filha define a chave estrangeira para um valor padrão (Innodb não suporta)

gramática

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE 行为 ON DELETE 行为;

demonstração

Como NO ACTION é o comportamento padrão, já testamos na demonstração de sintaxe anterior, então não iremos demonstrar novamente, aqui demonstramos os outros dois comportamentos: CASCADE e SET NULL.

  1. excluir e atualizar - cascata
    alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade;
  • implemento:update dept set id = 6 where id = 1;
    insira a descrição da imagem aqui
    insira a descrição da imagem aqui
  • implemento:delete from dept where id = 5;
    insira a descrição da imagem aqui
    insira a descrição da imagem aqui
  1. SET NULL
    primeiro exclui e recria manualmente as duas tabelas e, em seguida, cria chaves estrangeiras.
    alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null;
  • implemento:delete from dept where id = 1;
    insira a descrição da imagem aquiinsira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/qq_49030008/article/details/126680878
Recomendado
Clasificación