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:
-
Tipos de dados comuns (char, varchar2, data, número, boolean.long)
-
Tipos de variáveis especiais (variáveis de referência, variáveis de registro)
A maneira de declarar variáveis é
-
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:
-
Atribuição direta: =
-
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
-
Declaração do cursor:
O nome do cursor CORSOR [(lista de parâmetros)] é uma instrução de consulta;
-
Abertura do cursor:
Nome do cursor ABRIR;
-
Valor do cursor:
FETCH nome do cursor NA lista de variáveis;
-
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:
-
sem parâmetros
-
com parâmetros de entrada
-
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;