Diferencia entre revisiones de «Plantilla:PHP/SQL»

De WikiEducator
Saltar a: navegación, buscar
(Ejercicios select/from/where con funciones)
 
Línea 277: Línea 277:
 
</source>
 
</source>
 
}}
 
}}
 
 
 
===SELECT===
 
*Esta es una claúsula especial a la que le vamos a dedicar bastante tiempo.
 
*Consiste en hacer consultas de nuestro conjunto de datos y poder recuperarlos.
 
*La cantidad de consultas que se pueden realizar es muy grande y variado, siempre que se pueda establecer la consulta y la lógica matemática de su resolución, va a haber una sentencia SQL que permita implementarla.
 
Esta sentencia que empieza por la claúsual SELECT va a terner hasta 5 posibles claúsulas, de las cuales solo son obligatorias las dos primeras
 
<source lang=SQL>
 
SELECT
 
FROM
 
</source>
 
Las 5 posibles que estudaremos son
 
<source lang=SQL>
 
  SELECT
 
  FROM
 
  WHERE
 
  GROUP BY
 
  HAVING
 
(ORDER BY)
 
</source>
 
{{MRM_Clave|Title=Importante (lo estudiaremos)|
 
*'''''Having''''' solo se usa como opción en el '''group by'''.
 
*'''''Order by''''' es un criterio de ordenación y no se considera como cláusula propiamente dicho
 
}}
 
*Usando el álgebra relacional y permite recuperar un subconjunto de los datos de la base de datos.
 
*Esta sentencia devuelve un conjunto de tuplas  como resultado de ejecutar la consulta.
 
*Las operaciones del algebra relacional son
 
 
;Proyecciones
 
;Selecciones
 
;Producto cartesiano
 
;Join
 
 
====Claúsula Select====
 
[[Archivo:dml_select_t1.png]]<br />
 
<hr />
 
[[Archivo:dml_select_t2.png]]<br />
 
<hr />
 
[[Archivo:dml_select_t3.png]]<br />
 
<hr />
 
[[Archivo:dml_select_t4.png]]<br />
 
<hr />
 
[[Archivo:dml_select_t5.png]]<br />
 
<hr />
 
[[Archivo:dml_select_t6.png]]<br />
 
<hr />
 
[[Archivo:dml_select_t7.png]]<br />
 
<hr />
 
[[Archivo:dml_select_t8.png]]<br />
 
<hr />
 
[[Archivo:dml_select_t9.png]]<br />
 
<hr />
 
[[Archivo:dml_select_t10.png]]<br />
 
<hr />
 
;Uso de funciones
 
*Podemos usar funciones sobre todas las filas y obtener el resultado.
 
*Algunas funciones típicas son
 
;Funciones de carácter
 
[[Archivo:dml_func_01.png]]<br />
 
<hr />
 
;Descripción de las funciones
 
[[Archivo:dml_func_02.png]]<br />
 
[[Archivo:dml_func_03.png]]<br />
 
;Ejemplos
 
[[Archivo:dml_func_04.png]]<br />
 
[[Archivo:dml_func_05.png]]<br />
 
<hr />
 
;Funciones con valores numércios
 
[[Archivo:dml_func_06.png]]<br />
 
[[Archivo:dml_func_07.png]]<br />
 
<hr />
 
;Funciones con fechas
 
[[Archivo:dml_func_08.png]]<br />
 
[[Archivo:dml_func_09.png]]<br />
 
[[Archivo:dml_func_10.png]]<br />
 
====Funciones de agregación o grupo====
 
*Son funciones que se aplican a un conjunto de valores de diferentes filas
 
*Nos darán como resultado un sólo valor
 
*Conviene renombrar la columna
 
[[Archivo:dml_func_11.png]]<br />
 
[[Archivo:dml_func_12.png]]<br />
 
[[Archivo:dml_func_13.png]]<br />
 
{{MRM_Actividad|Title=Realiza las siguientes consultas|
 
*El usuario que más cobra
 
*El trabajo más remunerado
 
*La remuneración media, en número de trabajos y el que más y menos se paga
 
*El empleado con la fecha de contratación mayor y menor
 
*El total de comisiones pagadas a los empleados
 
}}
 
 
===From===
 
*Esta es una operación de un producto cartesiano
 
*El producto cartesiano consiste en juntar todas las tuplas de una relación con cada una de las tuplas de otra
 
*Genera gran cantidad de información, por ese motivo los gestores de bases de datos intentan hacerlo lo último
 
{{MRM_Actividad|Title=probar from|
 
*Realiza un producto cartesiano entre empleados y departamentos
 
}}
 
*En el from además de una relación o tabla, puede ir cualquier cosa que me devuelva una relación, incluso una consulta
 
{{MRM_Actividad|Title=probar from|
 
Realiza un producto cartesiano entre empleados y departamentos, solo nombres, y fuérzalo en el from.
 
}}
 
===Where===
 
*La claúsura '''''where''''' establece la operación de selección.
 
*Es decir de todas las filas, indica cuales son las que queremos seleccionar.
 
[[Archivo:where1.png]]<br />
 
*En esta claúsura, utiliza operadores de comparación para establecer el criterio de las filas seleccionadas
 
[[Archivo:dml_func_14.png]]<br />
 
[[Archivo:dml_func_15.png]]<br />
 
[[Archivo:dml_func_16.png]]<br />
 
[[Archivo:dml_func_17.png]]<br />
 
[[Archivo:dml_func_18.png]]<br />
 
[[Archivo:dml_func_19.png]]<br />
 
[[Archivo:dml_func_20.png]]<br />
 
[[Archivo:dml_func_31.png]]<br />
 
[[Archivo:dml_func_22.png]]<br />
 
<hr />
 
 
====Ejercicios select/from/where con funciones ====
 
<br />
 
{{MRM_Actividad|Title=Realiza las siguientes consultas|
 
 
[[Archivo:ej1_query.png]]
 
*En este caso JOB_ID nos da el tipo de trabajo
 
Secretari@ es el tipo '''''ST_CLERK'''''
 
<source lang=sql>
 
mysql> SELECT * 
 
      FROM EMPLOYEES
 
      WHERE JOB_ID ="ST_CLERK"     
 
            AND     
 
            HIRE_DATE>"1997-12-31";
 
</source>
 
<hr />
 
[[Archivo:ej2_query.png]]
 
 
<source lang=sql>
 
SELECT LAST_NAME, JOB_ID,SALARY, COMMISSION_PCT
 
FROM EMPLOYEES
 
WHERE COMMISSION_PCT IS NOT NULL
 
ORDER BY LAST_NAME DESC;
 
</source>
 
 
<hr />
 
[[Archivo:ej3_query.png]]
 
<source lang=sql>
 
SELECT 'El salario de '||Last_name||
 
      'va a ser con un incremento del 10% de '||
 
      round(Salary *1.10) ||
 
      ' dólares' as "Nuevo Salario"
 
FROM EMPLOYEES
 
where COMMISSION_pCT IS NULL
 
 
</source>
 
<hr />
 
[[Archivo:ej4_query.png]]
 
<source lang=sql>
 
select last_name,
 
      trunc(months_between(sysdate, hire_date)/12) as "años",
 
      trunc(mod(months_between(sysdate, hire_date),12))as "meses"
 
from employees
 
order by hire_date;
 
</source>
 
<hr />
 
[[Archivo:ej5.png]]
 
<source lang=sql>
 
select *
 
from empleados
 
where substr(last_name,1,1) in ('J', 'K', 'L', 'M')
 
 
</source>
 
<hr />
 
[[Archivo:ej6.png]]
 
<source lang=sql>
 
 
select last_name, salary,
 
        decode (commission_pct,NULL, 'No' ,
 
                              'Yes') as "comisión"
 
from employees
 
 
</source>
 
<hr />
 
[[Archivo:ej7.png]]
 
<source lang=sql>
 
 
 
select department_name, location_id,job_id, salary
 
from departments d, employees e
 
where d.department_id = e.department_id
 
      and
 
      location_id = '&localizacion';
 
</source>
 
<hr />
 
[[Archivo:ej8.png]]
 
<source lang=sql>
 
SELECT COUNT(*)
 
FROM employees
 
WHERE last_name LIKE '%n';
 
--or
 
SELECT COUNT(*)
 
FROM employees
 
WHERE SUBSTR(last_name, -1) = 'n';
 
</source>
 
<hr />
 
[[Archivo:ej10.png]]
 
<source lang=sql>
 
SELECT DISTINCT job_id
 
FROM employees
 
WHERE department_id IN (10, 20);
 
</source>
 
<hr />
 
[[Archivo:ej12.png]]
 
<source lang=sql>
 
SELECT last_name, hire_date
 
FROM  employees
 
WHERE TO_CHAR(hire_date, 'DD') < 16;
 
</source>
 
<hr />
 
[[Archivo:ej13.png]]
 
<source lang=sql>
 
SELECT last_name, salary, TRUNC(salary, -3)/1000
 
FROM  employees;
 
</source>
 
<hr />
 
[[Archivo:ej14.png]]
 
<source lang=sql>
 
SELECT e.last_name, m.last_name manager, m.salary,
 
j.grade_level
 
FROM  employees e JOIN employees m
 
      ON    e.manager_id = m.employee_id
 
    JOIN job_grades j
 
    ON  m.salary BETWEEN j.lowest_sal AND j.highest_sal
 
    AND  m.salary > 15000;
 
</source>
 
<hr />
 
[[Archivo:ej21.png]]
 
<source lang=sql>
 
SELECT last_name, TO_CHAR(hire_date, 'Month DD') BIRTHDAY
 
FROM employees
 
ORDER BY TO_CHAR(hire_date, 'DDD');
 
</source>
 
<hr />
 
}}
 
 
====Ejercicios de agrupación  ====
 
<br />
 
{{MRM_Actividad|Title=Ejercicios de agrupación|
 
[[Archivo:ej9.png]]
 
<source lang=sql>
 
SELECT d.department_id, d.department_name, d.location_id, COUNT(e.employee_id)
 
FROM  employees e
 
      RIGHT OUTER JOIN departments d
 
ON
 
    e.department_id = d.department_id
 
GROUP BY d.department_id, d.department_name, d.location_id;
 
</source>
 
<hr />
 
[[Archivo:ej11.png]]
 
<source lang=sql>
 
SELECT e.job_id, count(e.job_id) FREQUENCY
 
FROM employees e
 
    JOIN departments d
 
    ON e.department_id = d.department_id
 
WHERE  d.department_name IN ('Administration', 'Executive')
 
GROUP BY e.job_id
 
ORDER BY FREQUENCY DESC;
 
</source>
 
<hr />
 
 
[[Archivo:ej15.png]]
 
<source lang=sql>
 
SELECT  d.department_id, d.department_name, count(e1.employee_id) employees, 
 
        NVL(TO_CHAR(AVG(e1.salary), '99999.99'), 'No average') avg_sal, 
 
        e2.last_name, e2.salary, e2.job_id
 
FROM  departments d RIGHT OUTER JOIN employees e1
 
      ON  d.department_id = e1.department_id
 
      RIGHT OUTER JOIN employees e2
 
      ON  d.department_id = e2.department_id
 
      GROUP BY d.department_id, d.department_name, e2.last_name,
 
          e2.salary,
 
          e2.job_id
 
      ORDER BY d.department_id, employees;
 
</source>
 
<hr />
 
 
[[Archivo:ej18.png]]
 
;a) Contrate menos de tres empleados:
 
<source lang=sql>
 
SELECT d.department_id, d.department_name, COUNT(*)
 
FROM
 
departments d JOIN employees e
 
ON
 
d.department_id = e.department_id
 
GROUP BY d.department_id, d.department_name
 
HAVING COUNT(*) < 3;
 
</source>
 
;b) Tenga el mayor número de empleados:
 
<source lang=sql>
 
SELECT d.department_id, d.department_name, COUNT(*)
 
FROM
 
departments d JOIN employees e
 
ON
 
d.department_id = e.department_id
 
GROUP BY d.department_id, d.department_name
 
HAVING COUNT(*) = (SELECT MAX(COUNT(*))
 
FROM
 
employees
 
GROUP BY department_id);
 
</source>
 
 
;c) Tenga el menor número de empleados:
 
<source lang=sql>
 
SELECT d.department_id, d.department_name, COUNT(*)
 
FROM
 
departments d JOIN employees e
 
ON
 
d.department_id = e.department_id
 
GROUP BY d.department_id, d.department_name
 
HAVING COUNT(*) = (SELECT MIN(COUNT(*))
 
FROM
 
employees
 
GROUP BY department_id);
 
</source>
 
 
<hr />
 
[[Archivo:ej19.png]]
 
<source lang=sql>
 
SELECT e.employee_id, e.last_name, e.department_id, e.salary,
 
AVG(s.salary)
 
FROM
 
employees e JOIN employees s
 
ON
 
e.department_id = s.department_id
 
GROUP BY e.employee_id, e.last_name, e.department_id,
 
e.salary;
 
</source>
 
<hr />
 
}}
 
 
====Ejercicios con subconsultas ====
 
<br />
 
{{MRM_Actividad|Title=Ejercicios de subconsultas
 
[[Archivo:ej16.png]]
 
<source lang=sql>
 
SELECT department_id, MIN(salary)
 
FROM  employees
 
GROUP BY department_id
 
HAVING AVG(salary) = (SELECT MAX(AVG(salary))
 
                      FROM  employees
 
                      GROUP BY department_id);
 
</source>
 
<hr />
 
[[Archivo:ej17.png]]
 
<source lang=sql>
 
SELECT *
 
FROM
 
departments
 
WHERE  department_id NOT IN(SELECT department_id
 
                            FROM employees
 
                            WHERE job_id = 'SA_REP'
 
                              AND department_id IS NOT NULL);
 
 
</source>
 
<hr />
 
[[Archivo:ej20.png]]
 
<source lang=sql>
 
SELECT last_name, TO_CHAR(hire_date, 'DAY') day
 
FROM  employees
 
WHERE TO_CHAR(hire_date, 'Day') = (SELECT TO_CHAR(hire_date, 'Day')
 
                                    FROM employees
 
                                    GROUP BY TO_CHAR(hire_date, 'Day')
 
                                    HAVING COUNT(*) = (SELECT MAX(COUNT(*))
 
                                                      FROM    employees
 
                                                      GROUP BY TO_CHAR(hire_date,'Day')));
 
 
</source>
 
<hr />
 
}}
 
 
===Concepto de join o reunión natural===
 
<br />
 
{{MRM_Definicion|Title=JOIN|
 
;El join consiste en unir filas de diferentes tablas
 
;Con la condición que esas filas tengan una relación directa
 
Por relación directa vamos a entender que son dos realidades
 
que en el mundo real están relacionadas
 
{{MRM_Ejemplo|
 
;Las facturas de cada empleados
 
Un empleado tiene realción directa con sus facturas
 
}}
 
;La relación directa  queda almacenada con la clave extranjera que propagamos.
 
;Se tratará de los clientes sus facturas
 
es decir para cada cliente, reunirlo con las facturas
 
cuyo valor en el campo id_cliente coincida con la clave de cliente
 
}}
 
[[Archivo:join_img1.png]]
 
Una forma de realizar esta reunión sería
 
<source lang=sql>
 
select campos
 
from tabla t1 otra_tabla t2
 
where t1.clave_ppal = t2.clave_foranea
 
</source>
 
*Por ejemplo:
 
<source lang=sql>
 
select *
 
from cliente c, factura f
 
where c.id = f.cliente_id
 
</source>
 
 
*Por ser una operación muy frecuente se ha implementado un operador explícito para ello
 
[[Archivo:join_img2.png]]
 
;La sintaxis posible que vamos a estudiar
 
[[Archivo:join_img3.png]]
 
;A continución vemos su significado para analizar cada una de ellas
 
[[Archivo:join_img4.png]]
 
;Creación de uniones naturales
 
[[Archivo:join_img5.png]]
 
*Miramos el ejemplo de '''''employees''''' y '''''departments'''''
 
*En ella vemos que la coincidencia de '''clave principal''' y '''foránea''' que las relaciona
 
'''''department_id'''''
 
*Podemos hacer el join natural
 
[[Archivo:join_img6.png]]
 
*Pero en este caso tenemos un pequeño problema
 
*Hay que tener cuidad con el operador '''''natural join''''' si hay más de una columna que coincida los nombres
 
;Veamos el siguiente ejemplo
 
 
<source lang=sql>
 
SELECT DEPARTMENT_NAME, LAST_NAME, EMPLOYEE_ID
 
FROM DEPARTMENTS d, EMPLOYEES e
 
where d.DEPARTMENT_ID=e.DEPARTMENT_ID
 
</source>
 
*Nos da la siguiente salida
 
[[Archivo:join_img7.png]]
 
*Pero si hacemos la unión natura
 
<source lang=sql>
 
SELECT DEPARTMENT_NAME, LAST_NAME, EMPLOYEE_ID
 
FROM DEPARTMENTS
 
NATURAL JOIN EMPLOYEES
 
 
</source>
 
o
 
<source lang=sql>
 
SELECT DEPARTMENT_NAME, LAST_NAME, EMPLOYEE_ID
 
FROM EMPLOYEES
 
NATURAL JOIN DEPARTMENTS
 
</source>
 
*Vemos la siguiente salida
 
[[Archivo:join_img8.png]]
 
*Por que el operador 'NATURAL JOIN' junta las filas de los campos que coincidan nombres
 
*Si observamos la imagen anterior estas dos tablas tiene las campos en común
 
'''''DEPARTMENTS_ID'''''
 
'''''MANAGER_ID'''''
 
*Para esto está el operador USING dentro del JOIN
 
<source lang=sql>
 
SELECT DEPARTMENT_NAME, LAST_NAME, EMPLOYEE_ID
 
FROM DEPARTMENTS JOIN EMPLOYEES
 
USING (DEPARTMENT_ID)
 
</source>
 
*Ahora vemos que el resultado es igual a los 19 registros
 
;Qué pasa con las filas que no tienen relación
 
*En el ejemplo anterior tenemos un empleado que no pertenece a ningún departamento
 
*También tenemos departamentos dónde no hay ningún empleado trabajando
 
{{MRM_Clave|
 
;Podría ser que también nos interesaran esas tuplas}}
 
[[Archivo:join_img10.png]]
 
;INNER vS OUTER
 
[[Archivo:join_img11.png]]
 
;Unión por la izquierda
 
[[Archivo:join_img12.png]]
 
;Unión por la derecha
 
[[Archivo:join_img13.png]]
 
;Y si queremos todas (Tanto de la izquierda como de la derecha)
 
[[Archivo:join_img14.png]]
 
 
 
 
 
 
;Juntar una tabla consigo misma
 
*En este caso debemos ver que el mismo atributo juega roles diferentes
 
En empleados un concepto es el id de empleado (su clave) y otro el id de la empleada que es gerente (clave extranjera)
 
[[Archivo:join_img15.png]]
 
 
====Funciones de conversión de tipos====
 
[[Archivo:func_conv1.png]]<br />
 
<hr />
 
[[Archivo:func_conv1.png]]<br />
 
<hr />
 
[[Archivo:func_conv2.png]]<br />
 
<hr />
 
[[Archivo:func_conv3.png]]<br />
 
<hr />
 
[[Archivo:func_conv4.png]]<br />
 
<hr />
 
[[Archivo:func_conv5.png]]<br />
 
<hr />
 
[[Archivo:func_conv6.png]]<br />
 
<hr />
 
[[Archivo:func_conv7.png]]<br />
 
<hr />
 
[[Archivo:func_conv8.png]]<br />
 
<hr />
 
[[Archivo:func_conv9.png]]<br />
 
<hr />
 
[[Archivo:func_conv10.png]]<br />
 
<hr />
 
 
====Funciones de agrupación o grupo====
 
*Son funciones que nos va a mostrar un valor por cada conjunto de filas a las que se aplica la función
 
[[Archivo:sql_group1.png]]<br />
 
<hr />
 
[[Archivo:sql_group2.png]]<br />
 
<hr />
 
[[Archivo:sql_group3.png]]<br />
 
<hr />
 
[[Archivo:sql_group4.png]]<br />
 
<hr />
 
[[Archivo:sql_group5.png]]<br />
 
<hr />
 
[[Archivo:sql_group6.png]]<br />
 
<hr />
 
[[Archivo:sql_group7.png]]<br />
 
<hr />
 
[[Archivo:sql_group8.png]]<br />
 
<hr />
 
[[Archivo:sql_group9.png]]<br />
 
<hr />
 
[[Archivo:sql_group10.png]]<br />
 
<hr />
 
[[Archivo:sql_group11.png]]<br />
 
<hr />
 
[[Archivo:sql_group12.png]]<br />
 
<hr />
 
[[Archivo:sql_group13.png]]<br />
 
<hr />
 
[[Archivo:sql_group14.png]]<br />
 
<hr />
 
[[Archivo:sql_group15.png]]<br />
 
<hr />
 
[[Archivo:sql_group16.png]]<br />
 
<hr />
 
[[Archivo:sql_group17.png]]<br />
 
<hr />
 
[[Archivo:sql_group18.png]]<br />
 
<hr />
 
====Actividades de funciones y agregados====
 
[[Archivo:ej_func_01.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_01.png]]
 
<source lang=sql>
 
 
</source>
 
<hr />
 
[[Archivo:ej_func_02.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_03.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_04.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_05.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_06.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_07.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_08.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_09.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_10.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_11.png]]
 
<source lang=sql>
 
</source>
 
 
<hr />
 
[[Archivo:ej_func_12.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_13.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_14.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_15.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_16.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_17.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_18.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_19.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_20.png]]
 
<source lang=sql>
 
</source>
 
<hr />
 
[[Archivo:ej_func_21.png]]
 
<source lang=sql>
 
 
</source>
 
[[Archivo:ej_func_22.png]]
 
<source lang=sql>
 
</source>
 
 
<hr />
 

Última revisión de 21:04 14 may 2018

SQL

SQL es un lenguaje de consultas estructuradas o Structured Query Language. Es un lenguaje de 4º generación donde el programador o usuario del lenguaje especifica lo qué quiere, pero no establece el procedimiento a seguir para conseguirlo, no dice cómo ha de hacer el sistema para conseguirlo


Icon casestudy.gif
Lenguaje no procedural Vs lenguaje procedural)
Con lenguaje no procedural (tipo SQL)
Dime todos los empleados de más de 45 años
o 
SELECT *
FROM empleados
WHERE edad>45;

Lenguaje procedural (tipo php o java)

Abre la tabla empelados
Lee desde el primer registro hasta el último (Bucle)
     Verifica si ese empleado tiene mas de 45 
     Si es así añádelo a la lista de resultado
Muestra la lista de resultado




Icon define.gif
SQL

Lenguaje para gestionar bases de datos relacionales cuyas instrucciones o sentencias especifican lo qué se quiere, no cómo se va a realizar


Lenguajes dentro de SQL

SQL no es, como su nombre indica, solamente un lenguaje de consultas, sino que proporciona todas las instrucciones necesarias para gestionar una base de datos.
SQL incorpora tres tipos de lenguajes: de Definición, de Control, de Manipulación.
Las instrucciones de SQL se conocen como sentencias, y todas se caracterizan por que empiezan por una palabra reservada que identifica a qué lenguaje de los tres que tiene SQL pertenece esa instrucción.


Icon key points.gif

Lenguajes SQL

DDL
Lenguaje de definición de datos.
Las sentencias de este lenguajes permite crear nuevos elementos en la base de datos como usuarios, tablas, índices, etc.
DCL
Lenguaje de control de datos
Las sentencias de este lenguaje permite gestionar permisos sobre los elementos y acciones sobre la consistencia de los datos
DML
Lenguaje de manipulación de datos
Sin duda son las instrucciones o sentencias mas utilizadas en un Gestor
Con ellas podemos manipular lo que se conoce como la extensión o contenido de la base de datos. Es decir actuar sobre las tuplas (insertar, modificar y borrar), y consultar


T111.png


Sentencias DDL



Icon define.gif
Sentencias DDL
CREATE
CREATE DATABASE usuarios;
CREATE TABLE usuario(
       password VARCHAR(200),
       nombre varchar2(40)
);
DROP
DROP TABLE usuario;
ALTER
ALTER TABLE usuarios ADD direccion VARCHAR(20);


Instrucción CREATE
Sintaxis de la instrucción

Ddl t1.png

  • Los nombres de las columnas son identificadores

Tipos de datos para las columnas

Ddl t2.png


Especificación de Restricciones

Ddl t3.png


Definición de Restricciones

Ddl t4.png


Definición de Restricciones

Ddl t5.png


Restricción unique

Ddl t6.png


Restrición Foreign Key

Ddl t7.png


Restricción Ckeck

Ddl t8.png


Creacción de tabla como resultado de una consulta

Ddl t9.png




Icon activity.jpg
Crear una base de datos

Crea la base de datos dado el siguiente enunciado

Clientes (DNI, nombre, dirección, edad (mayor de 18 años y menor de 65), sexo (H, M, N_A), por defecto N_A)
Facturas (Número , fecha (por defecto la fecha actual, importe total, cantidad_productos)





Icon activity.jpg
Realiza el sql de la siguiente estructura

Cliente factura sql.png

DROP TABLE cliente;
DROP TABLE facturas;
 
CREATE TABLE cliente(
dni varchar2(10) PRIMARY KEY,
nombre varchar2(10) DEFAULT 'mi nombre'
);
CREATE TABLE factura(
num NUMBER PRIMARY KEY,
fecha DATE DEFAULT sysdate,
cantidad NUMBER DEFAULT 10,
cliente varchar2(10),
CONSTRAINT cliente_factura FOREIGN KEY (cliente) REFERENCES cliente(dni) ON DELETE SET NULL
);
 
INSERT INTO  cliente (dni) VALUES ( 1);
INSERT INTO  cliente (dni) VALUES ( 2);
INSERT INTO  cliente (dni) VALUES ( 3);
INSERT INTO  cliente (dni) VALUES ( 4);
 
INSERT INTO  factura(num, cliente) VALUES ( 1, 1);
INSERT INTO  factura(num, cliente) VALUES ( 2, 1);
INSERT INTO  factura(num, cliente) VALUES ( 3, 1);
INSERT INTO  factura(num, cliente) VALUES ( 4, 2);
INSERT INTO  factura(num, cliente) VALUES ( 5, 3);
INSERT INTO  factura(num, cliente) VALUES ( 6, 3);
INSERT INTO  factura(num, cliente) VALUES ( 7, 4);
INSERT INTO  factura(num, cliente) VALUES ( 8, 4);





Alter table

La sentencia ALTER TABLE se utiliza para añadir, eliminar o modificar las columnas en una tabla existente.
  • SQL ALTER TABLE

Ddl alter t1.png

ALTER TABLE TABLE_NAME
ADD column_name datatype

Eliminar una columna de una tabla

ALTER TABLE TABLE_NAME
DROP COLUMN column_name
</sql>
 
Modificar co  cambiar el tipo de datos de una columna de una tabla
<SOURCE lang=sql>
ALTER TABLE TABLE_NAME
MODIFY column_name datatype

(Comment.gif: Ojo no violar restricciones con la modificación de la tabla)




Icon activity.jpg
Modifica la tabla anterior
  • Añade un atributo a cada tabla con un valor por defecto
  • Modifica el tipo de dato de dni a 15 caracteres.
  • Elimina los atributos añadidos





Icon activity.jpg
Alter table
  • Supongamos que tenemos el siguiente esquema
En un departamento hay empleados
cada empleado pertenece a un solo departamento
Cada departamento es dirigido por un empleado
Un empleado puede dirigir varios departamentos
  • En él vemos dos tablas con referencias cruzadas

Relaciones dobles.png

  • Excribe las sentencias sql que generen la estructura de base de datos
CREATE TABLE EMPLEADO (
dni varchar2(20),
direccion varchar2(15),
nombre varchar2(20) NOT NULL,
telefono NUMBER,
departamento NUMBER,
CONSTRAINT valor_telefono CHECK(telefono > 600000000),
CONSTRAINT clave_ppal_empleados PRIMARY KEY (dni),
CONSTRAINT nom_tel_unico_emp UNIQUE(nombre, telefono)
);
 
CREATE TABLE DEPARTAMENTO(
numero NUMBER,
nombre varchar2(15),
ubicacion varchar2(20) NOT NULL,
director varchar2(20),
CONSTRAINT numero  PRIMARY KEY (numero),
CONSTRAINT director FOREIGN KEY (director) REFERENCES EMPLEADO(dni)
);
 
ALTER TABLE EMPLEADO
ADD CONSTRAINT pertenece FOREIGN KEY (departamento) REFERENCES DEPARTAMENTO(numero);
Ahora si queremos eliminar las tablas, directamente no lo podremos hacer



Icon key points.gif

Importante a la hora de borrar


No se puede eliminar una tabla si está siendo referenciada por otra
  • Primero habría que eliminar esa referencia
  • En general se deben eliminar las tablas en orden inverso en el que se crearon


ALTER TABLE departamento
DROP CONSTRAINT director;
DROP TABLE empleado;
DROP TABLE departamento;



}}

Drop table

Ddl drop t1.png

  • Elimina una tabla de forma completa
  • Si solo quire elminiar su contenido usa la claúsula trunctate


Icon activity.jpg
Drop
  • Prueba a borrar una tabla




Sentencias DCL



Icon define.gif
Sentencias DCL
GRANT
para asignar privilegios
 GRANT ALL ON DATABASE.* TO 'manuel'@'localhost'
 #Asigna todos los privilegios sobre las tablas 
 #de la base de datos 'database' 
 # al usuario 'manuel'
REVOKE
Elimina privilegios asignados
COMMIT
Confirma una transacción de manera permanente en la base de datos
ROLLBACK
Desace todos los cambios en la base de datos desde la ultima transacción confirmada


Icon activity.jpg
Actividad
  • Prueba a hacer una inserción
  • Después sal y vuelve a entrar a ver si está la tupla
Esto es por que por defecto se hace un rollback a todo lo hecho
  • Haz lo mismo haciendo un commit
Ahora los cambios se mantienen





Sentencias DML



Icon define.gif
Sentencias DML
INSERT
Inserta tuplas en una tabla
Esta acción pude devolver algún tipo de valor booleano indicando se se ha insertado o no la tupla
INSERT INTO usuarios (nombre, password) 
VALUES("manuel", "password_no_segura");
DELETE
Borra tuplas (0 o más) de una o más tablas
DELETE FROM usuarios WHERE nombre="manuel";
UPDATE
Actuliza tuplas (0 o más) de una o más tablas
Las dos últimas sentencias (UPDATE Y DELETE) suelen devolver un entero.
Este valor indica el número de tuplas actualizadas o borradas (0 o n)
Un error se detalla con el valor (-1 o false).
UPDATE usuarios SET nombre="alicia" WHERE nombre="manolo";