Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=ede246d0-7f38-4a98-8200-e033b759900a

TUTORIAL SQL #2: Consultas simples con SELECT

SQL-LenguajeEn la entrega anterior de esta serie veíamos qué es el lenguaje SQL y sus diferentes subconjuntos de instrucciones. Aprendimos también lo más básico sobre cómo se organiza la información en un sistema de datos relacional, y montaste un pequeño entorno de pruebas con SQLite para poder lanzar consultas. ¡Ya podemos empezar a entrar en materia!. Hoy vamos a aprender los fundamentos de consultas simples de datos con SELECT.

Operaciones básicas de manipulación de datos en SQL

Como hemos visto, las instrucciones DML (Data Manipulation Language – Lenguaje de Manipulación de Datos) trabajan sobre los datos almacenados en nuestro SGBD, permitiendo consultarlos o modificarlos.

En general a las operaciones básicas de manipulación de datos que podemos realizar con SQL se les denomina operaciones CRUD (de Create, Read, Update and Delete, o sea, Crear, Leer, Actualizar y Borrar, sería CLAB en español, pero no se usa). Lo verás utilizado de esta manera en muchos sitios, así que apréndete ese acrónimo.

Hay cuatro instrucciones para realizar estas tareas:

  • INSERT: Inserta filas en una tabla. Se corresponde con la “C” de CRUD.
  • SELECT: muestra información sobre los datos almacenados en la base de datos. Dicha información puede pertenecer a una o varias tablas. Es la “R”.
  • UPDATE: Actualiza información de una tabla. Es, obviamente, la “U”.
  • DELETE: Borra filas de una tabla. Se corresponde con la “D”.

Consulta de datos

Ahora nos vamos a centrar en la “R” de CRUD, es decir, en cómo recuperar la información que nos interesa de dentro de una base de datos, usando para ello el lenguaje de consulta o SQL.  Ya nos preocuparemos luego de cómo llegamos a introducir los datos primeramente.

Para realizar consultas sobre las tablas de las bases de datos disponemos de la instrucción SELECT. Con ella podemos consultar una o varias tablas. Es sin duda el comando más versátil del lenguaje SQL.

Existen muchas cláusulas asociadas a la sentencia SELECT (GROUP BY, ORDER, HAVING, UNION). También es una de las instrucciones en la que con más frecuencia los motores de bases de datos incorporan cláusulas adicionales al estándar, que es el que veremos aquí.

Vamos a empezar viendo las consultas simples, basadas en una sola tabla. Veremos cómo obtener filas y columnas de una tabla en el orden en que nos haga falta.

El resultado de una consulta SELECT nos devuelve una tabla lógica. Es decir, los resultados son una relación de datos, que tiene filas/registros, con una serie de campos/columnas. Igual que cualquier tabla de la base de datos. Sin embargo esta tabla está en memoria mientras la utilicemos, y luego se descarta. Cada vez que ejecutamos la consulta se vuelve a calcular el resultado.

La sintaxis básica de una consulta SELECT es la siguiente (los valores opcionales van entre corchetes):

SELECT [ ALL / DISTINC ] [ * ] / [ListaColumnas_Expresiones] AS [Expresion]
FROM Nombre_Tabla_Vista 
WHERE Condiciones
ORDER BY ListaColumnas [ ASC / DESC ]

A continuación analizaremos cada una de las partes de la consulta para entenderla mejor.

SELECT

Permite seleccionar las columnas que se van a mostrar y en el orden en que lo van a hacer. Simplemente es la instrucción que la base de datos interpreta como que vamos a solicitar información.

ALL / DISTINCT

ALL es el valor predeterminado, especifica que el conjunto de resultados puede incluir filas duplicadas. Por regla general nunca se utiliza.

DISTINCT especifica que el conjunto de resultados sólo puede incluir filas únicas. Es decir, si al realizar una consulta hay registros exactamente iguales que aparecen más de una vez, éstos se eliminan. Muy útil en muchas ocasiones.

Nombres de campos

Se debe especificar una lista de nombres de campos de la tabla que nos interesan y que por tanto queremos devolver. Normalmente habrá más de uno, en cuyo caso separamos cada nombre de los demás mediante comas.

Se puede anteponer el nombre de la tabla al nombre de las columnas, utilizando el formato Tabla.Columna. Además de nombres de columnas, en esta lista se pueden poner constantes, expresiones aritméticas, y funciones, para obtener campos calculados de manera dinámica.

Si queremos que nos devuelva todos los campos de la tabla utilizamos el comodín “*” (asterisco).

Los nombres indicados deben coincidir exactamente con los nombre de los campos de la tabla, pero si queremos que en nuestra tabla lógica de resultados tengan un nombre diferente podemos utilizar:

AS

Permite renombrar columnas si lo utilizamos en la cláusula SELECT, o renombrar tablas si lo utilizamos en la cláusula FROM. Es opcional. Con ello podremos crear diversos alias de columnas y tablas. Enseguida veremos un ejemplo.

FROM

Esta cláusula permite indicar las tablas o vistas de las cuales vamos a obtener la información. De momento veremos ejemplos para obtener información de una sola tabla.

Como se ha indicado anteriormente, también se pueden renombrar las tablas usando la instrucción “AS”.

WHERE

Especifica la condición de filtro de las filas devueltas. Se utiliza cuando no se desea que se devuelvan todas las filas de una tabla, sino sólo las que cumplen ciertas condiciones. Lo habitual es utilizar esta cláusula en la mayoría de las consultas.

Condiciones

Son expresiones lógicas a comprobar para la condición de filtro, que tras su resolución devuelven para cada fila TRUE o FALSE, en función de que se cumplan o no. Se puede utilizar cualquier expresión lógica y en ella utilizar diversos operadores como:

  • > (Mayor)
  • >= (Mayor o igual)
  • < (Menor)
  • <= (Menor o igual)
  • = (Igual)
  • <> o != (Distinto)
  • IS [NOT] NULL (para comprobar si el valor de una columna es o no es nula, es decir, si contiene o no contiene algún valor)

Se dice que una columna de una fila es NULL si está completamente vacía. Hay que tener en cuenta que si se ha introducido cualquier dato, incluso en un campo alfanumérico si se introduce una cadena en blanco o un cero en un campo numérico, deja de ser NULL.

  • LIKE: para la comparación de un modelo. Para ello utiliza los caracteres comodín especiales: “%” y “_”. Con el primero indicamos que en su lugar puede ir cualquier cadena de caracteres, y con el segundo que puede ir cualquier carácter individual (un solo carácter). Con la combinación de estos caracteres podremos obtener múltiples patrones de búsqueda. Por ejemplo:
    • El nombre empieza por A: Nombre LIKE ‘A%’
    • El nombre acaba por A: Nombre LIKE ‘%A’
    • El nombre contiene la letra A: Nombre LIKE ‘%A%’
    • El nombre empieza por A y después contiene un solo carácter cualquiera: Nombre LIKE ‘A_’
    • El nombre empieza una A, después cualquier carácter, luego una E y al final cualquier cadena de caracteres: Nombre LIKE ‘A_E%’
  • BETWEEN: para un intervalo de valores. Por ejemplo:
    • Clientes entre el 30 y el 100: CodCliente BETWEEN 30 AND 100
    • Clientes nacidos entre 1970 y 1979: FechaNac BETWEEN ‘19700101’ AND ‘19791231’
  • IN( ): para especificar una relación de valores concretos. Por ejemplo: Ventas de los Clientes 10, 15, 30 y 75: CodCliente IN(10, 15, 30, 75)

Por supuesto es posible combinar varias condiciones simples de los operadores anteriores utilizando los operadores lógicos OR, AND y NOT, así como el uso de paréntesis para controlar la prioridad de los operadores (como en matemáticas). Por ejemplo:  … (Cliente = 100 AND Provincia = 30) OR Ventas > 1000 … que sería para los clientes de las provincias 100 y 30 o cualquier cliente cuyas ventas superen 1000.

ORDER BY

Define el orden de las filas del conjunto de resultados. Se especifica el campo o campos (separados por comas) por los cuales queremos ordenar los resultados.

ASC / DESC

ASC es el valor predeterminado, especifica que la columna indicad en la cláusula ORDER BY se ordenará de forma ascendente, o sea, de menor a mayor. Si por el contrario se especifica DESC se ordenará de forma descendente (de mayor a menor).

Por ejemplo, para ordenar los resultados de forma ascendente por ciudad, y los que sean de la misma ciudad de forma descendente por nombre, utilizaríamos esta cláusula de ordenación:

… ORDER BY Ciudad, Nombre DESC …

Como a la columna Ciudad no le hemos puesto ASC o DESC se usará para la misma el valor predeterminado (que es ASC)

OJO: Aunque al principio si aún no se está habituado, pueda dar la impresión de que se ordena por ambas columnas en orden descendente. Si es eso lo que queremos deberemos escribir … ORDER BY Ciudad DESC, Nombre DESC …

Algunos ejemplos

Para terminar este repaso a las consultas simples  practicarlas un poco, veamos algunos ejemplos con la base de datos Northwind en SQL Server:

- Mostrar todos los datos de los Clientes de nuestra empresa:

SELECT * FROM Customers

- Mostrar apellido, ciudad y región (LastName, city, region) de los empleados de USA (nótese el uso de AS para darle el nombre en español a los campos devueltos):

SELECT E.LastName AS Apellido, City AS Ciudad, Region
FROM Employees AS E
WHERE Country = ‘USA’

- Mostrar los clientes que no sabemos a qué región pertenecen (o sea, que no tienen asociada ninguna región) :

SELECT * FROM Customers WHERE Region IS NULL

- Mostrar las distintas regiones de las que tenemos algún cliente, accediendo sólo a la tabla de clientes:

SELECT DISTINCT Region FROM Customers WHERE Region IS NOT NULL

- Mostrar los clientes que pertenecen a las regiones CA, MT o WA, ordenados por región ascendentemente y por nombre descendentemente.

CODE SELECT * FROM Customers WHERE Region IN(‘CA’, ‘MT’, ‘WA’)
ORDER BY Region, CompanyName DESC

- Mostrar los clientes cuyo nombre empieza por la letra “W”:

SELECT * FROM Customers WHERE CompanyName LIKE ‘W%’

- Mostrar los empleados cuyo código está entre el 2 y el 9:

SELECT * FROM Employees WHERE EmployeeID BETWEEN 2 AND 9

- Mostrar los clientes cuya dirección contenga “ki”:

SELECT * FROM Customers WHERE Address LIKE ‘%ki%’

- Mostrar las Ventas del producto 65 con cantidades entre 5 y 10, o que no tengan descuento:

SELECT * FROM [Order Details] WHERE (ProductID = 65 AND Quantity BETWEEN 5 AND 10) OR Discount = 0

Nota: En SQL Server, para utilizar nombres de objetos con caracteres especiales se deben poner entre corchetes. Por ejemplo en la consulta anterior [Order Details] se escribe entre corchetes porque lleva un espacio en blanco en su nombre. En otros SGBDR se utilizan comillas dobles (Oracle, por ejemplo: “Order Details”) y en otros se usan comillas simples (por ejemplo en MySQL).

Resumen

Como ves, hacer consultas básicas con SQL ha sido muy fácil. Solo hay que pensar en instrucciones directas dadas en inglés y lo más complicado es quizá cómo combinar las condiciones que caracterizan a los registros que nos interesan. En la próxima entrega de este tutorial lo vamos a complicar un poco haciendo que las consultas involucren a varias tablas al mismo tiempo.

¡Hasta pronto!

Fecha de publicación:
José Manuel Alarcón Fundador de campusMVP, es ingeniero industrial y especialista en consultoría de empresa. Ha escrito diversos libros, habiendo publicado hasta la fecha cientos de artículos sobre informática e ingeniería en publicaciones especializadas. Microsoft lo ha reconocido como MVP (Most Valuable Professional) en desarrollo web desde el año 2004 hasta la actualidad. Puedes seguirlo en Twitter en @jm_alarcon o leer sus blog técnico o personal. Ver todos los posts de José Manuel Alarcón
Archivado en: Acceso a Datos

Boletín campusMVP.es

Solo cosas útiles. Una vez al mes.

🚀 Únete a miles de desarrolladores

DATE DE ALTA

x No me interesa | x Ya soy suscriptor

La mejor formación online para desarrolladores como tú

Comentarios (62) -

Como puedo buscar con 1 select  este valor  1-02-22222-3?

select * from tabla where campo = '1-02-22222-3' no me trae eso exactamente

José Manuel Alarcón
Spain José Manuel Alarcón

Pues de esa manera debería traértelo. ¿Qué quieres decir con que no te trae exactamente eso?

Si el capo es un campo de texto y usas la consulta anterior te debería traer los registros que tengan exactamente en ese campos...

COMO VISUALISO EL NOMBRE DE USUARIOS Q SON APELLIDO MEDINA

SELECT <nombre_usuario> FROM <tabla_bd> WHERE <apellido_usuario>='medina'

Como podría hacer una consulta que implique un BETWEEN y varios AND.

por ejemplo;

"SELECT * FROM tabla WHERE fecha BETWEEN 2015-02-13 AND 2015-03-13 AND nombre='algo' AND apellido ='algo' '"

José Manuel Alarcón
Spain José Manuel Alarcón

Hola:

Tú mismo te has contestado: le pones varios AND y listo.
Si quieres, puedes usar paréntesis para agrupar las condiciones y así marcar de manera explícita la precedencia.

Saludos.

José Manuel Alarcón gracias por este aporte, tengo una duda, como realizo una consulta donde tenga que buscar un numero dentro de un campo que diga :

mensajes
Entrego talon 23451
Realizo entrega 45237
Entrega Realizada 9856472

como realizo un query que me de unicamente los numeros?

Saludos.

José Manuel Alarcón
Spain José Manuel Alarcón

Hola Sergio:

No entiendo lo que me preguntas. Si indicases mejor la estructura de la tabla y qué es cada cosa de la que pones en tu mensaje...

De todos modos si es una tabla simple, o son dos relacionadas, con lo que se explica en esta serie de artículos, o en el PDF de "Héroe en SQL" que te puedes descargar gratuitamente, deberías ser capaz de hacerlo tú mismo.

Saludos.

Como agrupo los gastos de compras por ejemplo el primer  qincenal d marzo mas mensual mas semestral

Juan David
Colombia Juan David

Que tablas podria utilizar y que significa estas consultas:
select distinct apellido from empleados
select apellido as trabajador from empleados
select * from empleados where edad > 35 and edad < 45 por fa es usrgente

como generar una consulta SELECT que presente el nombre empresas y el (los) nombre(s) del (los) proyecto (s) que se le realiza(n) ayudaaaaaaaaaaaaaaa lo ocupo saber ya

al realizar una consulta, donde quedan guardadas, y como las recupero. ?.

como hago para traerme un total de población solo de los países spain, germany, france
SELECT SUM(population)
FROM   world
WHERE  name = 'france' ,'spain', 'germany'

Hola Luis:

Tienes un ejemplo en el texto del artículo: es la cláusula IN:

SELECT SUM(population)
FROM   world
WHERE  name IN ('france' ,'spain', 'germany')

Saludos.

para que y como se usa el Group be y el having, gracias por ayudarme con el comentario anterior

Teniendo una bd con 4 tablas relacionadas: oficina(id) 1aM con vehiculo(matricula); vehiculo(matricula) 1aM con alquila(dni,matricula,fecha) Ma1 con  cliente(dni).

alquila: cliente.dni(cp), vehiculo.matricula(cp), fecha(cp), dias, seguro, precio
vehiculo: matricula, marca, grupo, puertas, plazas, añomatricula, oficinia.id

La consulta es:
Muestra la matricula del vehiculo que ha sido alquilado más veces.

GRACIAS!!!!

Podrías poner un ejemplo de como hacer un Select con Where a un campo lógico?
Por ejemplo SELECT * FROM USUARIOS WHERE  BAJA = FALSO
teniendo en cuenta que el campo BAJA es un campo lógico y sólo va a contener .T.  ó  .F.
Así mismo decirte si la foma de poner la instrucción es válida para un Filter
Gracias

Hola Pedro:

Tu pregunta en realidad parece ir por ¿cómo se almacenan los valores booleanos (True o false) en la base de datos y cómo los uso en una consulta.

Pues depende del gestor de datos.

Por ejemplo, en SQL Server los booleanos se suelen guardar en campos de tipo BIT, que solo admiten 0 y 1 como valores, siendo el 0 equivalente a FALSE y el 1 a TRUE (y NULL sería equivalente a desconocido/unknown).

En MySQL 5.0.3 o superior también hay un campo de tipo BIT que podrías usar exactamente igual. Si es una versión anterior deberías usar un TINYINT(1).

En ambos casos lo que se hace es una consulta estilo esta:

SELECT * FROM USUARIOS WHERE  BAJA = 0

Saludos.

Como una consulta donde me imprima donde exista datos alguno o sea solo los datos que no sean null he provado con esta:
SELECT * FROM productos WHERE lanzamiento  IS not NULL

pero me vota todos, hasta los null solo quiero los que tengan dato.

Buenos días, como puedo realizar un IN de varios campos, me explico tengo que obtener el titulo del documento de una tabla a partir del  año y el mes .
titulo año mes
1 2
1 3
2 3
2 4
2 5
Resultado así:
titulo año mes
prueba 1 2
leyenda 1 3
etc  Gracias.

como le hago para listar los registros de 3 tablas

Mark Suckember
Mark Suckember

solo divide el nombre de las tablas seguido del signo de puntuacion de la coma y listo como en el ejemplo de abajo

SELECT * FROM nm_cat_empleados, nm_cat_contratos_nv, nm_antiguedad

como se usa inner Join on con dos tablas pero que solo  visualice una columna

Como puedo Obtener un listado con el nombre de los empleados y el nombre de sus
respectivos jefes
Gracias!!!

tienes que hablar de TOP

tengo que haceer una consulta a una base de datos que le pusieron por nombre lin-db , pero cuando hago la consulta me dice que lin la base de datos no existe este caracter '-' como lo remplazo ? - ese ese caracte el guion les muestro el error
Warning: mssql_select_db() [function.mssql-select-db]: message: Database 'lin' does not exist. Make sure that the name is entered correctly. (severity 16) in C:\AppServ\www\flash\list.php on line 14
y  la tengo asi $db ='lin-db'

Hola:

Utiliza corchetes para rodear el nombre de la tabla:

SELECT * FROM [lin-db]...

debería irte...

Saludos.

Como puedo realizar un procedimiento que reciba el nombre de un empleado y me devuelva su nombre, apellido, dni y sueldo, realizando la llamada a todos los prodecimientos.
Soy nuevo en esto de procedimientos, me seria de gran ayuda gracias

EDUARDO CORTES
Mexico EDUARDO CORTES

Hola, buen día.
Tengo una duda con respecto a un Select, la consulta que estoy generando intervienen dos tablas, Una en la cual se almacena un número y nombre de persona y en la otra se almacenan accesos que realiza la persona con fecha y hora, lo que requiero es extraer solo el primer registro de accesos del día, pero con la variante de poder elegir un periodo de fechas, la consulta que estoy generando es la siguiente:
SELECT P.NO_PERSONA, P.NOMBRE,A.FECHA
FROM P INNER JOIN A ON P.NO_PERSONA = A.NO_PERSONA
WHERE A.FECHA BETWEEN '12-01-2015' AND '12-15-2015'
Como lo mencione anteriormente, requiero extraer solo el primer acceso del dia de un periodo de fecha, ojala y puedas asesorarme. Gracias

Hola:

Solo tienes que ponerle TOP 1 justo después del SELECT y te devolverá solamente el primer registro. Si quieres el más reciente tendrías que asegurarte de que ese es el primero usando la cláusula ORDER BY para ordenar descendentemente por fecha.

Si necesitas aprender SQL te recomendamos que te apuntes a nuestro curso:
/catalogo/Product-SQL-Server-pr%C3%A1ctico-para-desarrolladores_165.aspx

Y puedes empezar con nuestro eBook gratuito "Heroe SQL" sobre el tema que te puedes descargar del enlace que hay en este artículo.

Saludos.

EDUARDO CORTES
Mexico EDUARDO CORTES

Hola muchas gracias por responder, no formule correctamente mi pregunta, efectivamente si escribo el top 1 me mostrara el primer registro, pero lo que requiero es que si una persona tiene 4 registros en un día, me muestre el primero que se almaceno, pero si selecciono 4 días, requiero que se muestre el primer registro que realizo la persona de cada uno de esos días, ademas de que en esa tabla, existen mas de una persona, de las cuales requiero obtener la información de cada uno de ellos.

Gracias.

Hola:

Esa es una consulta más compleja porque tendrías que hacer una consulta agregada (con una subconsulta) y hacer un GROUP BY por día (del mes, suponemos, dependerá de tu consulta) para que te traiga exactamente eso que necesitas.

A ver si esta pista te ayuda.

Saludos

Como puedo crear una consulta q muestre nombre, fechaventa,montoventa,cantidad
(Nombre esta en una tabla distina)

Y una consulta q muestre el total de venta por empleados TOTAL(montoventa) TOTAL(cantidad)
Desde ya gracias

José Manuel Alarcón
José Manuel Alarcón

Hola Vanesa:

Descárgate el eBook gratuito para aprender los fundamentos de SQL (está referenciado en el artículo) y ahí encontrarás la respuesta para hacerlo tú misma :-)

Saludos.

Hola, yo hice una consulta a través del "Order by desc" obtengo mis datos, pero en esta primera fase es solo un resumen pequeño de los datos que quiero mostrar, tengo la opción "ver más" para que se muestre el resumen completo de todos los datos enlazandolos a una tabla completa, pero no se como hacer una consulta que me enlace al valor correcto, digamos tengo mi Id1 y Id2 cuando el usuario de click en ver más me enlace al correspondiente...

Id1 (click ver más) ----> Resumen completo de los datos de Id1
Id2 (click ver más) ----> Resumen completo de los datos de Id2

No se si me explico correctamente, espero que si quiero saber eso

Hola: Tengo una duda tengo un archivo que quiero que primero me realice el select de los objetos que tiene y después que le de el grant excute pero no se como formarlo el paquete esta cargado asi:

v_grant:= 'GRANT EXECUTE ON  POLO.PKG_INTERCAMBIO TO '|| VCPOLI_CARGA_ROL.LOGIN_USUARIO;

Como puedo cambiarlo para que haga primero el select y luego el execute.

Te agradezco mucho tu ayuda. Saludos

José Manuel Alarcón
José Manuel Alarcón

Si estás en SQL Server puedes separar las instrucciones con un punto y coma, y se ejecutarán en el orden en que las coloques...

use Master
go

Create database (nombreBD)
ON
Primary (Name = (NombreArchivoprimary),
filename = 'D:.MDF',
Size = 10MB,
maxsize = 25MB,
filegrowth = 50%),
(NAME = (Nombrearchivosecundario),
filename = 'D:.NDF',
Size = 10MB,
maxsize = 15MB,
filegrowth = 5MB)
Log on
(Name = (Nombre archivolog),  
filename = 'D:.LDF',
Size = 10MB,
maxsize = 70MB,
filegrowth = 15MB)
GO

USe (BD)
go

Create Table (Nombre tabla)
( Variables int not null,
  Variables varchar(100) not null)
  go

Alter table (nombre tabla) add
Constraint PK_Provincia primary key (nombrecampoprimary)  ****Hacer llave primaria****

  Alter table tabla add
  Constraint PK_nombreprimary key (CodigoCiudad),
  constraint FK_Nombre foreign key (CodigoProvincia)  ****Hacer llave foranea****
  references Tabla (Campo)
  Go

select [campos],[campos],[campos], [campos], [campos] ****Campos****
from [dbo].[tabala]Go ´**Tabla**


INSERT INTO [dbo].[tabla] **Insertar valores**
           ([]
           ,[])
     VALUES
           ('' , ''),  ('' , ''), ( '' , ') , ('' , ''), ('' , '')
GO


DELETE FROM [dbo].[tablas]
      WHERE (CodigoCiudad = 1) **Condicion**
GO

Exec SP_helpdb basedatos **SP muestra la informacion de una base datos**
go
Exec SP_helpdb Basedatos ***SP muestra tamaño de una BD***
go


Select [campos],[],[], [], []
from [dbo].[tablas]
where (campos a validar > '2' and campo a validar < '5')
go  **mostrar valores entre rangos**

select [campos],[],[], [], []
from [dbo].[tablas]
Where campos a valida Between '3' and '4'
Go  **muestra valores entre rangos


SELECT max(campoa validar) muestra el maximo
FROM tabla
go


Select [campos] [] []
from tabla order by campos Desc ASC
go

select count (campo) from tabla
go **Contador**


BACKUP DATABASE [NombreBD] TO  DISK = N'Direccion\nombre\respaldo.bak' WITH NOFORMAT, NOINIT,  NAME = N'NombreBD-Completa Base de datos Copia de seguridad', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Hola quisiera saber si tengo dos hablas y quiero realizar un where con el condicional =
Pero al comparar quiero adicionarle una cadena ejemplo

Where Campo.Tabla1='cadena'+campo.tabla2

Esta es la forma correcta o hay una mejor porque no ha funcionado en traer lo que realmente quiero

José Manuel Alarcón
José Manuel Alarcón

No tienes ningún problema con hacer eso que quieres hacer ni veo por qué deberías tener problema en hacerlo. Quizá hayas escrito algo mal si no te trae la información que necesitabas.

Saludos.

Hola a todos una pregunta de iniciador.... Porque en una consulta SQL  

"SELECT * FROM products ORDER BY product "


me lista de la siguiente manera:

SP-109
SP-222
SP-30


La pregunta puntual seria:

Porque no me lista primero el SP-30 si este es menor que SP-109 (En un orden natural Ascendente) ...

Parece que en la consulta solo considera solo la primer unidad y no todo el numero compuesto.



Podrían ayudarme?

José Manuel Alarcón
José Manuel Alarcón

Hola Alex:

Porque el campo por el que estás ordenando es un campo de texto, no numérico. Tú interpretas los números y ordenas numéricamente pensando que el 109 es mayor que el 30, pero alfanuméricamente (es decir, considerando el texto), el 30 va después del que el 109, ya que en la tabla de caracteres el 1 va antes que el 3.

Cuando una base de datos ordena por un campo de texto lo que hace es comparar individualmente caracter a carácter hasta encontrar una diferencia. En tu ejemplo los 3 primeros son idénticos (SP-) y luego empiezan las diferencias. El 1 va antes que el 2 y éste antes que el 3, por eso te sale ese orden. Luego no se sigue comparando pues no es necesario. Inisisto: se comparan las letras una a una, no se consideran los números completos. Para ello tendría que ser un campo numérico.

Q tal? Alguien podría ayudarme. Necesito de una tabla de ventas q contiene " id de empleado" , folio de venta, y fecha de venta, mostrar la venta mas vieja y mas reciente de cada empleado. Esto de acuerdo claro a su fecha de venta o inclusive al folio.
Pero debo de hacerlo usando operador "&"  . De tal forma q no muestre a toda la lista de empleados como lo lograría con un simple " max" o "min" .si no que se genere la búsqueda por cada uno de los empleados cuando ingrese un id especifico.
Pueden ayudarme por favor? Gracias!

Me podrían ayudar necesito buscar ID de productos en el cual se duplican tengo miles de productos registrados en el sql y algunos repiten su ID como puedo hacer la consulta

José Manuel Alarcón
José Manuel Alarcón

Hola Hassan:

En este post de mi blog te lo cuento:
www.jasoft.org/.../...os-en-una-base-de-datos.aspx

Saludos.

Hola Jose Manuel:
Estoy iniciándome en sql y mi duda es la siguiente:
En una bbdd con tres tablas, Ingresos, Pacientes, Médicos, quiero consultar la localidad de todos los pacientes que han ingresado con parada.

SELECT PACIENTES.POBLACION, INGRESOS.DIAGNOSTICO
FROM PACIENTES, INGRESOS
WHERE DIAGNOSTICO ='PARADA';

De esta manera me saca el producto cartesiano y repite datos. Creo que tengo que indicar la PK de alguna tabla pero no sé cual.

Muchas gracias de antemano por tu ayuda y un saludo.

Hola José Manuel...
No soy primerizo ni veterano en el manejo de los sql, pero me tope con la necesidad de sacar información de una tabla de datos de clientes tomando como parámetro su localidad.

Como puedo hacer que el usuario ingrese una localidad y que como resultado la consulta me devuelva los clientes de la localidad que el usuario ingresó.

Saludos.
Ga.Bo.

José Manuel Alarcón
José Manuel Alarcón

Hola:

¿Crear una aplicación que le pida la localidad y luego meterla en una consulta?
No sé muy bien qué necesitas saber, la verdad...

Las consultas pueden llevar parámetros (cada gestor de datos de su manera) pero en cualquier caso tendrás que solicitarla a un usuario mediante algún programa, claro.

Saludos.

John Serrano
John Serrano

Muy Buenas Tardes mi nombre es John y tengo una duda en un query

Necesito una consulta donde me genere la venta máxima y que cliente pertenece a esa venta, no se si es con un anidamiento, en la consulta que hago me genera la venta máxima y un cliente pero el primero en la lista.

SELECT clientes.`nom_cliente`, MAX(ventas.`monto_venta`)
FROM ventas
INNER JOIN clientes
ON ventas.`clientes_idclientes`=clientes.`idclientes`
GROUP BY ventas.`monto_venta`

Cliente              Venta
Edubin            850000
Carlos             950000
Laura             1005000

SELECT clientes.`nom_cliente`, MAX(ventas.`monto_venta`)
FROM ventas
INNER JOIN clientes
ON ventas.`clientes_idclientes`=clientes.`idclientes`

Edubin    1005000

Como es la consulta para que indique que la venta maxima pertenece a laura.

Agradezco mucho si me puede colaborar.



José Manuel Alarcón
José Manuel Alarcón

Hola John:

Depende del gestor de datos que uses, que puede tener quizá su forma particular de obtenerlo de manera más directa, pero con SQL estándar es muy fácil de obtener porque lo único que tienes que hacer es ordenar los resultados por "MAX(monto_venta) DESC" (para que esté el más alto de primero) y luego quedarte solo con ese registro usando "TOP 1" para que la consulta solo te devuelva un resultado.

Espero que te sirva.

Saludos.

hola saludos, como puedo borrar los resultados de esta consulta
select SACODBAR.codprod from SACODBAR

where not exists  (select 1 from saprod where   saprod.CodProd= SACODBAR.codprod)

buen dia, algun tutorial que me recomienden para hacer subconsultas algun manual o algo que me sirva para aprender utilizo sql en access

como puedo medir el tamaño total de la base  de datos creada con registros. en mysql y  en sql serve

Buenos días, alguien me puede ayudar, tengo una base de datos con campos alfanuméricos que almacena los datos de una documento por fila, los campos que tiene la base de datos es: Número de documento, casilla, valor de casilla, total documento.  Lo que necesito es tener en forma horizontal los datos dependiendo el número de documento agrupados por columnas cada casilla.

Usaba este query pero ahora no me funciona.

StrPa2 = " SUM(DECODE(B.NUMERO_CASILLA," & C_1 & ",TO_NUMBER(B.VALOR_CAMPO,'99999')))"
For i = C_1 To C_2
        StrPa2 = StrPa2 & ", SUM(DECODE(B.NUMERO_CASILLA," & i & ",TO_NUMBER(B.VALOR_CAMPO,'99999')))"
        i1 = i1 + 1
    Next i

strQuery = "SELECT SC.NIT, SC.NOMBRE, A.CODIGO_FORMULARIO, A.NUMERO_VERSION, A.NUMERO_FORMULARIO, A.NUMERO_DOCUMENTO, A.FECHA_CUR, A.PERIODO_DESDE, A.PERIODO_HASTA, A.VALOR_PAGO, A.FECHA_VENCIMIENTO, A.STATUS, " & _
              StrPa2 & _
              " FROM BA_DECLARACIONES A, BA_DET_DECLARACIONES B, CONTRIBUYENTES SC" & _
              " WHERE SC.NIT = A.NIT AND A.NUMERO_DOCUMENTO = B.NUMERO_DOCUMENTO AND A.ANIO_FISCAL = B.ANIO_FISCAL " & StrPa1 & repo & " AND (A.CODIGO_FORMULARIO In (" & strForms & ")))) " & _
              " GROUP BY A.CODIGO_FORMULARIO, A.NUMERO_VERSION, A.NUMERO_FORMULARIO, A.NUMERO_DOCUMENTO, A.FECHA_VENCIMIENTO, A.FECHA_CUR, A.STATUS, SC.NIT, SC.NOMBRE, A.PERIODO_DESDE, A.PERIODO_HASTA, A.VALOR_PAGO " & _
              " ORDER BY SC.NIT, A.CODIGO_FORMULARIO, A.PERIODO_HASTA, A.FECHA_CUR DESC, A.NUMERO_DOCUMENTO DESC"



El problema es que B.VALOR_CAMPO es un valor alfanumérico y no me funciona cuando tiene valores decimales

Gerardo Bustos Rojas
Gerardo Bustos Rojas

Estimados tengo una consulta la cual consiste en mostrar una lista de rendiciones de SAP en una consulta de SQL por ejemplo:
SELECT  T0.[DocStatus] AS 'ESTADO_OC', T0.[DocNum] AS 'OC', T1.[BaseRef] 'NV', T1.[ItemCode], T1.[Dscription],
    T1.[LineTotal] AS 'LINE_OC', T2.[LineTotal] AS 'LINEA_NV', T1.[OcrCode4] AS 'PERSO',
    CASE WHEN T1.[TargetType]='-1' THEN 'NO_TIENE' WHEN T1.[TargetType]='18' THEN 'FACTURA' ELSE 'OTRO' END AS 'DESTINO',
    CASE WHEN (T4.[DocTotal] <> T4.[PaidToDate] OR ISNULL (T4.[DocTotal], '0')=0) THEN 'NO_PAGADO' ELSE 'PAGADO' END AS 'STATUS_FC', T3.[PrcName]
FROM   OPRC T3 INNER JOIN OPOR T0 INNER JOIN
    POR1 T1 ON T0.[DocEntry] = T1.[DocEntry] INNER JOIN
    RDR1 T2 ON T1.[BaseEntry] = T2.[DocEntry] AND T1.[BaseLine] = T2.[LineNum] ON
    T3.[PrcCode] = T1.[OcrCode4] LEFT OUTER JOIN
    OPCH T4 ON T1.[TrgetEntry] = T4.[DocEntry]
WHERE   (T1.[BaseType]=17)
    AND (T1.[BaseRef] LIKE '15%')
    AND (T0.[CANCELED]='N')
    AND ((CASE WHEN (T4.[DocTotal] <> T4.[PaidToDate] OR ISNULL (T4.[DocTotal],'0')=0) THEN 'NO_PAGADO' ELSE 'PAGADO' END) = 'NO_PAGADO')

La cual muestra una lista como la siguiente, quite una columnas que no me sirven:
#  Estado OC  OC  NV  Número  Descripción  DESTINO  STATUS FC  Nombre
1  O  6267  15000356  ADRE0001  REND./11111111  NO TIENE  NO PAGADO  Luis
2  C  6300  15000368  ADRE0004  RENDICION  FACTURA  NO PAGADO  Ana
3  C  5278  15000224  ADRE0001  AUTOMATICOS  NO TIENE  NO PAGADO  Daniel

Como podría hacer para que me elimine u oculte la tercera fila la cual tiene Estado C, Destino NO TIENE y Status FC NO PAGADO, mi problema es que este un un listado muy grande, aca solo deje los tres tipos de resultados que me muestra, favor su ayuda gracias

Hola, tengo una consulta y  deseo filtrar por fecha;
SELECT DATEADD(second, time + 60 * offset, '01/01/70') AS timeStr, msec, host, process, dbName, ptName AS point, description, rtuName AS rtu, groupName, message, type, sevInt, time FROM dbo.summary

El problema es que la cantidad de datos a mostrar es demasiado grande y me da un error a tratar de visualizarlos me da un error . Alguien pudiera ayudarme

Buenas
Como seria un listado de usuarios creados en el ultimo año?
gracias!

como puedes hacer una consulta cruzada??

como hago para consultar Nombre de los investigadores principales de los proyectos cuya entidad financiadora sea la “CICYT”.

estaba revisando la consulta de la respuesta al problema:  Mostrar las Ventas del producto 65 con cantidades entre 5 y 10, o que no tengan descuento.
Y no sale en la consulta lo que se pide, modifique el orden de la consulta que hiciste
SELECT * FROM [Order Details] WHERE ((Quantity between 5 and 10) and ProductID =65) and Discount = 0;
y recien salio.
Pero realmente los ejercicios que proporcionas me enseñaron mucho y aclare muchas dudas.  

Gracias

Pingbacks and trackbacks (1)+

No se aceptan más comentarios