notas de oráculo
inicio de base de datos
Iniciar oráculo
Después de la instalación, abra la línea de comando sql
ingresar
conn sys as sysdba
Iniciar e ingresar contraseña
select 11 from dual;
Compruebe si está instalado correctamente
Creación de usuarios
Inicio de sesión de superadministrador
conn sys/口令 as sysdba
Ingrese a la base de datos como dba
Crear espacio de tabla
create tablespace scott_tb_space datafile'D:\Programming\oracle\note\tbspace/scott_tb_space.dbf' size 200m;
Cree un archivo de datos llamado scott_tb_space en la ruta D:\Programming\oracle\note\tbspace. dbf es el tipo de datos y el espacio de tabla es 200 m.
create user scott identified by tiger default tablespace scott_tb_space;
Crear usuario
create user 用户名 identified by 密码 default tablespace 表空间;
grant dba to scott;
Conceder permisos de usuario
Pruebe si la creación es exitosa
seleccione * de dual;
Si usa 19c, debe ejecutar cmd como administrador al principio y luego iniciar sesión como administrador.
sqlplus/como sysdba
Luego cree un usuario. A partir de 12c, Oracle ha agregado CDB. De forma predeterminada, CDB está conectado. Sin cambiar a pdb, el nombre de usuario debe tener el prefijo C##.
Entonces el comando para crear usuario es:
crear usuario c##root IDENTIFICADO POR sy670422;
Luego realice la autorización:
otorgar conexión, recursos, espacio de tabla ilimitado a c## contenedor raíz=all;
Luego ejecute sqlplus;
diseño de mesa
Tabla de empleados: nombre, edad, sexo
nombre | edad | género |
---|---|---|
Zhang San | 18 | masculino |
Juan Pérez | 20 | masculino |
seleccionar sintaxis
seleccionar información de consulta de la fuente de datos
En una consulta grupal, todas las columnas de funciones no estadísticas en la cláusula de selección deben aparecer en la cláusula group by.
SELECCIONE DEPTNO,EMPNO,count(*) FROM emp GROUP BY DEPTNO,EMPNO;
Consultar información del departamento.
seleccione * del departamento;
Consultar información del empleado.
seleccione * de emp;
Consultar los números de departamento y los nombres de departamento de todos los departamentos.
seleccione deptno,dname del departamento;
Consultar el nombre, salario, departamento y número de todos los empleados.
seleccione ename,sal,deptno de emp;
Eliminar duplicados
Consultar los nombres y números de departamento de todos los empleados.
seleccione nombre deptno de emp; ## Consulta el número de departamento de los empleados existentes seleccione deptno de emp; ## Eliminar duplicados distintos seleccione distinto deptno de emp; ## Consulta los nombres de todos los empleados y sus números de departamento seleccione nombre distinto, depto de emp;
Alias una columna
##Consultar nombre del empleado, salario del empleado seleccione ename,sal de emp; seleccione ename nombre,sal salario de emp; seleccione ename como nombre,sal como salario de emp ;
clasificar
--order by select ename,sal from emp; Consulta los nombres y salarios de todos los empleados, ordénelos en orden descendente según el salario del empleado select ename,sal from emp order by sal desc;##Orden descendente seleccione ename,sal from emp ordenar por sal asc ;## Orden ascendente
Ordenar por múltiples campos
--Consulta el nombre, salario y número de departamento de todos los empleados en orden ascendente por número de departamento. Los empleados del mismo departamento se ordenan en orden descendente por salario select ename,sal,deptno from emp order by deptno asc,sal desc;
Pseudo columnas y tablas virtuales.
Nota: Consultar columnas inexistentes es una pseudocolumna. Cuando los resultados requeridos no se pueden obtener directamente de la tabla y deben mostrarse mediante cálculo, se pueden usar pseudocolumnas + expresiones.
##Consultar nombre de usuario, salario seleccione ename, sal,1 de emp; ## Consultar nombre de usuario, salario mensual, salario anual (salario mensual*12) seleccione ename,sal,sal*12 de emp; seleccione ename,sal,sal * 12 como salario anual del emp;
procesamiento nulo
Consultar nombre del empleado, ingreso mensual salario + comisión
seleccione * de emp; seleccione ename,sal,comm,sal+comm como ingreso mensual de emp; ##nvl(expresión expl, resultado res) seleccione ename,sal,comm,sal+nvl(comm,0) como ingreso mensual de emp; ## Ordenar ##Ordenar según el salario del empleado select * from emp order by sal; ##Orden descendente select * from emp order by comm desc; ##Pon los vacíos al final null primero, null último select * from emp ordenar por comm desc nulos primero; seleccionar * de emp ordenar por comm desc nulos al final ;
Concatenación de cadenas (||)
seleccione ename de emp; seleccione ename,ename||'a' como 别名 de emp; ## null seleccione ename,comm,ename||comm prueba de emp;
mesa virtual
La tabla virtual dual construye principalmente reglas de sintaxis seleccionadas. Oracle garantiza que siempre habrá un solo registro en la tabla dual.
Evaluar expresiones y seleccionar variables del sistema.
--Calcular 999*666, seleccione 999*666 de dual;
seleccione el orden de ejecución de la declaración
nulo, cuando se opera con nulo, el resultado es nulo
seleccione el alias del campo de consulta 1, el campo de consulta 2 como alias, el alias de expresión del origen de datos ordene por descripción del campo de clasificación
tema gramatical
seleccionar....de...ordenar por
orden de análisis
1.de
2.seleccionar
ciudad de tercer orden
Consulte el nombre del empleado, el alias del salario del empleado y ordene los resultados en orden descendente de salario
seleccione ename,sal 工资 de emp ordenar por sal desc;
orden gramatical
seleccionar, desde, dónde, agrupar por, tener, ordenar por
Orden de compilación
desde, donde, agrupar por, tener, seleccionar, ordenar por
consulta condicional
Operación condicional
=,<,><=,>=,<>,!=,entre y, en Consultar la información de los empleados de 10 departamentos
Consultar información de empleados fuera de 10 departamentos.
Consultar el nombre, tipo de trabajo y número de departamento de los empleados con un salario superior a 2000
Consultar información de empleados con salario entre 1800 y 2500
Consultar información de empleados de los departamentos 10, 30 y 40.
seleccione * de emp donde deptno=10; seleccione * de emp donde deptno<>10; seleccione ename,trabajo,deptno,sal de emp donde sal>2000 seleccione * de emp donde sal entre 1800 y 2500
Operación de conexión condicional
y o no
Consultar la información de los empleados que no están en el departamento y cuyo salario no supera los 1500
seleccione * de emp deptno!=20 y sal<1500;
operación nula nvl
--Consultar la información de todos los empleados que tienen dificultades para obtener bonificaciones --Consultar datos Información del empleado --Fuente de datos emp --Condiciones del filtro comm no es nulo seleccione ename, comm de emp donde comm no es nulo; seleccione ename, comm de emp donde comm es nulo; select * from emp donde no comm es nulo; --nvl () da un valor específico cuando un valor es nulo; de lo contrario, el valor en sí es select nvl(null,100 ) from dual; --Consultar la información de los empleados que han recibido bonificaciones y consultar la información de los empleados cuyas bonificaciones son superiores a 0 select * from emp donde comm>0;
insertar
--Insertar un dato en la tabla emp insertar en emp(empno,ename,job,deptno) value(1111,'afbi','aaa',200) ;
Manejo especial de consultas difusas
--Consulta empleados que contienen '% a'select * from emp donde ename como '%a%%' escape ()
donde cláusula infantil
Consultar información de empleados del departamento de ventas (ventas)
seleccione * de emp donde deptno=(seleccione deptno de depto donde dname='ventas') --1 )de --2)de donde --21)de --22)de donde --23)seleccione --3)seleccione --Consulta empleados con grado salarial 2 --datos información del empleado --fuente tabla de empleados --condiciones grado salarial 2 seleccione * de emp donde sal entre (seleccione losal de salgrade donde grado=2) y (seleccione hisal de salgrade donde nota=2);
función
función de carácter
concat(x,y) concatena cadenas xey
instr(x,str,start,n). Para buscar str en x, puede especificar comenzar desde el inicio o la enésima vez.
longitud(x) devuelve la longitud de x
lower(x) x se convierte a minúsculas
Upper(x) X convierte a mayúsculas
ltrim(x,trim_str) trunca la cadena trim.str en el lado izquierdo de x y trunca los espacios de forma predeterminada.
rtrim(x,trim_ str) trunca la cadena trim_ str en el lado derecho de x y trunca los espacios de forma predeterminada
reemplazar(x, antiguo, nuevo) busca lo antiguo en x y lo reemplaza con lo nuevo
substr(x, inicio, longitud) devuelve la secuencia de caracteres de x, comenzando desde el inicio, interceptando caracteres de longitud, longitud predeterminada, predeterminada hasta el final
función concat, seleccione número
--Consultar los nombres y tipos de trabajo de todos los empleados seleccione ename,trabajo de emp; --Conéctelos juntos seleccione ename||trabajo nombretrabajo de emp; seleccione concat (ename,trabajo) nombretrabajo de emp;
--Buscar subcadena --Agregue una cadena "helloworld", busque "e" seleccione instr ('holloword','a') de dual; --Compruebe si los nombres de todos los empleados contienen 'A', si está incluido, el posición de visualización seleccione ename,instr(ename,'a' de emp); --Agregue una cadena "helloworld", busque "l" seleccione instr ('holloword','l') de dual; seleccione instr ('holloword ','l',6) de dual; seleccione instr ('holloword','l',1,2) de dual; comience desde la primera posición y busque la segunda l Ubicación
ltrim elimina espacios en el lado izquierdo de una cadena
rtrim elimina espacios en el lado derecho de una cadena
seleccione ltrim (' abc abc ')||'a' de dual; seleccione rtrim (' abc abc ')||'a' de dual; seleccione ltrim(rtrim (' abc abc '))||'a' de dual; seleccione concat(rtrim(ltrim(' abc abc ')),'a') de dual; --去掉左边的aaa seleccione ltrim ('aaabsdbdb','aaa') de dual;
reemplazar reemplazar
seleccione reemplazar ('aaabsdbdb','a','_') de dual;
intercepción substr
select substr('abc',2,2) from dual; --Muestra el primer carácter de los nombres de todos los empleados select substr(ename,1,1) from emp; --Muestra el último carácter select ename,substr(ename ,longitud(ename),1) de emp;
función de fecha
sysdate hora actual del sistema fecha_actual devuelve la fecha actual del sistema, sel, seleccione agregar_ meses(d1,n1) devuelve la nueva fecha después de agregar n1 meses a la fecha d1 último, día(d1) devuelve el último día del mes donde está la fecha d1 ubicado fecha meses, _between(d1,d2) devuelve el número de meses entre 8 período d1 y la fecha d2 siguiente. day(d1[c1]) devuelve la fecha de la fecha d1 en la próxima semana y el día de la semana (parámetro c1 )
--Obtener la fecha actual del sistema, seleccionar sysdate desde dual; seleccionar current_date desde dual; --Obtener la hora un día después de que el sistema seleccione sysdate+1 desde dual; --Saltar a tres meses después y consultar las fechas de regularización de todos los empleados, período de prueba de 3 meses seleccione empno, nombre, fecha de contratación de emp; seleccione no, nombre de empresa, fecha de contratación,add_months(fechacontratada,3) de emp; --Devolver el último día del mes seleccione último_día(fecha del sistema) de doble ; --Ver cada El último día del mes de ingreso del empleado seleccione last_day(hiredate) El último día, fecha de contratación desde emp; --Consultar cuántos meses ha trabajado cada empleado hasta ahora seleccione sysdate,hiredate,months_between(sysdate,hiredate) from emp; --Obtener el siguiente día de la semana en el momento actual seleccione next_day(sysdate,'Monday') from dual; --Ver las horas de trabajo de cada empleado seleccione contratadotae,next_day(hiredate,'Wednesday') de dual;
función de conversión
to_ char(x,c) Convertir fecha o datos x a tipo de datos char según el formato c to_ date(x,c) Convertir cadena x en fecha según el formato c to_ _number(x) Convertir cadena x a digital
--to_char carácter de conversión de fecha seleccione fecha de contratación de emp; seleccione to_char (fecha de contratación,'dd/mm/aaaa') de emp; seleccione to_char (fecha de contratación,'mm"mes"/dd"日"/aaaa"año"') de emp; --to_date (chars,charFormat) fecha de conversión de caracteres --1990/01/01 seleccione to_date('1990/01/01','yyyy/mm/dd') de dual; --to_number () Convertir caracteres a números : "11" seleccione '11' de dual; seleccione '11'+1 de dual; seleccione to_munber('11')+1 de dual; seleccione to_number ('11','xx') de dual;
Funciones de grupo de uso común
La función de grupo opera en múltiples registros al mismo tiempo y devuelve un resultado avg() promedio suma() suma seleccione next_day(sysdate,'Monday') de dual; min() valor mínimo seleccione next_day(sysdate,'Monday) ') de dual; max() valor máximo count() nota estadística: nulo no participa en la operación
--Encontrar el número total de personas count() El número de personas en la empresa seleccione count(emptno) de emp; --El salario más alto de todos los empleados seleccione max(sal) de emp; --El mínimo seleccione min(sal ) de emp; --Suma Los salarios que deben pagarse en un messeleccione sum(sal) de emp; --Encuentre el salario promedio seleccione avg(sal) de emp; --Estadísticas sobre el número de empleados en 10 departamentosseleccione count(empno) from emp donde deptno=10; --Estadísticas La comunicación de toda la empresa no está involucrada en la operación . select count(comm) fromm emp; --Estadísticas sobre en cuántos departamentos hay empleados . select count( distinto deptno) del departamento; --Número estadístico de registros. seleccione recuento (*) de emp; seleccione recuento (*) del departamento; -- Cuente cuántos departamentos hay en toda la empresa seleccione recuento(deptno) del departamento;
grupo por grupo
Agrupar por grupo agrupa aún más los registros que cumplen las condiciones según determinadas características. Extraer puntos en común en cada conjunto de registros
--Encontrar el salario promedio de cada departamento seleccione el departamento, promedio (sal) del grupo emp por departamento; --Encuentre el salario promedio de cada trabajo seleccionado , promedio (sal) del grupo emp por trabajo; --Encuentre los empleados El número de las personas en cada departamento seleccionan count(empno),deptno del grupo emp por deptno;
tener información del grupo de filtros
La información del grupo que se obtendrá puede necesitar cumplir ciertas condiciones.
--Encuentre el salario promedio de cada departamento, seleccione deptno, avg(sal) del grupo emp por deptno que tenga avg(sal)>2000 para departamentos con más de 2000 empleados; --Ver el número de departamento y el número de empleados en el departamento con más de 3 empleados; seleccione deptno,count(deptno) del grupo emp por deptno que tenga count(deptno)>3;
Filtrar registros de filas e información de grupos
El filtrado de registros de fila es para cada registro y el filtrado de información de grupo es para grupos, pueden aparecer al mismo tiempo, filtrar primero las filas y luego filtrar los grupos. Al filtrar filas donde, solo aparecerá información de fila. Al tener grupo de filtro, solo aparecerá información de grupo. Estructura: seleccionar .. de ..dónde .agrupar por .. tener...
Orden de ejecución:
de
dónde
agrupar por
teniendo
seleccionar
--Consulta número de departamento, número de empleados en el departamento, empleados con salario superior a 2000, departamentos con más de 2 empleados seleccionan deptno,count(deptno) de emp donde sal>2000 agrupan por deptno teniendo recuento(deptno)>=2 ;
Paginación y deduplicación
Hay dos soluciones para implementar la paginación: (1) Consultar todos los registros en la base de datos a la vez y luego mostrar los registros especificados en cada página. Paginación falsa (2) Consulte la base de datos varias veces, obtenga solo los datos de esta página cada vez y muestre paginación verdadera
Hoy en día, los datos en la construcción de sitios web son masivos. Si implementa el plan 1: sin duda aumentará la carga en la memoria del servidor y reducirá la velocidad de ejecución del sistema; si usa el plan 2, es posible que opere la base de datos con frecuencia, lo que también afectará la eficiencia de la respuesta; por lo tanto, todos utilizarán el plan 1 + el plan 2 para lograrlo. El núcleo de la paginación es calcular cuántos registros por página, el número total de páginas y qué página. Para cada página de datos, solo necesita calcular el registro inicial y el registro final.
Paginación verdadera y falsa
Consulta de paginación real primero, luego paginación falsa
Primero consulte la base de datos para encontrar 500 elementos (paginación verdadera) y luego use paginación falsa para mostrar 100 elementos (paginación falsa)
Mejor eficiencia y uso de memoria
Rownum
rownum no es una columna real, es el número de filas devueltas por la consulta. A la primera fila devuelta se le asigna 1, a la segunda fila es 2, y así sucesivamente. Este pseudocampo se puede utilizar para limitar las filas devueltas por la consulta. Número total de filas. Dado que rownum es siempre el número del conjunto de resultados, cualquier registro con rownum>1 no se puede consultar directamente porque siempre comienza desde 1.
--True paging --rownum es el número de cada registro en cada conjunto de resultados. Seleccione ename,sal,deptno,rownum de emp; --Paging , muestra 5 registros en cada página, consulta cada uno. También seleccione enmae,sal,deptno ,rownum from emp donde rownum<=5; --consulta los datos en la segunda página. No puedes usar mayor que, porque cada fila se convertirá en la primera fila. selecciona enmae,sal,deptno,rownum from emp donde rownum<= 10; --Consulta toda la información de los empleados y agrega pseudocolumnas rownum select enmae,sal,deptno,rownum from emp; --Usa un conjunto de resultados de consulta como fuente de datos temporal, solo temporal Ese conjunto de resultados rownum campo común selecciona * from (select ename,sal,deptno,rownum from emp) donde rownum<=10;
Si la primera línea no es mayor que 5, entonces se eliminará el primer día y luego la segunda línea se convertirá en la primera línea, y así sucesivamente, y finalmente la décima línea se convertirá en la primera línea.
seleccione ename,sal,deptno,rownum de emp; seleccione ename,sal,deptno,rownum de emp donde rownum<=5; seleccione * de (seleccione ename,sal,deptnno,rownum rw de emp) donde rw >5 y rw<=10; --Consulta los datos en la segunda página select ename,sal,deptno,rownum from (ename,sal,deptno,rownum rw from emp) donde rw>5 y rw<=10;--Consulta los empleados Información, nombre, salario, número de departamento, salario en orden descendente, realizar paginación, mostrar 3 registros en cada página, consultar los datos en la primera página seleccionar ename,sal,deptno, rwonum r1 de emp orden por sal desc ; seleccione ename, sal,deptno, r1, rwonum r2 de (select ename,sal,deptno,rownum r1 de emp orden por sal desc);seleccione ename, sal ,deptno,r1,r2 de (seleccione ename,sal,deptno, r1, rownum r2 from (select ename,sal,deptno,rownum r1 from emp order by sal desc)) donde r2<=3; ; seleccione ename,sal,deptno,r1,r2 de (seleccione ename,sal,deptno, r1, rownum r2 de (seleccione ename,sal,deptno,rownum r1 de emp orden por sal desc)) donde r2>(2-1) *3 y r2<=2*3;
deduplicación ruidosa
ROWID es un concepto importante en ORACLE. Un valor de dirección relativamente único utilizado para localizar un registro en la base de datos. Normalmente, este valor se determina y es único cuando la fila de datos se inserta en la tabla de la base de datos. ROWID es una pseudocolumna, en realidad no existe en la tabla. Es una pseudocolumna codificada por ORACLE en función de la información de la dirección física de cada fila de datos al leer las filas de datos de la tabla. Por lo tanto, la información de la dirección física de una fila de datos se puede encontrar en función del ROWID de una fila de datos. Esto le permite localizar rápidamente filas de datos. La mayoría de las operaciones de la base de datos se completan a través de ROWID y usar ROWID para localizar un solo registro es la forma más rápida. A veces, cuando se recuperan datos complicados, las condiciones de búsqueda ordinarias no pueden cumplir con los requisitos. Rowid se puede utilizar para recuperar los resultados con precisión. En Oracle, si desea consultar varios campos en una determinada tabla y solo deduplicar un determinado campo, utilice distintos o agrupar por no funcionará.. Distinguir y agrupar por deduplicará los campos a consultar, es decir, cuando todos los campos consultados sean iguales, Oracle los considerará duplicados. Usar Rowid es una buena opción en este momento.
--Preparar datos crear copia de tabla como seleccionar * del departamento; ##Copiar una tabla seleccionar * de la copia; seleccionar departamento no, nombre, ubicación, ID de fila de la copia; insertar en copia seleccionar * del departamento;##Insertar confirmación ; --Mantener solo una copia de todos los mismos registros --1. Agrupar los datos según información repetida --2. En cada grupo, seleccionar un registro para guardar y encontrar las características (roeid) --3 .Al eliminar, buscar los datos que no están dentro del rango de retención seleccione * del grupo de copia por deptno,dname,loc; seleccione min(rowid) del grupo de copia por deptno,dname,loc; seleccione * de la copia donde roeid no esté en( seleccione min( rowid) del grupo de copia por deptno,dname,loc); eliminar de la copia donde no está el rowid (seleccione min(rowid) del grupo de copia por deptno,dname,loc); ##Eliminar registros duplicados confirmar; seleccionar * de copiar;
unirse a la mesa
Consulta de conexión: 1) Al realizar una consulta, se requieren varias tablas al mismo tiempo (especialmente aquellas con relaciones de clave externa) y se necesitan los valores entre varias tablas para conectarse; 2) El estándar SQL actual propone dos consultas de conexión, la El primero es el estándar SQL92 anterior y el segundo es el estándar SQL99 más nuevo que se utiliza ampliamente actualmente;
3) La forma de 92 es simple, pero la escritura es relativamente detallada. 99 no solo está optimizado en el nivel inferior, sino que también la forma es más clara y lógica. Generalmente se recomienda utilizar el estándar 99;
92 Gramática
Es necesario colocar varias tablas después de y todas las condiciones de conexión se colocan en dónde. Por lo tanto, las uniones equivalentes, enlaces no equivalentes, uniones externas, etc. en SQL92 son en realidad solo estructuras de filtrado de condiciones whgre: seleccione... de tabla1, tabla2 , tabla3 .. donde... Muchas veces es necesario darle un alias a la tabla (1. Simplificar el nombre de la tabla 2. Puede haber una autounión) El principio de la conexión: Según el orden de aparición de las tablas después de, las tablas anteriores se usan como memoria para el bucle, la tabla que aparece después se usa como el bucle for externo
--Consulta los datos en la tabla emp y en la tabla de departamento (producto cartesiano) emp12 registros * dept4 registros = 48 seleccionar * de emp e,dept d ordenar por empno; seleccionar * de emp e,dept d donde 1=1 ordenar por empno ;
Equijuntar
Según el producto cartesiano, tome el mismo valor en la columna de condición para consultar la información del empleado y la información del departamento Consultar el nombre del empleado y el nombre del departamento.
--Consulta la información de cada empleado y la información del departamento --Datos: información del empleado información del departamento --Fuente: emp,dept --Condiciones de conexión: emp,deptno=dept,deptno select * from emp e,dept d donde e.deptno=d.deptno; --Consulta la información de cada departamento de empleados y el número de personas en el departamento --Consulta datos: información del departamento, plantilla del departamento correspondiente --Fuente de datos: departamento, emp calculado --Condiciones de conexión :dept,deptno=correspondiente al número de deptno - consulta el número de empleados en el departamento con empleados seleccione count(*),deptno from emp group by deptno; seleccione * from dept d,(seleccione count(*),deptno del grupo emp por deptno) c donde d.deptno=c.deptno
no equiunión
!=, >, <, <>, entre y consulta el nombre, salario y grado del empleado
--Consulta el nombre de cada empleado, monto del salario, tiempo de incorporación y grado salarial correspondiente --Consulta datos: ename, sal, fecha de contratación, grado --Fuente de datos: departamento, salgrade --Condiciones de conexión: emp, sal entre losal y hisal select ename,sal,hiredate,grade from emp e,salgrade s donde e.sal entre losal e hisal;
unión externa
Las uniones internas utilizan operadores de comparación para hacer coincidir filas en dos tablas según los valores de las columnas comunes a cada tabla. Una unión exterior puede ser una unión exterior izquierda, una unión exterior derecha o una unión exterior completa. El conjunto de resultados de una combinación externa izquierda incluye todas las filas de la tabla izquierda especificada en la cláusula LEFT OUTER, no solo las filas que coinciden con las columnas de la combinación. Si una fila de la tabla de la izquierda no tiene una fila coincidente en la tabla de la derecha, todas las columnas de la lista de selección de la tabla de la derecha tendrán valores NULL en las filas del conjunto de resultados asociados. La unión exterior derecha es la unión retórica de la unión exterior izquierda. Se devolverán todas las filas de la tabla derecha. Si una fila de la tabla de la derecha no tiene una fila coincidente en la tabla de la izquierda, se devolverá un valor nulo para la tabla de la izquierda. Mire '+', la tabla con '+' es la tabla esclava y la tabla opuesta es la tabla maestra. Encuentre los nombres de todos los empleados y los nombres de sus superiores. Encuentre los nombres de todos los superiores y los nombres de sus empleados. Encuentre el número de empleados y los nombres de los departamentos en todos los departamentos. Encuentre los nombres y el número de empleados de todos los departamentos con empleados .
--Conexión interna --Consulta la información de cada departamento y el número de personas en el departamento seleccione * del departamento; seleccione * del emp; seleccione recuento(*),deptno del emp agrupar por deptno; seleccione * del departamento d ,(select count (*),deptno from emp group by deptno) c donde d.deptno=c.deptno; --Conexión externa a la tabla principal (siempre que los registros consultados en la tabla principal deben aparecer en los resultados ) --Ver la información de cada departamento, número correspondiente de empleados --Consultar datos: información del departamento, plantilla del departamento --Fuente de datos: departamento d, (seleccione recuento (*)), número de departamento del grupo emp por número de departamento) c --Condiciones de conexión: d.deptno= c.deptno(+) select * from dept d,(select count(*),deptno from emp group by deptno) c donde d.deptno=c.deptno(+); --nvl Cuando un valor está vacío Proporcione un valor específico; de lo contrario, el valor en sí mismo será seleccionar d.deptno,dname,loc,nvl(cc,0) del departamento d, (select count(*) cc,deptno from emp group by deptno) c donde d.deptno=c.deptno(+); --Listar la información de cada empleado con un superior y la información superior correspondiente --Listar todos los empleados información y la información de sus superiores --Datos de consulta: información de empleados, información de superiores --Fuente de datos: emp e, emp m --Condiciones de conexión: e.mgr=m.deptno(+ )
autoconexión
Equijoin especial (de la misma tabla) para encontrar los nombres de los empleados cuyos superiores existen.
--Consulta la información propia de cada empleado (empleado con superior) y la información del superior --Consulta datos: todos los empleados son datos, datos del superior --Fuente de datos: emp e, emp m --Condiciones de conexión: e.mgr=m.empno seleccione * de emp e,emp m donde e.mgr=m.empno;
99 Gramática
unión cruzada
Conexión cruzada para implementar producto cartesiano.
--99 flag implementa la selección de producto cartesiano * del departamento de unión cruzada emp;
unión natural
Requerido (columna del mismo nombre, edificio exterior principal)
Conexión natural, conexión equivalente
Consultar los nombres de todos los empleados y los nombres de sus departamentos.
Debe haber columnas con el mismo nombre o una relación de clave primaria y externa:
--Ver los nombres de todos los empleados, número de empleado, número de departamento, nombre de departamento --Datos de consulta: nombre de empleado, número de empleado, número de departamento, nombre de departamento --Fuente de datos: emp, dept --Condiciones de conexión: emp.deptno= dept.deptno --99 se puede implementar usando unión natural unión natural seleccione ename,empno,deptno,dname de emp natural join dept; --Consulte el nombre del empleado, nombre del departamento, número de departamento de 10 departamentos seleccione ename,deptno,dname desde emp natural unirse al departamento donde deptno=10
unirse usando (columna del mismo nombre)
usando conexión, conexión equivalente para consultar los nombres de todos los empleados y los nombres de sus departamentos
Debe haber columnas con el mismo nombre: equijoin
--99 se puede implementar usando conexión (valor igual) seleccione ename,empno,deptno,dname de emp unirse al departamento usando (deptno); --Consulte el nombre del empleado, nombre del departamento, número de departamento de 10 departamentos seleccione ename,deptno , nombre del departamento de unión de emp usando (nºdept) donde nºdept=10;
Unete
en conexión, que se puede utilizar para conexión de equivalencia, conexión de no equivalencia y autoconexión. Puede resolver - cortar conexión. La columna de relación debe distinguirse para consultar los nombres de todos los empleados y los nombres de sus departamentos. Consultar el nombres, salarios y grados salariales de todos los empleados.
Nota: ¿Necesita agregar un calificador antes de la columna con el mismo nombre? Si usa una conexión natural usando conexión, no puede agregarla. Si no, debe agregarla.
--Ver los nombres, números y números de departamento y nombres de departamento de todos los empleados --Si es necesario agregar un calificador antes de la columna con el mismo nombre. Si usa una conexión natural usando conexión, no puede agregarlo. De lo contrario , debe agregar select e.ename ,e.deptno,e.empno,d.dname from emp e join dept d on e.deptno=d.deptno; --Ver el nombre de cada empleado, salario, número de departamento, salario grado --Datos de consulta: nombre del empleado, salario, número de departamento, grado salarial - fuente de datos; emp, slagrade - condiciones de conexión: sal entre losal e hisal seleccione ename,sal,deptno,grade from emp e join salgrade s on sal entre losal y hisal; --Consulta nombre del empleado, salario, número de departamento, grado salarial, nombre del departamento en 30 departamentos --Consulta datos: nombre del empleado, salario, número de departamento, grado salarial, nombre del departamento --Fuente de datos: emp e, salgrade s, departamento d --Condiciones de unión: sal entre losal e hisal e.deptno=d.deptno seleccione ename,sal,e.deptno,dname,grado de emp e unirse al departamento d en e.deptno=d.deptno une salgrade s en sal entre losal e hisal donde e.deptno=30;
unión externa
Unión externa, está la tabla principal y la tabla esclava: unión izquierda [externa] en unión izquierda [externa] usando unión derecha [externa] en unión derecha [externa] usando
--Consulta número de empleado, nombre del empleado, nombre superior correspondiente del empleado, número superior seleccione e.empno número de empleado, e.ename nombre de empleado, e.mgr número superior, m.ename nombre superior de emp e izquierda unión externa emp m en e .mgr=m.empno
Resumen de unión de tablas
--Unión de tabla Cuando los datos consultados provienen de más de una tabla--1. Producto cartesiano--2. Unión equivalente--3. Unión no equivalente--4. Autounión--92 estándar
seleccione... de la tabla1, tabla2 donde tabla1. xxItabla2. xx y tabla1.xx=1;
--99 estándar
seleccione.....de la tabla unión cruzada tabla2 donde... seleccione ...de la tabla1 unión natural tabla2 donde... ; seleccione ...de la tabla1 unión tabla2 usando (同名字段) donde... .. seleccione ....de la tabla1 únase a la tabla2 en连接条件 donde... seleccione ...de la tabla1 unión externa derecha a la tabla2 en 连接条件donde .....
Totalmente conectado
seleccione ...de la tabla unión completa tabla2 en la condición de unión donde...
sintaxis ddl
ddl: lenguaje de definición de datos
dml: lenguaje de manipulación de datos
dcl: lenguaje de control de datos
Operaciones de tabla
Crear mesa
crear tabla nombre de la tabla (
Tipo de nombre de campo (longitud),
...Otros campos...
);
Modificar la estructura de la tabla
Modificar el nombre de la tabla
cambiar el nombre de la tabla original al nuevo nombre de la tabla
cambie el nombre de tb_txt a tb_txt_new;
Modificar el nombre de la columna
alterar el nombre de la tabla cambiar el nombre de la columna nombre de la columna a
modificar la tabla tb_txt_new cambiar el nombre de la columna txtid a tid;
Modificar tipo de campo
alterar el nombre de la tabla modificar (tipo de campo)
alterar tabla tb_txt_new modificar(tid vachar2(20))
Añadir columna
alterar el nombre de la tabla agregar el tipo de campo
alterar tabla tabla tb_txt_new agregar col_test_name varchar2(30)
Eliminar columna
alterar el nombre de la tabla colocar el campo de la columna
alterar tabla tabla tb_txt_new soltar columna col_test_name
Eliminar tabla
soltar tabla tb_txt_new;
PLSQL
gramática:
--plsql se divide en tres partes: parte de declaración, parte ejecutable, parte de manejo de excepciones declarar --declarar variables, cursor i entero; comenzar --parte de ejecución --[Manejo de excepciones] finalizar;
establecer la salida del servidor en --Abrir la opción de salida declarar i entero; comenzar --Ejecutar la parte DBMS.output.put_line('HELLO WORLD') --Imprimir --[Manejo de excepciones] finalizar; /
variable
Las variables comunes en la programación PL SQL se dividen en dos categorías:
-
Tipos de datos comunes (char, varchar2, fecha, número, boolean.long)
-
Tipos de variables especiales (variables de referencia, variables de registro)
La forma de declarar variables es
-
Nombre de variable tipo de variable (longitud de variable) Por ejemplo: v_name varchar2(20);
Variables ordinarias
Hay dos formas de asignar valores a las variables:
-
Asignación directa: =
-
Asignación de declaración, use select...into... para asignar valor: (sintaxis seleccione valor en variable)
[Ejemplo] Imprima información personal de la persona, incluyendo: nombre, salario, dirección
--Imprimir información personal del personal, incluyendo: nombre, salario, dirección DECLARAR --Nombre V_NAME VARCHAR2(20):='Zhang San'; --Asignación directa de variable declarada --Salario V_SAL NUMBER; --Dirección V_ADDR VARCHAR2(200) ; COMENZAR --Asigne v_sal directamente en el programa :=1580; --Asignación de declaración SELECCIONE 'Sichuan' EN v_addr desde dual; dbms_output.put_line('Nombre: '||v_name||', salario: ' ||v_sal|| ', dirección: '|| v_addr); FIN;
variable de referencia
El tipo y la longitud de la variable dependen del tipo y la longitud de los campos de la tabla.
Especifique el tipo y la longitud de la variable mediante el nombre de la tabla y el nombre de la columna %tipo, por ejemplo:
v_name emp.ename%tipo
[Ejemplo] Consultar la información personal de 7839 empleados en la tabla emp e imprimir el nombre y el salario
--Tipo común --Consulta la información personal de 7839 empleados en la tabla emp, imprime el nombre y el salario DECLARE --Nombre V_NAME VARCHAR2(20);--Declara variables para asignar valores directamente --Salario V_SAL NUMBER; BEGIN seleccione ename,sal en v_name, v_sal de emp donde empno=7839; --Imprimir salida dbms_output.put_line('Nombre: '||v_name||', Salario: ' ||v_sal); END; --Variable de referencia DECLARAR --Nombre V_NAME emp .ename%tipo;--Declarar variables y asignar valores directamente --Salario V_SAL emp.sal%tipo; COMENZAR seleccionar ename,sal en v_name,v_sal de emp donde empno=7839; --Imprimir producción dbms_output.put_line('Nombre: '||v_name||', Salario: ' ||v_sal); FIN;
variable de registro
Aceptar una fila completa de registros de una tabla
Sintaxis: nombre de variable nombre de tabla %tipo de fila Por ejemplo: v_emp emp%tipo de fila;
[Ejemplo] Consultar e imprimir el nombre y salario del empleado No. 7839
--Consulta e imprime el nombre y salario del empleado No. 7839DECLARE --Variable de tipo de registro v_emp emp%rowtype; BEGIN select * into v_emp from emp donde empno=7839; --Imprime la salida dbms_output.put_line('Nombre:'|| v_emp .ename||', salario: ' ||v_emp.sal); FIN;
control de procesos
-
rama condicional
gramática:
COMENZAR SI condición 1 ENTONCES ejecución 1: ELSIF condición 2 ENTONCES ejecución 2: ELSE ejecución 3 FINALIZAR SI ;
[Ejemplo] Determine si hay más de 20 registros en la tabla emp, entre 10 y 10 o menos de 10 registros
--Determinar si hay más de 20 registros en la tabla emp, entre 10-10, o menos de 10 DECLARE --Declarar una variable para recibir el número en la tabla 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 ('Más de 20 registros en la tabla son: '||v_count); ELSIF V_COUNT>=10 THEN DBMS_OUTPUT.PUT_LINE ('El los registros en la tabla están entre 10 y 20 Las entradas son: ''||v_count); ELSE DBMS_OUTPUT.PUT_LINE ('Los registros en la tabla debajo de 10 son: ''||v_count); END IF; END;
-
ciclo
gramática:
COMIENZO DEL BUCLE SALIR CUANDO salir de la condición del ciclo FINALIZAR EL BUCLE ;
[Ejemplo] Imprimir números del 1 al 10
DECLARE --Declara la variable del bucle y asigna el valor inicial NÚMERO V_NUM :=1; COMENZAR SALIR DEL BUCLE CUANDO V_NUM>10; DBMS_OUTPUT.PUT_LINE(v_NUM); --Incrementa la variable del bucle v_num:=v_num+1; END LOOP; END ;
cursor
Cursor: se utiliza para almacenar temporalmente varias filas de datos devueltos por una consulta. Al atravesar los datos, puede acceder y procesar los datos en el conjunto de resultados fila por fila.
Uso del cursor: declarar-->abrir-->leer-->cerrar
gramática
-
Declaración del cursor:
El nombre del cursor CORSOR [(lista de parámetros)] es una declaración de consulta;
-
Apertura del cursor:
ABRIR nombre del cursor;
-
Valor del cursor:
FETCH nombre del cursor EN la lista de variables;
-
Cierre del cursor
CERRAR nombre del cursor;
Propiedades del cursor
Propiedades del cursor | Tipo de valor de retorno | ilustrar |
---|---|---|
%NÚMERO DE FILAS | entero | Obtenga el número de filas de datos devueltas por la declaración FETCH |
%ENCONTRÓ | booleano | Verdadero si la declaración FETCH más reciente devuelve una fila de datos; falso en caso contrario |
%EXTRAVIADO | booleano | Lo contrario del valor devuelto por la propiedad %FOUND |
%ESTA ABIERTO | booleano | Verdadero si el cursor se ha abierto, falso en caso contrario |
Entre ellos, %NOTFOUND devuelve VERDADERO cuando el elemento no se puede encontrar en el cursor y generalmente se usa para determinar si se debe salir del bucle.
Sin cursor de parámetro
--Utilice un cursor para consultar los nombres y salarios de todos los empleados en la tabla emp e imprímalos en secuencia DECLARE --Declare el cursor CURSOR C_EMP IS SELECT ENAME,SAL FROM EMP; --Declare una variable para recibir los datos en el cursor v_ename emp.ename%type; v_sal emp.sal%type; BEGIN --Abre el cursor open c_emp; --Atraviesa el bucle del cursor --Obtiene los datos en el cursor busca c_emp en v_ename,v_sal; --Salir el bucle sale cuando c_emp%notfound; DBMS_OUTPUT.PUT_LINE(v_ename ||'-'||v_sal); finalizar bucle; --Cerrar el cursor cerrar c_emp; END ;
Cursor con parámetros
[Ejemplo] Utilice el cursor para consultar e imprimir los nombres y salarios de los empleados de cada departamento e ingrese el número de departamento manualmente.
--Utilice un cursor para consultar los nombres y salarios de todos los empleados en la tabla emp e imprímalos en secuencia DECLARE --Declare el cursor, la diferencia entre participación y sin parámetros CURSOR C_EMP(v_deptno emp.deptno%type) IS SELECT ENAME,SAL FROM EMP donde deptno = v_deptno; --Declara una variable para recibir los datos en el cursor v_ename emp.ename%type; v_sal emp.sal%type; BEGIN --Abre el cursor, la diferencia entre participación y no parámetros abiertos c_emp(10); --Recorrer el bucle del cursor --Obtener los datos en el cursor buscar c_emp en v_ename,v_sal; --Salir del bucle y determinar si hay un valor de salida cuando c_emp%notfound; DBMS_OUTPUT.PUT_LINE( v_ename||'-'||v_sal); finalizar bucle; --Cerrar cursor cerrar c_emp; END ;
La recuperación debe realizarse antes del juicio; de lo contrario, aparecerán algunos valores más. Debido a que la recuperación tiene un valor predeterminado, habrá un valor predeterminado más.
procedimiento almacenado
gramática
CREAR O REEMPLAZAR PROCEDIMIENTO el nombre del procedimiento [(lista de parámetros)] es BEGIN END [nombre del procedimiento];
Según el tipo de parámetros, los dividimos en tres categorías para su explicación:
-
sin parametros
-
con parámetros de entrada
-
Con parámetros de entrada y salida (valor de retorno)
Procedimiento almacenado sin parámetros
CREAR o REEMPLAZAR PROCEDIMIENTO p_hello es --Declarar la variable BEGIN DBMS_OUTPUT.PUT_LINE('hola mundo'); END P_HELLO; BEGIN --plsql llama al procedimiento almacenado p_hello; end;
cmd llama al ejecutivo p_hello;
Procedimiento almacenado con parámetros de entrada.
[Ejemplo] Consultar e imprimir el nombre y el salario de un empleado (como el empleado 7839): procedimiento almacenado; requisito: pase el número del empleado al llamar y la consola lo imprimirá.
--Consultar e imprimir el nombre y salario de un empleado (como el empleado 7839) --procedimiento almacenado; --Requisito: ingrese el número del empleado al llamar y la consola lo imprimirá. CREAR O REEMPLAZAR EL PROCEDIMIENTO p_quernameandsal(i_empno IN emp.empno%type) as --Declarar variable v_name emp.ename%type; v_sal emp.sal%type; COMENZAR seleccionar ename,sal INTO v_name,v_sal desde emp donde empno =i_empno; dbms_output .put_line(v_name||'_'||v_sal); end; DECLARE i INTEGER; BEGIN --plsql llama al procedimiento almacenado p_quernameandsal(7839); end;
Procedimiento almacenado con parámetros de salida.
Generalmente utilizado por programas de terceros.
[Ejemplo] Generar empleados para consultar la información de un determinado empleado (empleado No. 7839) y requerir que la información se genere como un valor de retorno para que lo utilice el programa que llama.
--Enviar información de consulta de empleado de un determinado empleado (empleado No. 7839) --Requerido para generar el valor como valor de retorno para uso del programa que llama. CREAR O REEMPLAZAR PROCEDIMIENTO p_querysal(i_empno IN emp.empno%type,o_sal OUT emp.sal%TYPE) as --Declarar variable v_name emp.ename%type; v_sal emp.sal%type; COMENZAR seleccionar sal INTO o_sal de emp donde empno =i_empno; end ; DECLARE --Declara una variable para recibir el parámetro de salida v_sal emp.sal%TYPE en el procedimiento almacenado; BEGIN --plsql llama al procedimiento almacenado p_querysal_out(7839,v_sal); dbms_output.put_line(v_sal); fin;