Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas

jueves, 4 de diciembre de 2014

Saca partido a tus bases de datos MYSQL

Las bases de datos están presentes en gran cantidad de aplicaciones, tanto web, como de sobremesa. SQL es el lenguaje más difundido para acceder y manipular información de bases de datos.

Desde el apartado de Presentaciones de este blog, accede a una nueva, para ver, a través de más de noventa páginas, un repaso con ejemplos de las principales sentencias de este lenguaje, utilizando como base MYSQL.

La mayoría de los apartados que podrás ver, se pueden aplicar también a otros motores de bases de datos, como Microsoft SQL o incluso Microsoft Access.

martes, 27 de diciembre de 2011

Usar remplazar en SQL para borrar parte de un texto


Más de una vez me ha pasado, que he necesitado eliminar parte del contenido de un campo de texto, por ejemplo, porque se ha creado ese texto con información incorrecta mediante programación. Este error se ha detectado al cabo de un tiempo afectando a un volumen alto de registros, que impide la corrección manual de los mismos.

La forma más sencilla, es crear una consulta de actualización con REPLACE. Este comando necesita los siguientes valores
  • La cadena de texto o el campo de texto donde buscar el contenido a remplazar
  • El texto a buscar
  • El texto que lo sustituye
  • La posición de inicio a partir de donde queremos que lo busque
  • Número de veces que queremos que lo sustituya
  • Tipo de comparación de las dos cadenas

Si quiero utilizar este comando para borrar parte de un texto, el parámetro “texto que sustituye” le indicaremos ‘’ (2 comillas simples) de tal manera que si encuentra el texto a buscar lo sustituirá por estas comillas o lo que es lo mismo por nada

Pongamos un ejemplo
Tenemos una tabla pedidos donde tenemos un campo comentarios que contiene el texto “almacén clientes” y que queremos quitar, ya que a la hora de imprimir el pedido, no queremos que aparezca.

Una forma de eliminar el texto es con replace, actualizando el campo comentarios de todas los registros de pedidos

Update pedidos
Set pedidos.comentario=REPLACE(pedidos.comentario,”Almacén Clientes”,’’)

Información sobre las funciones de texto en transact SQL en MSDN

miércoles, 29 de junio de 2011

SQL injection a la cabeza del top 25 de Errores de Software

Se acaba de publicar -27 de Junio de 2011- en la web de SANS Institute y de CWE el estudio “2011 CWE/SANS Top 25 Most Dangerous Software Errors” (2011 CWE/SANS Los 25 Errores de Software más Peligrosos).

Me llama la atención que el más detectado haya sido el SQL Injection, ya que es un tema que cuando hablas de seguridad en la programación de aplicaciones, siempre se hace referencia.

En el estudio presentan el punto CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection') (Impropia Neutralización de Elementos Especiales usados en un SQL Command ) con una descripción del problema, ejemplos de cómo se produce el ataque y técnicas de programación para evitar los casos más obvios.

SQL Injection consiste en introducir código SQL en casillas de texto de aplicaciones web con intención de ejecutar sentencias contra la base de datos que no están permitidas por el diseño de la aplicación.
Un artículo interesante sobre este problema lo podemos encontrar en la Wikipedia, Inyección SQL

miércoles, 1 de septiembre de 2010

Evitar redondeo automático en SQL

Últimamente he tenido un problema con el redondeo utilizando el operador división (/) en una consulta de SQL, para el origen de datos de un informe en un proyecto Microsoft Access Project (.adp)

El problema es que al dividir dos enteros me trunca de forma automática el resultado. La explicación al problema esta en http://technet.microsoft.com/en-us/library/ms175009.aspx. Básicamente es que cuando el divisor y el dividendo son enteros el resultado lo convierte a entero.

La solución es sencilla, convertir uno de los dos operando a float o a real con CAST para que el operador “/” no convierta el resultado a entero. La conversión  hay que hacerla de uno de los operandos y no del resultado, ya que la división ya lo devuelve truncado y aunque lo conviertas no va a haber cambios

Información sobre CAST en http://technet.microsoft.com/en-us/library/aa226054(SQL.80).aspx

Por ejemplo. Si tenemos una tabla tbventas con una columna impVenta  y otra nArtículos de tipo entero si queremos que nos devuelva los decimales tendría que ser así:
Select CAST(impVenta as float)/cArticulos as valorMedio
from tbventas

jueves, 15 de abril de 2010

DateDiff y CASE para agrupar por rangos de edad a partir de la fecha de nacimiento en SQL

Es muy normal almacenar en las bases de datos la fecha de nacimiento en vez de la edad y calcular a partir de ese valor la edad en cada ocasión que sea necesario.

Este cálculo lo podemos hacer muy fácil con DateDiff . Esta función necesita el tipo de comparación de fechas (años, meses…) la fecha inicial y la fecha final, devolviendo el valor que separa las dos fechas en base al tipo de comparación

DATEDIFF(year, tbPersona.FNAC, { fn NOW() })
Esto lo podemos complicar un poco más si lo que necesitamos no es la edad exacta sino que tenemos que englobar esa edad dentro de un rango (menores de 18, entre 18 y 40,…) Para esto podemos utilizar CASE, indicando según la edad el rango al que pertenece.

CASE
     When edad <19 THEN ‘menor edad’
     WHEN edad <41 THEN ‘Entre 18 y 40
     ELSE ‘Mayor 40’
END
Si unimos los dos puntos anteriores podemos crear una consulta que nos agrupe por franjas de edad a partir de la fecha de nacimiento

SELECT COUNT(Persona.ID) AS Personas
CASE
    WHEN DATEDIFF(year, Persona.FNAC, { fn NOW() }) < 25 THEN '16-24'
    WHEN DATEDIFF(year, Persona.FNAC, { fn NOW() }) < 45 THEN '25-44'
    ELSE '45-65'
END AS Edad
FROM Persona
GROUP BY CASE WHEN DATEDIFF(year, Persona.FNAC, { fn NOW() }) < 25 THEN '16-24' WHEN DATEDIFF(year, Persona.FNAC, { fn NOW() }) < 45 THEN '25-44' ELSE '45-65' END

 

lunes, 28 de septiembre de 2009