Notas pessoais da Oracle

Notas do oráculo

início do banco de dados

Inicie o Oráculo

Após a instalação, abra a linha de comando sql

digitar

conn sys as sysdba

Inicie e digite a senha

select 11 from dual;

Verifique se está instalado corretamente

Criação de usuário

Login de superadministrador

conn sys/口令 as sysdba

Insira o banco de dados como dba

Criar espaço de tabela

create tablespace scott_tb_space datafile'D:\Programming\oracle\note\tbspace/scott_tb_space.dbf' size 200m;

Crie um arquivo de dados chamado scott_tb_space no caminho D:\Programming\oracle\note\tbspace.dbf é o tipo de dados e o espaço de tabela é 200m.

create user scott identified by tiger default tablespace scott_tb_space;

Criar usuário

create user 用户名 identified by 密码 default tablespace 表空间;

grant dba to scott;

Conceder permissões de usuário

Teste se a criação foi bem-sucedida

selecione * de duplo;

Se você usar 19c, precisará executar o cmd como administrador no início e, em seguida, fazer login como administrador.

sqlplus /as sysdba

Em seguida, crie um usuário. A partir de 12c, a Oracle adicionou o CDB. Por padrão, o CDB está conectado. Sem mudar para pdb, o nome do usuário precisa ser prefixado com C##.

Portanto, o comando de criação de usuário é:

crie o usuário c##root IDENTIFICADO POR sy670422;

Em seguida, execute a autorização:

conceder espaço de tabela de conexão, recurso e ilimitado para c##root container=all;

Em seguida, executesqlplus;

desenho de mesa

Tabela de funcionários: nome, idade, sexo

nome idade gênero
Zhang San 18 macho
John Doe 20 macho

selecione sintaxe

selecione informações de consulta da fonte de dados

Em uma consulta de grupo, todas as colunas de função não estatística na cláusula select devem aparecer na cláusula group by.

SELECT DEPTNO,EMPNO ,count(*) 
FROM emp 
GROUP BY DEPTNO,EMPNO;

Consultar informações do departamento

selecione * do departamento;

Consultar informações dos funcionários

selecione * de emp;

Consulte os números e nomes dos departamentos de todos os departamentos

selecione deptno,dname do departamento;

Consulte o nome, salário, departamento e número de todos os funcionários

selecione ename,sal,deptno de emp;

Remover duplicatas

Consulte os nomes e números de departamento de todos os funcionários

select ename deptno from emp; 
​##
Consulte o número do departamento de funcionários existentes 
selecione deptno from emp; 
​##
Remova duplicatas distintas 
selecione distinto deptno de emp; 
​##
Consulte os nomes de todos os funcionários e seus números de departamento 
selecione distinto ename, deptno de emp;

Alias ​​uma coluna

##Consulte nome do funcionário, salário do funcionário 
selecione ename,sal de emp; 
selecione ename nome,sal salário de emp; 
selecione ename como nome,sal como salário de emp 
;

organizar

--order by 
select ename,sal from emp; 
Consulta os nomes e salários de todos os funcionários, classifica-os em ordem decrescente de acordo com o salário do funcionário 
select ename,sal from emp order by sal desc;##Ordem decrescente 
select ename,sal from emp ordenar por sal asc ;## 
Ordem crescente

Classificar por vários campos

--Consulte o nome, salário e número do departamento de todos os funcionários em ordem crescente por número de departamento.Os funcionários do mesmo departamento são classificados em ordem decrescente por salário, selecione ename,sal,deptno from 
emp order by deptno asc,sal desc;

Pseudocolunas e tabelas virtuais

Nota: A consulta de colunas inexistentes é uma pseudocoluna. Quando os resultados necessários não podem ser obtidos diretamente da tabela e precisam ser exibidos por meio de cálculo, podem ser utilizadas pseudocolunas + expressões.

## Consulta nome de usuário, salário 
selecione ename, sal,1 de emp; 
##
Consulta nome de usuário, salário mensal, salário anual (salário mensal*12) 
selecione ename,sal,sal*12 de emp; 
selecione ename,sal,sal * 12 como salário anual do empregado;

processamento nulo

Consultar nome do funcionário, salário mensal + comissão

selecione * de emp; 
selecione ename,sal,comm,sal+comm como renda mensal de emp; 
##nvl(expl expression, res result) 
selecione ename,sal,comm,sal+nvl(comm,0) como renda mensal de emp; 
​##
Classificar 
##Classificar de acordo com o salário do funcionário 
select * from emp order by sal; 
##Ordem decrescente 
select * from emp order by comm desc; 
##Coloque os vazios por último null primeiro,null last 
select * from emp ordene por comm desc nulos primeiro; 
selecione * de emp ordene por comm desc nulos por último 
;

Concatenação de strings (||)

selecione ename de emp; 
​selecione
ename,ename||'a' como 别名 de emp; 
​​##

null 
selecione ename,comm,ename||comm test de emp;

mesa virtual

A tabela virtual dupla constrói principalmente regras de sintaxe selecionadas.A Oracle garante que sempre haverá apenas um registro na tabela dupla.

Avalie expressões e selecione variáveis ​​do sistema.

--Calcule 999*666 
selecione 999*666 de dual;

selecione a ordem de execução da instrução

nulo, quando nulo é operado, o resultado é nulo

selecione o alias do campo de consulta 1, o campo de consulta 2 como alias, o alias da expressão da fonte de dados ordene por campo de classificação desc

assunto gramatical

selecione ....de...ordenar por

ordem de análise

1.de

2.selecione

Cidade de 3ª ordem

Consulte o nome do funcionário, salário do funcionário, alias salário e classifique os resultados em ordem decrescente de salário

selecione ename,sal 工资 de emp order by sal desc;

ordem gramatical

selecionar, de, onde, agrupar por, ter, ordenar por

Ordem de compilação

de, onde, agrupar por, tendo,, selecionar, ordenar por

Consulta condicional

Operação condicional

=,<,><=,>=,<>,!=,entre e, em Consultar as informações dos funcionários em 10 departamentos

Consulte informações de funcionários fora de 10 departamentos

Consulte o nome, tipo de trabalho e número de departamento de funcionários com salário superior a 2.000

Consultar informações de funcionários com salário entre 1800 e 2500

Consultar informações de funcionários dos departamentos 10, 30 e 40

select * from emp 
where deptno=10; 
​select
* from emp 
where deptno<>10;
​select
ename,job,deptno,sal 
from emp 
where sal>2000 
​select
* from emp 
where sal entre 1800 e 
2500

Operação de conexão condicional

e, ou, não

Consultar a informação dos colaboradores que não fazem parte do departamento e cujo salário não ultrapassa os 1500

selecione * de emp deptno!=20 e sal<1500;

operação nula nvl

--Consulte as informações de todos os funcionários que têm dificuldade em obter bônus 
--Consulte dados Informações do funcionário 
--Fonte de dados emp 
--Condições do filtro comm não é nulo 
selecione ename, comm from emp 
onde comm não é nulo; 
​selecione
ename, comm from emp 
onde comm é nulo; 
​select
* from emp onde not comm é nulo; 
​--nvl


() fornece um valor específico quando um valor é nulo, caso contrário o próprio valor é 
select nvl(null,100 ) from dual; 
--Consulte as informações dos funcionários que receberam bônus, e consulte as informações dos funcionários cujos bônus são maiores que 0 
select * from emp where comm>0;

inserir

--Inserir uma informação na tabela emp 
insert
into emp(empno,ename,job,deptno) valores(1111,'afbi','aaa',200); 
commit;

Tratamento especial de consultas difusas

--Consulta funcionários contendo '% 
a'select * from emp where ename like '%a%%' escape()

cláusula where filho

Consultar informações de funcionários do departamento de vendas (vendas)

selecione * de emp 
onde deptno=(selecione deptno de dept onde dname='vendas') 
--1
)de 
--2)onde 
    --21)de 
    --22)onde 
    --23)selecione 
--3)selecione 
​​-- Consultar


funcionários com nível salarial 2 
--dados informações 
do funcionário --fonte tabela de funcionários 
--condições nível salarial 2 
selecione * de emp 
onde sal entre (selecione losal de salgrade onde nota = 2) e (selecione hisal de salgrade onde nota=2);

função

função de personagem

concat(x,y) concatena strings x e y

instr(x,str,start,n).Para pesquisar str em x, você pode especificar a partir do início ou da enésima vez.

comprimento(x) retorna o comprimento de x

lower(x) x é convertido em minúsculo

maiúscula(x) X converte para maiúscula

ltrim(x,trim_str) trunca a string trim.str no lado esquerdo de x e trunca espaços por padrão.

rtrim(x,trim_ str) trunca a string trim_ str no lado direito de x e trunca espaços por padrão

replace(x, old,new) encontra o antigo em x e o substitui pelo novo

substr(x, start,length) retorna a sequência de caracteres de x, começando do início, interceptando caracteres de comprimento, comprimento padrão, padrão até o final

função concat, selecione o número

--Consulte os nomes e tipos de trabalho de todos os funcionários 
selecione ename,job from emp; 
--Conecte-os juntos 
selecione ename||job namejob from emp; 
selecione concat (ename,job) namejob from emp;
--Find substring 
--Adicione uma string "helloworld", encontre "e" 
select instr ('holloword','a') from dual; 
--Verifique se os nomes de todos os funcionários contêm 'A', se incluído, o posição de exibição 
select ename,instr(ename,'a' from emp); 
​--Adicione
uma string "helloworld", encontre "l" 
select instr ('holloword','l') from dual; 
select instr ('holloword' ','l',6) de dual; 
selecione instr ('holloword','l',1,2) de dual; 
comece da primeira posição e procure pela segunda l Localização

ltrim remove espaços no lado esquerdo de uma string

rtrim remove espaços no lado direito de uma string

selecione ltrim ('abc abc ')||'a' de dual; 
selecione rtrim ('abc abc')||'a' de dual; 
selecione ltrim(rtrim (' abc abc '))||'a' de dual; 
selecione concat(rtrim(ltrim(' abc abc ')),'a') de dual; 
--去掉左边的aaa 
selecione ltrim ('aaabsdbdb','aaa')de dual;

substituir substituir

selecione substituir ('aaabsdbdb','a','_')de dual;

interceptação de substrato

select substr('abc',2,2) from dual; 
--Exibe o primeiro caractere dos nomes de todos os funcionários 
select substr(ename,1,1) from emp; 
--Exibe o último caractere 
select ename,substr( ename ,comprimento(ename),1) de emp;

função de data

sysdate hora atual do sistema data_atual retorna a data atual do sistema, sel, select add_ meses(d1,n1) retorna a nova data após adicionar n1 meses à data d1 último, dia(d1) retorna o último dia do mês onde a data d1 é data localizada meses, _between(d1,d2) retorna o número de meses entre 8 período d1 e a data d2 seguinte. day(d1[c1]) retorna a data da data d1 na próxima semana e o dia da semana (parâmetro c1 )

--Obter a data atual do sistema 
selecione sysdate de dual; 
selecione current_date de dual; 
​​-Obter

a hora um dia após o sistema 
selecionar sysdate+1 de dual; 
​-Pule

para três meses depois e consulte as datas de regularização de todos os funcionários, período de teste de 3 meses, 
selecione empno, ename, subscriber de emp; 
selecione empno, ename, Hiredate,add_months(hiredate,3) de emp; 
​--Retorna
o último dia do mês 
, selecione last_day(sysdate) de dual ; 
--Ver cada O último dia do mês de entrada do funcionário 
selecione último_dia(datadecontratação) O último dia, data de contratação de emp; 
​--Consulte
quantos meses cada funcionário trabalhou até agora 
selecione sysdate,datadecontratação,meses_entre(data_sistema,datadecontratação) from emp; 
--Obtém
o próximo dia da semana no momento atual 
select next_day(sysdate,'Monday') from dual 
;
as horas de trabalho de cada funcionário
selecione contratadotae,next_day(hiredate,'Quarta-feira') de dual;

função de conversão

to_ char(x,c) Converte a data ou dados x para o tipo de dados char de acordo com o formato c to_ date(x,c) Converte a string x em data de acordo com o formato c to_ _number(x) Converte a string x para digital

--to_char caractere de conversão de data 
selecione data de contratação de emp; 
selecione to_char (data de contratação,'mm/dd/yyyy') de emp; 
selecione to_char (data de contratação,'mm"mês"/dd"日"/aaaa"ano"') de emp; 
​​​​--to_date



(chars,charFormat) data de conversão de caracteres 
--1990/01/01 
select to_date('1990/01/01','yyyy/mm/dd') from dual; 
​--to_number
() Converter caracteres em números 
--"11" 
selecione '11' de dual; 
selecione '11'+1 de dual; 
selecione to_munber('11')+1 de dual; 
selecione to_number ('11','xx') de duplo;

Funções de grupo comumente usadas

A função de grupo opera em vários registros ao mesmo tempo e retorna um resultado avg() Average Sum() sum select next_day(sysdate,'Monday') from dual; min() valor mínimo select next_day(sysdate,'Monday) ') from dual; max() valor máximo count() nota estatística: null não participa da operação

--Encontre o número total de pessoas count() O número de pessoas na empresa 
select count(emptno) from emp; 
--O salário mais alto de todos os funcionários 
select max(sal) from emp; 
--O mínimo 
selecione min(sal ) de emp; 
--Soma Os salários que precisam ser pagos em um mês selecione 
sum(sal) de emp; 
--Encontre o salário médio médio selecione 
avg(sal) de emp; 
--Estatísticas sobre o número de funcionários em 10 departamentos selecione 
count(empno) from emp 
where deptno=10; 
--Estatísticas A comunicação de toda a empresa não está envolvida na operação 
. select count(comm) fromm emp;    
--Estatísticas sobre quantos departamentos há funcionários 
. select count( distinto deptno) de dept; 
--Número estatístico de registros. 
select count(*) from emp; 
select count(*) from dept; 
-- Conta quantos departamentos existem em toda a empresa 
select count(deptno) from dept;

grupo por grupo

Agrupar por grupo agrupa ainda os registros que atendem às condições de acordo com determinadas características. Extraia pontos em comum em cada conjunto de registros

--Encontre o salário médio de cada departamento 
, selecione o número de departamento, média (sal) 
do 
grupo de funcionários por número de departamento; 
--Encontre o salário médio de cada 
trabalho selecionado, média (sal) do 
grupo de funcionários por trabalho; 
--Encontre os funcionários O número de pessoas em cada departamento 
selecionam contagem (empno),deptno do 
grupo de funcionários por deptno;

ter informações do grupo de filtros

As informações do grupo a serem obtidas podem precisar atender a certas condições

--Encontre o salário médio de cada departamento, 
selecione deptno,avg(sal) 
do grupo emp 
por deptno 
tendo avg(sal)>2000 para departamentos com mais de 2000 funcionários; 
--Ver o número do departamento e o número de funcionários no departamento com mais de 3 funcionários; 
selecione deptno,count(deptno) do 
grupo emp por deptno 
tendo count(deptno)>3;

Filtrar registros de linha e informações de grupo

A filtragem de registros de linha é para cada registro, e a filtragem de informações de grupo é para grupos. Eles podem aparecer ao mesmo tempo. Filtre as linhas primeiro e depois filtre os grupos. Onde filtra linhas, apenas informações de linha podem aparecer. Tendo grupo de filtros, apenas estruturas de informações de grupo podem aparecer: selecione .. de ..onde .grupo por .. tendo...

Ordem de execução:

de

onde

agrupar por

tendo

selecione

--Consulte o número do departamento, número de funcionários no departamento, funcionários com salário superior a 2.000, departamentos com mais de 2 funcionários 
selecione deptno,count(deptno) de emp 
onde sal>2000 
agrupa por deptno 
tendo count(deptno)>=2 
;

Paginação e desduplicação

Existem duas soluções para implementar a paginação: (1) Consultar todos os registros do banco de dados de uma só vez e, em seguida, exibir os registros especificados em cada página. Paginação falsa (2) Consulte o banco de dados várias vezes, obtenha apenas os dados desta página de cada vez e exiba a paginação verdadeira

Hoje em dia, os dados na construção de sites são enormes. Se você implementar o plano 1: sem dúvida aumentará a carga na memória do servidor e reduzirá a velocidade de funcionamento do sistema; se você usar o plano 2, poderá operar o banco de dados com frequência, o que também afetará a eficiência da resposta; portanto, todos usarão o plano 1 + plano 2 para alcançá-lo. O núcleo da paginação é calcular quantos registros por página, o número total de páginas e qual página. Para cada página de dados, você só precisa calcular o registro inicial e o registro final.

Paginação verdadeira e falsa

Consulta de paginação real primeiro, depois paginação falsa

Primeiro consulte o banco de dados para encontrar 500 itens (paginação verdadeira) e, em seguida, use paginação falsa para exibir 100 itens (paginação falsa)

Melhor eficiência e uso de memória

número de linha

rownum não é uma coluna real, é o número de linhas retornadas da consulta. A primeira linha retornada recebe 1, a segunda linha é 2 e assim por diante. Este pseudo campo pode ser usado para limitar as linhas retornadas pela consulta . Número total de linhas. Como rownum é sempre o número do conjunto de resultados, qualquer registro com rownum>1 não pode ser consultado diretamente porque sempre começa em 1.

--True paging 
--rownum é o número de cada registro em cada conjunto de resultados. 
Selecione ename,sal,deptno,rownum de emp; 
--Paging
, exibe 5 registros em cada página, consulte cada também 
selecione enmae,sal,deptno ,rownum from emp where rownum<=5; 
​--consulta
os dados na segunda página. Você não pode usar maior que, porque cada linha se tornará a primeira linha. 
select enmae,sal,deptno,rownum from emp where rownum<= 10 ; 
​--Consulte
todas as informações dos funcionários e adicione pseudocolunas rownum 
select enmae,sal,deptno,rownum from emp; 
--Use um conjunto de resultados de consulta como uma fonte de dados temporária, apenas temporária Esse conjunto de resultados rownum campo comum 
select * from (selecione ename,sal,deptno,rownum from emp) onde rownum<=10;

Se a primeira linha não for maior que 5, o primeiro dia será excluído e a segunda linha se tornará a primeira linha e assim por diante e, finalmente, a décima linha se tornará a primeira linha.

selecione ename,sal,deptno,rownum de emp; 
selecione
ename,sal,deptno,rownum de emp onde rownum<=5; 
selecione
* from (selecione ename,sal,deptnno,rownum rw de emp) onde rw >5 e rw<=10; 
​--Consulte
os dados na segunda página 
select ename,sal,deptno,rownum from (ename,sal,deptno,rownum rw from emp) where rw>5 e rw<=10;​--Query as 
informações 
dos funcionários 
ename,sal,deptno, rwonum r1 do emp order by sal desc ;
selecione
ename, sal,deptno, r1, rwonum r2 de (selecione ename,sal,deptno,rownum r1 de emp ordene por sal desc);​(selecione ename,sal,deptno, r1 , rownum r2 de (selecione ename,sal 
,
; 
de
(selecione ename,sal,deptno, r1, rownum r2 de (selecione ename,sal,deptno,rownum r1 de emp order by sal desc)) onde r2<=3; 
selecione ename,sal,deptno,r1,r2 de 
(selecione ename,sal,deptno, r1, rownum r2 de 
(selecione ename,sal,deptno,rownum r1 de 
 emp order por sal desc)) 
 onde r2>(2-1) *3 e r2<=2*3;

desduplicação rowid

ROWID é um conceito importante no ORACLE. Um valor de endereço relativamente exclusivo usado para localizar um registro no banco de dados. Normalmente, este valor é determinado e único quando a linha de dados é inserida na tabela do banco de dados. ROWID é uma pseudocoluna, na verdade não existe na tabela. É uma pseudocoluna codificada pelo ORACLE com base nas informações do endereço físico de cada linha de dados ao ler as linhas de dados da tabela. Portanto, as informações de endereço físico de uma linha de dados podem ser encontradas com base no ROWID de uma linha de dados. Isso permite localizar rapidamente linhas de dados. A maioria das operações do banco de dados é concluída por meio do ROWID, e usar o ROWID para localizar um único registro é o mais rápido. Às vezes, ao recuperar dados complicados, as condições de pesquisa comuns não podem atender aos requisitos. Rowid pode ser usado para recuperar os resultados com precisão. No Oracle, se você deseja consultar vários campos em uma determinada tabela e apenas desduplicar um determinado campo, usando distinto ou agrupar por não vai funcionar. . Distinto e agrupar por irá desduplicar os campos a serem consultados, ou seja, quando todos os campos consultados forem iguais, o Oracle irá considerá-los como duplicados. Usar rowid é uma boa escolha neste momento.

--Preparar dados 
criar cópia da tabela como select * do dept; ##Copiar uma tabela 
select
* do copy; 
​select
deptno, dname,loc,rowid da cópia; 
​inserir
na cópia select * do dept;##Inserir 
commit ;
--Mantenha
apenas uma cópia de todos os mesmos registros 
--1. Agrupe os dados de acordo com informações repetidas 
--2. Em cada grupo, selecione um registro para salvar e encontre as características (roeid) 
--3 .Ao excluir, encontre os dados que não estão dentro do intervalo de retenção 
selecione * do grupo de cópias por deptno,dname,loc; 
selecione
min(rowid) do grupo de cópias por deptno,dname,loc; 
selecione
* da cópia onde roeid não está em( select min( rowid) do grupo de cópias por deptno,dname,loc);   
​commit
da cópia onde rowid não está (selecione min(rowid) do grupo de cópias por deptno,dname,loc); ##Excluir registros duplicados
commit; 
​selecione
* da cópia;

junção de mesa

Consulta de conexão: 1) Ao consultar, múltiplas tabelas são necessárias ao mesmo tempo (especialmente aquelas com relacionamentos de chave estrangeira), e os valores entre múltiplas tabelas são necessários para conectar; 2) O padrão SQL atual propõe duas consultas de conexão, a o primeiro é o padrão SQL92 anterior e o segundo é o padrão SQL99 mais recente que é amplamente utilizado atualmente;

3) A forma de 92 é simples, mas a escrita é relativamente detalhada. 99 não é apenas otimizado no nível inferior, mas também a forma é mais clara e lógica. Geralmente é recomendado usar o padrão 99;

92 Gramática

Múltiplas tabelas precisam ser colocadas depois de, e todas as condições de conexão são colocadas em onde. Portanto, equijoins, links não equivalentes, junções externas, etc. em SQL92 são na verdade apenas estruturas de filtragem de condições whgre: select .. from table1 , table2 , table3 .. where... Muitas vezes é necessário dar um alias à tabela (1. Simplificar o nome da tabela 2. Pode haver auto-junção) O princípio da conexão: De acordo com a ordem de aparecimento do tabelas após from, as tabelas anteriores são usadas como memória for loop, a tabela que aparece depois é usada como loop for externo

--Consulte os dados na tabela emp e na tabela dept (produto cartesiano) registros emp12 * registros dept4 = 48 
select * from emp e,dept d order by empno; 
select * from emp e,dept d where 1=1 order by empno ;

Equijunção

Com base no produto cartesiano, use o mesmo valor na coluna de condição para consultar informações do funcionário e do departamento. Consulte o nome do funcionário e o nome do departamento.

--Consulte as informações de cada funcionário e as informações do departamento 
--Dados: informações do departamento de informações dos funcionários 
--Fonte: emp,dept 
--Condições de conexão: emp,deptno=dept,deptno 
select * from emp e,dept d 
where e.deptno=d.deptno; 
​--Consulte
as informações de cada departamento de funcionários e o número de pessoas no departamento 
--Consulte os dados: informações do departamento, número de funcionários do departamento correspondente 
--Fonte de dados: dept, emp calculado 
--Condições de conexão :dept,deptno=correspondente ao número de deptno 
--
consulta o número de funcionários no departamento com funcionários 
select count(*),deptno from emp group by deptno; 
select * from dept d,(select count(*),deptno do grupo emp por deptno) c 
onde d.deptno=c.deptno

não-equijoin

!=, >, <, <>, entre e consulta nome do funcionário, salário e categoria

--Consulte o nome de cada funcionário, valor do salário, horário de ingresso e faixa salarial correspondente 
--Consulte dados: ename, sal, contratado, nota 
--Fonte de dados: dept, salgrade 
--Condições de conexão: emp, sal entre losal e hisal 
select ename,sal,hiredate,grade from emp e,salgrade s 
onde e.sal entre losal e hisal;

junção externa

As junções internas usam operadores de comparação para combinar linhas em duas tabelas com base nos valores das colunas comuns a cada tabela. Uma junção externa pode ser uma junção externa esquerda, uma junção externa direita ou uma junção externa completa. O conjunto de resultados de uma junção externa esquerda inclui todas as linhas da tabela esquerda especificada na cláusula LEFT OUTER, não apenas as linhas correspondentes às colunas de junção. Se uma linha na tabela esquerda não tiver nenhuma linha correspondente na tabela direita, todas as colunas da lista de seleção da tabela direita terão valores NULL nas linhas associadas do conjunto de resultados. A junção externa direita é a junção retórica da junção externa esquerda. Todas as linhas da tabela certa serão retornadas. Se uma linha na tabela da direita não tiver nenhuma linha correspondente na tabela da esquerda, será retornado nulo para a tabela da esquerda. Veja '+', a tabela com '+' é a tabela escrava e a tabela oposta é a tabela mestre. Encontre os nomes de todos os funcionários e os nomes de seus superiores. Encontre os nomes de todos os superiores e os nomes de seus funcionários. Encontre o número de funcionários e nomes de departamentos em todos os departamentos. Encontre os nomes e o número de funcionários de todos os departamentos com funcionários. .

--Conexão interna 
--Consulte as informações de cada departamento e o número de pessoas no departamento 
select * from dept; 
select * from emp; 
​select
count(*),deptno from emp group by deptno; 
​select
* from dept d ,(select count (*),deptno from emp group by deptno) c 
where d.deptno=c.deptno; 
​-Conexão externa
com a tabela principal (desde que os registros consultados na tabela principal devam aparecer nos resultados ) 
--Ver informações de cada departamento, número correspondente de funcionários 
--Consulta de dados: informações do departamento, número de funcionários do departamento 
--Fonte de dados: dept d,(selecione contagem(*),deptno do grupo emp por deptno) c 
--Condições de conexão: d.deptno= c.deptno(+) 
select * from dept d,(select count(*),deptno from emp group by deptno) c 
where d.deptno=c.deptno(+); 
​--nvl
Quando um valor está vazio Forneça um valor específico, caso contrário, o próprio valor é 
select d.deptno,dname,loc,nvl(cc,0) from dept d,
(select count(*) cc,deptno from emp group by deptno) c 
where d.deptno=c.deptno(+); 
​--Liste
as informações de cada funcionário com um superior e as informações superiores correspondentes 
--Liste todos os funcionários informações e informações de seus superiores 
--Consulta de dados: informações de funcionários, informações superiores 
--Fonte de dados: emp e, emp m 
--Condições de conexão: e.mgr=m.deptno(+ 
)

autoconexão

Equijoin especial (da mesma tabela) para encontrar os nomes dos funcionários cujos superiores existem.

--Consulte as próprias informações de cada funcionário (funcionário com superior) e as informações do superior 
--Consulta de dados: funcionários são todos dados, dados do superior 
--Fonte de dados: emp e, emp m 
--Condições de conexão: e.mgr=m.empno 
selecione * de emp e,emp m 
onde e.mgr=m.empno;

99 Gramática

junção cruzada

Conexão cruzada para implementar produto cartesiano

--99 flag implementa produto cartesiano 
select * from dept cross join emp;

junção natural

Obrigatório (coluna com o mesmo nome, edifício externo principal)

Conexão natural, conexão equivalente

Consulte os nomes de todos os funcionários e os nomes de seus departamentos

Deve haver colunas com o mesmo nome ou um relacionamento de chave primária e estrangeira:

--Ver os nomes de todos os funcionários, número do funcionário, número do departamento, nome do departamento 
--Consulta de dados: nome do funcionário, número do funcionário, número do departamento, nome do departamento 
--Fonte de dados: emp, dept 
--Condições de conexão: emp. deptno= dept.deptno 
--99 pode ser implementado usando natural join natural join 
select ename,empno,deptno,dname from emp natural join dept; 
​--Consulte
o nome do funcionário, nome do departamento, número do departamento de 10 departamentos 
selecione ename,deptno,dname de emp natural join dept 
onde deptno = 10

junte-se usando (coluna de mesmo nome)

usando conexão, conexão equivalente para consultar os nomes de todos os funcionários e os nomes de seus departamentos

Deve haver colunas com o mesmo nome: equijoin

--99 pode ser implementado usando connection (valor igual) 
select ename,empno,deptno,dname from emp join dept using(deptno); 
​--Consulte
o nome do funcionário, nome do departamento, número do departamento de 10 departamentos 
selecione ename,deptno ,dname de emp join dept usando(deptno) 
onde deptno=10;

junte-se

na conexão, que pode ser usada para conexão de equivalência, conexão de não equivalência e autoconexão. Pode resolver - cortar conexão. A coluna de relacionamento deve ser diferenciada para consultar os nomes de todos os funcionários e os nomes de seus departamentos. Consulte o nomes, salários e níveis salariais de todos os funcionários.

Nota: Você precisa adicionar um qualificador antes da coluna com o mesmo nome? Se você usar uma conexão natural usando connection, não poderá adicioná-lo. Caso contrário, será necessário adicioná-lo.

--Ver os nomes, números e números de departamento e nomes de departamento de todos os funcionários 
--Se um qualificador precisa ser adicionado antes da coluna com o mesmo nome. Se você usar uma conexão natural usando conexão, não poderá adicioná-lo. Caso contrário , você precisa adicionar 
select e.ename ,e.deptno,e.empno,d.dname 
from emp e join dept d on 
e.deptno=d.deptno; 
​--Ver
o nome de cada funcionário, salário, número do departamento, salário grade 
--Consulta dados: Nome do funcionário, salário, número do departamento, faixa salarial 
- fonte de dados; emp, slagrade 
- condições de conexão: sal entre losal e hisal 
select ename,sal,deptno,grade from emp e join salgrade s on sal entre losal e hisal; 
- Consultar
nome do funcionário, salário, número do departamento, faixa salarial, nome do departamento em 30 departamentos 
--Consultar dados: nome do funcionário, salário, número do departamento, faixa salarial, nome do departamento 
--Fonte de dados: emp e, salgrade s, dept d 
--Condições de junção: sal entre losal e hisal e.deptno=d.deptno 
selecione
ename,sal,e.deptno,dname,grade 
from emp e join dept d
em e.deptno=d.deptno 
junte salgrade s 
em sal entre losal e hisal 
onde e.deptno=30;

junção externa

Junção externa, existe a tabela principal e a tabela escrava: junção esquerda [externa] na junção esquerda [externa] usando junção direita [externa] na junção direita [externa] usando

--Consulte o número do funcionário, o nome do funcionário, o nome superior correspondente do funcionário, o número superior, 
selecione o número do funcionário e.empno, o nome do funcionário e.ename, o número superior e.mgr, o nome superior m.ename 
do emp e left outer join emp m on e .mgr=m.empno

Resumo de junção de tabela

--Junção de tabela Quando os dados consultados vêm de mais de uma tabela--1. Produto cartesiano--2. Junção equivalente--3. Junção não equivalente--4. Autojunção--padrão 92

selecione ... da tabela1, tabela2 onde tabela1. xxItable2. xx e tabela1.xx=1;

--99 padrão

selecione.....da tabela junção cruzada tabela2 onde .. 
​selecione
......da tabela1 junção natural tabela2 onde ... ; 
​selecione
...da tabela1 junte-se à tabela2 usando (同名字段) onde... .. 
​selecione
....da tabela1 junte-se à tabela2 em连接条件 onde... 
​selecione
...da tabela1 junte-se externamente à tabela2 em 连接条件onde 
.....

Totalmente conectado

selecione ...da tabela full join table2 na condição de junção onde...

sintaxe ddl

ddl: linguagem de definição de dados

dml: linguagem de manipulação de dados

dcl: linguagem de controle de dados

Operações de tabela

Criar a tabela

criar tabela nome da tabela (

Tipo de nome de campo (comprimento),

...Outros campos...

);

Modificar estrutura da tabela

Modificar nome da tabela

renomear o nome da tabela original para o novo nome da tabela

renomeie tb_txt para tb_txt_new;

Modificar nome da coluna

alterar o nome da tabela renomear o nome da coluna da coluna para

alterar tabela tb_txt_new renomear coluna txtid para tid;

Modificar tipo de campo

alterar tabela nome da tabela modificar (tipo de campo)

alterar tabela tb_txt_new modificar(tid vachar2(20))

Adicionar coluna

alterar tabela nome da tabela adicionar tipo de campo

alterar tabela tabela tb_txt_new adicionar col_test_name varchar2 (30)

Excluir coluna

alterar o nome da tabela, eliminar o campo da coluna

alterar tabela tabela tb_txt_new eliminar coluna col_test_name

Excluir tabela

eliminar tabela tb_txt_new;

PLSQL

gramática:

--plsql é dividido em três partes: parte de declaração, parte executável, parte de tratamento de exceções 
declarar 
    --declarar variáveis, cursor 
    i inteiro; 
começar 
    --parte de execução 
    
    --[tratamento de exceções] 
    
fim;
set serveroutput on --Abre a opção de saída 
declare
 
    i inteiro; 
começar 
    --Execute parte 
    DBMS.output.put_line('OLÁ MUNDO') --Print 
    --[Tratamento de exceção] 
fim; 
/

    

variável

Variáveis ​​comuns na programação PL SQL são divididas em duas categorias:

  1. Tipos de dados comuns (char, varchar2, data, número, boolean.long)

  2. Tipos de variáveis ​​especiais (variáveis ​​de referência, variáveis ​​de registro)

A maneira de declarar variáveis ​​é

  1. Nome da variável tipo de variável (comprimento variável) Por exemplo: v_name varchar2(20);

Variáveis ​​​​comuns

Existem duas maneiras de atribuir valores às variáveis:

  1. Atribuição direta: =

  2. Atribuição de instrução, use select ...into... para atribuir valor: (sintaxe selecione valor na variável)

[Exemplo] Imprima informações pessoais da pessoa, incluindo: nome, salário, endereço

--Imprime informações pessoais do pessoal, incluindo: nome, salário, endereço 
DECLARE 
    --Nome 
    V_NAME VARCHAR2(20):='Zhang San'; --Atribuição direta de variável declarada 
    --Salário 
    V_SAL NUMBER; 
    --Endereço 
    V_ADDR VARCHAR2(200) ; 
BEGIN 
    --Atribuir v_sal diretamente no programa 
    :=1580; 
    --Atribuição de instrução 
    SELECT 'Sichuan' INTO v_addr from dual; 
    dbms_output.put_line('Name: '||v_name||', salário: ' 
                         ||v_sal|| ', endereço: '|| 
                         v_addr); 
END;

variável de referência

O tipo e comprimento da variável dependem do tipo e comprimento dos campos na tabela

Especifique o tipo e o comprimento da variável através do nome da tabela e do nome da coluna %type, por exemplo:

v_name emp.ename%tipo

[Exemplo] Consulte os dados pessoais de 7.839 funcionários na tabela emp e imprima o nome e o salário

--Tipo comum 
--Consulta as informações pessoais de 7839 funcionários na tabela emp, imprime o nome e salário 
DECLARE 
    --Name 
    V_NAME VARCHAR2(20);--Declara variáveis ​​para atribuir valores diretamente 
    --Salário 
    V_SAL NUMBER; 
    
BEGIN 
    selecione ename,sal em v_name, v_sal 
    de emp onde empno=7839; 
    --Imprimir saída 
    dbms_output.put_line('Nome: '||v_name||', Salário: ' 
                         ||v_sal); 
END; 
​​--Variável de referência

 
DECLARE 
    --Name 
    V_NAME emp .ename%type;--Declara variáveis ​​e atribui valores diretamente 
    --Salary 
    V_SAL emp.sal%type; 
BEGIN 
    select ename,sal into v_name,v_sal 
    from emp where empno=7839; 
    --Print saída
    
    dbms_output.put_line('Nome: '||v_name||', Salário: ' 
                         ||v_sal); 
END;

variável de registro

Aceitar uma linha inteira de registros de uma tabela

Sintaxe: nome da variável nome da tabela %rowtype Por exemplo: v_emp emp%rowtype;

[Exemplo] Consulte e imprima o nome e salário do funcionário nº 7839

--Consulte e imprima o nome e salário do funcionário nº 7839DECLARE 
    --Variável do tipo de registro 
    v_emp emp%rowtype; 
BEGIN 
select 
    * into v_emp 
    from emp where empno=7839; 
    --Print output 
    dbms_output.put_line('Name:'|| v_emp .ename||', salário: ' 
                         ||v_emp.sal); 
END;
    

controle do processo

  • ramificação condicional

    gramática:

    BEGIN 
        IF condição 1 THEN execução 1: 
        
        ELSIF condição 2 THEN execução 2: 
        
        ELSE execução 3 
        
        END IF 
        
    ;

    [Exemplo] Determine se há mais de 20 registros na tabela emp, entre 10 e 10 ou menos de 10 registros

    --Determina se há mais de 20 registros na tabela emp, entre 10-10 ou menos de 10 
    DECLARE 
        --Declara uma variável para receber o número na tabela emp 
        v_count NUMBER; 
    BEGIN 
        SELECT COUNT(1) INTO V_COUNT FROM EMP; 
        --count (1)=count(*) 
        IF V_COUNT>20 THEN 
            DBMS_OUTPUT.PUT_LINE 
            ('Mais de 20 registros na tabela são: '||v_count); 
        ELSIF V_COUNT>=10 THEN 
            DBMS_OUTPUT.PUT_LINE 
            ('O os registros na tabela estão entre 10-20 As entradas são: ''||v_count); 
        ELSE 
            DBMS_OUTPUT.PUT_LINE 
            ('Os registros na tabela abaixo de 10 são: ''||v_count); 
        END IF; 
    END;
  • ciclo

    gramática:

    BEGIN 
        LOOP 
            EXIT WHEN condição de loop de saída 
        END LOOP; 
    END;

    [Exemplo] Imprimir números de 1 a 10

    DECLARE 
        --Declara a variável do loop e atribui o valor inicial 
        V_NUM NUMBER :=1; 
        
    BEGIN 
        LOOP 
            EXIT WHEN V_NUM>10; 
            DBMS_OUTPUT.PUT_LINE(v_NUM); 
            --Incrementa a variável do loop 
            v_num:=v_num+1; 
        END LOOP; 
    END ;

cursor

Cursor: usado para armazenar temporariamente várias linhas de dados retornados por uma consulta. Ao percorrer os dados, você pode acessar e processar os dados no conjunto de resultados linha por linha.

Uso do cursor: declarar -> abrir -> ler -> fechar

gramática

  1. Declaração do cursor:

    O nome do cursor CORSOR [(lista de parâmetros)] é uma instrução de consulta;

  2. Abertura do cursor:

    Nome do cursor ABRIR;

  3. Valor do cursor:

    FETCH nome do cursor NA lista de variáveis;

  4. Fechamento do cursor

    FECHAR nome do cursor;

Propriedades do cursor

Propriedades do cursor Tipo de valor de retorno ilustrar
%CONTAGEM DE LINHAS inteiro Obtenha o número de linhas de dados retornadas pela instrução FETCH
%ENCONTRADO boleano Verdadeiro se a instrução FETCH mais recente retornar uma linha de dados; caso contrário, falso
%NÃO ENCONTRADO boleano Oposto do valor retornado pela propriedade %FOUND
%ESTÁ ABERTO boleano True se o cursor foi aberto, false caso contrário

Entre eles, %NOTFOUND retorna TRUE quando o elemento não pode ser encontrado no cursor e geralmente é usado para determinar se deve sair do loop.

Nenhum cursor de parâmetro

--Use um cursor para consultar os nomes e salários de todos os funcionários na tabela emp, e imprima-os em sequência 
DECLARE 
    --Declara o cursor 
    CURSOR C_EMP IS SELECT ENAME,SAL FROM EMP; 
    
    --Declara uma variável para receber os dados no cursor 
    v_ename emp.ename%type ; 
    v_sal emp.sal%type; 
    
BEGIN 
    --Abra o cursor 
    abra c_emp; 
    
    --Percorra o 
    loop do cursor 
    --Obtenha os dados no cursor 
    busque c_emp em v_ename,v_sal; 
    
    --Sair o loop 
    sai quando c_emp%notfound; 
    DBMS_OUTPUT.PUT_LINE(v_ename ||'-'||v_sal); 
    end loop; 
    
    --Feche o cursor 
    feche c_emp; 
​END
;

Cursor com parâmetros

[Exemplo] Utilize o cursor para consultar e imprimir os nomes e salários dos funcionários de cada departamento e insira o número do departamento manualmente.

--Use um cursor para consultar os nomes e salários de todos os funcionários na tabela emp e imprima-os em sequência 
DECLARE 
    --Declara o cursor, a diferença entre participação e nenhum parâmetro 
    CURSOR C_EMP(v_deptno emp.deptno%type) IS SELECT ENAME,SAL FROM EMP where deptno = v_deptno; 
    
    --Declara uma variável para receber os dados no cursor 
    v_ename emp.ename%type; 
    v_sal emp.sal%type; 
    
BEGIN 
    --Abre o cursor, a diferença entre participação e não parâmetros 
    abrem c_emp(10); 
    
    --Percorre o 
    loop do cursor 
    --Obtém os dados no cursor, 
    busca c_emp em v_ename,v_sal; 
    
    --Saia do loop e determina se há um valor 
    exit quando c_emp%notfound; 
    DBMS_OUTPUT.PUT_LINE( v_ename||'-'||v_sal); 
    end loop; 
    
    --Close Cursor 
    close c_emp; 
​END
;

A busca deve ser realizada antes do julgamento, caso contrário, mais alguns valores aparecerão. Como a busca tem um valor padrão, haverá mais um valor padrão.

procedimento armazenado

gramática

CREATE OR REPLACE PROCEDURE nome do procedimento [(lista de parâmetros)] é 
BEGIN 
​END
[nome do procedimento];

De acordo com o tipo de parâmetros, dividimos-os em três categorias para explicação:

  1. sem parâmetros

  2. com parâmetros de entrada

  3. Com parâmetros de entrada e saída (valor de retorno)

Nenhum procedimento armazenado de parâmetro

CREATE ou REPLACE PROCEDURE p_hello is 
--Declare a variável 
BEGIN 
DBMS_OUTPUT.PUT_LINE('hello world'); 
END P_HELLO; 
​​BEGIN

 
    --plsql chama o procedimento armazenado 
    p_hello; 
end;

cmd chama exec p_hello;

Procedimento armazenado com parâmetros de entrada

[Exemplo] Consultar e imprimir o nome e salário de um funcionário (como o funcionário 7839) - procedimento armazenado; requisito: passar o número do funcionário ao ligar e o console irá imprimi-lo.

--Consulte e imprima o nome e salário de um funcionário (como o funcionário 7839)--procedimento armazenado; 
--Requisito: Passe o número do funcionário ao ligar e o console irá imprimi-lo. 
CRIAR OU SUBSTITUIR PROCEDIMENTO p_quernameandsal(i_empno IN emp.empno%type) as 
--Declarar variável 
    v_name emp.ename%type; 
    v_sal emp.sal%type; 
BEGIN 
    select ename,sal INTO v_name,v_sal from emp where empno =i_empno; 
    dbms_output .put_line(v_name||'_'||v_sal); 
end ; 
DECLARE

 
    i INTEGER; 
BEGIN 
    --plsql chama o procedimento armazenado 
    p_quernameandsal(7839); 
end;

Procedimento armazenado com parâmetros de saída

Geralmente usado por programas de terceiros

[Exemplo] Saída de funcionários para consultar as informações de um determinado funcionário (funcionário nº 7839) e exigir que as informações sejam geradas como um valor de retorno para uso pelo programa chamador.

--Exibe informações de consulta de funcionário de um determinado funcionário (funcionário nº 7839) 
--Obrigatório para gerar o valor como um valor de retorno para uso pelo programa de chamada. 
CRIAR OU SUBSTITUIR PROCEDIMENTO p_querysal(i_empno IN emp.empno%type,o_sal OUT emp.sal%TYPE) as 
--Declarar variável 
    v_name emp.ename%type; 
    v_sal emp.sal%type; 
BEGIN 
    selecione sal INTO o_sal de emp onde empno =i_empno; 
end ; 
​DECLARE

 
--Declara uma variável para receber o parâmetro de saída 
    v_sal emp.sal%TYPE no procedimento armazenado; 
BEGIN 
    --plsql chama o procedimento armazenado 
    p_querysal_out(7839,v_sal); 
    dbms_output.put_line(v_sal); 
fim;

Acho que você gosta

Origin blog.csdn.net/qq_66970557/article/details/122898969
Recomendado
Clasificación