Aprende a realizar consultas, gestionar bases de datos y optimizar tus habilidades en SQL
SELECT * | { [ DISTINCT ] columna expresión [alias],...}
FROM tabla
[WHERE condición]
[ORDER BY {columna, alias, expresión, posición_numérica} [ASC|DESC]];
Operador | Descripción | Ejemplo |
---|---|---|
= | Igual a | salary = 5000 |
!=, <> | Diferente a | department_id != 10 |
<, > | Menor que, Mayor que | salary > 3000 |
<=, >= | Menor o igual, Mayor o igual | hire_date <= '01-JAN-2010' |
BETWEEN | Entre un rango (inclusivo) | salary BETWEEN 3000 AND 5000 |
IN | En una lista de valores | department_id IN (10, 20, 30) |
LIKE | Coincide con patrón | last_name LIKE 'S%' |
IS NULL | Es nulo | commission_pct IS NULL |
SELECT employee_id AS "IDENTIFICACION EMPLEADO",
first_name || ' ' || last_name AS "NOMBRE DEL EMPLEADO",
salary salario
FROM employees;
SELECT e.employee_id, e.last_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id;
SELECT employee_id "IDENTIFICACION EMPLEADO",
first_name || ' ' || last_name "NOMBRE DEL EMPLEADO",
salary salario
FROM employees;
||
se utiliza para concatenar cadenas de texto en Oracle. En otros sistemas como SQL Server, se utiliza el operador +
.
La cláusula ORDER BY va al final de la sentencia SELECT y permite ordenar en forma Ascendente (defecto) o Descendente.
SELECT employee_id, last_name, salary
FROM employees
ORDER BY salary DESC;
La cláusula WHERE restringe a que las filas deben cumplir con una condición para ser visualizadas, actualizadas o eliminadas.
Elementos que se pueden comparar:
SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = 90
AND salary > 10000;
Operador | Descripción | Ejemplo |
---|---|---|
AND | Todas las condiciones deben ser verdaderas | salary > 3000 AND department_id = 50 |
OR | Al menos una condición debe ser verdadera | department_id = 60 OR job_id = 'IT_PROG' |
NOT | Niega una condición | NOT (salary BETWEEN 1000 AND 2000) |
SELECT last_name, department_id, salary*12
FROM employees
WHERE job_id = '&job_title';
Cuando se quiere que el dato colocado se ocupe en dos lados, se pone en la primera variable &&
y en las demás &
:
SELECT employee_id, last_name, job_id, &&column_name
FROM employees
ORDER BY &column_name;
Para crear nuevas tablas en la base de datos y guardar los datos de una consulta:
CREATE TABLE nombre_tabla [(columna, columna...)] AS
sentencia_select;
Una función siempre devuelve algo. Toma algo, lo procesa y devuelve algo nuevo. Cada función tiene por lo menos 1 parámetro.
Una dentro de otra, recordar el tipo de datos puede tener problemas con algunas funciones.
F3(F2(F1(col, arg1), arg2), arg3)
lower()
- todo en minúsculaupper()
- todo en mayúsculainitcap()
- solo la primera en mayúsculasubstr()
- corta (ej: SUBSTR(last_name, -2, 2)
)replace()
- reemplaza (ej: REPLACE(last_name, 'A', 'Hola')
)instr()
- devuelve posiciónlength()
- largo de textoconcat()
o ||
- concatenatrim()
- elimina espacioslpad()
/ rpad()
- rellena izquierda/derecharound()
- redondeatrunc()
- truncamod()
- módulosysdate
- fecha actualmonths_between()
- meses entre fechasadd_months()
- sumar/restar meseslast_day()
- último día del mesextract()
- extrae parte de fechaFunción | Descripción | Ejemplo |
---|---|---|
TO_NUMBER |
Convierte a número | TO_NUMBER('1234,56') |
TO_CHAR |
Convierte a texto | TO_CHAR(salary, '$999G999') |
TO_DATE |
Convierte a fecha | TO_DATE('2007/05/31','YYYY/MM/DD') |
-- NVL: Reemplaza NULL por un valor
NVL(manager_id, 0)
-- NVL2: Distintos valores si es NULL o no
NVL2(commission_pct, 'si no es null', 'si es null')
-- NULLIF: Retorna NULL si los dos valores son iguales
NULLIF(x, y)
-- COALESCE: Devuelve el primer valor no nulo
COALESCE(expr1, expr2, …, exprn)
Muestra solo lo que tienen en común ambas tablas.
SELECT suppliers.supplier_id, suppliers.supplier_name,
orders.order_date
FROM suppliers
INNER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
Muestra todo lo que tiene la tabla de la izquierda.
SELECT suppliers.supplier_id, suppliers.supplier_name,
orders.order_date
FROM suppliers
LEFT OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
Muestra todo lo que tiene la tabla de la derecha.
SELECT orders.order_id, orders.order_date,
suppliers.supplier_name
FROM suppliers
RIGHT OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
-- Subconsulta que devuelve un solo valor
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- Subconsulta que devuelve múltiples valores
SELECT employee_id, last_name
FROM employees
WHERE department_id IN (SELECT department_id
FROM departments
WHERE location_id = 1700);
Junta dos tablas con los mismos datos y no se duplican.
SELECT employee_id, job_id FROM employees
UNION
SELECT employee_id, job_id FROM job_history;
Junta dos tablas con los mismos datos (incluye duplicados).
SELECT employee_id, job_id FROM employees
UNION ALL
SELECT employee_id, job_id FROM job_history;
Muestra solo los datos comunes en ambas tablas.
SELECT employee_id, job_id FROM employees
INTERSECT
SELECT employee_id, job_id FROM job_history;
A le quita lo que coincide con B.
SELECT employee_id, job_id FROM employees
MINUS
SELECT employee_id, job_id FROM job_history;
Inserta datos en una tabla.
INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id)
VALUES (207, 'John', 'Smith', 'JSMITH', SYSDATE, 'IT_PROG');
Actualiza los datos de una tabla.
UPDATE employees
SET salary = salary * 1.10
WHERE department_id = 90;
Borra datos de una tabla.
DELETE FROM employees
WHERE department_id = 20;
Borra todos los datos de una tabla.
TRUNCATE TABLE job_history;
COMMIT: Confirma acciones y guarda datos en las tablas.
ROLLBACK: Deshace acciones ya aplicadas hasta el último commit.
Permisos de creación, grant, permisos para los usuarios.
-- Otorgar privilegios de sistema
GRANT CREATE SESSION TO usuario;
GRANT CREATE TABLE TO usuario;
GRANT CREATE VIEW TO usuario;
Permisos para tablas, ON.
-- Otorgar privilegios de objeto
GRANT SELECT, INSERT, UPDATE ON employees TO usuario;
GRANT SELECT ON departments TO PUBLIC;
REVOKE DELETE ON employees FROM usuario;
GRANT RESOURCE TO C##DUEÑO;
GRANT SELECT, INSERT, UPDATE ON employees TO C##DESARROLLADOR;
GRANT SELECT ON employees TO C##CONSUMIDOR;
Los nombres de usuario en versiones recientes de Oracle deben ir precedidos de C##
cuando se utiliza el modo de contenedor múltiple (CDB).
Las vistas guardan las consultas en un paquete para poder volver a ver los informes de manera más automática. El usuario requiere permisos específicos para crearlas.
-- Crear una vista simple
CREATE VIEW emp_dept_view AS
SELECT e.employee_id, e.first_name, e.last_name,
d.department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id;
-- Usar la vista
SELECT * FROM emp_dept_view
WHERE department_name = 'IT';
Secuencia de números que se le pueden ajustar varios parámetros como el número inicial, de a cuánto avanza, si es cíclica, autoincrementar, etc. Se puede concatenar con columnas.
-- Crear una secuencia
CREATE SEQUENCE employees_seq
START WITH 207
INCREMENT BY 1
NOCACHE
NOCYCLE;
-- Usar una secuencia
INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id)
VALUES (employees_seq.NEXTVAL, 'Jane', 'Doe', 'JDOE', SYSDATE, 'IT_PROG');
-- Obtener el valor actual
SELECT employees_seq.CURRVAL FROM dual;
Los índices optimizan queries y mejoran el rendimiento. Solemos ocupar dos tipos: los B-tree y los de PK de las columnas.
-- Índice simple
CREATE INDEX emp_last_name_idx
ON employees (last_name);
-- Índice compuesto
CREATE INDEX emp_dept_job_idx
ON employees (department_id, job_id);
-- Índice único
CREATE UNIQUE INDEX emp_email_idx
ON employees (email);
-- Eliminar un índice
DROP
INDEX emp_last_name_idx;
Los índices mejoran la velocidad de las consultas, pero agregan sobrecarga en operaciones de inserción, actualización y eliminación. Utiliza índices en columnas que se usan frecuentemente en cláusulas WHERE, JOIN o ORDER BY.
En SQL, las consultas se procesan en un orden específico que es importante entender para escribir consultas efectivas:
Orden lógico de procesamiento SQL
Jerarquía de operaciones SQL
Diagramas de JOINs en SQL
En SQL, las consultas se procesan en un orden específico que es importante entender para escribir consultas efectivas:
Orden lógico de procesamiento SQL
Jerarquía de operaciones SQL
Diagramas de JOINs en SQL
Las subconsultas se ejecutan desde la más interna hacia la más externa:
SELECT employee_id, last_name
FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE location_id = (
SELECT location_id
FROM locations
WHERE city = 'Toronto'
)
);
SELECT location_id FROM locations WHERE city = 'Toronto'
SELECT department_id FROM departments WHERE location_id = resultado_anterior
SELECT employee_id, last_name FROM employees WHERE department_id IN resultado_anterior
Proceso de ejecución de subconsultas