Instruções avançadas do MySQL (ver tabelas, procedimentos armazenados, instruções condicionais, instruções de loop)
- 1. CRIAR VISUALIZAÇÃO (visualizar)
- 2. declaração de caso
- 3. A diferença entre valor nulo (nulo) e nenhum valor (' ')
- 4. Expressões regulares
- 5. Procedimentos armazenados
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';
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';
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;
1.3.2. Visualizar
语法
select * from 视图表名;
#例子
select * from v_region_sales;
1.3.3. Excluir
语法
drop view 视图表名;
#例子
drop view v_region_sales;
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;
#再通过视图表求无交集
select store_name from v_union group by store_name having count(*)=1;
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的值返回
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]';
select * from store_info where store_name regexp 'Hou+';
select * from store_info where store_name regexp 'os';
select * from store_info where store_name regexp 'ho|bo';
select * from store_info where store_name regexp 'Ho|Bo';
select * from store_info where store_name regexp 'b{1}';
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 ;
5.4.2. Chamada
call 存储过程名;
5.4.3. Visualização
show create procedure [数据库.]存储过程名;
#查看某个存储过程的具体信息
show create procedure 存储过程名\G;
show procedure status [like '%存储过程名%'] \G;
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 时,如果指定的过程不存在,则报错
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为自定义变量名
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;
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 中的值。
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
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;