Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sentencias SQL
Manten en mente lo siguiente: las sentencias SQL no son sencibles a las mayusculas o minisculas
Algunos sistemas de bases de datos requieren un punto y coma al final de cada sentencia SQL
El punto y como es un estandar que se para cada sentencia SQL en sistemas de bases de datos que
habilitan mas de una sentencia SQL ejecutada en la misma llamada al servidor
SQL puede ser dividido en dos partes: El Lenguaje de Manipulacion de Datos (DML) y el Lenguaje
de Definicion de Datos (DDL)
La parte DLL del SQL, las sentencias mas importante DDL en SQL son:
La sentencia SELECT
1) SELECT nombre_columna(s)
FROM nombre_tabla
Ejemplo 1
SELECT nombre_columna(s)
FROM nombre_tabla
SELECT Nombre,Apellidos,Ciudad
FROM Personas
Ejemplo 2
Funciones de programacion como estas no son parte de este tutorial. Para aprender a accesar a
datos con la llamada a funciones espera mi siguiente tutorial ADO y PHP.
La sentencia SELECT DISTINCT
Dentro de una tabla, algunas columnas pueden contener valores duplicados. Esto no es un
problema, algunas veces tu querras listar solo los valores diferentes (distintos) en la tabla
La palabra DISTINCT puede ser usada como llave para regresar solo los valores
distintos(diferentes).
Ejemplo:
SQL WHERE
La sentencia where es usada para extraer solo los registros que cumplen con el criterio especificad
SELECT nombre_columna(s)
FROM nombre_tabla
WHERE nombre_columna operador valor
SELECT *
FROM Personas
WHERE Apellidos ='Trejo Lemus'
SQL usa comillas simples en los valores de texto (muchos sitemas manejadores de bases de datos
aceptan comillas dobles).Para SQL los valores de texto deben ser puestos entre comillas simples
SELECT *
FROM Personas
WHERE Nombre='Lucero'
SELECT *
FROM Personas
WHERE Nombre=Lucero
SELECT *
FROM Personas
WHERE P_id = 9
Esta es la forma incorrecta:
SELECT *
FROM Personas
WHERE P_id = '9'
Los operadores AND y OR son usados para filtrar registros basados en mas de una condicion
Operador AND
El operador AND muestra el registro si la primera condicion y la segunda condicion son verdaderas
El resultado seria:
Operador OR
Ahora seleccionaremos las personas con el campo Nombre igual a "Martha" o el campo Nombre
igual a "Elvira"
Ahora seleccionaremos solo las personas con el campo Apellidos igual a "Sobrevilla Trejo" AND
Nombre igual a "Marcel Abisag" OR igual a "Jose Abraham"
SQL ORDER BY
La sentencia ORDER BY es usada para ordenar los registros en orden ascendente por default
SELECT nombre_columna(s)
FROM nombre_tabla
ORDER BY nombre_column(s) ASCDESC
Ahora vamos a seleccionar todas las personas de la tabla, pero mostrando en orden por el campo
Nombre
Ahora vamos a seleccionar a todas las personas de la tabla pero mostrandolas en un orden
descendente por el campo Nombre con la palabra DESC
La sentencia INSERT INTO se usa para insertar un registro o fila en una tabla
La primera forma no especifica los nombres de las columnas donde los datos seran insertados solo
los valores:
La segunda forma especifica los nombres de las columnas y los valores insertados
Mostrara lo siguiente:
Sentencia SQL UPDATE Statement
UPDATE nombre_tabla
SET columna1=valor, column2=valor,...
WHERE alguna_columna=algun_valor
Nota: La sentencia WEHRE en la sintaxis UPDATE, especifica cual de los registros va a ser
actualizado. Si omites la sentencia WHERE todos los registros seran actualizados.
UPDATE Personas
SET Direccion='Canoga Park', Ciudad='L.A.'
WHERE Nombre='Antonio' AND Apellido='Trejo Campos'
UPDATE Personas
SET Direccion='Canoga Park', Ciudad='L.A.'
El resultado seria:
Nota: La sentencia WHERE en la sintaxis DELETE especifica el registro o los registros que seran
borrados, si omites la sentencia WHERE, todos los registros seran borrados de la tabla
Ahora vamos a borrar la persona "Marco Antonio Trejo Lemus" en la tabla Personas con la
siguiente sentencia:
Es posible borrar todas las filas en una table sin borrar la tabla en si. Esto significa que la estructura
de la tabla, atributos e indices quedaran intactos:
or
Nota: Debes tener cuidado cuando borres registros. Ya que no podras deshacer lo que hagas con
esta sentencia.
APENDICE 1
El siguiente codigo creara la base de datos en el servidor SQL EXPRESS
1.- Hacer clic en Inicio --> Todos los Programas --> Microsoft SQL SERVER 2008 -->
SQL Server Management Studio
3.- Hacer clic Nueva Consulta (se encuentra en el margen superior izquierdo)
USE master
if exists (select * from sysdatabases where name='empresa')
begin
raiserror('La base de datos existe; eliminndola....',0,1)
DROP database empresa
end
GO
raiserror('Creando base de datos empresa....',0,1)
go
CREATE DATABASE empresa
GO
USE empresa
GO
CREATE TABLE Personas(
P_id int PRIMARY KEY IDENTITY,
Nombre nchar(20) NOT NULL,
Apellidos nchar(30) NOT NULL,
Direccion nchar(40) NOT NULL,
Ciudad nchar(10) NOT NULL)
GO
GO
INSERT INTO Personas VALUES ('Marco Antonio','Trejo Lemus','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Martha Beatriz','Trejo Lemus','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Juana Elvira','Trejo Lemus','Calle E
822','Tampico')
INSERT INTO Personas VALUES ('Nora Zulma','Trejo Lemus','Calle E 822','Tampico')
INSERT INTO Personas VALUES ('Laura Lucero','Sobrevilla Trejo','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Maria de la luz','Trejo Campos','Calle
E 822','Tampico')INSERT INTO Personas VALUES ('Trinidad','Trejo Bautista','Calle E
822','Tampico')
INSERT INTO Personas VALUES ('Marcel Abisag','Sobrevilla Trejo','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Jose Abraham','Sobrevilla Trejo','Calle
E 822','Tampico')INSERT INTO Personas VALUES ('Samuel Salomon','Olmeda
Trejo','Calle E 822','Tampico')
GO
select * from Personas
quit
______________________________________________________
Ahora seleccionaremos solo los dos primeros registros de la tabla que se muestra abajo:
El operador LIKE se usa en una sentencia WHERE para buscar un patron en una columna
Sintaxis LIKE
SELECT nombre_columna(s)
FROM nombre_tabla
WHERE nombre_columna LIKE patron
Vamos a buscar las personas que viven en la ciudad de Tampico que empiecen con "Ta" de la tabla
en cuestion
El signo "%" puede ser usado para definir comodines (letras que faltan en el patron de busqueda)
ambas antes o despues del patron de busqueda
Ahora vamos a seleccionar las personas que viven en la ciudad que comienza con una "T" de la
tabla personas
Ahora vamos a seleccionar las personas que viven en la ciudad que contiene el patron "tam" de la
tabla personas
Tambien es posible seleccionar las personas que viven en la ciudad que no contienen el patron
"tamp" de la tabla personas, usando la palabra clave NOT
Comodines SQL
Los comodines SQL pueden ser usados en la busqueda de datos en una base de datos
pueden sustituir a uno o mas caracteres cuando se busquen los datos
Usando el comodn %
Ahora seleccionaremos las personas que viven en la ciudad de Tampico que empiecen con "Ta" de
la tabla Personas
Usando el _ Comodn
Ahora selectionaremos las personas que el primer nombre comience con algun caracter
seguido de "Ma" de la tabla Personas
Transact-SQL
USE AdventureWorks2012;
GO
SELECT *
FROM Production.Product
ORDER BY Name ASC;
-- Alternate way.
USE AdventureWorks2012;
GO
SELECT p.*
FROM Production.Product AS p
ORDER BY Name ASC;
GO
En este ejemplo se devuelven todas las filas (no se ha especificado la clusula WHERE) y
solo un subconjunto de las columnas (Name, ProductNumber, ListPrice) de la tabla Product
de la base de datos AdventureWorks2012 . Adems, se agrega un encabezado de columna.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT Name, ProductNumber, ListPrice AS Price
FROM Production.Product
ORDER BY Name ASC;
GO
En este ejemplo solo se devuelven las filas de Product que tienen una lnea de productos de
R y cuyo valor correspondiente a los das para fabricar es inferior a 4.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT Name, ProductNumber, ListPrice AS Price
FROM Production.Product
WHERE ProductLine = 'R'
AND DaysToManufacture < 4
ORDER BY Name ASC;
GO
Transact-SQL
USE AdventureWorks2012;
GO
SELECT p.Name AS ProductName,
NonDiscountSales = (OrderQty * UnitPrice),
Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount)
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY ProductName DESC;
GO
sta es la consulta que calcula el beneficio de cada producto de cada pedido de venta.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT 'Total income is', ((OrderQty * UnitPrice) * (1.0 -
UnitPriceDiscount)), ' for ',
p.Name AS ProductName
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY ProductName ASC;
GO
Transact-SQL
USE AdventureWorks2012;
GO
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO
Transact-SQL
USE tempdb;
GO
IF OBJECT_ID (N'#Bicycles',N'U') IS NOT NULL
DROP TABLE #Bicycles;
GO
SELECT *
INTO #Bicycles
FROM AdventureWorks2012.Production.Product
WHERE ProductNumber LIKE 'BK%';
GO
Transact-SQL
USE AdventureWorks2012;
GO
IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL
DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks2012 SET RECOVERY BULK_LOGGED;
GO
SELECT * INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL;
GO
Transact-SQL
USE AdventureWorks2012;
GO
SELECT DISTINCT Name
FROM Production.Product AS p
WHERE EXISTS
(SELECT *
FROM Production.ProductModel AS pm
WHERE p.ProductModelID = pm.ProductModelID
AND pm.Name LIKE 'Long-Sleeve Logo Jersey%');
GO
-- OR
USE AdventureWorks2012;
GO
SELECT DISTINCT Name
FROM Production.Product
WHERE ProductModelID IN
(SELECT ProductModelID
FROM Production.ProductModel
WHERE Name LIKE 'Long-Sleeve Logo Jersey%');
GO
Transact-SQL
USE AdventureWorks2012;
GO
SELECT DISTINCT p.LastName, p.FirstName
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = p.BusinessEntityID WHERE 5000.00 IN
(SELECT Bonus
FROM Sales.SalesPerson AS sp
WHERE e.BusinessEntityID = sp.BusinessEntityID);
GO
Una subconsulta correlativa se puede usar tambin en la clusula HAVING de una consulta
externa. En este ejemplo se buscan los modelos cuyo precio mximo es superior al doble de
la media del modelo.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT p1.ProductModelID
FROM Production.Product AS p1
GROUP BY p1.ProductModelID
HAVING MAX(p1.ListPrice) >= ALL
(SELECT AVG(p2.ListPrice)
FROM Production.Product AS p2
WHERE p1.ProductModelID = p2.ProductModelID);
GO
En este ejemplo se utilizan dos subconsultas correlativas para buscar los nombres de los
empleados que han vendido un producto especfico.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT DISTINCT pp.LastName, pp.FirstName
FROM Person.Person pp JOIN HumanResources.Employee e
ON e.BusinessEntityID = pp.BusinessEntityID WHERE pp.BusinessEntityID IN
(SELECT SalesPersonID
FROM Sales.SalesOrderHeader
WHERE SalesOrderID IN
(SELECT SalesOrderID
FROM Sales.SalesOrderDetail
WHERE ProductID IN
(SELECT ProductID
FROM Production.Product p
WHERE ProductNumber = 'BK-M68B-42')));
GO
F.Usar GROUP BY
En este ejemplo se busca el total de cada pedido de venta de la base de datos.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
Debido a la clusula GROUP BY, solo se devuelve una fila que contiene la suma de todas
las ventas por cada pedido de venta.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, SpecialOfferID, AVG(UnitPrice) AS [Average Price],
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY ProductID, SpecialOfferID
ORDER BY ProductID;
GO
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductModelID, AVG(ListPrice) AS [Average List Price]
FROM Production.Product
WHERE ListPrice > $1000
GROUP BY ProductModelID
ORDER BY ProductModelID;
GO
Transact-SQL
USE AdventureWorks2012;
GO
SELECT AVG(OrderQty) AS [Average Quantity],
NonDiscountSales = (OrderQty * UnitPrice)
FROM Sales.SalesOrderDetail
GROUP BY (OrderQty * UnitPrice)
ORDER BY (OrderQty * UnitPrice) DESC;
GO
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, AVG(UnitPrice) AS [Average Price]
FROM Sales.SalesOrderDetail
WHERE OrderQty > 10
GROUP BY ProductID
ORDER BY AVG(UnitPrice);
GO
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
USE AdventureWorks2012 ;
GO
SELECT SalesOrderID, CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO
L.Usar HAVING y GROUP BY
En el siguiente ejemplo se muestra el uso de las clusulas GROUP BY, HAVING, WHERE
y ORDER BY en una instruccin SELECT. Genera grupos y valores de resumen pero lo
hace tras eliminar los productos cuyos precios superan los 25 $ y cuyas cantidades de
pedido medias son inferiores a 5. Tambin organiza los resultados por ProductID.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
WHERE UnitPrice < 25.00
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, AVG(OrderQty) AS AverageQuantity, SUM(LineTotal) AS
Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $1000000.00
AND AVG(OrderQty) < 3;
GO
Para ver los productos cuyas ventas totales son superiores a $2000000.00, utilice esta
consulta:
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO
Si desea asegurarse de que hay al menos mil quinientos elementos para los clculos de cada
producto, use HAVING COUNT(*) > 1500 para eliminar los productos que devuelven
totales inferiores a 1500 elementos vendidos. La consulta sera la siguiente:
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO
Transact-SQL
USE AdventureWorks2012;
GO
SELECT pp.FirstName, pp.LastName, e.NationalIDNumber
FROM HumanResources.Employee AS e WITH
(INDEX(AK_Employee_NationalIDNumber))
JOIN Person.Person AS pp on e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO
O.Usar la sugerencia de consulta UNION
En el ejemplo siguiente se usa la sugerencia de consulta MERGE UNION.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, JobTitle, HireDate, VacationHours,
SickLeaveHours
FROM HumanResources.Employee AS e1
UNION
SELECT BusinessEntityID, JobTitle, HireDate, VacationHours,
SickLeaveHours
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO
Transact-SQL
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
Transact-SQL
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.ProductResults', 'U') IS NOT NULL
DROP TABLE dbo.ProductResults;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
INTO dbo.ProductResults
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
Transact-SQL
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
/* INCORRECT */
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
/* CORRECT */
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO
En el tercer ejemplo se utiliza ALL con el primer UNION y los parntesis incluyen al
segundo UNION que no utiliza ALL. El segundo UNION se procesa en primer lugar
porque se encuentra entre parntesis. Devuelve 5 filas porque no se utiliza la opcin ALL y
se quitan los duplicados. Estas 5 filas se combinan con los resultados del primer SELECT
mediante las palabras clave UNION ALL. Esto no quita los duplicados entre los dos
conjuntos de 5 filas. El resultado final es de 10 filas.
Transact-SQL
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.EmployeeOne', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeOne;
GO
IF OBJECT_ID ('dbo.EmployeeTwo', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeTwo;
GO
IF OBJECT_ID ('dbo.EmployeeThree', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeThree;
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeOne
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeTwo
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeThree
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
-- Union ALL
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne
UNION ALL
SELECT LastName, FirstName ,JobTitle
FROM dbo.EmployeeTwo
UNION ALL
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeThree;
GO