Instruções avançadas do MySQL (ver tabelas, procedimentos armazenados, instruções condicionais, instruções de loop)

1. CRIAR VISUALIZAÇÃO (visualizar)

1.1. Visão geral da tabela de visualização

 可以被当作是虚拟表或存储查询
  • A diferença entre uma visão e uma tabela é que a tabela realmente armazena dados, enquanto a visão é uma estrutura construída na tabela e não armazena dados em si.

  • A tabela temporária desaparece automaticamente após o usuário sair ou a conexão com o banco de dados ser desconectada, mas a visualização não desaparecerá.

  • Uma visualização não contém dados, apenas sua definição é armazenada e sua finalidade geralmente é simplificar consultas complexas. Por exemplo, se você deseja conectar e consultar várias tabelas, e também realizar classificação estatística e outras operações, será muito problemático escrever instruções SQL. Use uma visualização para conectar várias tabelas e, em seguida, consulte a visualização, que é a mesma como consultar uma tabela. A consulta é a mesma, muito conveniente.

1.2. A tabela de visualização pode ser modificada? (Pergunta da entrevista)

视图表保存的是select语句的定义,视图表的表数据能否修改,视情况而定。
如果 select 语句查询的字段是没有被处理过的源表字段,则可以通过视图表修改源表数据;
如果select 语句查询的字段是被 group by语句或 函数 处理过的字段,则不可以直接修改视图表的数据。
#例子

create view v_store_info as select store_name,sales from laozi;

update laozi set sales=1000 where store_name='Houston';

Insira a descrição da imagem aqui

create view v_sales as select store_name,sum(sales) from laozi group by store_name having sum(sales)>1000;

update v_sales set store_name='xxxx' where store_name='Los Angeles';

Insira a descrição da imagem aqui

1.3. Sintaxe básica

1.3.1. Criar

语法
create view "视图表名" as "select 语句";
#例子

create view v_region_sales as select a.region region,sum(b.sales) sales from location a 
inner join store_info b on a.store_name = b.store_name group by region;

Insira a descrição da imagem aqui

1.3.2. Visualizar

语法
select * from 视图表名;
#例子
select * from v_region_sales;

Insira a descrição da imagem aqui

1.3.3. Excluir

语法
drop view 视图表名;
#例子
drop view v_region_sales;

Insira a descrição da imagem aqui

1.4. Encontre valores que não sejam de interseção por meio de tabelas de visualização

Mesclar os valores únicos de um determinado campo nas duas tabelas, que aparecem apenas uma vez (contagem=1), ou seja, não há interseção.

create view 视图表名 as select distinct 字段 from 左表 union all select distinct 字段 from 右表;

select 字段 from 视图表名 group by 字段 having count(字段)=1;
#先建立视图表
create viem v_union as select distinct store_name from location union all select distinct store_name from store_info;

Insira a descrição da imagem aqui

#再通过视图表求无交集
select store_name from v_union group by store_name having count(*)=1;

Insira a descrição da imagem aqui

2. declaração de caso

  • No MySQL, a instrução CASE é usada para realizar julgamento condicional e seleção de ramificação em dados com base em determinadas condições.

  • Ele pode ser usado em instruções SELECT, UPDATE e DELETE e também em expressões.

语法
select case ("字段名")
  when "条件1" then "结果1"
  when "条件2" then "结果2"
  ...
  [else "结果n"]
  end
from "表名";

# "条件" 可以是一个数值或是公式。 else 子句则并不是必须的。

exemplo

#举个例子
select store_name, case store_name 
  when 'los angeles' then sales * 2 
  when 'boston' then 2000
  else sales 
  end 
'new sales',date 
from store_info;

#将'sales的值作为new sales的值返回

Insira a descrição da imagem aqui

3. A diferença entre valor nulo (nulo) e nenhum valor (' ')

  • O comprimento de um valor nulo é 0 e não ocupa espaço; o comprimento de um valor nulo é nulo e ocupa espaço;

  • é nulo ou não é nulo é usado para determinar se o campo é nulo ou não nulo.Não é possível descobrir se não tem valor;

  • O julgamento de nenhum valor é tratado por =' ' ou <>' ', <> e != representam diferente;

  • Ao especificar o número de linhas em um campo através de count(), qualquer valor NULL será automaticamente ignorado e nenhum valor será adicionado ao registro para cálculo.

4. Expressões regulares

4.1. Sintaxe básica e padrões de correspondência

Os padrões de correspondência não diferenciam maiúsculas de minúsculas

padrão de correspondência descrever Exemplo
^ Corresponde ao caractere inicial do texto '^bd' corresponde a caracteres que começam com bd
$ Corresponde ao caractere final do texto 'qn$' corresponde a uma string que termina com qn
. Combine qualquer caractere único 's.t' corresponde a qualquer string com um caractere entre s e t
* Corresponde a zero ou mais caracteres anteriores 'fo*t' corresponde a t precedido por qualquer número de o's
+ Corresponde ao caractere anterior uma ou mais vezes 'hom+' corresponde a uma string começando com ho seguida por pelo menos um m
corda Corresponde à string especificada 'clo' corresponde a strings contendo clo
p1p2 Combine p1 ou p2 'bg fg' corresponde a bg ou fg
[…] Combine qualquer caractere no conjunto de caracteres '[abc]' corresponde a a ou b ou c
[^…] Corresponde a qualquer caractere não colocado entre parênteses [^ ab] corresponde a uma string que não contém a ou b
{n} Combine a string anterior n vezes 'g{2}' corresponde a uma string contendo 2 g's
{n,m} Combine a string anterior pelo menos n vezes e no máximo m vezes 'f{1,3}' corresponde a f pelo menos 1 vez e no máximo 3 vezes

4.2. Exemplo

select * from store_info where store_name regexp '^[a-g]';

Insira a descrição da imagem aqui

select * from store_info where store_name regexp 'Hou+';

Insira a descrição da imagem aqui

select * from store_info where store_name regexp 'os';

Insira a descrição da imagem aqui

select * from store_info where store_name regexp 'ho|bo';

select * from store_info where store_name regexp 'Ho|Bo';

Insira a descrição da imagem aqui

select * from store_info where store_name regexp 'b{1}';

Insira a descrição da imagem aqui

5. Procedimentos armazenados

Os procedimentos armazenados também são chamados de scripts de banco de dados (scripts MySQL, scripts SQL)

5.1. Introdução

  • Um procedimento armazenado é um conjunto de instruções SQL projetadas para realizar uma função específica.

  • Durante o uso de um procedimento armazenado, o trabalho comum ou complexo é escrito antecipadamente usando instruções SQL e armazenado com um nome especificado.Este processo é compilado, otimizado e armazenado no servidor de banco de dados. Quando você precisar usar esse procedimento armazenado, basta chamá-lo. Os procedimentos armazenados são mais rápidos e eficientes na execução do que o SQL tradicional.

5.2. Vantagens dos procedimentos armazenados

1. Após a execução uma vez, o código binário gerado residirá no buffer para melhorar a eficiência da execução.
2. A coleção de instruções SQL mais instruções de controle tem alta flexibilidade.
3. É armazenado no lado do servidor e reduz a carga da rede quando chamado pelo cliente.
4, pode ser chamado várias vezes, pode ser modificado a qualquer momento, sem afetar as chamadas do cliente
5. Pode completar todas as operações do banco de dados e também pode controlar os direitos de acesso às informações do banco de dados

5.3. Etapas para criar um procedimento armazenado

1) Modifique temporariamente o terminador da instrução SQL (;——>símbolos personalizados, como $$, ##,...);

2) Crie um procedimento armazenado;

3) Altere o caractere final da instrução SQL de volta para;;

4) Chame o procedimento armazenado.

5.4. Comandos relacionados

5.4.1. Criar

delimiter $$							
#将语句的结束符号从分号;临时改为两个$$(可以是自定义)
create procedure proc()					
#创建存储过程,过程名为proc,不带参数
-> begin								
#过程体以关键字 begin 开始
-> select * from store_info;			
#过程体语句
-> end $$								
#过程体以关键字 end 结束
delimiter ;								
#将语句的结束符号恢复为分号

delimiter $$							
create procedure proc()					
-> begin
->.....(要执行的命令)
-> select * from store_info;			
-> end $$								
delimiter ;								

#举个例子

delimiter $$ 
use nba
create procedure proc1()
begin
create table xxxx (id int,name varchar(10),pid int,age int);
insert into xxxx values (1,'xx',11,111);
insert into yyyy values (2,'yy',22,222);
insert into zzzz values (3,'zz',33,333);
select * from xxxx;
end $$
delimiter ;

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

5.4.2. Chamada

call 存储过程名;

Insira a descrição da imagem aqui

5.4.3. Visualização

show create procedure [数据库.]存储过程名;		
#查看某个存储过程的具体信息

show create procedure 存储过程名\G;

show procedure status [like '%存储过程名%'] \G;

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

5.4.4. Excluir

  • O método para modificar o conteúdo de um procedimento armazenado é excluir o procedimento armazenado original e, em seguida, criar um novo procedimento armazenado com o mesmo nome.

  • Se desejar modificar o nome de um procedimento armazenado, você poderá primeiro excluir o procedimento armazenado original e, em seguida, criar um novo procedimento armazenado com um nome diferente.

基本语法
drop procedure if exists 存储过程名;		
#仅当存在时删除
#不添加 if exists 时,如果指定的过程不存在,则报错

Insira a descrição da imagem aqui

5.5. Parâmetros de procedimentos armazenados

parâmetro Função
em Parâmetros de entrada
fora Parâmetros de saída
parâmetros de entrada e saída inout Isso significa que o chamador passa um valor para o processo e também significa que o processo passa um valor para o chamador (o valor só pode ser uma variável, e os valores de entrada e saída devem ser do mesmo tipo de dados)
  in
delimiter $$				
create procedure proc1(in inname char(16))		
-> begin					
-> select * from store_info where store_name = inname;
-> end $$					
delimiter ;					

call proc1('boston');

#inname为自定义变量名

Insira a descrição da imagem aqui

out
基本格式

delimiter $$
create procedure 存储过程名(in 传入参数名 传入参数数据类型,out 传出参数名 传出参数数据类型)
begin
select 字段 into 传出参数名 from 表名 where 字段=传入参数名;
end $$
delimiter ;

call 存储过程名(参数值,@变量名)
#传出参数的值只能用变量获取

#举个例子

delimiter $$
mysql> create procedure proc1(in myname char(10), out outname int)
    -> begin
    -> select sales into outname from store_info where store_name = myname
    -> end $$
delimiter ;
#建一个名为 proc1 的存储过程
#存储过程接收一个字符参数 myname,并将与其匹配的 store_info 表中的 sales 值存储到一个整数参数 outname 中

call proc1('Houston', @xxx);
select @xxx;

Insira a descrição da imagem aqui

inout
基本格式

delimiter $$
create procedure 存储过程名(into 参数名 参数数据类型)
begin
select 字段 into 传出参数名 from 表名 where 字段=参数名;
end $$
delimiter ;

set @变量名 传入值
#变量赋值,传入值
call 存储过程名(@变量名)
#传入传出参数的值只能用变量
select @变量名
#此时变量内容应该为传出值

delimiter $$
create procedure proc4(inout insales int)
-> begin
-> select count(sales) into insales from store_info where sales < insales;
-> end $$
delimiter ;
set @inout_sales=1000;
call proc4(@inout_sales);
select @inout_sales;

#创建了一个名为 proc4 的存储过程
#存储过程接受一个输入输出参数 insales,并通过查询 store_info 表获取 sales 值小于 insales 的记录数量,并将结果存储到参数 insales 中。
#通过 call 语句调用该存储过程,并使用 select 语句查看存储在变量 @inout_sales 中的值。

Insira a descrição da imagem aqui

5.6. Instruções de controle de procedimentos armazenados

create table t (id int(10));
insert into t values(10);

5.6.1. Declaração condicional if-then-else ···· end if

5.6.1 条件语句if-then-else ···· end if
delimiter $$  
create procedure proc3(in pro int)  
-> begin 
-> declare var int;  
-> set var=pro*2;   
-> if var>=10 then 
-> update t set id=id+1;  
-> else 
-> update t set id=id-1;  
-> end if;  
-> end $$

delimiter ;

call proc3(6);
#pro=6

Insira a descrição da imagem aqui

5.6.2. Instrução de loop while ···· end while

while 条件表达式
do
  SQL语句序列
  set 条件迭代表达式;
end while;

delimiter $$  
create procedure proc3()
-> begin 
-> declare var int(10);  
-> set var=0;  
-> while var<6 do  
-> insert into t values(var);  
-> set var=var+1;  
-> end while;  
-> end $$  

delimiter ;

call proc3;

例子
创建一张表

id name

1 student1

…

一万行数据
delimiter $$  
create procedure proc4()
begin 
declare i int;
set i=1;
create table xx(id int ,name varchar(20))
while i<=10000 do  
insert into xx values(i,concat('student',i));  
set i=i+1;  
end while;  
end $$  

delimiter ;

call proc4;

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/fyb012811/article/details/133317170
Recomendado
Clasificación