GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 137 -
5 SENTENCIAS SQL
El lenguaje de consulta estructurado o SQL (por sus siglas en inglés Structured Query Language) es un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar diversos tipos de operaciones en ellas. Una de sus características es el manejo del álgebra y el cálculo relacional que permiten efectuar consultas con el fin de recuperar de forma sencilla información de interés de bases de datos, así como hacer cambios en ellas.
5.1 LAS CONSULTAS
Tipos de consultas.Las consultas son los objetos de una base de datos que permiten recuperar datos de una tabla, modificarlos e incluso almacenar el resultado en otra tabla.Existen varios tipos de consultas:Consultas de selección. Una consulta de selección genera una tabla lógica (se llama lógica porque no está físicamente en el disco duro sino en la memoria del ordenador y cada vez que se abre se vuelve a calcular).
Consultas de acción. Son consultas que realizan cambios a los registros. Existen varios tipos de consultas de acción, de eliminación, de actualización, de datos anexados y de creación de tablas.
Consultas específicas de SQL.Son consultas que no se pueden definir desde la cuadrícula QBE de Access sino que se tienen que definir directamente en SQL. Para practicar las consultas SQL se usara la base de datos alumnos
5.2 PASOS PARA EJECUTAR SENTENCIA SQL EN VISUAL BASIC
1. TABLA ALUMNOS
CodAlumno NombreAlumno FechaNacA1 JUAN 01/01/1970A2 PEDRO 01/01/1977A3 LUIS 01/01/1980A4 JORGE 01/01/1990A5 MARIO 01/01/1993
2. TABLA CURSOSCodCurso NombreCurso ProfesorAD AdmisionM1 Matrícula 1C1 Ergonomía LOPEZC2 Gestión de Recursos Humanos RIOSC3 Condiciones de Seguridad FLORESC4 Salud Ocupacional PEREZ
3. TABLA PAGOS
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 138 -
Nro CodAlumnoFechaPago Monto CodCurso
1 A1 01/04/2007 100 AD2 A2 01/12/2007 100 AD3 A1 01/02/2008 200 C14 A3 01/03/2008 100 AD5 A2 01/02/2009 200 C26 A1 02/04/2009 200 C27 A4 03/05/2009 200 AD8 A4 04/08/2009 200 C1
Para realizar consultas en Visual Basic 2012Agregue su base de datos del servidor con y Utilice la siguiente origen de datos
Utilice la siguiente conexión
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 139 -
Debe aparecer la siguiente conexión
Elija
Agrega las tablas que desea
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 140 -
Para ejecutar ponga
En base de datos atachada o adjuntada
Para usar las sentencias SQL use la opción Nueva consulta( New Query ) de la base de datos
Data Source=(LocalDB)\v11.0;AttachDbFilename=E:\SI2014B\DATOS\ALUMNOS.mdf;Integrated Security=True;Connect Timeout=30
CONSULTAS SQL
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 141 -
5.3 SELECT | SELECCIONAR[editar]
La sentencia SELECT nos permite consultar los datos almacenados en una tabla de la base de datos.Forma básica[editar]SELECT [ALL | DISTINCT ] <nombre_campo> [{,<nombre_campo>}]FROM <nombre_tabla>|<nombre_vista> [{,<nombre_tabla>|<nombre_vista>}][WHERE <condicion> [{ AND|OR <condicion>}]][GROUP BY <nombre_campo> [{,<nombre_campo >}]][HAVING <condicion>[{ AND|OR <condicion>}]][ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC] [{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]
SELECT Palabra clave que indica que la sentencia de SQL que queremos ejecutar es de selección.
ALL Indica que queremos seleccionar todos los valores.Es el valor por defecto y no suele especificarse casi nunca.
DISTINCT Indica que queremos seleccionar sólo los valores distintos.
FROMIndica la tabla (o tablas) desde la que queremos recuperar los datos. En el caso de que exista más de una tabla se denomina a la consulta "consulta combinada" o "join". En las consultas combinadas es necesario aplicar una condición de combinación a través de una cláusula WHERE.
WHERE Especifica una condición que debe cumplirse para que los datos sean devueltos por la consulta. Admite los operadores lógicos AND y OR.
GROUP BY
Especifica la agrupación que se da a los datos. Se usa siempre en combinación con funciones agregadas.
HAVING
Especifica una condición que debe cumplirse para que los datos sean devueltos por la consulta. Su funcionamiento es similar al de WHERE pero aplicado al conjunto de resultados devueltos por la consulta. Debe aplicarse siempre junto a GROUP BY y la condición debe estar referida a los campos contenidos en ella.
ORDER BY
Presenta el resultado ordenado por las columnas indicadas. El orden puede expresarse con ASC (orden ascendente) y DESC (orden descendente). El valor predeterminado es ASC.
5.4 SELECCIONAR CAMPOS
EJERCICIOS: Usando la aplicación pruebe las siguientes sentencias SQL
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 142 -
1) Listar los nombre de los alumnos con todos los campos
2) Listar todos los registros de la tabla CURSOSSELECT Cursos.* FROM Cursos;
3) Generar la lista de pagos SELECT * FROM Pagos
5.5 Definir campos calculados: Los campos calculados son campos obtenidos del resultado de una expresión o de una función.
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 143 -
Ejemplo Supongamos que se debe separar el 15% de los pagos para la Universidad entonces creamos un campo calculado que se llamará Descuento que seriaselect * from pagosSELECT Nro,CodAlumno, monto ,monto*0.10 as descuento,monto-monto*0.10 as neto,codcurso FROM PAGOSPara copiar con cabecera
5.6 En SQL también se puede trabajar sin tablas
SELECT (2+4)/3 muestra 2select 23 as pago (muestra el valor 23)
(Sin nombre de columna)
23
select 2+3 as resultado (muestra una operación)
select len('gato') as resultado ( muestra el resultado de una fórmula)Resultado
4
SELECT sin(3.1416/4) as senoAngulo
SELECT SQRT(2) AS raízRaíz
1,4142135623731
SELECT Power(2,5) AS potenciapotencia
32
Resultado5
SenoAngulo
0.70710808
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 144 -
NUMERO ALEATORIOS SELECT rand () AS aleatorioaleatorio0.360058
41
5.7 Encabezados de columna
Ejemplo cambiar el nombre de CAMPO CodAlumno con CODIGOALUMNO
SELECT CodALumno AS CODIGOALUMNO FROM ALUMNOS
5.8 Ordenar las filas
Ejemplo listar todos La tabla alumnos ordenados de acuerdo al nombre del alumno/* seleccionar registros de la tabla alumnos ordenados por nombre*/SELECT ALUMNOS.* FROM ALUMNOSORDER BY ALUMNOS.NombreAlumno ASC
El orden puede ser ascendente o descedente ASC o DESC)
1. Generar El código y el nombre del alumno de la tabla ALUMNOS ordenado por nombre del alumno en forma ascendente
SELECT ALUMNOS.* FROM ALUMNOS ORDER BY ALUMNOS.NombreAlumno ASC
2. Mostrar la tabla PAGOS ordenado de acuerdo al monto en forma Descendente ( que figuren todos los campos)
SELECT Pagos.* FROM Pagos ORDER BY Monto DESC;
3. Obtener un listado de código del alumno y monto pagado ordenado en forma descendente de acuerdo al pago ( que se muestre solo código del alumno y monto)
SELECT Pagos.codAlumno,Pagos.Monto FROM Pagos ORDER BY Monto DESC;
5.9 Incluir criterios de búsqueda (Seleccionar filas)
La opción Dónde permite poner un criterio de búsqueda que se aplicará a las filas del origen de la consulta antes de realizar los cálculos. Por ejemplo queremos saber cuántos alumnos son nacidos antes de año 1980, para ello tenemos que contar los registros de la tabla alumnos pero seleccionando previamente los nacidos antes del año 1980
SELECT Alumnos.* FROM Alumnos Where Year(FechaNac) <1980;
codalumno NombreAlumno FechaNAcA1 JUAN 01/01/1970
Para indicar varias condiciones se emplean los operadores Y y O.Las condiciones: Los operadores de comparación: > < = ..
2 Mostrar todos los pagos mayores a 100 y menores a 300
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 145 -
SELECT * FROM Pagos ;SELECT * FROM Pagos WHERE Monto>=100 AND MONTO <=300;
5.10 Búsqueda de valores conocidos(TEXTO)
Listar pagos del alumno que tiene código A1
SELECT PAGOS.* FROM PAGOS WHERE CodAlumno ='A1';
NroFechaPago
CodAlumno Monto
CodCurso
101/04/200
7 A1 100 AD
301/02/200
8 A1 200 C1
601/04/200
9 A1 300 C2
701/05/201
0 A1 200 AD
801/08/201
1 A1 120 C1O puede ser SELECT PAGOS.* FROM PAGOS WHERE CodAlumno LIKE 'A1';
Se puede hacer varias consultas
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 146 -
5.11 CONCIDENCIA DE PATRONES Caracteres Comodin
Coincidencia de patrones es una técnica que determina si una cadena de caracteres coincide con un patrón especificado. Puede crear un patrón mediante una combinación de caracteres regulares y caracteres comodín. Durante la coincidencia de patrones, deben coincidir exactamente con patrones regulares como especificado en la cadena de caracteres. LIKE y NOT LIKE (negación) son los operadores utilizados para la coincidencia de patrones. Recuerde que la coincidencia de patrones distingue mayúsculas de minúsculas. SQL Server admite los siguientes caracteres comodín para la coincidencia de patrón:
% (porcentaje marca): este comodín representa cero para muchos caracteres. Por ejemplo, título donde como '%VB 2008 %' encuentra todos los títulos de libros que contiene el texto "vb 2008", independientemente de dónde en el título que el texto se produce, en principio, medio o al final. • _ (subrayado): un único carácter de subrayado representa cualquier carácter individual. Por ejemplo, '_ean' encuentra todos los primeros nombres que constan de cuatro letras y que terminan con "ean" (Dean, Sean, etcétera). DONDE au_fname como 'a___n' encuentra todos los nombres que comienzan con "a" y terminar con la "n" y cualquier otros tres caracteres, tales como allan, Ammán, ario, y así sucesivamente.
[] (corchetes): estos especifican cualquier carácter individual dentro del intervalo especificado, como [a-f], o conjunto, como [abcdef] o incluso [adf]. Por ejemplo, WHERE au_lname LIKE '[C-K] arsen' considera autor apellidos terminando con "arsen" y comenzando con cualquier carácter individual entre "C" y "K", como por ejemplo Carsen, Darsen, Larsen, Karsen, y así sucesivamente.
• [^] (corchetes y símbolo de intercalación): estos especifican cualquier carácter individual dentro del rango especificado, como [^ a-f], o conjunto, como [^ abcdef]. Por ejemplo, dónde au_lname como ' de [^ l] %' recupera todo autor apellidos con "de", pero la siguiente letra no puede ser "l."
EJERCICIOS CON CARACTERES COMODIN DE LA BASE DE DATOS ALUMNOS
Ejemplo. Listar todos aquellos alumnos que contiene la letra RSELECT * FROM ALUMNOS;SELECT * FROM Alumnos WHERE NombreAlumno Like '%R%';
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 147 -
En Algunos sistemas seriaSELECT Alumnos.* FROM Alumnos WHERE Alumnos.NombreAlumno Like '*R*';
Usando el caracter % Listar los alumnos que contienen la letra Aselect * FROM Alumnos where NombreAlumno like '%A%';
codalumno NombreAlumno FechaNAcA1 JUAN 01/01/1970A5 MARIO 01/08/1993
Listar los alumnos que comienzan con la letra Jselect * FROM Alumnos where NombreAlumno like 'J%';
Listar los alumnos que terminan con la letra Oselect * FROM Alumnos where NombreAlumno like '%O';
Utilizando el carácter _ (subrayado): en la base de datos Alumnos
Listar los alumnos cuya primera letra sea J y la tercera sea R Use Alumnos select * FROM Alumnos where NombreAlumno like 'J_R%';
Usando los caracteres [^] (corchete y símbolo de intercalación).
Listar los alumnos cuyo nombre empieza de A-K select * FROM Alumnos where NombreAlumno like '[A-K]%';
Listar los alumnos que no comienzan con Jselect * FROM Alumnos where NombreAlumno like '[^J]%';
listar los alumonos cuya primera no esten en el intervalo A-Kselect * FROM Alumnos where NombreAlumno like '[^A-K]%';
listar los nombres de los alumnos cuya primera letra sea 'J' pero la segunda no puede ser 'O'select * FROM Alumnos where NombreAlumno like 'J[^O]%';
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 148 -
5.12 El operador Entre (Between)Tiene la siguiente sintaxis: Expresión Entre valor1 Y valor2
Ejemplo: listar todos los alumnos nacidos entre entre #01/01/60# y #04/06/70#,
SELECT ALUMNOS.*, ALUMNOS.FechaNac FROM ALUMNOSWHERE FechaNac Between '1/1/1960' And '6/4/1980'
codalumno
NombreAlumno
FechaNAc
FechaNac
A1 JUAN01/01/19
7001/01/19
70
A3 LUIS02/02/19
8002/02/19
80
Esta sentencia es lo mismoSELECT ALUMNOS.*, ALUMNOS.FechaNac FROM ALUMNOSWHERE FechaNac >= '1/1/1960' And FechaNac <= '6/4/1980'5.13 El operador In : (Inclusión) Tiene la siguiente sintaxis: Expresión In (valor1, valor2, ...)
Examina si el valor de la expresión es uno de los valores incluidos en la lista de valoresescritos entre paréntesis.
Por ejemplo, para seleccionar los alumnos que pagaron en Admisión y matricula seriaSELECT PAGOS.* FROM PAGOS WHERE CodCurso IN ('AD', 'M1');
NroFechaPago
CodAlumno Monto
CodCurso
101/04/200
7 A109/04/19
00 AD
201/12/200
7 A209/04/19
00 M1
401/03/200
8 A3 100 AD
701/05/201
0 A1 200 AD
No inclusión Listar aquellos registros que no contienen ni admisión ni matricula SELECT PAGOS.* FROM PAGOS WHERE CodCurso NOT IN ('AD', 'M1');
NroFechaPago
CodAlumno Monto
CodCurso
301/02/200
8 A118/07/19
00 C1
501/02/200
9 A218/07/19
00 C1
601/04/200
9 A1 300 C2
801/08/201
1 A1 120 C1
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 149 -
5.14 LAS CONSULTAS DE RESUMEN
Introducción
En SQL de Microsoft Jet 4.x y de la mayoría de los motores de bases de datos relacionales, podemos definir un tipo de consultas cuyas filas resultantes son un resumen de las filas de la tabla origen, por eso las denominamos consultas de resumen, también se conocen como consultas sumarias.
En el ejemplo que viene a continuación tienes un ejemplo de consulta normal en la que se visualizan las filas de la tabla oficinas ordenadas por region, en este caso cada fila del resultado se corresponde con una sola fila de la tabla oficinas, mientras que la segunda consulta es una consulta resumen, cada fila del resultado se corresponde con una o varias filas de la tabla oficinas.
Las consultas de resumen introducen dos nuevas cláusulas a la sentencia SELECT, la cláusula GROUP BY y la cláusula HAVING, son cláusulas que sólo se pueden utilizar en una consulta de resumen, se tienen que escribir entre la cláusula WHERE y la cláusula ORDER BY y tienen la siguiente sintaxis:
Funciones de columna
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 150 -
En la lista de selección de una consulta de resumen aparecen funciones de columna también denominadas funciones de dominio agregadas. Una función de columna se aplica a una columna y obtiene un valor que resume el contenido de la columna.Tenemos las siguientes funciones de columna:
La función SUM() calcula la suma de los valores indicados en el argumento. Los datos que se suman deben ser de tipo numérico (entero, decimal, coma flotante o monetario...).
La función AVG() calcula el promedio (la media arimética) de los valores indicados en el argumento, también se aplica a datos numéricos, StDev() y StDevP() calculan la desviación estándar de una población o de una muestra de la población representada por los valores contenidos en la columna indicada en el argumento. Si la consulta base (el origen) tiene menos de dos registros, el resultado es nulo.
Las funciones MIN() y MAX() determinan los valores menores y mayores respectivamente. Los valores de la columna pueden ser de tipo numérico, texto o fecha. La función COUNT(nb columna) cuenta el número de valores que hay en la columna, los datos de la columna pueden ser de cualquier tipo, y la función siempre devuelve un número entero. COUNT(*) permite contar filas en vez de valores. Si la columna no contiene ningún valor nulo,
SELECT Count(NombreALumno) AS Cantidad FROM Alumnos ;Cantidad
5
SELECT Count(*) AS Cantidad FROM Alumnos
Ejercicio . Elaborar una consulta donde nos muestre la suma, el promedio , el mayor y el menor y la desviación típica de los totales de la tabla PAGOS
Avg(Monto) As Promedio , Max(Monto) As Maximo, Min(Monto) as Minimo , STDEV (MONTO) AS desviacion, STDEVp (MONTO) AS desviacion FROM PAGOS;
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 151 -
Cuenta SumaPromedio Maximo Minimo
desviacion desviacion
8 1600 200 300 100 92.5820186.602540
4
5.15 Agrupar registros
La opción GROUP BY permite definir columnas de agrupación. Una consulta de resumen sin columnas de agrupación obtiene una única fila resultado y los cálculos se realizan sobre todos los registros del origen.
Por ejemplo queremos saber cuántos alumnos tenemos en cada Curso. Tenemos que indicar que queremos contar los registros de la tabla Pagos pero antes agrupándolos por el campo CodCurso. De esta manera la función cuenta() la calculará sobre cada grupo de registros (los Códigos de curso similares). La consulta quedaría así:
SELECT Pagos.CodCurso, Count(Pagos.CodCurso) AS CuentaDeCodCursoFROM Pagos GROUP BY Pagos.CodCurso;
CodCurso
CuentaDeCodCurso
AD 3C1 3C2 1M1 1
Ejercicio . Elaborar una consulta donde nos muestre la suma, el promedio , el mayor y el menor y la desviación típica de los totales de la tabla PAGOS agrupado por codigo( se puede agrupar por fechas, años, meses)
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 152 -
HAVING se comporta como WHERE, pero se aplica a grupos (las filas o tuplas en el conjunto de resultados representan grupos). La cláusula WHERE se aplica a filas o tuplas individuales, NO a grupos.
HAVING .- tiene un efecto similar similar a WHERE , pero solo trabaja de acuerdo a los resultados obtenidos por GROUP BY . Con la siguiente Instrucción
SELECT Codalumno, SUM (monto) As Totales FROM pagos GROUP BY codalumno
SELECT Codalumno, SUM (monto) As Totales FROM pagos GROUP BY codalumno HAVING SUM(monto)<=400
Con la clausula having solo se muestra los subtotales menores a 400
LAS CONSULTAS MULTITABLA
Una consulta multitabla es una consulta que obtiene datos de varias tablas por lo que deberá contener en la zona de tablas de la ventana Diseño las distintas tablas de donde obtiene esos datos.Para relacionar tablas use dataset para ello
Paso 1. Genere su conjunto de datos( antes debe agregar orígenes de datos)
Paso 2. Elija Dataset y arrastre al formulario
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 153 -
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 154 -
Combinar tablas
Cuando dos tablas están combinadas en una consulta, para cada fila de una de las tablas Access busca directamente en la otra tabla las filas que tienen el mismo valor en el campo de unión, con lo cual se emparejan sólo las filas que luego aparecen en el resultado y la consulta es más eficiente.
Ejemplo de composición interna
INNER JOIN CON LA BASE DE DATOS ALUMNOS
Obtener un listado completo de a tabla PAGOS incluyendo el código del alumno el nombre y el monto
SQL SIN INNER JOIN
SELECT A.Nro,A.CodAlumno,b.nombrealumno,a.monto FROM Pagos A, Alumnos B WHERE A.codAlumno = B.codAlumno ORDER BY A.Nro;
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 155 -
Combinar tres tablasSELECT A.Nro,A.CodAlumno,b.nombrealumno,a.monto ,a.CodCurso ,c.NombreCurso FROM Pagos A, Alumnos B ,Cursos C WHERE A.codAlumno = B.codAlumno And A.CodCurso =c.CodCurso ORDER BY A.Nro;
SQL CON INNER JOIN
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 156 -
SELECT A.NRO,A.CodAlumno,B.NombreAlumno, A.Monto from Pagos A INNER JOIN ALumnos B ON A.codAlumno = B.codAlumno ORDER BY A.Nro
Combinar 3 tablas con INNER JOINselect C.*,D.NombreCurso FROM (SELECT A.NRO,A.CodAlumno,B.NombreAlumno, A.Monto ,a.CodCurso from Pagos A INNER JOIN ALumnos B ON A.codAlumno = B.codAlumno ) C INNER JOIN CURSOS D on c.codcurso =D.CodCurso
Combinaciones internas.
Una combinación interna es la combinación más utilizada. Devuelve sólo las filas que cumplen la especificación de combinación. Aunque en teoría cualquier operador relacional (como > o <) puede utilizarse en la especificación de combinación, casi siempre se utiliza el operador de igualdad (=). Usando el operador de igualdad se denomina combinaciones naturales.
Combinaciones externas.
Combinaciones externas devolución todas las filas de una de las tablas combinadas (mínimo) aunque filas en una tabla no coinciden con las filas de la otra. Existen tres tipos de combinaciones externas: combinación externa, combinación externa derecha y combinación externa completa.
5.16.2LA COMPOSICION EXTERNA
La composición externa se utiliza cuando queremos que también aparezcan las filas que no tienen una fila coincidente en la otra tabla.
Ejemplo de combinación externa Encontrar los pagos Totales por alumno incluyendo los alumnos que no pagaron
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 157 -
SELECT A.CodAlumno, A.nombrealumno, B.total FROM Alumnos A LEFT JOIN (SELECT codalumno , sum(monto) as Total from Pagos group by codalumno ) B ON A.codAlumno = B.codAlumno
5.17 UNION.
La mayoría de las consultas requieren información de más de una tabla. Una Unión es una operación relacional que produce una tabla por recuperar los datos de dos tablas (no necesariamente distintas) y que coinciden con sus filas según una especificación de combinación(UNION).
Existen diferentes tipos de combinaciones, que miran individualmente, pero tenga en cuenta que cada combinación es una operación binaria, es decir, una tabla se une a otro, que puede ser la misma tabla, ya que las tablas se pueden unir a sí mismos. La operación de combinación es un tema algo complejo y Rico. Las secciones siguientes tratan la.
EL OPERADOR UNION
Unir dos tablas sin repeticiones ( mostrar tablas pagos y nombres sin repeticiones)SELECT CodAlumno from Alumnos UNIONSELECT CodAlumno from Pagos
Unir dos tablas con repeticiones ( tabla nombres y pagos)SELECT CodAlumno from Alumnos UNION ALLSELECT CodAlumno from Pagos;
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 158 -
5.18 LAS CONSULTAS DE REFERENCIAS CRUZADAS
Se define una consulta de referencias cruzadas cuando queremos representar una consulta resumen con dos columnas de agrupación como una tabla de doble entrada en la que cada una de las columnas de agrupación es una entrada de la tabla.
Por ejemplo queremos obtener las pagos realizados por alumno en cada cursoCon la consulta se obtieneSELECT CodAlumno,Monto,CodCurso From Pagos
CodAlumno Monto
CodCurso
A1 100 C1A2 200 C2A1 100 C2A2 200 C3A3 100 C4A1 300 C2A2 400 C3A4 100 C4
La consulta quedaría mucho más elegante y clara presentando los datos en un formato más compacto como el siguiente:
CODALUMNO AD M1 C1 C2 C3 C4 totalA1 0 0 100 400 0 0 500A2 0 0 0 200 600 0 800A3 0 0 0 0 0 100 100A4 0 0 0 0 0 100 100
SELECT CODALUMNO ,sum (case when codcurso='AD' then monto else 0 end ) as AD,sum (case when codcurso='M1' then monto else 0 end ) as M1,sum (case when codcurso='C1' then monto else 0 end ) as C1,sum (case when codcurso='C2' then monto else 0 end ) as C2,sum (case when codcurso='C3' then monto else 0 end ) as C3,sum (case when codcurso='C4' then monto else 0 end ) as C4,sum(monto) as totalfrom pagos group by CODALUMNO
SELECT CODcurso ,COUNT (case when codalumno='A1' then monto else 0 end ) as A1,COUNT (case when codalumno='A2' then monto else 0 end ) as A2,COUNT (case when codalumno='A3' then monto else 0 end ) as A3,COUNT (case when codalumno='A4' then monto else 0 end ) as A4,COUNT (case when codalumno='A5' then monto else 0 end ) as A5,COUNT(*) as totalfrom pagos group by CODCURSO
5.18.2Operador de pivote:
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 159 -
Un escenario común donde dinámica puede ser útil es cuando desea generar informes de tablas cruzadas para resumir datos. El operador PIVOT puede rotar filas a columnas.
EJERCICIO DE OPERADOR PIVOT CON LA TABLA ALUMNOS
Calcular la cantidad de alumnos matriculados en cada curso: La sentencia SQL es
select codAlumno, AD,M1,C1,C2,C3,C4from ( select Codalumno , CodCurso From Pagos)piv Pivot(count(CodCurso) for CodCurso in (AD,M1,C1,C2,C3,C4)) as CantCurso
Al revezselect codcurso, A1,A2,A3,A4from ( select Codcurso , Codalumno From Pagos) A Pivot ( count(Codalumno) for Codalumno in (A1,A2,A3,A4,A5)) as Cantaumno
codcurso A1 A2 A3 A4
AD 2 0 0 0C1 1 0 1 0C2 0 0 1 0C3 0 1 0 0M1 0 1 1 0
Para sumarselect codAlumno, AD,M1,C1,C2,C3,C4from ( select Codalumno , MONTO,CodCurso From Pagos)piv Pivot( SUM(MONTO) for CodCurso in (AD,M1,C1,C2,C3,C4)) as TOTAL
Elaborar una cuadricula de pagos por años y meses
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 160 -
Aunque el estándar SQL define un tipo SELECT YEAR(FechaPago) AS AÑO ,sum (case when month(FechaPago)=1 then monto else 0 end ) as ene,sum (case when month(FechaPago)=2 then monto else 0 end ) as feb,sum (case when month(FechaPago)=3 then monto else 0 end )as mar,sum (case when month(FechaPago)=4 then monto else 0 end )as abr,sum (case when month(FechaPago)=5 then monto else 0 end )as may,sum (case when month(FechaPago)=6 then monto else 0 end )as jun,sum (case when month(FechaPago)=7 then monto else 0 end )as jul,sum (case when month(FechaPago)=8 then monto else 0 end )as ago,sum (case when month(FechaPago)=9 then monto else 0 end )as seti,sum (case when month(FechaPago)=10 then monto else 0 end ) as oct,sum (case when month(FechaPago)=11 then monto else 0 end )as nov,sum (case when month(FechaPago)=12 then monto else 0 end )as dic,sum(monto) as totalfrom pagos group by year(fechapago)
5.19 FUNCIONES DE FECHA Y HORA
de datos DATETIME y sus componentes, año, mes, día, hora, minuto y segundo,
Select current_timestamp 'standard datetime',getdate()'Transact-SQL datetime',year(getdate())'year function',datepart(year, getdate())'datepart Año',datepart(month, getdate())'datepart Mesr',datepart(day, getdate())'datepart Dia',datepart(DAYOFYEAR , getdate())'datepart Dia del año',datepart(hour, getdate()) 'hora',datepart(minute, getdate()) 'Minuto',datepart(second, getdate()) 'Segundo',datepart(WEEKDAY , getdate()) 'datepart dia semana',datepart(MILLISECOND , getdate()) 'datepart milisegundos',datepart(MICROSECOND , getdate()) 'datepart microsegundo'
standard datetime
Transact-SQL datetime
year function
datepart Año
datepart Mesr
datepart Dia
datepart Dia del año
hora
Minuto
Segundo
datepart dia semana
datepart milisegundos
datepart microsegundo
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 161 -
35:27.7 35:27.7
2015
2015 6 28 179
10
35 27 1 667 667000
EJERCICIOS DE FECHAS Y HORAS
1. Obtener la fecha actual select getdate() 2015-06-28 10:39:05.557
2. Obtener año, mes y dia de la Select getdate() as fecha fecha actual
select 'año=',year(getdate());select 'mes=',month(getdate());select 'dia=',day(getdate());
3. Obtener hora, minuto y segundo de la fecha actual
select datepart(hour, getdate()) as horaselect datepart(minute, getdate()) as minutoselect datepart(second, getdate()) as segundo
4. Obtener el año, mes y dia de una fecha
select getdate() as fechahora,year(getdate()) as año,month(getdate()) as mes,day(getdate()) as dia
5. Dia de semana en SQLserver 2008SELECT DATENAME(dw, getdate()) Viernes
6. Obtener el año , mes y dia de una fecha de pago del alumno ‘A1’SELECT codalumno, fechapago, year(getdate()) as año ,month(getdate()) as mes ,day(getdate()) as dia from pagos where codalumno= 'A1'
7. encontrar el año de una fechaSELECT DATENAME(dw, '8/15/2015') AS FECHA
8. encontar dia de la semana de una fecha
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 162 -
SELECT DATENAME(dw, '08/15/2015')
FECHASaturday
5.20 El predicado TOP y la clave PERCENTSELECT DATENAME (dw,'02/02/2015') as dia
TOP Devuelve cierto número de registros que se encuentran entre la parte superior e inferior de un intervalo especificado por una cláusula ORDER BY.(los primeros n registros), si hubiera dos registros con el mismo nombre , devolverá ambos ,al utilizar el predicado TOP si la cláusula ORDER BY es omitido muestra un conjunto arbitrario de registros.
SELECT ALL TOP 4 * From pagos ORDER BY fechapago ASC
Selecciona los primeros 4 registros
SELECT TOP 50 PERCENT * From PAGOS WHERE MONTO > 0Muestra el 50 % de los registros que cumplen la condición especificado en WHERE ( si hay 5 registros listara 3)
5.21. CONSULTAS SELECT ANIDADAS
SubConsultas
Una subconsulta es una instrucción SELECT anidada dentro de una instrucción
SELECT, SELECT...INTO, INSERT...INTO, DELETE, o UPDATE o dentro de otra subconsulta.
Las consultas anidadas SELECT se conoce como subconsultas son consultas contenidas en otra
Encontrar el nombre del alumno que hizo mayor pago
Forma A
SELECT D.CODALUMNO,E.NOMBREALUMNO,D.TOTAL FROM (SELECT C.* FROM (select codalumno, SUM(MONTO) as tOTAL FROM PAGOS GROUP BY CODALUMNO)cWHERE C.TOTAL= (SELECT MAX(B.T1) FROM(select codalumno, SUM(MONTO) as t1 FROM PAGOS GROUP BY CODALUMNO) B))D ,ALUMNOS E WHERE D.CODALUMNO=E.CODALUMNO
Forma B
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 163 -
SELECT * FROM ALUMNOS WHERE CODALUMNO LIKE (SELECT CODALUMNO FROM PAGOS WHERE MONTO= (Select MAX(MONTO) FROM PAGOS ) )
codalumno
NombreAlumno
FechaNAc
A1 JUAN 01/01/1970
Pruebe la siguiente consultaSELECT X.NRO, X.CODALUMNO, X.NOMBREALUMNO, X.MONTO, X.CODCURSO,Y.PROFESORFROM (SELECT NRO , A.CODALUMNO, B.NOMBREALUMNO,MONTO ,CODCURSO FROM PAGOS A ,ALUMNOS B WHERE A.CODALUMNO =B.CODALUMNO) X, CURSOS YWHERE X.CODCURSO= Y.CODCURSO
Ejercicio resuelto en clase1. cual es el mayor pago de la tabla pagos
SELECT * FROM PAGOS;SELECT MAX(MONTO) AS MAYOR FROM PAGOS;
NroFechaPago
Codalumno Monto
CodCurso
101/02/200
1 A1 100 C1
201/02/200
1 A2 200 C2
301/02/200
1 A1 100 C2
401/02/201
0 A2 200 C35 01/02/200 A3 100 C4
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 164 -
1
601/02/201
5 A1 300 C2
720/02/201
5 A2 400 C3
801/02/201
5 A4 100 C4
MAYOR400
b) a que codigo del alumno le corresponde ese mayor pago
SELECT CODALUMNO FROM PAGOS WHERE MONTO= (SELECT MAX(MONTO) AS MAYOR FROM PAGOS)
CODALUMNOA2
C) EL NOMBRE DEL alumno que hizo el mayor pago
SELECT * FROM ALUMNOS Select nombrealumno from alumnos where codalumno =(SELECT CODALUMNO FROM PAGOS WHERE MONTO= (SELECT MAX(MONTO) AS MAYOR FROM PAGOS))
nombrealumnoPEDRO
5.22 Función ROW_NUMBER()
SQL Server 2005 ha introducido la función ROW_NUMBER() para clasificación: devuelve un número secuencial, único para cada fila del conjunto de resultado devuelto.
Ejemplo con la base de datos alumnos
SELECT ROW_NUMBER() OVER(ORDER BY NOMBREALUMNO Asc) AS FilaNro, CODALUMNO, NOMBREALUMNO FROM ALUMNOS
FilaNro CODALUMNO
NOMBREALUMNO
1 A4 JORGE2 A6 JOSE3 A1 JUAN4 A3 LUIS5 A5 MARIO6 A2 PEDRO
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 165 -
Poner numero de orden a la tabla PAGOS ordenado de acuerdo a la fecha de pago
select ROW_NUMBER() over (order by fechapago) as NroFecha,* from pagos
NroFecha Nro FechaPago CodAlumn
o MontoCodCurso
1 1 01/04/2007 A1 100 AD2 2 01/12/2007 A2 100 M13 3 01/02/2008 A1 200 C14 4 01/03/2008 A3 100 AD5 5 01/02/2009 A2 200 C16 6 01/04/2009 A1 300 C27 7 01/05/2010 A1 200 AD8 8 01/08/2011 A1 120 C1
5.23 LAS CONSULTAS DE ACCIÓN
Las consultas de acción son consultas que permiten realizar cambios en los datos almacenados en una tabla. Con estas consultas podemos crear una nueva tabla a partir de los registros de otra, modificar los datos almacenados, insertar nuevos registros o eliminar registros.
5.24 Consultas de creación de tabla.( consultas que se almacenan en una tabla)
Las consultas de creación de tabla son consultas que almacenan en una nueva tabla el resultado de una consulta de selección.
Sentencia SQL : SELECT ALUMNOS.* INTO ALUMNOS1 FROM ALUMNOS;Crea la tabla Alumnos a partir de la tabla Alumnos
Ejemplo 2. SELECT codalumno, sum(monto) as total into resumen FROM pagos group by codalumno;
Crear tablas con SQLCREATE TABLE ALUMNOS2(CodAlumno char(10),NombreAlumno char(50),FechaNac date, primary key (CodAlumno))
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 166 -
CREATE TABLE PAGOS2(Nro int,CodAlumno char(10),FechaPago date,Monto Money,CodCurso char(10), primary key (Nro))
5.25 Consulta de datos anexados.
Datos anexados en base a una consulta
Las consultas de datos anexados son consultas que añaden filas enteras a una tabla.Los nuevos registros se agregan siempre al final de la tabla.
Formar una nueva tabla llamada ALUMNOS1 con los nombres de los alumnos de la tabla ALUMNOS ( ADICIONAR DATOS)
INSERT INTO Alumnos1 ( CodAlumno, NombreAlumno )SELECT CodALumno, NOMBREALUMNO FROM ALUMNOS;
Nota: debe existir la tabla Alumnos1
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 167 -
Datos anexados con valores
Si puede anexar datos que no se obtiene de ninguna tabla
INSERT INTO ALumnos ( codAlumno, NombreAlumno, FechaNac ) values ('A6','JOSE','01/01/2009');
5.26 Consultas de actualización.
Las consultas de actualización son consultas que permiten modificar los datos almacenados en una tabla, modifican el contenido de los registros de una tabla. Se pueden modificar de golpe todos los registros de la tabla o sólo los que cumplan una determinado condición.
EjerciciosCrea la tabla pagos1 incluyendo su campo clave a partir de la tabla pagos
SELECT * INTO PAGOS1 FROM PAGOS
ALTER TABLE PAGOS1 ADD CONSTRAINT [PK_PAGOS]PRIMARY KEY CLUSTERED ([Nro]);
1. incrementar el campo monto de la tabla pagos1 en un 10%
UPDATE Pagos1 SET Monto = Monto*1.1 WHERE codalumno='A1';
Ejemplo Actualizar el campo pagos1 de la nueva tabla al 300 a todos los registrosUPDATE Pagos1 SET Monto =300
5.27 Consulta de eliminación
Las consultas de eliminación son consultas que eliminan de una tabla los registros que cumplen el criterio de búsqueda especificado.
1. Eliminar todos los registros de aquellos alumnos que tienen código A1DELETE FROM Alumnos WHERE CodAlumno='A1'
2. Eliminara todas los registros de la tabla Alumnos1
DELETE FROM Alumnos1;
5.28 OPERACIONES DE MODIFICACIONES DE TABLAS
ELIMINAR TODA LA TABLA
Elimina la tabla ALUMNOS2 DROP TABLE ALUMNOS2
Agregar un nuevo campo a la tabla ALUMNOS1
ALTER TABLE ALUMNOS1 ADD Procedencia char(20)
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 168 -
Eliminar el campo Procedencia en la tabla ALUMNOS2;ALTER TABLE ALUMNOS2 Drop Procedencia;
EJERCICIOS DE MODIFICACION DE TABLAS (CAMPOS)
Al crear La tabla Alumnos se ingreso de la siguiente manera
En SQL seria :
CREATE TABLE TABLE1(Id int,Nombre char(10),FechaNac nchar(10), primary key (Id))
Y se ingreso los siguientes datos
Que en sentencia SQL seriaDELETE FROM TABLE1INSERT INTO TABLE1 (Id,Nombre,FechaNac) values (1,'JOSE','1/2/2001');INSERT INTO TABLE1 (Id,Nombre,FechaNac) values (2,'PEDRO','fecha2');INSERT INTO TABLE1(Id,Nombre,FechaNac) values (3,'LUCAS','fecha3');
Que se obtiene
La tabla debería llamarse alumnos entonces se cambia el nombre de la tabla
EXEC sp_rename TABLE1, ALUMNOS;
Primero se debe quitar la clave principal
ALTER TABLE ALUMNOS drop CONSTRAINT [PK_Alumnos]
Nota ver con que nombre le puso la clave
ALTER TABLE ALUMNOS drop CONSTRAINT [PK__TABLE1__3214EC07C968DB7D]
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 169 -
luego se modifica al nuevo tipo de campo Id
ALTER TABLE alumnos ALTER COLUMN Id varchar (5) ;
Cambiamos el nombre de la columna Id a codalumnoEXEC sp_rename 'Alumnos.Codigo', 'CodAlumno'
Cambiamos el campo nombre con nombre alumnoEXEC sp_rename 'Alumnos.Nombre', 'NombreAlumno'
Cambiar el tipo de datos de NombreAlumno que es char(10) a VarChar(50)
ALTER TABLE alumnos ALTER COLUMN NombreALumno varchar (50) ;Cambiar el tipo de datos dell campo FechaNac a Date
ALTER TABLE alumnos ALTER COLUMN FechaNac Date ;
Previamente de debe borrar los datos de la columna FechaNac A NULLO primero borrar el campo fecha y agregarlo con los datos correctos
ALTER TABLE Alumnos DROP COLUMN FechaNacALTER TABLE Alumnos ADD FechaNac Date;
ALTER TABLE ALUMNOS ALTER COLUMN CodAlumno varchar (5) not NULL ;
Volver a colocar la clave principalALTER TABLE Alumnos ADD CONSTRAINT [PK_alumnos] PRIMARY KEY CLUSTERED ([Codalumno]);
Previamente la creacion de la table deberia haber sidoCREATE TABLE [dbo].[ALUMNOS] ( [CodAlumno] VARCHAR (5) NOT NULL, [NombreAlumno] VARCHAR (50) NULL, [FechaNac] DATE NULL);
ALTER TABLE Alumnos ADD CONSTRAINT [PK_alumnos] PRIMARY KEY CLUSTERED ([Codalumno]);
Vea http://www.1keydata.com/es/sql/sql-create-table.php
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 170 -
Crear la clave principalALTER TABLE ALUMNOS ADD CONSTRAINT [PK_Alumnos]PRIMARY KEY CLUSTERED ([Id]);
Remover el campo claveALTER TABLE ALUMNOS drop CONSTRAINT [PK_Alumnos]
Se puede copiar los datos a Excel recuperarloCuando la base de daos es creados en SQL Server se puede los nombres d elos campos como en Visual Basic 2010
5.29 EJERCICIOS Usando la tabla PAGOS
1 listar la tabla pagos SELECT Pagos.* FROM Pagos;
NroFechaPag
oCodAlumn
o MontoCodCurs
o
101/04/200
7 A1 100 AD
201/12/200
7 A2 100 M1
301/02/200
8 A1 200 C1
401/03/200
8 A3 100 AD
501/02/200
9 A2 200 C1
601/04/200
9 A1 300 C2
701/05/201
0 A1 200 AD
801/08/201
1 A1 120 C1
2) Mostrar los pagos totales por alumno
SELECT codalumno,SUM(monto) As total FROM Pagos GROUP BY codalumno;
codalumno Total
A1 920A2 300A3 100
3) Listar los alumnos que pagaron mayores o iguales 400
SELECT codalumno ,sum(monto) AS suma from Pagos GROUP BY codalumno HAVING SUM(monto)>=400
codalumn suma
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 171 -
oA1 920
4 Obtener el numero de pagos que sean menores y iguales a 100
SELECT COUNT(monto) AS NroPagos from Pagos WHERE monto<=100NroPago
s3
5) Obtener los códigos de los alumnos de la tabla pagos sin repeticiones
SELECT DISTINCT codalumno FROM Pagos;
6) Obtener el código del alumno que hizo mayor pago y en que curso
SELECT CodAlumno,Monto,CodCurso FROM Pagos WHERE Monto =(SELECT MAX(Monto) from Pagos);
CodAlumno Monto
CodCurso
A1 300 C2
Si hay varios mayores lista todos los registros
7) Elaborar un listado de aquellos alumnos que no pagaronSELECT codalumno ,nombrealumno FROM Alumnos WHERE codalumno NOT IN (SELECT CodAlumno FROM Pagos)
codalumno
nombrealumno
A4 JORGEA5 MARIO
8) Elaborar los pagos totales agrupado por año
SELECT YEAR (fechapago) AS APago , SUM(monto) as pagototal from Pagos GROUP BY YEAR (fechapago)Nota . en algunos sistemas no reconoce caracteres especiales como AÑO
APagopagotota
l2007 2002008 3002009 5002010 2002011 120
9) Calcular la cantidad de pagos totales por mes
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 172 -
SELECT MONTH (fechapago) as mes,count(monto) as cantidad from Pagos GROUP BY MONTH(fechapago)
mes cantidad2 23 14 25 18 112 1
10) Encontrar los subtotales por cursoSELECT CodCurso as Curso , SUM(Monto) as TOTAL FROM Pagos GROUP BY CodCurso
Curso TOTALAD 400C1 520C2 300M1 100
11) Listar los alumnos que pagaron entre 100 y 200
SELECT codalumno ,monto from pagos WHERE MONTO BETWEEN 100 and 200
12) La tabla pagos tiene la siguiente estructura mostrar todos los campos y la diferencia de esos campos
nombre P1 P2A 200 100B 300 100C 100 20
SELECT nombre, p1,p2,p1-p2 as dif from Pagos
nombre p1 p2 Dif
A200
100
100
B300
100
200
C100 20 80
Caso 2 .Se tiene la siguientes tablas (ingresos y egresos) de una base de datos se desea obtener los saldos
INGRESOSNOMBRE INGRESOSA 200B 300
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 173 -
C 50
EGRESOSNOMBRE EgresosA 100B 200
SELECT B.NOMBRE , B.EGRESOS FROM Egresos BSELECT A.NOMBRE , A.INGRESOS FROM Ingresos ASELECT a.NOMBRE ,A.INGRESOS ,B.EGRESOS,A.INGRESOS-B.EGRESOS AS SALDO FROM Ingresos ALEFT JOIN Egresos BON A.NOMBRE = B.NOMBRE
NOMBRE
INGRESOS
EGRESOS
SALDO
A 200 100 100B 300 200 100C 50
EJERCICIOS DE CONSULTAS DE REFERENCIAS CRUZADAS(Acces)
1 Elaborar la cuadricula de pagos por alumno y curso (no incluye totales)
TRANSFORM SUM(Pagos.Monto) SELECT Pagos.CodAlumno FROM Pagos GROUP BY Pagos.CodAlumno PIVOT Pagos.CodCurso
PAGOS_Tabla ALUMNOS Y CURSOSCodAlumno AD C1 C2A1 100,00 € 200,00 € 200,00 €A2 100,00 € 200,00 €A3 100,00 €A4 200,00 € 200,00 €
2 elaborar cuadricula de pagos por alumnos y años
TRANSFORM SUM(Monto) SELECT CodAlumno FROM Pagos GROUP BY CodAlumno PIVOT Year(FechaPago)
PAGOS ConsultaCodAlumno 2007 2008 2009A1 500,00 €A2 100,00 € 200,00 €A3 100,00 €A4 400,00 €A5 200,00 €
1. Elaborar cuadricula de pagos por alumnos y meses
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 174 -
TRANSFORM SUM(Monto) SELECT CodAlumno FROM Pagos GROUP BY CodAlumno PIVOT MONTH(FechaPago)
PAGOS ConsultaCodAlumno 1 2 4 5 8 12A1 500,00 €A2 200,00 € 100,00 €A3 100,00 €A4 200,00 € 200,00 €A5 200,00 €
3 Elaborar cuadriculas años y meses
TRANSFORM SUM(Monto) SELECT year(FechaPago) as AÑO FROM Pagos GROUP BY Year(Fechapago) PIVOT MONTH(FechaPago)
PAGOS ConsultaAÑO 1 2 4 5 8 122007 500,00 € 100,00 €2008 100,00 € 200,00 €2009 200,00 € 200,00 € 200,00 €
ELIMINAR LA BASE DE DATO
DROP DATABASE SalesSnapshot0600 ;
ESCRIBIR LAS SENTENCIAS SQL PARA:
PRACTICAS CON los ejercicios de SQL enviado se revisara y se calificara como evaluación . mostrar las pruebas
Ejemplo
Probar los Ejercicios de SQL de Borja Sotomayor se le envía un modelo ( realizar los ejercicios de 2 al 9 como el caso de la tienda de Informatica que se deja como Modelo
1. La Tienda de Informatica2. Empleados3. Los Almacenes4. Peliculas y Salas5. Los Directores6. Piezas y Proveedores7. Los Cientificos
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 175 -
8. Los Grandes Almacenes 9. Los Investigadores
BASE DE DATOS TIENDA DE INFORMATICA
Creando las tablas
CREATE TABLE ARTICULOS (Codigo int,Nombre nvarchar(100),Precio int,Fabricante int,primary key (Codigo))CREATE TABLE FABRICANTES (Codigo int,Nombre nvarchar(100),primary key (Codigo))
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 176 -
Agregar los siguientes valores
FABRICANTESCodigo Nombre
1 Intel2 Quantum3 Fabricante 1
ARTICULOSCodigo Nombre Precio Fabricante
1Microprocesador 200 1
2 Disco Duro 100 23 Laptop Core I5 600 14 Mouse 1 3
Con la sentencia
INSERT INTO FABRICANTES(Codigo, Nombre) values(1,'Intel');INSERT INTO FABRICANTES(Codigo, Nombre) values(2,'Quantum');INSERT INTO FABRICANTES(Codigo, Nombre) values(3,'Fabricante 1');
Se obtiene
Con la sentencia
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 177 -
INSERT INTO ARTICULOS(Codigo, Nombre,Precio, Fabricante) values(1,'Microprocesador', 200,1);INSERT INTO ARTICULOS(Codigo, Nombre,Precio, Fabricante) values(2,'Disco Duro', 100,2);INSERT INTO ARTICULOS(Codigo, Nombre,Precio, Fabricante) values(3,'Laptop Core I5 ', 600,1);INSERT INTO ARTICULOS(Codigo, Nombre,Precio, Fabricante) values(4,'Mouse', 1,3);
Se obtiene
1.1 Obtener los nombres de los productos de la tienda
SELECT nombre FROM ARTICULOS
1.2 Obtener los productos y los precios de los productos de la tienda
SELECT Nombre, Precio FROM ARTICULOS
1.3 Obtener el nombre de los productos cuyo precio sea menor igual a 200
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 178 -
SELECT nombre FROM ARTICULOS WHERE Precio <=200
1.4 Obtener todos los datos de los artículos cuyo precio este entre los 60 € y los 120 € (ambas cantidades incluidas)
/* Con AND */SELECT * FROM ARTICULOS WHERE Precio >=80 AND Precio <=120
/* Con BETWEEN */SELECT Codigo, Nombre, Precio, FabricanteFROM ArticulosWHERE (Precio BETWEEN 60 AND 120)
1.4 Obtener el nombre y el precio en pesetas (es decir, el precio en euros multiplicado por 166’386)
/*Sin As */SELECT Nombre, Precio * 166.386 FROM ARTICULOS
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 179 -
/*Con As */SELECT Nombre, Precio * 166.386 As PrecioPtas FROM ARTICULOS
1.6 Seleccionar el precio medio de todos los productos.
SELECT AVG (Precio) AS PROMEDIO FROM ARTICULOS
1.7 Obtener el precio medio de los articulos cuyo codigo de fabricante sea 2.
SELECT AVG (Precio) as Precio_medio FROM ARTICULOS WHERE Fabricante = 2
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 180 -
1.8 Obtener el número de artículos cuyo precio sea mayor o igual a 180 €.
SELECT COUNT (*) as num_articulos FROM ARTICULOS WHERE Precio >= 180
1.9 Obtener el nombre y precio de los artículos cuyo precio sea mayor o igual a 180 Euros y ordenarlos desdendentemente por precio y luego ascendentemente por nombre
SELECT Nombre, PrecioFROM ArticulosWHERE (Precio >= 180)ORDER BY Precio DESC, Nombre
1.10 Obtener un listado completo de artículos, incluyendo por cada artículo los datos del artículo y de su fabricante.
/* SIN INNER JOIN */SELECT * FROM ARTICULOS, FABRICANTES
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 181 -
WHERE ARTICULOS. Fabricante = FABRICANTES. Codigo
/* Con INNER JOIN */SELECT * FROM ARTICULOS INNER JOIN FABRICANTES ONARTICULOS.FABRICANTE= FABRICANTES.CODIGO
1.11 Obtener un listado de artículos, incluyendo el nombre del artículo, su precio y el nombre de su fabricante.
/* SIN INNER JOIN */SELECT ARTICULOS.Nombre, Precio, FABRICANTES. NombreFROM ARTICULOS, FABRICANTESWHERE ARTICULOS. Fabricante = FABRICANTES. Codigo
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 182 -
/*con INNER JOIN */SELECT ARTICULOS.Nombre , Precio, FABRICANTES.NombreFROM ARTICULOS INNER JOIN FABRICANTESON ARTICULOS.Fabricante = FABRICANTES.Codigo
1.12 Obtener el precio medio de los productos de cada fabricante, mostrando solo los códigos de fabricante.
SELECT AVG(Precio) AS Expr1, FabricanteFROM ArticulosGROUP BY Fabricante
1.13 Obtener el precio medio de los productos de cada fabricante, mostrando el nombre del fabricante./* Sin INNER JOIN*/SELECT AVG(Precio), FABRICANTES.NombreFROM ARTICULOS, FABRICANTESWHERE ARTICULOS.Fabricante=FABRICANTES.CodigoGROUP BY FABRICANTES.Nombre
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 183 -
/* CON INNER JOIN*/
SELECT AVG(Articulos.Precio) AS Expr1, Fabricantes.NombreFROM Articulos INNER JOIN Fabricantes ON Articulos.Fabricante = Fabricantes.CodigoGROUP BY Fabricantes.Nombre
1.14 Obtener los nombres de los fabricantes que ofrezcan productos cuyo precio medio sea mayor o igual a 150 €.
/* SIN inner JOIN*/SELECT AVG(Precio) AS Precio_medio, Fabricantes.NombreFROM Articulos,FABRICANTESWHERE ARTICULOS.Fabricante = Fabricantes.CodigoGROUP BY Fabricantes.NombreHAVING (AVG(Articulos.Precio) >= 150)
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 184 -
/* CON INNER JOIN*/SELECT AVG(Articulos.Precio) AS Precio_medio, Fabricantes.NombreFROM Articulos INNER JOIN Fabricantes ON Articulos.Fabricante = Fabricantes.CodigoGROUP BY Fabricantes.NombreHAVING (AVG(Articulos.Precio) >= 150)
1.15 Obtener el nombre y precio del articulo más barato
SELECT Nombre, Precio FROM ARTICULOSWHERE Precio = (SELECT MIN (Precio) FROM ARTICULOS)
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 185 -
1.16 Obtener una lista con el nombre y precio de los artículos más caros de cada proveedor (incluyendo el nombre del proveedor)
/* SIN INNER JOIN */SELECT A.Nombre, A.Precio, F.Nombre FROM Articulos A ,FABRICANTES F WHERE A.Fabricante=F.CodigoAND A.Precio = (SELECT MAX(A.Precio) FROM Articulos A WHERE A.Fabricante = F.Codigo)
/* CON INNER JOIN */SELECT A.Nombre, A.Precio, A.Nombre AS Expr1FROM Articulos AS A INNER JOIN Fabricantes AS F ON A.Fabricante = F.CodigoWHERE (A.Precio = (SELECT MAX(Precio) AS Expr1 FROM Articulos AS A WHERE (Fabricante = F.Codigo)))
17 Añadir un Nuevo producto: Altavoces de 70€ ( del fabricante 2)
INSERT INTO Articulos (Codigo, Nombre, Precio, Fabricante)
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 186 -
VALUES (6, 'Altavoces', 70, 2)
1.18 Cambiar el nombre del producto 8 a impresora laser
UPDATE ARTICULOSSET Nombre = ' Impresora Laser 'WHERE Codigo =8
1.19Aplicar un descuento del 10% (multiplicar el precio por 0’9) a todos los productosUpdate ARTICULOSSet precio= Precio *0.9
1.20Aplicar un descuento de 10 € a todos los productos cuyo precio sea mayor o igual a 120€Update ARTICULOS SET precio = Precio -10 WHERE Precio >=120
PRACTICAR Los Ejercicios de SQL del documento adjunto(Ejercicios SQL) 381En este caso practicamos el ejercicio 9
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 187 -
CREAMOS LAS SIGUIENTES TABLAS
1 TABLA INVESTIGADORES
DNI NomApelsFacultad
1111JUAN PEREZ 1
2222JOSE PEREZ 2
3333JAVIER RIOS 3
4444LUIS MONTES 1
5555CARLOS RIOS 2
2 TABLA FACULTAD
CODIGO NOMBRE1 PRODUCCION Y SERVICIOS2 MEDICINA3 EDUCACION4 CIENCIAS FORMALES
3 TABLA RESERVA
DNINumSerie
Comienzo Fin
1111 101/06/2009
12/06/2010
2222 201/06/2009
12/06/2010
3333 301/06/2009
12/06/2010
4444 401/06/2009
12/06/2010
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 188 -
5555 501/06/2009
12/06/2010
1111 601/06/2009
12/06/2010
1. TABLA EQUIPOSNumSerie Nombre Facultad1 UNIDAD PLC 12 MICROSCOPIO 23 PROYECTOR MULTIMEDIA 34 EQUIPO LABORATORIO 45 GPS 16 LAPTOP TOSHIBA 28 SENSORES DE LUZ 1
5.1Obtener el DNI y Nombre de aquellos Investigadores que han realizado más de una reserva
/* juntando tablas */SELECT I.DNI, NomApels FROM [INVESTIGADORES$] I LEFT JOIN [RESERVA$] RON R.DNI = I.DNI GROUP BY I.DNI, NomApels HAVING COUNT (R.DNI) >1DNI NomApels1111 JUAN PEREZ2222 JOSE PEREZ
/* con subconsulta */SELECT DNI, NomApels FROM [INVESTIGADORES$] WHERE DNI IN( SELECT DNI FROM [RESERVA$] GROUP BY DNI HAVING COUNT (*) >1)
9.2 Obtener un listado completo de reservas , incluyendo los siguientes datos DNI y nombre del investigador, junto con el nombre de su facultad
DNI NomApels F_INV.NombreNumSerie E.Nombre F_EQUIP.Nombre Comienzo Fin
2222JOSE PEREZ MEDICINA 5 GPS
PRODUCCION Y SERVICIOS 01/06/2009 12/06/2010
1111JUAN PEREZ
PRODUCCION Y SERVICIOS 1 UNIDAD PLC
PRODUCCION Y SERVICIOS 01/06/2009 12/06/2010
2222JOSE PEREZ MEDICINA 2 MICROSCOPIO MEDICINA 01/06/2009 12/06/2010
1111JUAN PEREZ
PRODUCCION Y SERVICIOS 6
LAPTOP TOSHIBA MEDICINA 01/06/2009 12/06/2010
3333JAVIER RIOS EDUCACION 3
PROYECTOR MULTIMEDIA EDUCACION 01/06/2009 12/06/2010
4444LUIS MONTES
PRODUCCION Y SERVICIOS 4
EQUIPO LABORATORIO
CIENCIAS FORMALES 01/06/2009 12/06/2010
Numero de serie y nombre de equipo reservado , junto con el nombre de la facultad a la que pertenece
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 189 -
Fecha de comienzo y fin de la reserva
SELECT I.DNI , NomApels , F_INV.Nombre, E.NumSerie, E.Nombre, F_EQUIP.Nombre, Comienzo, FinFROM [RESERVA$] R, [INVESTIGADORES$] I, [EQUIPOS$] E, [FACULTAD$] F_INV , [FACULTAD$] F_EQUIP WHERE R.DNI=I.DNIAND R.NumSerie = E.NumSerieAND I.Facultad=F_INV.CodigoAND E.Facultad = F_EQUIP.Codigo
9.3 Obtener el DNI y el nombre de los investigadores que han reservado equipos que no son de su Facultad
DNI NomApels1111 JUAN PEREZ2222 JOSE PEREZ4444 LUIS MONTES
/* juntando tablas +/SELECT DISTINCT I.DNI, NomApelsFROM [RESERVA$] R , [INVESTIGADORES$] I, [EQUIPOS$] EWHERE R.DNI=I.DNIAND R.NumSerie= E.NumSerieAND I.Facultad <> E.Facultad
/*con EXISTS */SELECT DNI, NomApels FROM [INVESTIGADORES$] IWHERE EXISTS( SELECT *FROM [RESERVA$] R INNER JOIN [EQUIPOS$] EON R.NumSerie = E.NumserieWHERE R.DNI=I.DNIAND I.Facultad <> E.Facultad)
9.4 Obtener los nombres de las facultades en las que ningun investigador ha realizado una reserva
NombreEn este caso todos ha realizado alguna reserva
SELECT Nombre FROM [FACULTAD$]WHERE Codigo IN( SELECT Facultad FROM [INVESTIGADORES$] I LEFT JOIN [RESERVA$] RON I.DNI =R.DNIGROUP BY FacultadHAVING COUNT (R.DNI)=0)
9.5 Obtener los nombres de las facultades con investigadores “ociosos” ( investigadores que no han realizado ninguna reserva).
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 190 -
NombreNo hay facultades con investigadores ociososSELECT Nombre FROM [FACULTAD$]WHERE Codigo IN ( SELECT Facultad FROM [INVESTIGADORES$] WHERE DNI NOT IN ( SELECT DNI FROM [RESERVA$] ) )
9.6 Obtener el numero de serie y nombre de los equipos que nunca han sido reservados
NumSerie Nombre8 SENSORES DE LUZ
/* juntando tablas +/SELECT E.NumSerie, NombreFROM [EQUIPOS$] E LEFT JOIN [RESERVA$] RON R.NumSerie = E.NumSerieGROUP BY E.NumSerie, NombreHAVING COUNT (R.NumSerie)=0/* con subconsulta IN */
SELECT NumSerie, NombreFROM [EQUIPOS$]WHERE NumSerie NOT IN( SELECT NumSerie FROM [RESERVA$])/* con subconsulta Exists */SELECT NumSerie, NombreFROM [EQUIPOS$] EWHERE NOT EXISTS( SELECT * FROM [RESERVA$] RWHERE R.NumSerie=E.NumSerie)
Tarea. Pruebe las consultas con la base de datos De Ventas
5. SENTENCIAS SQL
5.1 LAS CONSULTAS 3445.2 Pasos para ejecutar sentencia SQL en Visual Basic 20125 3 SELECT | SELECCIONAR[editar] 3395.4 SELECCIONAR CAMPOS 3455.5 Definir campos calculados 3455.6 En SQL también se puede trabajar sin tablas 3465.7Encabezados de columna 3465,8 Ordenar las filas 3465.9 Incluir criterios de búsqueda (Seleccionar filas) 347
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 191 -
5.10 Búsqueda de valores conocidos (TEXTO)5.11 CONCIDENCIA DE PATRONES carácter Comodin 3485.12 El operador Entre between 3505.13 El operador In : (Inclusión) 350 y No inclusión 355.14 LAS CONSULTAS DE RESUMEN 351
Funciones de columna 352Funciones de columnaLa función SUM() . AVG() ,StDev() y StDevP() , MIN() y MAX() La función COUNT(nb) yCOUNT(*) 5.15 Agrupar registros 353 GROUP BY HAVING .- 3545.16 LAS CONSULTAS MULTITABLA 3545.16.1 Combinaciones internas. Inner Join 3545.16.2Combinaciones externas. Left join5.17. 3EL OPERADOR UNION 3615.18 L5.182 AS CONSULTAS DE REFERENCIAS CRUZADAS 360
Operador de pivote: 3615.19 FUNCIONES DE FECHA Y HORA 3635.20 El predicado TOP y la clave PERCENT 3645.21 CONSULTAS SELECT ANIDADAS 364 SubConsultas5.22 Función ROW_NUMBER() 3655.23 LAS CONSULTAS DE ACCIÓN 3665.24 Consultas de creación de tabla.( consultas que se almacenan en una tabla) 366
Crear tablas con SQL 3665.25 Consulta de datos anexados. Datos anexados en base a una consulta 367Datos anexados con valores5.26 Consultas de actualización. 3685.27 Consulta de eliminación 3695.28 ELIMINAR TODA LA TABLA 3695.29 Agregar un nuevo campo a la tabla ALUMNOS1 370Ejercicios 369EJERCICIOS DE CONSULTAS DE REFERENCIAS CRUZADAS(Acces)3725.30 EJERCICIOS DE MODIFICACION DE TABLAS (CAMPOS) 373
CREATE TABLE FACULTAD( Codigo int,Nombre nvarchar(100),primary key (Codigo))
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 192 -
CREATE TABLE INVESTIGADORES( DNI varchar(8),NomApels nvarchar(255),Facultad intprimary key (DNI))
SENTENCIA SQL AVANZADAS
Listar el esquema de una base de datos
SELECT * FROM INFORMATION_SCHEMA.TABLESWHERE TABLE_TYPE = 'BASE TABLE'
TABLE_CATALOGTABLE_SCHEMA
TABLE_NAME
TABLE_TYPE
E:\DATOS\ALUMNOS.MDF dbo ALUMNOS
BASE TABLE
E:\DATOS\ALUMNOS.MDF dbo PAGOS
BASE TABLE
E:\DATOS\ALUMNOS.MDF dbo CURSOS
BASE TABLE
E:\DATOS\ALUMNOS.MDF dbo
ALUMNOS1
BASE TABLE
E:\DATOS\ALUMNOS.MDF dbo
SUBTOTALES
BASE TABLE
E:\DATOS\ALUMNOS.MDF dbo
ALUMNOS2
BASE TABLE
E:\DATOS\ALUMNOS.MDF dbo TB2015B
BASE TABLE
La consulta muestra todos las caracteristicas de los objetos de la base de datosselect * from sysobjects
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 193 -
use [E:\DATOS\ALUMNOS.MDF]select name from sysobjects
--La consulta muestra todos los objetos de la base de datos Alumnosselect name from sysobjects ‘osea 82 objetos
--La consulta muestra todas las tablas de la base de datosselect name from sysobjects where type='U'
--La consulta muestra todas las propiedades de tablas de la base de datos*/ select * from sysobjects where type='U'
muestra el esquema de las tablasSELECT * FROM INFORMATION_SCHEMA.TABLESWHERE TABLE_TYPE = 'BASE TABLE'
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 194 -
*--La consulta muestra todas las tablas de la base de datos*/ select name from sysobjects where type='U'
Código:/*--La consulta muestra todas las vistas de la base de datos*/ select name from sysobjects where type='V'
Código:/*--La consulta muestra todos los procedimientos de la base de datos*/ select name from sysobjects where type='P'
Código:/*--La consulta muestra todos los triggers de la base de datos*/ select name from sysobjects where type='T'
Código:/*--La consulta muestra todas las llaves foraneas de la base de datos*/ select name from sysobjects where type='F'
Código:/*--La consulta muestra todas las llaves primarias de la base de datos*/ select name from sysobjects where type='K'
Código:/*--La consulta muestra todos los objetos del sistema de la base de datos*/ select name from sysobjects where type='S'
Código:/*--La consulta muestra todos los objetos de la base de datos: Tablas, procedimientos almacenados, etc.*/ SELECT CAST(table_name as varchar) FROM INFORMATION_SCHEMA.TABLES
Código:/*la consulta muestra todas las bases de datos, pero no muestra las de sistema: master,model, msdb y temdb*/ SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('master','model','msdb','tempdb')
Listar la todas las tablas de una base de datos
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 195 -
SELECT * FROM sys.Tables
Pruebe
PRUEBA CON LA BASE DE DATOS ADVENTURE WORK
Listar lo nombres de los objetos de la base de datos Adventure Worksuse [E:\DATOS1\ADVENTUREWORKSLT.MDF] select name from sysobjects
select name from sysobjects182 objetos
LISTAR LAS propiedades de las tablas
SELECT * FROM sys.Tables
LISTARA LAS PRPIEDADES DE LA TABLA PRODUCTOSSELECT * FROM sys.Tables WHERE NAME='Product'
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 196 -
MOSTRAR INFORMACION de esqeuma de las columnas SELECT * FROM INFORMATION_SCHEMA.COLUMNS
MOSTRAR INFORMACION de esqeuma de las columnas DE UNA SOLA TABLA
SELECT * FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME ='Product'
VER el contenido de la table productos
select * from [SalesLT].[Product] order by namepor la definición de la tabla
HAGA LO MISMO CON La tabla NORWIND
1. Listar las tablas
USE [E:\DATOS1\NORTHWIND.MDF]SELECT * FROM SYS.TABLES
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 197 -
Listar el contenido de la tabla productos
SELECT * FROM Products
Utilizando la base de datos Northwind . Genere una lista de selección de la tabla Employees (Empleado) donde solo se genere una columna de salida y esta contenga loscampos: EmployeeID, LastName y FirstName
Select convert(nvarchar(2), EmployeeID) + ' ' + LastName + ' ' + FirstName as Nombrefrom from Employees
Utilizando la tabla Employees liste las columnas EmployeeID, LastName, FirstName, además envié dos mensajes en conjunto con cada fila utilizando para cadauno una de las opciones de literales.
Select EmployeeID, LastName as Apellido, FirstName as Nombre, 'ESTOS SON EMPLEADOS' as Literal, [Otra Forma] = 'Esta es otra forma' from Employees
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 198 -
Encontrar todos los apellidos (LastName) en la tabla Employees que comiencen con la letra <<S>>. Use el carácter comodín %.
SELECT LastName FROM Employees WHERE LastName LIKE 'S%'
Para recuperar el apellido de los Empleados cuya primera letra comienza entre <<A>> y<<M>>. Utilice el comodín [ ]
SELECT LastName FROM Employees WHERE LastName LIKE '[A-M ]%'
Juegue con la base de datos NORWIND elaborando consultas creadas por usted mismo
Vea la base de datos Neptuno hecho en Access
Vea estas relaciones
GUIA DE PRACTICAS DE TBD2015B\SQL \ Ismael Véliz Vilca - 199 -
TRABAJO FINAL DE BASE DE DATOS (vea el video)
Top Related