Resumen de los conocimientos básicos de Oracle

Las declaraciones de Oracle deben entenderse ~

oracle知识的总结

1. Principales tipos de datos

1.Tipo de carácter

varchar(10):定长的字符型数据

char(2):定长的字符型数据

varchar2(20):变长的字符串数据

long :变长度的字符串,最大字节数可达2GB

BLOB:二进制数据,最大字节数4G

BFILE:二进制数据外部存储,最大字节数4G

2.Tipo de datos

number(4):不带小数点的数据

number(8,2):数据的总长度是8位,小数点后占两位

3.Tipo de fecha

date

2. Clasificación de declaraciones SQL

Declaraciones DML (lenguaje de manipulación de datos)

insertar agregar/actualizar modificar/eliminar eliminar/fusionar fusionar

Declaraciones DDL (lenguaje de definición de datos)

crear crear/soltar eliminar/truncar

Declaración DCL (lenguaje de control de datos)

conceder/revocar

declaración de control de transacciones

confirmar/revertir/punto de guardado


3. Operaciones de mesa

~Crear
--创建数据表
1.在建表的时候,先建立父表,后建立子表;

2.先添加父表数据,后添加子表数据

3.删除数据的时候,先删除子表数据,后删除父表数据

4.删除表的时候,先删除子表,后删除父表
--创建表
create table card(
	cid number(4) primary key,
    pname varchar2(20)
);
create table perscn(
	pid number(4) primary key,
    pname varchar2(20),
    cid number(4),
    --添加外键,给表添加外键,指定哪个表
    constraints FK_Per_crad foreign key(cid) references card(cid),
    constraint cid_uni unique (cid)
)

--查看表结构,只能在命令行模式下
desc users;
--删除表
drop table "表名"/*没有 if exists字段*/
  • Utilice subconsultas al crear tablas

    create table user as select name ,age from user where id=5;
    --创建表和查询的字段一样
    create table user_a("名字","性别","住址") as select * from user;
    
  • Un sinónimo
    es un alias de un objeto de base de datos que simplifica el acceso a las bases de datos de otros usuarios.

    select name from user_table;
    --创建user_table表名的别名user,方便使用
    create or repalce synonym user for user_table
    
~Alter modifica la tabla (estructura de la tabla)

alterar el nombre de la tabla agregar el tipo de datos del campo

	/*添加单行*/
	alter table user add score varchar2(3);
	/*添加多行*/
	alter table user add (score varchar2(3),disth varchat2(100))
  • Modificar campos

    --在改字段没有数据的时候,字段的类型和长度都是可以修改的
    alter table user modify tel number(11);
    
    --对于缺省值的修改,不会影响已经存在的数据,只会对以后插入的数据产生影响
    --不会改变表中的性别,但对新插入的数据的性别会有影响
    alter table user modify sex default '女';
    
    --当该字段有数据的时候,字段的类型是不能修改的;字段的长度是可以修改的,增大总是可以的,减少要看数据的实际长度;
    alter table user modify name varchar2(20);
    
  • Eliminar campo

    --有无数据都可以删除
    alter table user drop column name;
    
  • Modifique el nombre de la columna y utilícelo para conectarse (no se usa con mysql)

    --将user中addre列名改为address
    alter table user rename addre to address;
    
  • Modificar el tipo de columna (no se puede modificar cuando hay datos, mysql sí)

    --将user中的score列类型修改
    alter table user modify (score varchar2(3));
    
~insertarInsertar
	--一次性插入多条数据,复制表中的数据,把插入结果当作数据插入到表中
	insert into user select * from user1;
~actualizar actualización
	--使用update语句的时候,在事务没有结束之前,该条数据会被锁住,其他的用户无法修改这条数据
	--事务结束之后,该条数据的锁放开,其他的用户可以操作这条数据
	update user set ename='xiaoming',eage=3,eaddre='pingyao' where empid=5;
~eliminarEliminar
	delete from user where sal > 5000;
比较,删除表truncate table

删除表的数据,truncate table 比delete的删除速度快,但是改命令一定要慎重使用
清空users表
truncate table users;--回滚是不可能的
~Cambiar el nombre del objeto
--改变表的名字
rename user to users;

用 ‘||’ 可以把两列或者多列查询结果合并到一起

- 任何类型都支持null
~Agregar comentarios a las columnas de la tabla
--给表userTable的name字段加注释
comment on column userTable.name is '用户名';
--给表userTable加注释
comment on table userTable is '用户信息表';

Imagen de referencia
Insertar descripción de la imagen aquí

· 4. Eliminar duplicados numéricos distintos

--去除单列重复的数据
select distinct deptno from emp;
--去除多列重复的数据
select distinct job,deptno from emp

· 5. Filtrado de cláusulas Where

  • Se deben utilizar comillas simples'' para datos de caracteres y datos de fecha.

  • Para datos de tipo fecha, el formato es confidencial. El formato de datos de tipo fecha es DD-MM-AAAA (día-mes-año)

--查询emp表时间为'20-02-1981'的数据
select * from emp where date='20-02-1981'
  • Cambiar el formato de fecha en la sesión actual
--改变会话session的日期格式为"YYYY-MM-DD HH:MI:SS"
alter session set date = "YYYY-MM-DD HH:MI:SS"
  • Utilice otros operadores de comparación en las condiciones de consulta.
    Utilice y en lugar de && y
    o en lugar de ||

· 6. Como consulta difusa

--名字带%号的,相当于转义符;即,‘\’为转移字符,第二个‘%’为普通字符,第一第三个是通配符
select * from emp where ename like '%\%%' escape '\';

· 7. ​​Funciones unifilares y funciones multilíneas

  • Función de una sola línea: tome un registro a la vez y utilícelo como parámetro de la función para obtener un único resultado correspondiente a este registro.

Categoría: funciones de caracteres, otras funciones, funciones de conversión, funciones de fecha, funciones numéricas, funciones trigonométricas

--查询emp表中名字和名字的长度
select name,length(name) from emp;
  • Función de varias líneas: ingrese varios registros como parámetros de la función a la vez y obtenga un único resultado correspondiente a varios registros.
select max(sal) from emp;
①Función de carácter
  • Utilice minúsculas para convertir a minúsculas
--查询emp表并将名字是‘smith’的转换成小写  
select * from emp where lower(ename)='smith';
  • Utilice mayúsculas para convertir a mayúsculas
--查询emp表并将名字是‘smith’的转换成大写  
select * from emp where ename=upper('smith');
  • Convertir caso de camello usando initcap
--查询emp表并将名字是‘smith’转换成驼峰式写法   
select ename,initcap(ename) from emp where initcap(ename)='Smith';
  • El carácter de conexión es concat
    concat (x, s1, s2, s3...), que es lo mismo que concat, excepto que se agrega x entre cada cadena.
--concat 只能连接两个字符,而 “||” 可以连接多个字符。 
select concat('aa','bb') from test; --得aabb
  • Interceptar cadena usando substr
--截取字符串  用substr
--截取ename从第一个字符到第二个字符(没有第0个)
select ename,substr(ename,1,2) from emp;
  • Utilice instr para devolver la posición del subíndice
--打印字符出现的位置   instr
--名字中有A的位置(从左下标第1位开始,A在第几位就返回第几位,如果没有A这个字符就会返回的是0)
select ename ,instr(ename,'A') from emp;
  • Uso complementario lpad, rpad
--补充字符   lpad,rpad
--把sal字段的内容扩展成8位,左边(lpad)不够用*代替,右边(rpad)不够用#代替
select sal ,lpad(sal,8,'*'),rpad(sal,8,'#') from emp;
  • Reemplazar con reemplazar
--替换 replace
--将名字中的有A的找到,将其替换成a,没有的话就不动
select ename.replace(ename,'A','a') from emp;
  • ASCII(s): devuelve el valor del código ASCII del primer carácter de la cadena s.
  • CHAR_LENGTH(S): Devuelve el número de caracteres en la cadena s, la misma función que CHARACTER_LENGTH(S)
  • longitud(es): Devuelve el número de bytes de la cadena s, relacionados con el juego de caracteres
  • izquierda (cadena, n): devuelve los n caracteres más a la izquierda de la cadena cadena
  • derecha (cadena, n): devuelve los n caracteres más a la derecha de la cadena cadena
  • LTRIM(S): Elimina espacios en el lado izquierdo de la cadena s
  • RTRIM(S): Elimina espacios en el lado derecho de la cadena s
  • TRIM(S): elimina espacios al principio y al final de la cadena s
  • TRIM(S1 FROM S): Elimina s1 al principio y al final de la cadena s
  • RECORTAR (PRÉSTAMO S1 DE S): Eliminar s1 al comienzo de s
  • RECORTAR (TRAILING S1 FROM S): eliminar s1 al final de s
  • REPEAT(STR,N): Devuelve el resultado de str repetido n veces
  • ESPACIO(N): devuelve n espacios
  • STRCMP (s1, s2): compara el tamaño de los valores del código ASCII de las cadenas s1 y s2
  • LOCATE(substr, str): devuelve la posición donde la cadena substr aparece por primera vez en la cadena str
  • CAMPO(S,S1,S2,S3…): Devuelve la posición de la primera aparición de la cadena s en la lista de cadenas
②Función numérica
  • Utilice ronda para redondear
--得45.26,45,41
select round(45.2568,2) "小数点后两位", 
round(45.2568,0) "个位",
round(45.2568,-1) "十位"
from NUMTable;
  • Intercepta el valor sin redondear, usa trunc
select trunc(45.2568,2) "小数点后两位", 
trunc(45.2568,0) "个位",
trunc(45.2568,-1) "十位"
from NUMTable;
  • Usa mod para encontrar el resto.
select ename,sal,mod(sal,300) 
from emp where empno=7369
查询编号为7369的人的工资除以300的余数
Resumen de funciones uso
ABS(x) Devuelve el valor absoluto de x
FIRMA(x) Devuelve el signo de x. Los números positivos devuelven 1, los números negativos devuelven -1, 0 devuelve 0
PI() Devuelve el valor de pi
TECHO(x),TECHO(x) Devuelve el entero más pequeño mayor o igual a un valor
PISO(x) Devuelve el mayor entero menor o igual a un valor
MENOS(e1,e2,e3…) Devuelve el valor mínimo en la lista.
MAYOR(e1,e2,e3) Devuelve el valor máximo en la lista.
MOD(x,y) Devuelve el resto después de dividir x por y
rand() Devuelve un valor aleatorio de 0 a 1
rand(x) Devuelve un valor aleatorio de 0 a 1, donde el valor de x se utiliza como valor inicial. El mismo valor de x generará el mismo número aleatorio.
ronda(x) Devuelve el valor más cercano a x después de redondear el valor de x
redondo(x,y) Devuelve el valor de x redondeado al valor de x más cercano, conservando los dígitos y después del punto decimal
truncar(x,y) Devuelve el número x truncado a y decimales
raíz cuadrada (x) Devuelve la raíz cuadrada de x. Cuando x es negativo, devuelve nulo
Funciones trigonométricas
función uso
pecado(x) Devuelve el valor del seno de x, donde el parámetro x es el valor en radianes
asin(x) Devuelve el arcoseno de x. Si el valor de x no está entre -1 y 1, devuelve nulo
porque(x) Devuelve el valor del coseno de x, donde el parámetro x es el valor en radianes
acos(x) Devuelve el valor del arco coseno de x, es decir, obtiene el valor cuyo coseno es x; si el valor de x no está entre -1 y 1, devuelve nulo
tan(x) Devuelve el valor tangente de x, donde el parámetro x es el valor tangente
tiempo(x) Devuelve el arcotangente de x, es decir, devuelve el valor cuya tangente es x
atan2(x,y) Devuelve el arcotangente de dos argumentos.
cuna(x) Devuelve el valor cotangente de x, donde x es un valor en radianes
③Función de fecha

Para valores de tipo de fecha, puede utilizar los operadores + y -

1.一个日期+- 一个数值(就是+-一个天数),得到一个新的日期

2.两个日期型的数据相减,得到的是两者之间相差的天数

3.两个日期型的数据不能相加,日期型的数据不能进行乘除运算
  • Resta fechas exactas usando bocas_entre
--查询编号,今日,给定日期,相减日期除以365的值;粗糙日期
select empno, sysdate ,birthdate,(sysdate-birthdate)/365 from emp
--查询编号,今日,给定日期,相减日期除以365的值;精确日期,相差多少月
select empno, sysdate ,birthdate,(sysdate-birthdate)/365,mouths_between(sysdate,birthdate) from emp
- 相加精确日期 用add_mouths
select empno ,birthdate "雇佣日期",(birthdate+90) "粗略的转正日期",add_mouths(birthdate,3) "精确的转正日期" from emp;
  • Utilice next_day para la próxima semana
select sysdate "当前日期",next_day(sysday,'星期一') 下周星期一 from emp;
  • Utilice next_day para el último día
--所在月份的最后一天
select ename , birthdate,last_day(birthdate) from emp;
  • ronda de los últimos días
select sysdate 当时日期,
	round(sysdate) 最近0点日期,
	round(sysdate,'day') 最近星期日,
	round(sysdate,'mouth') 最近月初,
	round(sysdate,'q') 最近季初日期,
	round(sysdate,'year') 最近年初日期
	from numTable;

Obtener la fecha hace 10 minutos

select sysdate,sysdate-interval '10' minute from dual;

Obtener la fecha hace una semana

select sysdate, sysdate - interval '7' day  from dual

Obtener la fecha hace un mes

select sysdate,sysdate-interval '1' month from dual;

Obtener la fecha hace un año

select sysdate,sysdate-interval '1' year from dual;

Obtenga el número total de días del mes.

select to_number(to_char(last_day(sysdate),'dd')) from dual;

Obtener el número total de días en un mes determinado.

select to_number(to_char(last_day(to_date('2018-09','yyyy-mm')),'dd')) from dual;

Consultar todas las fechas de un mes determinado.

SELECT TO_CHAR(TRUNC(to_date('2018-09','yyyy-MM'), 'MM') + ROWNUM - 1,'yyyy-MM-dd') someday  FROM DUAL
 CONNECT BY ROWNUM <= TO_NUMBER(TO_CHAR(LAST_DAY(to_date('2018-09','yyyy-MM')), 'dd'));

  • Devuelve la fecha actual, incluyendo solo año, mes y día.
CURDATE(),CURRENT_DATE()
  • Devuelve la hora actual, incluyendo sólo horas, minutos y segundos.
CURTIME(),CURRENT_TIME()```
  • Devuelve la fecha y hora actuales del sistema.
NOW()/SYSDATE()/CURRENT_TIMESTAMP()/LOCALTIME()/LOCALTIMESTAMP()
  • Devuelve una fecha UTC (Tiempo Universal Coordinado)
UTC_DATE()
  • Devuelve la hora UTC (hora universal coordinada)
UTC_TIME()
  • Conversión de hora y marca de tiempo.
SELECT UNIX_TIMESTAMP(‘2021-10-01 12:12:32’),FROM_UNIXTIME(1635173853) FORM DUAL;
  • AÑO() devuelve el año, MES() devuelve el mes, DÍA() devuelve el día, HORA() devuelve la hora, MINUTO() devuelve el minuto, SEGUNDO() devuelve el segundo
  • Devuelve el mes, julio
MONTHNAME(DATE)
  • Devuelve el día de la semana: LUNES
DAYNAME(DATE)
  • Devuelve el día de la semana: ten en cuenta que el día 1 es 0
WEEKDAY(DATE)
  • Devuelve el trimestre correspondiente a la fecha, que va del 1 al 4
QUARTER(date)
  • Devuelve la semana del año.
WEEK(DATE),WEEKOFYEAR(DATE)
  • La fecha de regreso es el día del año.
DAYOFYEAR(DATE)
  • Devuelve el día del mes en el que se encuentra la fecha.
DAYOFMONTH(DATE)
  • Devuelve tiempo1 menos tiempo 2. Cuando tiempo2 es un número, representa segundos y puede ser negativo.
SUBTIME(time1,time2)
  • Devuelve el número de días entre fecha1-fecha2
DATEDIFF(date1-date2)
  • Devuelve el intervalo de tiempo entre tiempo1-tiempo2
TIMEDIFF(time,time2)
  • Devuelve la fecha n días después del 1 de enero de 0000
FROM_DAYS(N)
  • Devuelve el número de días desde el 1 de enero de 0000
TO_DAY(date)
  • Devuelve la fecha del último día del mes en el que se encuentra la fecha.
LAST_DAY	(date)
  • Combina las horas, minutos y segundos dados en una hora y devuelve
MARKTIME(hour,minute,second)
  • Devuelve la vez tras vez más n
PERIOD_ADD(TIME,N)
④Función de conversión

Hay dos formas de conversión: conversión implícita y conversión manual.

  • Convertir valor numérico a carácter——to_char()
--要查日期,而这个日期是字符串,所以要将日期转化成字符串
select empno,ename from emp where birthdate = '2020-02-03';
--转换
select empno,ename from emp where to_char(birthdate,'YYYY-MM-DD') = '2020-02-03';

--数值转换成字符
select sal, to_char(sal,'$999,999.00'),to_char(sal,'L000,000.00') from emo where id='5'
/*
9:代表一个数字(有数字就显示,没有就不显示)

0:强制显示0

$:放置一个$符

L:放置一个本地货币符

. :(点)显示小数点

,:(逗号)显示千位指示符
*/
  • Convertir carácter a fecha——to_date()
select * from emp where birthdate=to_date('1999-12-25','YYYY-MM-DD');

  • Convertir caracteres a números——to_number()
--字符的格式和模板的格式必须要一致,相当于都必须用¥ 或者 $
select to_number('$800,00','$999,99.00') from numTable;
  • Convertir fecha a carácter——to_char()
--日期转字符串
select sysdate,to_char(sysdate,'YYYY-MM-DD HH24:MI:SS AM DAY') from numTable;

⑤Otras funciones
  • nvl (campo, valor devuelto);

Si es nulo, configúrelo en 0

#模糊查询在mybatis中
select nvl(x.ZHS,0) zhs from xq x
where
<if test="name!= null and name!= ''">
    x.name like concat(#{name},'%')
</if>

select ename,nvl(gongzuo,'还没有找到工作'from user
  • nvl2 (campo, no el valor devuelto por nulo, el valor devuelto por nulo)
--查询id为5的人如果不是null则返回job,如果式null返回‘没工作’
select nvl2(job,job,'没工作') from user where id=5
  • NULLIF (valor 1, valor 2) ; compara dos expresiones, devuelve un valor nulo si son iguales, devuelve la primera expresión si no son iguales

    --举例,第一个相等返回空值,第二个不相等,返回第一个
    select ename,eaddre, nullif(length(ename),length(ename)) num1,nullif(length(ename),length(eaddre)) num2 from emp;
    
  • CASE implementa la función de if...else if...else

select ename,job,sal,
	case job
		when '经理' then
		0.90 * sal
		when '主管' then
		0.80 * sal
		when '队长' then
		0.50 * sal
		else '员工' 
        0.30 * sal
        end as '工资捐赠数'
from emp where ename='小明';2(case QYLX when '地质灾害高易发区' then 1
               when '地质灾害中易发区' then 2
                   when  '地质灾害低易发区' then 3
                     when '地质灾害不易发区' then 4 end ) as NUM
  • DECODE implementa la función de if…else if…else
    eg1:
select ename,job,sal,
	decode(job
			'经理',
			0.90 * sal,
			'主管' ,
			0.80 * sal,
			'队长',
			0.50 * sal,
       		0.30 * sal) as '工资捐赠数'
from emp where ename='小明';

por ejemplo2:

decode(X,A,B,C,D,E)
//这个函数运行的结果是,当X = A,函数返回B;
//当X != A 且 X = C,函数返回D;
//当X != A 且 X != C,函数返回E。
//其中,X、A、B、C、D、E都可以是表达式,这个函数使得某些sql语句简单了许多
  • no es nulo no está vacío, es nulo está vacío

Filtrar valores que no están vacíos

select y.name, nvl(y.age,0) age ,nvl(y.score,0) score,y.nf
from user y
where y.name='xiaoming' is not null
and y.nf is not null;


--不在20-30之间
not between 20 and 30

NULL值与空值区别

	空值长度为0,不占空间,NULL值得长度为null,占用空间
	
	is null无法判断空值
	
	空值使用"=“或者”<>"来处理(!=)
	
	count()计算时,NULL会忽略,空值会加入计算
	
	注:NULL是占用内存空间的,而空值则不占用内存空间
  • Función extraer()
 --截取年份从PZRQ表的字段中
 extract(year from rqDate) as NF
 --截取月份从PZRQ表的字段中
 extract(month from rqDate) as NF
 --截取日期从PZRQ表的字段中
 extract(day from rqDate) as NF

Se utiliza para interceptar año, mes, día, hora, minuto, segundo.

⑥Funciones anidadas

Para anidar, debe utilizar funciones anidadas;

  • función de agrupación

    max( ), min( ), avg( ), sum( ), count( )
    avg, sum solo se puede usar para datos numéricos
    max, min, count se puede usar para cualquier tipo de datos

--求名字的最大值A为最小值,Z为最大值
select max(ename) Z,min(ename) A from emp;

contar tiene dos usos

1.count( * ) Consulta el número total de elementos de datos

2.count(campo), en este caso se ignoran los valores vacíos

select count(*) from emp;
select count(comm) from emp;
  • Teniendo
    por ejemplo: Encuentre los departamentos con un salario promedio mayor a 6,000 en cada departamento, y su salario promedio
select id,avg(salary)salary 
from username
having avg(salary)>6000
group by id;
--having avg(salary)>6000,也可以发在后面
  • función de grupo

    • Después de agrupar los datos, use la función de grupo.
      • Los campos que aparecen en la lista de consultas aparecen en la función de grupo o en la cláusula agrupar por
      • También solo puede aparecer en grupo por
    --根据部门分组,查询工资
    select max(sal) from emp group by bumenId;
    
    --根据部门分组,查询工资和部门
    select bumenId,max(sal) from emp group by bumenId;
    
    --按照多个字段进行分组;部门和工作分组
    select bumenId,job,max(sal) from emp group by bumenId,job order by bumenId
    
    --查询部门分组后,并且部门编号不为空的工资最大值 的最大值
    select max(max(sal)) from emp where bumenId is not null group by bumenId;
    
  • Función agregada agrupada

número de fila() sobre la partición por

Agrupación y agregación: Es agrupar primero y luego ordenar, si es posible marcar el ranking, si no quieres agrupar también puedes clasificar, si no quieres agrupar también puedes reclasificar en al mismo tiempo.

--按salary排序,rank给排个名
SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee

·8. Ataque de inyección SQL admin' o 'x'='x

  • El orden de las operaciones no es, y, o
状况:select * from users where name='admin' or 'x'='x' and password = 'xxxxxxx';
--上面情况会被攻击,以下解决
解决:select * from users where name='admin' or ('x'='x' and password = 'xxxxxxx');

·九、GROUP BY、ordenar por

Para agrupar, también se debe agregar el campo de consulta a qué campo está agrupado;

Ordenar, ordenar + campo + método de clasificación, orden ascendente asc, orden descendente desc

select t.nf ,sum(score) score
from user t
WHERE t.name='语文'
and t.NF is not null GROUP BY t.NF
order by t.nf asc

·10.Índice

índice de clave primaria

primary key

No puede ser un índice vacío

not null unique

Índice predeterminado

default  '默认的值';/*!注意要用单引号*/

Crear un índice de dos maneras.

  • 1. Creación automática: Oracle creará automáticamente índices para claves primarias y claves únicas.

Los índices creados automáticamente no se pueden eliminar manualmente, pero al eliminar restricciones de clave principal y restricciones únicas, los índices correspondientes se eliminarán automáticamente.

--添加名字为ename_uni的唯一索引
alter table emp
add constraints ename_uni unique (ename);
--删除名字为ename_uni的索引
alter table emp 
drop constraints ename_uni;
  • 2. Puede crear restricciones manualmente, qué campos de la tabla deben indexarse,

​----- Al realizar consultas, los campos que se utilizan a menudo como adiciones de consultas deben indexarse

Crear índice

-- 给表emp的字段ename创建名为ename_index的索引
create index ename_index on emp(ename);

Eliminar índice

--删除名为indexName的索引
drop index indexName;

Ver índice

select index_name, table_name, column_name from user_ind_columns where table_name='tableName' ;

Para consultar si el índice es efectivo: agregue una explicación antes

explain select s.* from stu s where name = '小强';

· 11. Ver

Ver introducción
  • Una vista es una mesa virtual.
  • Las vistas se crean sobre tablas existentes. Estas tablas sobre las que se crean las vistas se denominan tablas base.
  • Las vistas pueden entenderse como declaraciones de selección almacenadas.
  • Las vistas son otra forma de proporcionar datos de la tabla base al usuario.
Crear vista
create view Hr_view as select empno,ename,job,mgr,deptno from emp;
--创建物化视图
create materialized view Hr_view
    refresh force on demand
as select empno,ename,job,mgr,deptno from emp
--可以加只读
with read only;
ver restablecer
--创建视图,如果没视图则创建,如果有则重置
create or replace view Hr_view as select empno,ename,job,mgr,deptno from emp;
--起别名
create or replace view Hr_view (员工编号,员工姓名,薪水,佣金) as select empno,ename,sal,comn from emp;
Eliminar vista
--删除视图,不会影响原来的数据
drop view users;
insertar vista

Una vista es una tabla (virtual). Podemos insertar datos en la tabla o en la vista.

--将工资大于2000的做一个视图表
create or replace view Emp_num as select * from emp where sal>2000;
--对视图插入数据,数据会被插入到源表中
insert into Emp_num values (8000,'刘','软件工程师',005);
--创建只读的视图,不能执行DML操作
create or replace view Emp_num as select * from emp where sal>2000 with read only;
vista en línea

Es la subconsulta que aparece después de, que es una vista, pero la vista no tiene nombre y no se guardará en la base de datos.

--查询工资最大的三个员工;rownum是适用于<=的情况,是按照插入的顺序给记录排号
select rownum,E.* from (select * from emp order by sal desc) E where rownum <=3
--如何才可以拿到第二个数据
select * from (select rownum no, id,name,sal,job from emp) where  no=2
--可以使用rowid来获取数据的修改权限
select rowid ,e.* from emp e;

Obtener datos de la tabla y hacer vista sql

--查询user_after表中将nd转换为字符作为nd,bhnum截取六位作为bhnum,计算(当dlh为‘NC’的时候为DHJ,否则为0,作为NC),
--依次;并对nd,bhnum,dwmc分组;nd,xzqdm排序
select
    distinct to_char(nd) nd,
             to_char(substr(bhnum,0,6)) as bhnum,
             dwmc as xzqmc,
             sum(case when dlh ='NC' THEN DHJ else 0 END ) AS NC,
             sum(case when dlh ='NM' THEN DHJ else 0 END ) AS NM,
             sum(case when dlh ='N+' THEN DHJ else 0 END ) AS NZJ,
             sum(case when dlh ='N-' THEN DHJ else 0 END ) AS NJS
from user_after
group by to_char(nd),
         to_char(substr(bhnum,0,6)),
         dwmc
order by nd,xzqdm;

· 12. Consulta de varias tablas

· Consulta no equivalente

No existe una relación padre-hijo entre las dos tablas. Utilice! = para vincular las dos tablas.

--查询两张表,emp表的id,名字,工资,saldengji表的等级,低值,高值;emp表某人的工资在saldengji表中的工资等级和范围
select  e.empId,e.ename,e.esal,s.grade,s.losal,s.hisal 
from emp e,saldengji s where e.esal between s.losal and s.hisal;
· Autoconsulta (autounión)

Mediante alias, una tabla se virtualiza en dos tablas y luego se realizan consultas equivalentes en las dos tablas.

select e.empId,e.name,m.bumenId,m.ename 
from emp e,emp m where e.empId = m.bumenId
· Unión externa

A partir de consultas equivalentes, se pueden consultar datos que no cumplan las condiciones equivalentes;

**左外连接**:可以把右边不满足等值条件的数据查询出来 left join
**右外连接**:可以把左边表不满足等值条件的数据查出来 right join

Sintaxis SQL92 para implementar uniones externas, use + - MySQL no admite la sintaxis SQL92 para uniones externas

  • izquierda combinación externa
//第一种方式
select t.tbbh,w.xmwz
from tdgy t,wpxg w 
where t.objectid = w.objectid(+);
//第二种方式
select t.tbbh,w.xmwz
from tdgy t
left join wpxg w on t.objectid = w.objectid
  • unión exterior derecha
//第一种方式
select t.tbbh,w.xmwz
from tdgy t,wpxg w 
where t.objectid(+) = w.objectid;
//第二种方式
select t.tbbh,w.xmwz
from tdgy t
right join wpxg w on t.objectid = w.objectid

conexión externa completa

select t.tbbh,w.xmwz
from tdgy t
full outer join wpxg w on t.objectid = w.objectid
· Conexión cruzada

Nuevo estándar: es equivalente a la antigua consulta de equivalencia estándar sin dar las condiciones de equivalencia por las que luchar, lo que producirá un efecto cartesiano.

select e.*,d.* from emp e cross join dept d;
· unión natural unión natural
  • En la relación de tabla principal-secundaria, haga coincidir automáticamente los campos con exactamente los mismos nombres de columna en las dos tablas (llamadas columnas de referencia) y realice consultas equivalentes en estos campos con los mismos nombres.

  • Los prefijos no se pueden utilizar en columnas de referencia

  • Desventajas de la unión natural: 1. Todas las columnas de referencia se considerarán condiciones equivalentes, 2. Si los tipos de columnas de referencia son diferentes, la consulta informará un error;

  • Cuando no hay columnas de referencia en las dos tablas, la consulta natural generará un producto cartesiano.

select u.name,u.age,r.addre from user1 u natural join user2 r;

Insertar descripción de la imagen aquí

· unirse…usando
对自然连接的改造
在自然连接的基础上,加以连接,使用指定的参照列来作为等值条件;
--using(指定的参照列)
select u.name,u.id,addre,r.name from user u natural join user1 r using(addre) where u.id=5;
· Consulta de combinación de tablas
Unión: unión y unión todos
**union,去除重复**

eg:
	select adName,id,age,sorce,addre from aSchool
	union 
	select adName,id,age,sorce,addre from bSchool;
	若两张表有重复会去除一个
	
**union all,不去重复(推荐)**
eg:

    select adName,id,age,sorce,addre from aSchool
	union  all
	select adName,id,age,sorce,addre from bSchool;
	若两张表有重复不会去除

	字段名字必须一致

Insertar descripción de la imagen aquí

intersección: intersección
--取出两张表共同的内容
select adName,id,age,sorce,addre from aSchool
intersect
select adName,id,age,sorce,addre from bSchool;

Insertar descripción de la imagen aquí

Conjunto de diferencias: menos
--取出aSchool的内容以及和bSchool中相同的内容,反之

select adName,id,age,sorce,addre from aSchool
minus
select adName,id,age,sorce,addre from bSchool;

Insertar descripción de la imagen aquí

· Subconsulta
  • La subconsulta no tiene resultados y la consulta principal no informará un error, simplemente no tiene resultados de consulta.

  • Subconsulta de una sola columna de varias filas, utilice operadores de comparación de varias filas, IN, ANY, ALL

    1》Usar operador IN

    --查询表中工资大于3000的数据
    select job, fromm, emp, where sal>3000;
    --使用 in;查询emp表工资大于3000工资的数据(当查询另一张表中的员工工资,存在和本张表工资大于3000的工资一样的员工的数据时比较方便)
    select e.empId,e.ename,e.job,e.sal from emp e where e.job in (select job fromm emp where sal>3000);
    

    2》Usar TODOS los operadores

    --查询表中大于id为5的部门的工资数据,如果是<号:则小于满足子查询条件的所有数据的最小值,如果是>号:则大于满足子查询条件的所有数据的最大值
    select e.* from emp e where e.sal > ALL(select sal from emp where empId=5);
    

    3》Utilice CUALQUIER operador

    --查询工资数据大于某个部门编号为20的工资;如果是<号,则小于满足子查询条件的所有数据的最大值;如果是>号,则大于满足子查询条件的所有数据的最小值
    select e.* from emp e where e.sal < any(select sal from emp where empid=20);
    

    4》Subconsulta de varias filas y varias columnas

Puedes usar el operador de comparación.

--查询部门编号为5和8的addre,job的数据
select ename,job from emp where empid = 5 or ompid = 8; 

--成对的比较
--注:查询表中的数据addre,job和部门编号为5和8的addre,job一样的数据,不包括自己
select empid,ename,addre,job from emp 
where (addre,job) in (select ename,job from emp where empid = 5 or ompid = 8) and empid != 5 and empid != 8;

--非成对的比较,把多行多列的子查询拆分成两个多行单列的子查询,分别使用in运算符
select empid,ename,addre,job from emp 
where addre in (select addre from emp where empid = 5 or ompid = 8) 
and job in(select job from emp where empid = 5 or ompid = 8) 
and empid != 5 and empid != 8;

bloquear mesa, desbloquear

¡Cierra el reloj!
select * from user for update;
--锁表(其它事务不能读、更新、删除)
BEGIN TRAN
SELECT * FROM <表名> WITH(TABLOCKX);
WAITFOR delay '00:00:20'
COMMIT TRAN


--锁表(其它事务只能读,不能更新、删除)
BEGIN TRAN
SELECT * FROM <表名> WITH(HOLDLOCK);
WAITFOR delay '00:00:20'
COMMIT TRAN

--锁部分行
BEGIN TRAN
SELECT * FROM <表名>  WITH(XLOCK) WHERE ID IN ('81A2EDF9-D1FD-4037-A17B-1369FD3B169B');
WAITFOR delay '00:01:20'
COMMIT TRAN

--查看被锁表
select   request_session_id   锁表进程,OBJECT_NAME(resource_associated_entity_id) 被锁表名  
from   sys.dm_tran_locks where resource_type='OBJECT';

--解锁
declare @spid  int
Set @spid  = 55 --锁表进程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid  as varchar)
exec(@sql)


·13.Restricciones

·Restricción única única

Asegúrese de que los datos de este campo no se puedan repetir o que la combinación de campos no se pueda repetir, pero puede ser nula

--创建表的时候使用
firstName varchar2(10),
LastName varchar2(10),
//取一个名字叫name_uni的唯一约束
constraints name_uni unique (firstName,LastName)

·Restricciones de clave primaria clave primaria

No nulo y único. Solo puede haber una restricción de clave primaria en una tabla (solo se puede escribir una), pero se puede aplicar a múltiples campos al mismo tiempo, también llamada clave primaria conjunta.

--创建表
sid number(4),
sname varchar2(20),
constraints T_STU primary key (sid)--给sid加主键约束
  • Agregar restricciones de clave principal
    alter table myUser  add constraint myUser_key  primary key (userId);
    --alter table 表 add constraint 主键名 主键类型(主键字段)
    
#### ·外键约束

外键约束可以重复,可以为null;

- 添加外键约束

```sql
alter table cTable add foreign key(cUserId) references zTable(userId)
--alter table 从表 add foreign key(外键字段) references 主表(主键字段)
  • Eliminar restricciones de clave externa
alter table myUser drop foreign key cUserId
--alter table 表名 drop foreign key 外键名

secuencia

  • Datos de clave primaria utilizados para mantener la base de datos.
  • Proporcionar automáticamente valores únicos
  • Objetos compartidos
  • Cargar valores de secuencia en la memoria puede mejorar la eficiencia del acceso
Crear secuencia
--创建序列,名字为seq_stu
create sequence seq_stu
INCREMENT BY--指定序列号之间的间隔,该值可为正的或负的整数,但不可为0。序列为升序。忽略该子句时,缺省值为1。
START WITH--指定生成的第一个序列号。在升序时,序列可从比最小值大的值开始,缺省值为序列的最小值。对于降序,序列可由比最大值小的值开始,缺省值为序列的最大值。
MAXVALUE:--指定序列可生成的最大值。
NOMAXVALUE:--为升序指定最大值为1027,为降序指定最大值为-1。
MINVALUE:--指定序列的最小值。
NOMINVALUE:--为升序指定最小值为1。为降序指定最小值为-1026。
cycle				--需要循环
nocache				--不需要缓存登录




-- 创建序列  Student_stuId_Seq --
 create sequence Student_stuId_Seq
 increment by 1
 start with 1
 minvalue 1
 maxvalue 999999999;
Modificar secuencia
-- 更改序列  Student_stuId_Seq--
 alter sequence Student_stuId_Seq
    increment by 2  
    minvalue 1
    maxvalue 999999999;
Consulta usando secuencia
--查询序列下一个值
select Student_stuId_Seq.Nextval 自增序列ID from dual;
--查询序列当前值
select Student_stuId_Seq.currval from dual;
Agregar una nueva secuencia de uso
--给表student新增数据,seq_stu.nextval可以自动添加id值
 insert into Student(stuId,Stuname) values(Student_stuId_Seq.Nextval,'张三');
 insert into Student(stuId,Stuname) values(Student_stuId_Seq.Nextval,'李四');
eliminar secuencia
drop sequence Student_stuId_Seq;

otro

SQL determina si la tabla existe
1. La primera forma

select count(*) as count from user_tables where table_name =upper('tableName');

Resultados de la consulta
Insertar descripción de la imagen aquí
2. La segunda forma

SELECT COUNT(*) as count FROM ALL_TABLES WHERE OWNER = UPPER('用户名') AND TABLE_NAME = UPPER('表名')

resultado de búsqueda
Insertar descripción de la imagen aquí


Crear espacio de tabla (esquema) en plsql

-- 创建表空间
create tablespace TS_RAW_XZ
 logging
 datafile 'D:\oradata\6400NXdata\TS_RAW_XZ.dbf'	--保存的文件
 size 16384m	--大小
 autoextend on		
 next 32m maxsize unlimited
 extent management local;
-- Create the user 
--创建用户
create user US_RAW_XZ
  identified by "US_RAW_XZ"
  default tablespace TS_RAW_XZ
  temporary tablespace TEMP
  profile DEFAULT
  quota unlimited on TS_RAW_XZ;
-- Grant/Revoke role privileges 
grant connect to US_RAW_XZ with admin option;
grant dba to US_RAW_XZ with admin option;
grant resource to US_RAW_XZ with admin option;
-- Grant/Revoke system privileges 
grant unlimited tablespace to US_RAW_XZ with admin option;

Espero que esto te ayude

~感谢您的光临~

Supongo que te gusta

Origin blog.csdn.net/m0_50762431/article/details/121872497
Recomendado
Clasificación