1. Consulta de conexión SQL99
1.1 Conexión cruzada
Efecto: Su efecto es equivalente a no utilizar la cláusula donde para limitar las condiciones de conexión al conectar dos tablas;
SQL99:
select dept.deptno,dname,ename from dept cross join emp;
SQL92:
select dept.deptno,dname,ename from dept,emp;
resultado de la operación:
1.2 Conexión natural
Unión natural: establezca una conexión basada en todas las columnas con el mismo nombre en las dos tablas y seleccione todas las filas con valores iguales en las columnas con el mismo nombre de las dos tablas.
Nota 1: Si los tipos de datos de las columnas con el mismo nombre en las dos tablas son diferentes, se producirá un error.
Nota 2: No está permitido utilizar nombres de tablas o alias como prefijos en las columnas de referencia.
Nota 3: El resultado de la conexión natural no conserva atributos duplicados.
Ejemplo:
select empno, ename, sal, deptno, dname from emp natural join dept
resultado de la operación:
1.3 Uso de la cláusula secundaria
Si no desea realizar una unión equivalente con referencia a todas las columnas del mismo nombre en la tabla unida, las uniones naturales no podrán cumplir con los requisitos. Puede usar la cláusula USING durante la conexión para establecer la columna (columna de referencia ) nombre utilizado para la unión equi .
La columna a la que hace referencia la cláusula de uso no puede tener como prefijo el nombre de la tabla o el alias en ningún lugar de SQL.
select e.ename,e.ename,e.sal,deptno,d. dname
from emp e join dept d
using(deptno)
where deptno=101
1.4 Sobre la cláusula infantil
La condición de una combinación natural es una combinación equivalente basada en todas las columnas con el mismo nombre en la tabla. Para establecer condiciones de unión arbitrarias o especificar las columnas que se unirán , se debe utilizar la cláusula ON. Las condiciones de conexión se escriben por separado de otras condiciones de consulta y la cláusula ON se utiliza para que la declaración de consulta sea más fácil de entender.
Ejemplo:
select ename,dname from emp inner join dept
on emp.deptno=dept.deptno
where emp.deptno=30;
resultado de la operación:
Ejemplo:
select empno, ename, sal, emp.deptno, dname from emp inner join dept
on (emp.deptno = dept.deptno and sal>1000);
resultado de la operación:
Ejemplo:
select * from dept, emp where dept.deptno = emp.deptno and sal>1000;
resultado de la operación:
1.5 uniones externas
Izquierda combinación externa:
Durante el proceso de conexión de dos tablas, además de devolver filas que cumplen las condiciones de conexión, también devuelve filas en la tabla izquierda que no cumplen las condiciones. Este tipo de conexión se denomina unión externa izquierda.
seleccione * de la tabla 1 alias 1 izquierda [externa] únase a la tabla 2 alias 2 en alias 1.xx=alias 2.xx
select * from emp e left outer join dept d on e.deptno=d.deptno;
select e.ename,e.deptno,d.dname from emp e left
outer join dept d on e.deptno=d.deptno;
Unión exterior derecha:
Durante el proceso de conexión de dos tablas, además de devolver filas que cumplen las condiciones de conexión, también devuelve filas en la tabla derecha que no cumplen las condiciones. Este tipo de conexión se denomina unión externa derecha.
seleccione * de la tabla 1 alias 1 derecha [exterior] únase a la tabla 2 alias 2 en alias 1.xx=alias 2.xx
select * from emp e right outer join dept d on e.deptno=d.deptno;
2. Subconsulta
1) Subconsulta de una sola fila
Ejemplo: consultar el salario de todas las personas cuyo salario sea superior a CLEARK
select * from emp
where sal>(select sal from emp where ename='CLARK');
Ejemplo: Consultar la información de empleados que tienen el mismo puesto que SCOTT y fueron contratados antes que SCOTT
SELECT empno, ename, job FROM emp
WHERE job =(SELECT job FROM emp WHERE empno=7788)
AND hiredate < (SELECT hiredate FROM emp WHERE empno=7788);
Ejemplo: consultar el número y nombre de los empleados cuyo salario es superior a SCOTT o cuyo tiempo de empleo es anterior a SCOTT.
select empno,ename,sal,hiredate
from emp
where sal>(select sal from emp where ename='SCOTT')
or hiredate<(select hiredate from emp where ename='SCOTT')
2) Subconsulta de varias filas
all: comparar con todos los valores devueltos por la subconsulta
cualquiera: comparar con cualquier valor devuelto por la subconsulta
en: igual a cualquiera en la lista
Ejemplo: Consultar información de empleados cuyo salario es inferior a cualquier salario de 'CLERK'.
SELECT empno, ename, job,sal
FROM emp
WHERE sal < ANY (SELECT sal FROM emp WHERE job = 'CLERK') AND job <> 'CLERK';
resultado de la operación:
Ejemplo: Consultar el número, nombre y salario de los empleados cuyo salario es superior a todo 'VENDEDOR'.
SELECT empno, ename,sal
FROM emp
WHERE sal > ALL(SELECT sal FROM emp WHERE job= 'SALESMAN');
resultado de la operación:
Ejemplo: Consultar la información de los empleados del departamento 20 que tienen el mismo puesto que los empleados del departamento 10.
SELECT empno, ename, job FROM emp
WHERE job IN (SELECT job FROM emp WHERE deptno=10)
AND deptno =20;
resultado de la operación:
Ejemplo: consultar el salario de los empleados cuyo salario no es ni el más alto ni el más bajo
select * from emp where sal !=(select max(sal) from emp ) and sal !=
(select min(sal) from emp);
Ejemplo: información sobre empleados que no son vendedores
--法一:
select * from emp where deptno != (select deptno from dept where
dname='sales');
--法二:
select * from emp where deptno in(select deptno from dept where
dname !='sales');
Ejemplo: Consultar información de empleados y requerir cualquier empleado con salario superior al departamento número 10.
--法一:
select * from emp where sal >(select min(sal) from emp where
deptno=10);
--法二:
select * from emp where sal >any (select sal from emp where
deptno=10);
Ejemplo: Consultar el salario promedio de cada departamento.
select * from
salgrade s, (select deptno,avg(sal) avg_sal
from emp group by deptno) t
where t.avg_sal between s.losal and s.hisal;
resultado de la operación: