1. Lenguaje SQL
SQL Server 2005
Marta E. Zorrilla
Departamento de Matemática, Estadística y Computación
Universidad de Cantabria
Marta Zorrilla 2008-2009 1
2. Contenido
Contenido
Introducción.
Introducción.
Instrucciones de Definición de Datos.
Instrucciones de Definición de Datos.
Ejemplos.
Ejemplos.
Instrucciones de Manipulación de Datos.
Instrucciones de Manipulación de Datos.
Ejemplos.
Ejemplos.
Referencias bibliográficas:
- Kalen Delaney. A fondo Microsoft SQL Server 2000. McGraw-Hill, 2001
- Henderson, K. SQL Server 2000 Stored Procedure & XML Programming, 2ª ed. 2002.
- Henderson, K. The Guru's Guide to Transact-SQL. Addison-Wesley. 2000.
- Sunderic, D. Microsoft SQL Server 2005 stored procedure programming in T-SQL &
.NET. 2006
- Sql Server 2005. Ayuda online.
Marta Zorrilla 2008-2009 2
3. Introducción
Introducción
SQL (Structured Query Language).
SQL (Structured Query Language).
Lenguaje declarativo de acceso a los datos.
Estándar para las bases de datos relacionales.
Incluye la capacidad de manipular tanto la estructura de la
base de datos como sus datos. Aspectos de seguridad.
Desarrollado en el Laboratorio de investigación de San José
de IBM. Fue utilizado por primera vez en 1970.
En 1986:
ANSI (American National Standards Institute) e
ISO (International Standards Organization)
publicaron una norma, denominada SQL-86.
Ésta ha tenido dos actualizaciones: SQL-89 y SQL-92.
En la actualidad, se trabaja con el SQL:1999 y SQL:2003
Marta Zorrilla 2008-2009 3
4. SQL-92 y SQL-99
SQL-92 y SQL-99
SQL-92 incorpora:
• Nuevos operadores relacionales: OUTER JOIN y JOIN
• SQL dinámico
• El parámetro SQLSTATE para gestión de errores
• Cursores de desplazamiento (scroll cursor).
• Modo de acceso (lectura o lectura/escritura) y nivel de aislamiento de las
transacciones.
• Definir dominios (CREATE DOMAIN).
En la actualidad, se trabaja con el SQL:1999 (revisado en SQL3). Las características
más relevantes son:
• Nuevos tipos de datos: LOB, BOOLEAN, ROW, ARRAY, DISTINCT.
• Posibilidad de definir nuevos tipos de datos por parte del usuario (limitado).
• Disparadores (triggers), vistas actualizables (Indexed views)
• Cursores (punteros) sensitivos. Queries recursivos.
• Definición de roles de usuario
• Incorporación de las características de orientación a objetos: tipos de datos
abstractos, generalización, herencia y polimorfismo.
Marta Zorrilla 2008-2009 4
5. SQL:2003
SQL:2003
• Nuevos tipos de datos:
MULTISET, BIGINT y XML
• Columnas calculadas en tablas (valores escalares)
• Funciones escalares y que devuelven tablas
• Creación de tablas: LIKE , AS
• MERGE: permite la combinación de operaciones de inserción y
actualización en una sola instrucción
• Generadores de secuencia.
• Nuevas funciones escalares, de agregación, de clasificación
(RANK, ROW_NUMBER...)
Marta Zorrilla 2008-2009 5
6. Lenguaje de definición de
Lenguaje de definición de
datos
datos
SQL Server 2005
SQL Server 2005
(Parte 1)
(Parte 1)
7. Instrucciones de Definición de Datos (IDD)
Instrucciones de Definición de Datos (IDD)
Las IDD comprenden todas las operaciones necesarias para
implantar y mantener un esquema relacional.
Con ellas, se describen los datos y su agrupamiento formando tablas,
así como las restricciones que deben cumplir.
Las IDD permiten crear, modificar y eliminar tablas, así como todos
los componentes que las definen: campos, índices, claves, etc. y las
restricciones que sean precisas.
Principales instrucciones:
CREATE DATABASE
CREATE TABLE
Cláusula CONSTRAINT
ALTER TABLE
CREATE INDEX
CREATE VIEW
CREATE TRIGGER
CREATE PROCEDURE / FUNCTION
CREATE RULE
DROP “objeto”
Marta Zorrilla 2008-2009 7
8. IDD I :: CREATE DATABASE
IDD I CREATE DATABASE
Para crear una base de datos. Su sintaxis es:
CREATE DATABASE nombreBD
CREATE DATABASE nombreBD
[ [ON
ON
[ [< fichero > [ [,...n ] ]] ]
< fichero > ,...n
[ [, ,< grupo_fichero > [ [,...n ] ]] ] nombreBD: es el nombre de la BD que se va aacrear.
nombreBD: es el nombre de la BD que se va crear.
< grupo_fichero > ,...n
]] collation_name: mapa de caracteres
collation_name: mapa de caracteres
[ [LOG ON {{< fichero > [ [,...n ] ]}}] ]
LOG ON < fichero > ,...n logical_file_name : :nombre lógico del fichero.
logical_file_name nombre lógico del fichero.
[ [COLLATE collation_name ] ]
COLLATE collation_name
[ [FOR LOAD | |FOR ATTACH ] ] os_file_name : :nombre físico del fichero.
os_file_name nombre físico del fichero.
FOR LOAD FOR ATTACH
size: es el tamaño del fichero.
size: es el tamaño del fichero.
< fichero > ::=
< fichero > ::= max_size: es el tamaño máximo del fichero.
max_size: es el tamaño máximo del fichero.
[ [PRIMARY ] ]
PRIMARY
(([ [NAME = logical_file_name , ,] ] growth_increment : :incremento del fichero.
growth_increment incremento del fichero.
NAME = logical_file_name
FILENAME = 'os_file_name'
FILENAME = 'os_file_name' filegroup_name: nombre grupo de archivos
filegroup_name: nombre grupo de archivos
[ [, ,SIZE = size ] ]
SIZE = size
[ [, ,MAXSIZE = {{max_size | |UNLIMITED }}] ]
MAXSIZE = max_size UNLIMITED
[ [, ,FILEGROWTH = growth_increment ] ]))[ [,...n ] ]
FILEGROWTH = growth_increment ,...n
< grupo_fichero > ::=
< grupo_fichero > ::=
FILEGROUP filegroup_name < fichero > [ [,...n ] ]
FILEGROUP filegroup_name < fichero > ,...n
Marta Zorrilla 2008-2009 8
10. Páginas y extensiones
Páginas y extensiones
PÁGINA: es la unidad fundamental de almacenamiento de datos en Microsoft® SQL Server™.
Su tamaño es de 8 KB. Esto significa que las bases de datos de SQL Server 2005 tienen 128
páginas por cada megabyte.
El inicio de cada página es un encabezado de 96 bytes utilizado para almacenar información del
sistema, como el tipo de página, la cantidad de espacio libre en la página y el Id. del objeto
propietario de la página.
En SQL Server, las filas no pueden continuar en otras páginas. En SQL Server, la máxima
cantidad de datos contenidos en una fila es de 8060 bytes, sin incluir los tipos de dato text, ntext
e image. Al final de cada página se encuentra una tabla de desplazamiento de filas. La tabla de
desplazamiento de filas contiene una entrada por cada fila de la página y cada entrada registra la
posición del primer byte de la fila con respecto al principio de la página. Las entradas de la tabla
de desplazamiento de filas están en orden inverso a la secuencia de las filas de la página
Las EXTENSIONES son la unidad básica en la
que se asigna espacio a las tablas e índices. Una
extensión consta de 8 páginas contiguas, es decir
64 KB. Esto significa que las bases de datos de
SQL Server tienen 16 extensiones por megabyte.
Marta Zorrilla 2008-2009 10
11. SQL Server
SQL Server
database
Data (file)
Data (file) Log (file)
Log (file)
.mdf or .ndf
.mdf or .ndf .ldf
.ldf
Tablas e índices Extents = 8 páginas continuas de 8 KB
Datos se almacenan en Páginas de 8 KB Cabecera
Tamaño máx. fila 8060 bytes
Filas de datos
128 páginas por MB
Matriz
desplazamientos
•Cada archivo se divide en páginas de 8 Kb numeradas de 0 hasta x , donde x viene
definido por el tamaño del fichero.
•Acceder a una página: ID de BD, ID de fichero y nº de pág
•Fichero mdf: punto de comienzo de la BD, en sysfiles apunta los ficheros que
constituyen la BD y además almacena las tablas del sistema.
Marta Zorrilla 2008-2009 11
12. IDD II :: CREATE TABLE
IDD II CREATE TABLE
Para incorporar una tabla nueva a la base de datos. Su sintaxis es:
CREATE TABLE [ [nombreDB.[ propietario ] ]. .| |propietario. ] ]tabla
CREATE TABLE nombreDB.[ propietario propietario. tabla
(campo1 tipo [(tamaño)] [NOT NULL] [restricción_un_campo1 [ [... ] ]] ]
(campo1 tipo [(tamaño)] [NOT NULL] [restricción_un_campo1 ...
[, campo2 tipo [(tamaño)] [NOT NULL] [restricción_un_campo2 [ [... ] ]] ]
[, campo2 tipo [(tamaño)] [NOT NULL] [restricción_un_campo2 ...
[, ...]]
[, ...]]
[, restricción_varios_campos [, ...] ]]))
[, restricción_varios_campos [, ...]
[[ON {{grupo_fichero | |DEFAULT }}]]
ON grupo_fichero DEFAULT
[[TEXTIMAGE_ON {{grupo_fichero | |DEFAULT }}]]
TEXTIMAGE_ON grupo_fichero DEFAULT
tabla: es el nombre de la tabla que se va aacrear.
tabla: es el nombre de la tabla que se va crear.
campo1, campo2: son nombres de campos. Debe crearse al menos un campo.
campo1, campo2: son nombres de campos. Debe crearse al menos un campo.
tipo: es el tipo de dato asociado al campo.
tipo: es el tipo de dato asociado al campo.
tamaño: es el tamaño del campo en caracteres (solamente para campos de tipo Texto).
tamaño: es el tamaño del campo en caracteres (solamente para campos de tipo Texto).
restricción_un_campo1, restricción_un_campo2: son cláusulas CONSTRAINT que afectan aaun único
restricción_un_campo1, restricción_un_campo2: son cláusulas CONSTRAINT que afectan un único
campo.
campo.
restricción_varios_campos: es una cláusula CONSTRAINT que define un índice de múltiples campos.
restricción_varios_campos: es una cláusula CONSTRAINT que define un índice de múltiples campos.
ON: Especifica el grupo de archivos en el que se almacena la tabla.
ON: Especifica el grupo de archivos en el que se almacena la tabla.
TEXTIMAGE_ON: indica en qué grupo de archivos se almacenan las columnas text, ntext eeimage.
TEXTIMAGE_ON: indica en qué grupo de archivos se almacenan las columnas text, ntext image.
Marta Zorrilla 2008-2009 12
14. IDD III :: ALTER TABLE
IDD III ALTER TABLE
Para modificar el diseño de una tabla que ya existe en la base de datos. Su sintaxis es:
ALTER TABLE tabla
ALTER TABLE tabla
{{ADD [COLUMN] campo tipo[(tamaño)] [NOT NULL] [restricción_un_campo] | |
ADD [COLUMN] campo tipo[(tamaño)] [NOT NULL] [restricción_un_campo]
[ [WITH CHECK | |WITH NOCHECK ] ]ADD {{restricción_tabla }}[ [,...n ] ] | |
WITH CHECK WITH NOCHECK ADD restricción_tabla ,...n
ALTER COLUMN {{campo tipo [(tamaño)] }} | |
ALTER COLUMN campo tipo [(tamaño)]
DROP {COLUMN campo | | CONSTRAINT nombre_restricción} | |
DROP {COLUMN campo CONSTRAINT nombre_restricción}
{{ENABLE | |DISABLE }}TRIGGER {{ALL | |nombre_trigger [ [,...n ] ]}} | |
ENABLE DISABLE TRIGGER ALL nombre_trigger ,...n
{{CHECK | |NOCHECK }}CONSTRAINT {{ALL | |nombre_restricción[ ,...n ] ]}}
CHECK NOCHECK CONSTRAINT ALL nombre_restricción[ ,...n }}
tabla: es el nombre de la tabla que se va aamodificar.
tabla: es el nombre de la tabla que se va modificar.
campo: es el nombre del campo que se va aaañadir oomodificar en la tabla . .
campo: es el nombre del campo que se va añadir modificar en la tabla
tipo: es el tipo de dato que se asigna aacampo.
tipo: es el tipo de dato que se asigna campo.
tamaño: es el tamaño del campo en caracteres (solamente para campos de tipo Texto).
tamaño: es el tamaño del campo en caracteres (solamente para campos de tipo Texto).
restricción_un_campo: es una cláusula CONSTRAINT que afectan aaun único campo.
restricción_un_campo: es una cláusula CONSTRAINT que afectan un único campo.
restricción_tabla: es una cláusula CONSTRAINT que afecta aavarios campos.
restricción_tabla: es una cláusula CONSTRAINT que afecta varios campos.
nombre_restricción: es el nombre de la restricción que se va aaeliminar ooha habilitar/deshabilitar.
nombre_restricción: es el nombre de la restricción que se va eliminar ha habilitar/deshabilitar.
nombre_trigger: es el nombre del desencadenador que se va aaeliminar ooha habilitar/deshabilitar.
nombre_trigger: es el nombre del desencadenador que se va eliminar ha habilitar/deshabilitar.
Marta Zorrilla 2008-2009 14
15. IDD IV :: CLÁUSULA CONSTRAINT SOBRE UN SOLO CAMPO
IDD IV CLÁUSULA CONSTRAINT SOBRE UN SOLO CAMPO
Se utiliza en instrucciones CREATE TABLE y ALTER TABLE para crear o eliminar restricciones.
Esta cláusula puede referirse a un campo de la tabla. La restricción Primary Key y Unique generan
índice, Foreign key no.
CONSTRAINT nombre
CONSTRAINT nombre
{ {[ [NULL | |NOT NULL ] ]| |
NULL NOT NULL
[ [{ {PRIMARY KEY | |UNIQUE } }
PRIMARY KEY UNIQUE
[ [CLUSTERED | |NONCLUSTERED ] ]
CLUSTERED NONCLUSTERED
[ [WITH FILLFACTOR ==factor_relleno ] ]
WITH FILLFACTOR factor_relleno
[ [ON {grupo_ficheros | |DEFAULT} ] ]] ]
ON {grupo_ficheros DEFAULT}
] ]| |
[ [[ [FOREIGN KEY ] ]
FOREIGN KEY
REFERENCES otra_tabla[ (campo_externo1) ] ]
REFERENCES otra_tabla[ (campo_externo1)
[ [ON DELETE {NO ACTION | |CASCADE | |SET NULL | |SET DEFAULT } }] ]
ON DELETE {NO ACTION CASCADE SET NULL SET DEFAULT
[ [ON UPDATE {NO ACTION | |CASCADE | |SET NULL | |SET DEFAULT } }] ]
ON UPDATE {NO ACTION CASCADE SET NULL SET DEFAULT
[ [NOT FOR REPLICATION ] ]
NOT FOR REPLICATION
] ]| |
CHECK [ [NOT FOR REPLICATION ] ] ( (expresión_lógica ) )
CHECK NOT FOR REPLICATION expresión_lógica
}}
nombre: es el nombre de la restricción que se va aacrear.
nombre: es el nombre de la restricción que se va crear.
otra_tabla: es el nombre de la tabla aala que se hace referencia.
otra_tabla: es el nombre de la tabla la que se hace referencia.
campo_externo1: son los nombres de los campos de la otra_tabla aalos que se hace referencia.
campo_externo1: son los nombres de los campos de la otra_tabla los que se hace referencia.
factor_relleno: especifica cuánto se debe llenar cada página de índice utilizada para almacenar los
factor_relleno: especifica cuánto se debe llenar cada página de índice utilizada para almacenar los
datos de índice.Entre 00yy100. Por defecto 0.
datos de índice.Entre 100. Por defecto 0.
grupo_ficheros: indica dónde se almacena la tabla
grupo_ficheros: indica dónde se almacena la tabla
expresión_lógica: Expresión que devuelve true oofalse
expresión_lógica: Expresión que devuelve true false
Marta Zorrilla 2008-2009 15
16. IDD V: CLÁUSULA CONSTRAINT SOBRE TABLA
IDD V: CLÁUSULA CONSTRAINT SOBRE TABLA
CONSTRAINT nombre
CONSTRAINT nombre
{{ [ [{ {PRIMARY KEY | |UNIQUE } }
PRIMARY KEY UNIQUE
[ [CLUSTERED | |NONCLUSTERED ] ]
CLUSTERED NONCLUSTERED
{ {(principal1 [ [ASC | |DESC ] ][ [, ,principal2 [,[,...] ] ]) )} }
(principal1 ASC DESC principal2 ...]
[ [WITH FILLFACTOR = factor_relleno]
WITH FILLFACTOR = factor_relleno]
[ [ON { {grupo_ficheros | |DEFAULT } }] ]
ON grupo_ficheros DEFAULT
]] ||
FOREIGN KEY
FOREIGN KEY
[ [(referencia1 [,[,referencia2 [,[,...] ] ]) )] ]
(referencia1 referencia2 ...]
REFERENCES otra_tabla [ [(campo_externo1 [ [,... campo_externo2 ] ]) )] ]
REFERENCES otra_tabla (campo_externo1 ,... campo_externo2
[ [ON DELETE {NO ACTION | |CASCADE | |SET NULL | |SET DEFAULT } }] ]
ON DELETE {NO ACTION CASCADE SET NULL SET DEFAULT
[ [ON UPDATE {NO ACTION | |CASCADE | |SET NULL | |SET DEFAULT } }] ]
ON UPDATE {NO ACTION CASCADE SET NULL SET DEFAULT
[ [NOT FOR REPLICATION ] ] | |
NOT FOR REPLICATION
CHECK [ [NOT FOR REPLICATION ] ] (expresión_lógica ) )
CHECK NOT FOR REPLICATION (expresión_lógica
}}
nombre: es el nombre de la restricción que se va aacrear.
nombre: es el nombre de la restricción que se va crear.
principal1, principal2: son los nombres de los campos que compondrán la clave principal.
principal1, principal2: son los nombres de los campos que compondrán la clave principal.
referencia1, referencia2: son los nombres de los campos que hacen referencia aaotros de otra tabla.
referencia1, referencia2: son los nombres de los campos que hacen referencia otros de otra tabla.
otra_tabla: es el nombre de la tabla aala que se hace referencia.
otra_tabla: es el nombre de la tabla la que se hace referencia.
campo_externo1, campo_externo2: son los nombres de los campos de la otra_tabla aalos que se
campo_externo1, campo_externo2: son los nombres de los campos de la otra_tabla los que se
hace referencia.
hace referencia.
expresión_lógica: criterio que se ha de cumplir. Devuelve true oofalse
expresión_lógica: criterio que se ha de cumplir. Devuelve true false
Marta Zorrilla 2008-2009 16
17. Ejemplo
Ejemplo
La base de datos trata de informatizar el proceso de compras de una empresa. Esto
La base de datos trata de informatizar el proceso de compras de una empresa. Esto
es, recoger los pedidos de los artículos, contemplados en su catálogo, que compran aa
es, recoger los pedidos de los artículos, contemplados en su catálogo, que compran
proveedores ya conocidos.
proveedores ya conocidos.
Reglas:
Reglas:
- -No puede seleccionar un artículo descatalogado.
No puede seleccionar un artículo descatalogado.
- -Si el stock alcanza el mínimo establecido, se ha de notificar como un evento.
Si el stock alcanza el mínimo establecido, se ha de notificar como un evento.
Marta Zorrilla 2008-2009 17
18. IDD: CREATE TABLE
IDD: CREATE TABLE Escribir las instrucciones SQL necesarias para construir
Ejemplos
Ejemplos la base de datos cuyo esquema de relaciones es:
CREATE TABLE Lineas ( (
CREATE TABLE Lineas
CREATE TABLE Proveedores ( ( NOT NULL,
numped INTEGER NOT NULL,
CREATE TABLE Proveedores
numped INTEGER
codigpro CHAR(4) NOT NULL NOT NULL,
numlin NOT NULL CONSTRAINT id_pro PRIMARY KEY,
numlin
codigpro CHAR(4) SMALLINT NOT NULL,
SMALLINT CONSTRAINT id_pro PRIMARY KEY,
CREATE TABLE Articulos (
CREATE TABLE Articulos
CREATE TABLEcodigart NOT( NULLNOTNULL,
cifpro
cifpro CHAR(12) NOT NULL CONSTRAINT u_cif UNIQUE,
CREATE TABLEPedidos CHAR(6) NOT NULL,
codigart (
CHAR(12) (CHAR(6)
Pedidos CONSTRAINT u_cif UNIQUE,
codigart CHAR(6) NOT NULL CONSTRAINT id_art PRIMARY KEY,
nombrpro codigartINTEGER NULL, NULL NULL CONSTRAINT id_ped PRIMARY KEY,
unilin CHAR(6) NOT NULL, CONSTRAINT id_art PRIMARY KEY,
numped INTEGER NULL, NOT NULL CONSTRAINT id_ped PRIMARY KEY,
nombrpro CHAR(30) FLOAT NOT NOT
CHAR(30) NOT
numped unilin NOT
FLOAT NOT NULL,
descrart CHAR(40) NOT NULL,
descrart
direcpro CHAR(30)CHAR(40) NOT NULL,NULL DEFAULT getdate(),
fechaped DATETIME
preunlin MONEY
direcpro CHAR(30) NOT NULL,NOTNULL,
fechaped DATETIME NOT NOTNULL DEFAULT getdate(),
preunlin NOT NULL, NOT
MONEY NULL,
preunart MONEY NOT NULL,
preunart
cpostpro CHAR(5) MONEYNULLCHECK NULL,
desculin FLOAT
codigpro CHAR(4)
NOT NULL,
cpostpro CHAR(5) NOT NULLNOT NOT(cpostpro like '[0-9][0-9][0-9][0-9][0-9]'),
desculin NOT
codigpro CHAR(4) NOT (cpostpro (desculin>=0 and desculin<=100),
FLOAT NOTNULL CHECK like '[0-9][0-9][0-9][0-9][0-9]'),
NULL CHECK (desculin>=0 and desculin<=100),
CHECK NULL,
stockart INTEGER NOT NULL CHECK (stockart >0),
localpro stockartFLOAT ([preunlin]NULLNULL(1–[desculin] >0), and ivaped<100),
ivaped FLOATAS NULL, NOT
CHAR(20) AS NULL,
NOT
CHECK (stockart / 100)),
ivaped totallinINTEGER NOT NOT NULLCHECK (ivaped>0
localpro CHAR(20) NOT ([preunlin]**[unilin] **(1 CHECK(ivaped>0 and ivaped<100),
totallin [unilin] –[desculin] / 100)),
stockmin INTEGER NOT NULL CHECK (stockmin>0),
telefprofentrped DATETIMENULL, NULLNULL, (stockmin>0),
stockmin INTEGER NOT
CONSTRAINTid_lin PRIMARY NULL,
CHAR(17) NOT
CHAR(17) id_lin NOT
CHECK
telefpro CONSTRAINTNOT NULL, NOT KEY(numped, numlin),
fentrped DATETIME PRIMARY KEY (numped, numlin),
fecbaja DATETIME)
fecbaja DATETIME)
faxpro CONSTRAINT f_ped FOREIGN(codigpro) REFERENCES Proveedores (codigpro),
CONSTRAINT f_pro FOREIGN KEY KEY (numped) REFERENCES Pedidos (codigpro),
CHAR(17),
faxpro CONSTRAINT f_ped FOREIGN(codigpro) REFERENCES Proveedores (numped),
CONSTRAINT f_pro FOREIGN KEY KEY (numped) REFERENCES Pedidos (numped),
CHAR(17),
emailpro CONSTRAINT f_art FOREIGN KEY (codigart) REFERENCES Articulos (codigart))
CONSTRAINT c_fecha CHECK (fechaped<=fentrped))
CHAR(25),
emailpro CONSTRAINT f_art FOREIGN KEY (codigart) REFERENCES Articulos (codigart))
CONSTRAINT c_fecha CHECK (fechaped<=fentrped))
CHAR(25),
procepro CHAR(10) NOT NULL CHECK (procepro in ('UE', 'No UE')))
procepro CHAR(10) NOT NULL CHECK (procepro in ('UE', 'No UE')))
Marta Zorrilla 2008-2009 18
19. IDD :: ALTER TABLE. Ejemplos
IDD ALTER TABLE. Ejemplos
ALTER TABLE [dbo].[Proveedores]
ALTER TABLE [dbo].[Proveedores]
ADD CONSTRAINT [id_pro] PRIMARY KEY CLUSTERED (([codigpro] ))
ADD CONSTRAINT [id_pro] PRIMARY KEY CLUSTERED [codigpro]
ON [PRIMARY]
ON [PRIMARY]
GO
GO
ALTER TABLE [dbo].[Pedidos] WITH NOCHECK ADD
ALTER TABLE [dbo].[Pedidos] WITH NOCHECK ADD
CONSTRAINT [DF_Pedidos_fechaped] DEFAULT (getdate()) FOR [fechaped],
CONSTRAINT [DF_Pedidos_fechaped] DEFAULT (getdate()) FOR [fechaped],
CONSTRAINT [c_fecha] CHECK ([fechaped] <= [fentrped]),
CONSTRAINT [c_fecha] CHECK ([fechaped] <= [fentrped]),
CHECK ([ivaped] > 0 and [ivaped] < 100)
CHECK ([ivaped] > 0 and [ivaped] < 100)
GO
GO
ALTER TABLE [dbo].[Proveedores] ADD
ALTER TABLE [dbo].[Proveedores] ADD
CONSTRAINT [u_cif] UNIQUE NONCLUSTERED (([cifpro] )) ON [PRIMARY] , ,
CONSTRAINT [u_cif] UNIQUE NONCLUSTERED [cifpro] ON [PRIMARY]
CHECK ([cpostpro] like '[0-9][0-9][0-9][0-9][0-9]'),
CHECK ([cpostpro] like '[0-9][0-9][0-9][0-9][0-9]'),
CHECK ([procepro] = 'No UE' or [procepro] = 'UE')
CHECK ([procepro] = 'No UE' or [procepro] = 'UE')
GO
GO
Marta Zorrilla 2008-2009 19
20. IDD VI :: CREATE INDEX
IDD VI CREATE INDEX
Para crear un índice nuevo en una tabla que ya existe en la base de datos. Su sintaxis es:
CREATE [ [UNIQUE ] ][ [CLUSTERED | |NONCLUSTERED ] ]INDEX índice
CREATE UNIQUE CLUSTERED NONCLUSTERED INDEX índice
ON {tabla | |vista }}(campo1 [ [{ASC | |DESC }] [, campo2 [{ASC|DESC}], ...])
ON {tabla vista (campo1 {ASC DESC }] [, campo2 [{ASC|DESC}], ...])
[ [WITH < opción_índice > [ [,...n] ] ]
WITH < opción_índice > ,...n]
[ [ON grupo_ficheros ] ]
ON grupo_ficheros
< opción_índice > :: =
< opción_índice > :: =
{{PAD_INDEX | |FILLFACTOR = factor_relleno | |IGNORE_DUP_KEY | |
PAD_INDEX FILLFACTOR = factor_relleno IGNORE_DUP_KEY
DROP_EXISTING | |STATISTICS_NORECOMPUTE | | SORT_IN_TEMPDB }}
DROP_EXISTING STATISTICS_NORECOMPUTE SORT_IN_TEMPDB
UNIQUE: señala que el índice es de unicidad, en caso contrario permitirá repetición de valores.
UNIQUE: señala que el índice es de unicidad, en caso contrario permitirá repetición de valores.
índice: es el nombre del índice que se va aacrear.
índice: es el nombre del índice que se va crear.
tabla/vista: es el nombre de una tabla/vista existente aala que estará asociado el índice.
tabla/vista: es el nombre de una tabla/vista existente la que estará asociado el índice.
campo1, campo2: son los nombres de los campos que van aaformar el índice. Puede ser un solo
campo1, campo2: son los nombres de los campos que van formar el índice. Puede ser un solo
campo. Para forzar una ordenación descendente de un campo, hay que utilizar la palabra reservada
campo. Para forzar una ordenación descendente de un campo, hay que utilizar la palabra reservada
DESC; sino se especifica oose escribe ASC, se entiende que la ordenación es ascendente.
DESC; sino se especifica se escribe ASC, se entiende que la ordenación es ascendente.
CREATE INDEX FK_Lineas ON Lineas (codigart)
CREATE INDEX FK_Lineas ON Lineas (codigart)
Marta Zorrilla 2008-2009 20
21. SQL Server 2005
Tabla del catálogo: sysindexes
Índice no cluster
Índice cluster
Marta Zorrilla 2008-2009 21
22. Tipos de datos
Tipos de datos
Consideraciones previas:
Consideraciones previas:
• Qué tipo de información se va a almacenar. Por ejemplo, no se
• Qué tipo de información se va a almacenar. Por ejemplo, no se
pueden guardar caracteres en un campo cuyo tipo de datos sea
pueden guardar caracteres en un campo cuyo tipo de datos sea
numérico.
numérico.
• El espacio de almacenamiento necesario (dimensionar el campo).
• El espacio de almacenamiento necesario (dimensionar el campo).
• Qué tipo de operaciones se van a realizar con los valores del campo.
• Qué tipo de operaciones se van a realizar con los valores del campo.
Pues, por ejemplo, no se puede calcular la suma de dos cadenas de
Pues, por ejemplo, no se puede calcular la suma de dos cadenas de
texto.
texto.
• Si se desea ordenar o indexar por ese campo. Los criterios de
• Si se desea ordenar o indexar por ese campo. Los criterios de
ordenación difieren en función del tipo de dato, así, los números
ordenación difieren en función del tipo de dato, así, los números
almacenados en un campo texto se ordenan según el valor de su
almacenados en un campo texto se ordenan según el valor de su
código ASCII (1,10,11,2,20,...) que no coincide con la ordenación
código ASCII (1,10,11,2,20,...) que no coincide con la ordenación
numérica.
numérica.
Marta Zorrilla 2008-2009 22
23. Tipos de datos en SQL Server 2005 I
Tipos de datos en SQL Server 2005 I
NUMÉRICOS
bigint Datos enteros (números enteros) comprendidos entre -2^63 (-9223372036854775808) y 2^63
-1 (9223372036854775807).
int Datos enteros (números enteros) comprendidos entre -2^31 (-2.147.483.648) y 2^31 - 1
(2.147.483.647).
smallint Datos enteros comprendidos entre 2^15 (-32.768) y 2^15 - 1 (32.767).
tinyint Datos enteros comprendidos 0 y 255.
bit Datos enteros con valor 1 ó 0.
decimal Datos de precisión y escala numérica fijas comprendidos entre -10^38 +1 y 10^38 – 1.
numeric Funcionalmente equivalente a decimal.
money Valores de moneda comprendidos entre -2^63 (-922.337.203.685.477,5808) y 2^63 - 1
(+922.337.203.685.477,5807), con una precisión de una diezmilésima de la unidad
monetaria.
smallmoney Valores de moneda comprendidos entre -214.748,3648 y +214.748,3647, con una precisión
de una diezmilésima de la unidad monetaria.
float Números con precisión de coma flotante comprendidos entre -1,79E + 308 y 1,79E + 308.
real Números con precisión de coma flotante comprendidos entre -3,40E + 38 y 3,40E + 38.
Marta Zorrilla 2008-2009 23
24. Tipos de datos en SQL Server 2005 II
Tipos de datos en SQL Server 2005 II
FECHAS
datetime Datos de fecha y hora comprendidos entre el 1 de enero de 1753 y el 31 de diciembre de
9999, con una precisión de 3,33 milisegundos.
smalldatetime Datos de fecha y hora comprendidos entre el 1 de enero de 1900 y el 6 de junio de 2079,
con una precisión de un minuto.
CADENAS DE CARACTERES
char Datos de caracteres no Unicode de longitud fija con una longitud máxima de 8.000
caracteres.
varchar Datos no Unicode de longitud variable con un máximo de 8.000 caracteres.
text Datos no Unicode de longitud variable con una longitud máxima de 2^31 - 1 (2.147.483.647)
caracteres.
nchar Datos Unicode de longitud variable con una longitud máxima de 4.000 caracteres.
nvarchar Datos Unicode de longitud variable con una longitud máxima de 4.000 caracteres.
ntext Datos Unicode de longitud variable con una longitud máxima de 2^30 - 1 (1.073.741.823)
caracteres.
Marta Zorrilla 2008-2009 24
25. Tipos de datos en SQL Server 2005 III
Tipos de datos en SQL Server 2005 III
BINARIOS
binary Datos binarios de longitud fija con una longitud máxima de 8.000 bytes.
varbinary Datos binarios de longitud variable con una longitud máxima de 8.000 bytes.
image Datos binarios de longitud variable con una longitud máxima de 2^31 - 1 (2.147.483.647)
bytes.
OTROS TIPOS DE DATOS
cursor Una referencia a un cursor.
sql_variant Un tipo de datos que almacena valores de varios tipos de datos aceptados en SQL Server,
excepto text, ntext, timestamp y sql_variant.
table Un tipo de datos especial que se utiliza para almacenar un conjunto de resultados para un
proceso posterior.
timestamp Un número único para toda la base de datos que se actualiza cada vez que se actualiza una
fila. (sinónimo rowversion)
uniqueiden Un identificador exclusivo global (GUID), necesario para replicación
tifier
xml Almacena una instancia de XML
Marta Zorrilla 2008-2009 25
26. Tipo de dato Autonumérico: IDENTITY
Tipo de dato Autonumérico: IDENTITY
IDENTITY [ [(semilla , ,incremento) ] ]
IDENTITY (semilla incremento)
semilla: valor de inicio.
semilla: valor de inicio.
incremento: incremento que se aplica
incremento: incremento que se aplica
CREATE TABLE dbo.herramientas(
CREATE TABLE dbo.herramientas(
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
Nombre VARCHAR(40) NOT NULL
Nombre VARCHAR(40) NOT NULL
))
-- insertamos valores
-- insertamos valores
INSERT INTO dbo.herramientas (Nombre ))VALUES (‘Martillo')
INSERT INTO dbo.herramientas (Nombre VALUES (‘Martillo')
INSERT INTO dbo.herramientas (Nombre ))VALUES (‘Taladro')
INSERT INTO dbo.herramientas (Nombre VALUES (‘Taladro')
-- si borramos, Martillo, se pierde el ID 1. Para reutilizarlo
-- si borramos, Martillo, se pierde el ID 1. Para reutilizarlo
SET IDENTITY_INSERT dbo.Tool ON
SET IDENTITY_INSERT dbo.Tool ON
INSERT INTO dbo.herramientas (ID, Nombre) VALUES (1, Serrucho')
INSERT INTO dbo.herramientas (ID, Nombre) VALUES (1, Serrucho')
Marta Zorrilla 2008-2009 26
27. Tipos definidos por el usuario: CREATE TYPE
Tipos definidos por el usuario: CREATE TYPE
CREATE TYPE [ [nombre_schema. ] ]nombre
CREATE TYPE nombre_schema. nombre
{{
FROM tipo_base
FROM tipo_base
[ [((precision [ [, ,escala ] ])) ] ]
precision escala
[ [NULL | |NOT NULL ] ]
NULL NOT NULL
| |EXTERNAL NAME assembly_name [ [.class_name ] ]
EXTERNAL NAME assembly_name .class_name
}}[ [; ;] ]
nombre: es el nombre del tipo de dato que se va aacrear.
nombre: es el nombre del tipo de dato que se va crear.
tipo_base: tipo de dato base en el que se a`poya
tipo_base: tipo de dato base en el que se a`poya
CREATE TYPE iva
CREATE TYPE iva
FROM float NOT NULL ; ;
FROM float NOT NULL
Marta Zorrilla 2008-2009 27
28. CREATE RULE y DEFAULT (no estándar)
CREATE RULE y DEFAULT (no estándar)
Para crear una regla para ser utilizada en un tipo de dato definido por el usuario en la
base de datos. Su sintaxis es:
CREATE RULE nombre
CREATE RULE nombre
AS expresion_condicional
AS expresion_condicional
nombre: es el nombre de la función que se va aacrear.
nombre: es el nombre de la función que se va crear.
expresion_condicional: criterio que debe cumplir la regla
expresion_condicional: criterio que debe cumplir la regla
Para crear un valor por defecto utilizable en un tipo de dato definido por usuario en la
base de datos. Su sintaxis es:
CREATE DEFAULT nombre
CREATE DEFAULT nombre
AS expresion_constante
AS expresion_constante
nombre: es el nombre de la función que se va aacrear.
nombre: es el nombre de la función que se va crear.
expresion_constante: valor
expresion_constante: valor
Marta Zorrilla 2008-2009 28
29. CREATE RULE y DEFAULT: ejemplo
CREATE RULE y DEFAULT: ejemplo
Objetivo crear un tipo de dato definido por el usuario, denominado “iva”
CREATE RULE r_porcentaje
CREATE RULE r_porcentaje
AS @valor>=0 and @valor<=100
AS @valor>=0 and @valor<=100
CREATE DEFAULT d_iva AS 16
CREATE DEFAULT d_iva AS 16
EXEC sp_addtype iva, 'float', 'not null'
EXEC sp_addtype iva, 'float', 'not null'
go
go
EXEC sp_bindrule 'r_porcentaje', 'iva'
EXEC sp_bindrule 'r_porcentaje', 'iva'
go
go
EXEC sp_bindefault 'd_iva', 'iva'
EXEC sp_bindefault 'd_iva', 'iva'
Marta Zorrilla 2008-2009 29
31. Instrucciones de Manipulación de Datos (IMD) I
Instrucciones de Manipulación de Datos (IMD) I
Las IMD permiten actuar sobre los propios datos.
Las IMD permiten actuar sobre los propios datos.
Las operaciones básicas de manipulación de datos son: insertar,
Las operaciones básicas de manipulación de datos son: insertar,
modificar, borrar y consultar.
modificar, borrar y consultar.
Las tres primeras permiten alterar el contenido de la base de datos.
Las tres primeras permiten alterar el contenido de la base de datos.
La última consiste en localizar datos para su observación.
La última consiste en localizar datos para su observación.
Principales instrucciones:
Principales instrucciones:
INSERT
INSERT
UPDATE
UPDATE
DELETE
DELETE
SELECT
SELECT
Marta Zorrilla 2008-2009 31
32. IMD II :: INSERT
IMD II INSERT
Permite añadir una o más filas en una tabla. La sintaxis para insertar una sola fila es:
INSERT INTO destino [(campo1[, campo2[, ...]])]
INSERT INTO destino [(campo1[, campo2[, ...]])]
VALUES (valor1[, valor2[, ...]])
VALUES (valor1[, valor2[, ...]])
La sintaxis para insertar varias filas es:
INSERT INTO destino [(campo1[, campo2[, ...]])]
INSERT INTO destino [(campo1[, campo2[, ...]])]
Instrucción_SELECT
Instrucción_SELECT
destino: es el nombre de la tabla o vista donde se van a añadir filas.
campo1, campo2: son los nombres de los campos donde se van a añadir los datos.
valor1, valor2: son los valores que tomarán los campos en la nueva fila que se van a insertar. Cada valor
se asigna al campo que corresponde a la posición del valor en la lista, así, valor1 se asigna al campo1,
valor2 al campo2, y así sucesivamente. Por su frecuencia, cabe mencionar que los valores que se asignen a
campos de texto deben escribirse entre comillas simples ('texto').
Instrucción_SELECT: es la instrucción SELECT cuya ejecución proporcionará las filas a insertar.
Marta Zorrilla 2008-2009 32
33. IMD III :: UPDATE
IMD III UPDATE
Permite modificar información existente en una o varias filas de una tabla.
Su sintaxis es:
UPDATE destino SET campo1=nuevovalor1 [, campo2=nuevovalor2 [, ...]]
UPDATE destino SET campo1=nuevovalor1 [, campo2=nuevovalor2 [, ...]]
[WHERE condición]
[WHERE condición]
• destino: es el nombre de la tabla o vista en la que se desea modificar datos.
• campo1, campo2: son los nombres de los campos que van a modificar su valor.
• nuevovalor1, nuevovalor2: son expresiones que determinan los valores que van a tomar los
campos de las filas que se van a actualizar.
• condición: es una expresión lógica que determina qué filas se actualizarán. Sólo se
actualizarán las filas que satisfagan la expresión. Si no se incluye cláusula WHERE (no hay
condición) se modificarán todas las filas de la tabla.
Marta Zorrilla 2008-2009 33
34. IMD IV :: DELETE
IMD IV DELETE
Permite eliminar una o varias filas de una tabla. Su sintaxis es:
DELETE FROM destino [WHERE condición]
DELETE FROM destino [WHERE condición]
• destino: es el nombre de la tabla o vista cuyas filas se van a
eliminar.
• condición: es una expresión lógica que determina qué filas se
borrarán. Sólo se borrarán las filas que satisfagan la expresión. Si no
se incluye cláusula WHERE (no hay condición) se borrarán todas las
filas de la tabla.
Marta Zorrilla 2008-2009 34
35. IMD V :: INSERT, UPDATE, DELETE
IMD V INSERT, UPDATE, DELETE
Ejemplos
Ejemplos
Insertar una nueva fila en la tabla Proveedores.
INSERT INTO Proveedores (codigpro, cifpro, nombrpro, direcpro, cpostpro, localpro, telefpro, faxpro,
INSERT INTO Proveedores (codigpro, cifpro, nombrpro, direcpro, cpostpro, localpro, telefpro, faxpro,
procepro)
procepro)
VALUES ('P005', 'A39144325', 'Angulo Lastra, Antonio', 'Hernán Cortés,18', '39002', 'Santander', '(34)
VALUES ('P005', 'A39144325', 'Angulo Lastra, Antonio', 'Hernán Cortés,18', '39002', 'Santander', '(34)
942 202 022', '(34) 942 202 022', 'UE')
942 202 022', '(34) 942 202 022', 'UE')
Incorporar el e-mail del proveedor Luis Gil Laso, con valor mailto:gil@unican.es.
UPDATE Proveedores SET emailpro='mailto:gil@unican.es'
UPDATE Proveedores SET emailpro='mailto:gil@unican.es'
WHERE codigpro='P004'
WHERE codigpro='P004'
Borrar todos los proveedores de Santander.
DELETE FROM Proveedores
DELETE FROM Proveedores
WHERE localpro='Santander'
WHERE localpro='Santander'
Marta Zorrilla 2008-2009 35
37. Importación/Exportación de datos
Importación/Exportación de datos
Instrucción INSERT / /SELECT
Instrucción INSERT SELECT
Import/Export data (sólo SQL Server 2005)
Import/Export data (sólo SQL Server 2005)
Conexión ODBC/OLEDB
Conexión ODBC/OLEDB
Herramienta Integration Services
Herramienta Integration Services
ooGráfica, basada en objetos
Gráfica, basada en objetos
ooOrigen/destino de datos (OLEDB, ODBC)
Origen/destino de datos (OLEDB, ODBC)
ooTransformaciones más complejas
Transformaciones más complejas
Marta Zorrilla 2008-2009 37
38. IMD VI :: SELECT
IMD VI SELECT
Está dedicada a obtener información de la base de datos. El resultado de su
ejecución, si existe, siempre tiene estructura de una tabla y los campos de sus filas
responden a la lista de selección. Tiene enormes posibilidades, lo que hace que su
sintaxis presente muchas variantes.
SELECT [ [predicado ] ] Lista_de_selección
SELECT predicado Lista_de_selección
[INTO tabla_temporal]
[INTO tabla_temporal]
FROM lista_de_tablas
FROM lista_de_tablas
[WHERE condición ] ]
[WHERE condición
[GROUP BY lista_campos_group_by]
[GROUP BY lista_campos_group_by]
[HAVING condición_group_by]
[HAVING condición_group_by]
[ORDER BY colum1 { {[ASC] | |DESC } }[,[,colum2 { {[ASC] | |DESC }, .... ] ]] ]
[ORDER BY colum1 [ASC] DESC colum2 [ASC] DESC }, ....
Marta Zorrilla 2008-2009 38
39. IMD VII :: SELECT
IMD VII SELECT
predicado: puede tomar uno de los siguientes valores: ALL, DISTINCT o TOP número_de_filas (devuelve el
número de registros especificado según una cláusula ORDER BY). Puede utilizar el predicado para limitar el número
de registros devueltos. Si no especifica ninguno, el valor predeterminado es ALL.
Lista_de_selección: es el conjunto de los elementos que serán aportados como respuesta. Éstos, pueden ser
expresiones y funciones separados por comas, aunque generalmente responden a una de las siguientes alternativas:
{ * | tabla.* | [tabla.]campo1 [AS alias1] [, [tabla.]campo2 [AS alias2] , ...] | funciones}
o * especifica que se seleccionan todos los campos de la tabla o tablas a las que se accede.
o tabla: es el nombre de la tabla que contiene los campos de la que se van a seleccionar los registros.
o campo1, campo2: son los nombres de los campos que contienen los datos que desea recuperar.
o alias1, alias2: Los nombres que se van a utilizar como encabezados de columnas en vez de los nombres de
columnas originales en tabla.
o funciones: funciones definidas por el usuario, anteponer el propietario.
tabla_temporal: es el nombre de la tabla que se creará para almacenar los registros obtenidos.
lista_de_tablas: representa el nombre de la tabla o las tablas que contienen los datos a los que se desea acceder.
condición: es una expresión lógica con los criterios de selección de registros.
lista_campos_group_by: son los nombres de los campos que se van a utilizar para agrupar los registros.
condición_group_by: son las condiciones que se imponen sobre el criterio de agrupamiento.
colum1, colum2: son nombres de elementos de la lista de selección o la posición que ocupan en ella. ASC quiere
decir ordenación ascendente (es la opción por defecto) y DESC significa ordenación descendente.
Marta Zorrilla 2008-2009 39
40. IMD VIII :: SELECT
IMD VIII SELECT
Con Operadores
Con Pred. BETWEEN... AND...
Búsquedas
Búsquedas Con Pred. IN (lista_de_valores)
Sencillas
Sencillas Con Pred. LIKE ‘cadena_caracteres’
Condiciones de
Condiciones de Con Pred. NULL
Comparación
Comparación
Simple
Búsquedas Condiciones de
Condiciones de Múltiple
Búsquedas
Cualificadas Combinación
Combinación
Cualificadas Autocombinación
Combinación Externa
Condiciones de
Condiciones de
Subsentencia
Subsentencia De Comparación
Con Predicado IN
Con Predicado EXISTS
Marta Zorrilla 2008-2009 40
41. IMD IX :: SELECT
IMD IX SELECT
Funciones de Grupo
Funciones de Grupo
Funciones de Fecha
Funciones de Fecha
Agrupamiento de Datos
Agrupamiento de Datos Condición de Agrupamiento
Condición de Agrupamiento
Ordenación del Resultado
Ordenación del Resultado
Guardar Resultado
Guardar Resultado
en una Tabla
en una Tabla
Unión, Intersección y Excepción de Sentencias
Unión, Intersección y Excepción de Sentencias
Uso de funciones almacenadas
Uso de funciones almacenadas
Marta Zorrilla 2008-2009 41
42. IMD X :: SELECT
IMD X SELECT
Búsquedas Sencillas (Ejemplos)
Búsquedas Sencillas (Ejemplos)
• Obtener el contenido de la tabla Articulos.
SELECT ** FROM Articulos
SELECT FROM Articulos
• Listar el nombre y el teléfono de todos los Proveedores.
SELECT nombrpro as Nombre, telefpro as Telf
SELECT nombrpro as Nombre, telefpro as Telf
FROM Proveedores
FROM Proveedores
Marta Zorrilla 2008-2009 42
43. IMD XI :: SELECT
IMD XI SELECT
Búsquedas Cualificadas. Cond. de Comparación 1
Búsquedas Cualificadas. Cond. de Comparación 1
(Ejemplos)
(Ejemplos)
Las condiciones de comparación son expresiones lógicas que permiten comparar una
columna o expresión con otra columna, expresión o lista de columnas. Pueden adoptar
una de las formas siguientes:
exp operador_de_comparación exp
exp operador_de_comparación exp
exp [NOT] BETWEEN exp AND exp
exp [NOT] BETWEEN exp AND exp
exp [NOT] IN (lista de valores)
exp [NOT] IN (lista de valores)
campo [NOT] LIKE 'cadena_de_caracteres'
campo [NOT] LIKE 'cadena_de_caracteres'
campo IS [NOT] NULL
campo IS [NOT] NULL
• Encontrar los artículos cuyo precio unitario sea superior a 180 € y su stock sea
inferior o igual a 100.
SELECT ** FROM Articulos
SELECT FROM Articulos
WHERE preunart > 180 AND stockart <= 100
WHERE preunart > 180 AND stockart <= 100
Marta Zorrilla 2008-2009 43
44. IMD XII :: SELECT
IMD XII SELECT
Búsquedas Cualificadas. Cond. de Comparación 2
Búsquedas Cualificadas. Cond. de Comparación 2
(Ejemplos)
(Ejemplos)
• Listar los artículos cuyo precio unitario esté comprendido entre 180 € y 300 €.
SELECT ** FROM Articulos
SELECT FROM Articulos
WHERE preunart BETWEEN 180 AND 300
WHERE preunart BETWEEN 180 AND 300
• Hallar todos los proveedores de las ciudades de Santander, Madrid y Barcelona.
SELECT codigpro, nombrpro, direcpro, cpostpro, localpro FROM Proveedores
SELECT codigpro, nombrpro, direcpro, cpostpro, localpro FROM Proveedores
WHERE localpro IN ('Santander', 'Madrid', 'Barcelona')
WHERE localpro IN ('Santander', 'Madrid', 'Barcelona')
Marta Zorrilla 2008-2009 44
45. IMD XIII :: SELECT
IMD XIII SELECT
Búsquedas Cualificadas. Cond. de Comparación 3
Búsquedas Cualificadas. Cond. de Comparación 3
(Ejemplos)
(Ejemplos)
• Encontrar todos los proveedores cuyo primer apellido comience por una letra
comprendida entre la A y la J.
SELECT codigpro, nombrpro, direcpro, cpostpro, localpro FROM Proveedores
SELECT codigpro, nombrpro, direcpro, cpostpro, localpro FROM Proveedores
WHERE nombrpro LIKE '[A-J]%'
WHERE nombrpro LIKE '[A-J]%'
• Hallar todos los proveedores de los que no se tenga información sobre su correo
electrónico.
SELECT codigpro, nombrpro, direcpro, cpostpro, localpro, telefpro
SELECT codigpro, nombrpro, direcpro, cpostpro, localpro, telefpro
FROM Proveedores
FROM Proveedores
WHERE emailpro IS NULL
WHERE emailpro IS NULL
Marta Zorrilla 2008-2009 45
46. IMD XIV :: SELECT
IMD XIV SELECT
Búsquedas Cualificadas. Cond. de Combinación
Búsquedas Cualificadas. Cond. de Combinación
Combinación Simple (Ejemplo)
Combinación Simple (Ejemplo)
Las búsquedas cualificadas son las que afectan a datos de más de una tabla.
Una Combinación Simple es aquella en la que la condición de la cláusula
Una Combinación Simple es aquella en la que la condición de la cláusula
FROM (o WHERE) contiene una comparación de igualdad entre campos
FROM (o WHERE) contiene una comparación de igualdad entre campos
pertenecientes a dos tablas distintas.
pertenecientes a dos tablas distintas.
• Listar todos los proveedores a los que se ha efectuado algún pedido entre el 20/1/2006 y
el 15/9/2006.
SELECT DISTINCT Proveedores.codigpro, nombrpro, direcpro, localpro
SELECT DISTINCT Proveedores.codigpro, nombrpro, direcpro, localpro
FROM Proveedores INNER JOIN Pedidos
FROM Proveedores INNER JOIN Pedidos
ON Proveedores.codigpro = Pedidos.codigpro
ON Proveedores.codigpro = Pedidos.codigpro
WHERE fechaped BETWEEN '2006/01/20' AND '2006/09/15'
WHERE fechaped BETWEEN '2006/01/20' AND '2006/09/15'
Marta Zorrilla 2008-2009 46
47. IMD XIV :: SELECT
IMD XIV SELECT
Búsquedas Cualificadas. Cond. de Combinación
Búsquedas Cualificadas. Cond. de Combinación
Combinación Simple (Ejemplo. Continuación)
Combinación Simple (Ejemplo. Continuación)
SELECT DISTINCT Proveedores.codigpro, nombrpro, direcpro, localpro
SELECT DISTINCT Proveedores.codigpro, nombrpro, direcpro, localpro
FROM Proveedores INNER JOIN Pedidos
FROM Proveedores INNER JOIN Pedidos
ON Proveedores.codigpro = Pedidos.codigpro
ON Proveedores.codigpro = Pedidos.codigpro
WHERE fechaped BETWEEN '2006/01/20' AND '2006/09/15'
WHERE fechaped BETWEEN '2006/01/20' AND '2006/09/15'
Información
de proceso
Marta Zorrilla 2008-2009 47
48. IMD XV :: SELECT
IMD XV SELECT
Búsquedas Cualificadas. Cond. de Combinación
Búsquedas Cualificadas. Cond. de Combinación
Combinación Múltiple (Ejemplo)
Combinación Múltiple (Ejemplo)
Una Combinación Múltiple es aquella
Una Combinación Múltiple es aquella
combinación que relaciona varios
combinación que relaciona varios
campos de más de dos tablas.
campos de más de dos tablas.
• Encontrar todos los artículos que han sido pedidos entre el 15/5/2006 y el 30/5/2006.
SELECT DISTINCT Articulos.codigart, descrart
SELECT DISTINCT Articulos.codigart, descrart
FROM Pedidos INNER JOIN
FROM Pedidos INNER JOIN
(Lineas INNER JOIN Articulos ON Lineas.codigart = Articulos.codigart)
(Lineas INNER JOIN Articulos ON Lineas.codigart = Articulos.codigart)
ON Pedidos.numped = Lineas.numped
ON Pedidos.numped = Lineas.numped
WHERE fechaped BETWEEN '2006/05/15' AND '2006/05/30'
WHERE fechaped BETWEEN '2006/05/15' AND '2006/05/30'
Marta Zorrilla 2008-2009 48
49. IMD XVI :: SELECT
IMD XVI SELECT
Búsquedas Cualificadas. Cond. de Combinación
Búsquedas Cualificadas. Cond. de Combinación
Autocombinación (Ejemplo)
Autocombinación (Ejemplo)
Una Autocombinación es una combinación de una tabla con ella misma.
Una Autocombinación es una combinación de una tabla con ella misma.
• Localizar todos los pedidos que tienen varias líneas del mismo artículo.
SELECT x.numped, x.numlin, x.codigart
SELECT x.numped, x.numlin, x.codigart
FROM Lineas x, Lineas yy
FROM Lineas x, Lineas
WHERE x.numped = y.numped AND x.numlin <> y.numlin
WHERE x.numped = y.numped AND x.numlin <> y.numlin
AND x.codigart = y.codigart
AND x.codigart = y.codigart
Marta Zorrilla 2008-2009 49
50. IMD XVI :: SELECT
IMD XVI SELECT
Búsquedas Cualificadas. Cond. de Combinación
Búsquedas Cualificadas. Cond. de Combinación
Autocombinación (Ejemplo)
Autocombinación (Ejemplo)
• Localizar todos los pedidos que tienen varias líneas del mismo artículo.
SELECT x.numped, x.numlin, x.codigart
SELECT x.numped, x.numlin, x.codigart
FROM Lineas x, Lineas yy
FROM Lineas x, Lineas
WHERE x.numped = y.numped AND x.numlin <> y.numlin
WHERE x.numped = y.numped AND x.numlin <> y.numlin
AND x.codigart = y.codigart
AND x.codigart = y.codigart
Acceso X Acceso Y
Información Acceso X Acceso Y
de proceso Acceso X Acceso Y
Marta Zorrilla 2008-2009 50
51. IMD XVII :: SELECT
IMD XVII SELECT
Búsquedas Cualificadas. Cond. de Combinación
Búsquedas Cualificadas. Cond. de Combinación
Combinación Externa (Ejemplo)
Combinación Externa (Ejemplo)
Una Combinación Externa es aquella que da preferencia a una tabla
Una Combinación Externa es aquella que da preferencia a una tabla
con respecto a otra. Así, las filas de la tabla dominante serán
con respecto a otra. Así, las filas de la tabla dominante serán
seleccionadas aunque la condición de enlace no se haya verificado.
seleccionadas aunque la condición de enlace no se haya verificado.
• Listar todos los proveedores indicando, en su caso, los que han recibido algún pedido.
SELECT Proveedores.codigpro, nombrpro, Pedidos.numped Preferencia a la
SELECT Proveedores.codigpro, nombrpro, Pedidos.numped tabla de la izquierda
FROM Proveedores LEFT JOIN Pedidos
FROM Proveedores LEFT JOIN Pedidos
ON Proveedores.codigpro = Pedidos.codigpro
ON Proveedores.codigpro = Pedidos.codigpro
SELECT Proveedores.codigpro, nombrpro, Pedidos.numped
SELECT Proveedores.codigpro, nombrpro, Pedidos.numped
FROM Pedidos RIGHT JOIN Proveedores Preferencia a la
FROM Pedidos RIGHT JOIN Proveedores tabla de la derecha
ON Proveedores.codigpro = Pedidos.codigpro
ON Proveedores.codigpro = Pedidos.codigpro
Marta Zorrilla 2008-2009 51
52. IMD XVII :: SELECT
IMD XVII SELECT
Búsquedas Cualificadas. Cond. de Combinación
Búsquedas Cualificadas. Cond. de Combinación
Combinación Externa (Ejemplo 2)
Combinación Externa (Ejemplo 2)
En el FROM de una Consulta pueden establecerse predicados. Estos se aplican
En el FROM de una Consulta pueden establecerse predicados. Estos se aplican
antes de ejecutar el join, mientras que cuando se establecen en el WHERE se
antes de ejecutar el join, mientras que cuando se establecen en el WHERE se
ejecutan al resultado del join.
ejecutan al resultado del join.
El resultado puede ser distinto si la condición de join es LEFT o RIGHT.
El resultado puede ser distinto si la condición de join es LEFT o RIGHT.
• Listar todos los proveedores de Santander indicando, en su caso, los que han recibido
algún pedido.
SELECT Proveedores.codigpro, nombrpro, Pedidos.numped
SELECT Proveedores.codigpro, nombrpro, Pedidos.numped
FROM Pedidos LEFT JOIN Proveedores
FROM Pedidos LEFT JOIN Proveedores
ON Proveedores.codigpro = Pedidos.codigpro
ON Proveedores.codigpro = Pedidos.codigpro
AND Localpro='SANTANDER'
AND Localpro='SANTANDER'
SELECT Proveedores.codigpro, nombrpro, Pedidos.numped
SELECT Proveedores.codigpro, nombrpro, Pedidos.numped
FROM Pedidos LEFT JOIN Proveedores
FROM Pedidos LEFT JOIN Proveedores
ON Proveedores.codigpro = Pedidos.codigpro
ON Proveedores.codigpro = Pedidos.codigpro
WHERE Localpro=‘SANTANDER’
WHERE Localpro=‘SANTANDER’
Marta Zorrilla 2008-2009 52
53. IMD XVIII :: SELECT
IMD XVIII SELECT
Búsquedas Cualificadas. Cond. de Subsentencias
Búsquedas Cualificadas. Cond. de Subsentencias
(Ejemplo de comparación)
(Ejemplo de comparación)
La instrucción SELECT permite contrastar una expresión ooun campo con el resultado
La instrucción SELECT permite contrastar una expresión un campo con el resultado
de otra instrucción (subsentencia) SELECT. A este contraste se le llama condición de
de otra instrucción (subsentencia) SELECT. A este contraste se le llama condición de
subsentencia yylas dos instrucciones se llaman instrucciones imbricadas. A su vez, la
subsentencia las dos instrucciones se llaman instrucciones imbricadas. A su vez, la
subsentencia puede incluir en su condición aaotra subsentencia yyasí sucesivamente.
subsentencia puede incluir en su condición otra subsentencia así sucesivamente.
Las condiciones de subsentencia pueden adoptar una de las formas siguientes:
Las condiciones de subsentencia pueden adoptar una de las formas siguientes:
exp operador_de_comparación {ALL | |[ANY | |SOME] }} (instrucción SELECT)
exp operador_de_comparación {ALL [ANY SOME] (instrucción SELECT)
exp [NOT] IN (instrucción SELECT)
exp [NOT] IN (instrucción SELECT)
campo [NOT] EXISTS (instrucción SELECT)
campo [NOT] EXISTS (instrucción SELECT)
• Encontrar los artículos cuyo stock es mayor que toda cantidad pedida del mismo artículo.
SELECT articulos.codigart, descrart, stockart FROM Articulos
SELECT articulos.codigart, descrart, stockart FROM Articulos
WHERE stockart > ALL (SELECT unilin FROM Lineas
WHERE stockart > ALL (SELECT unilin FROM Lineas
WHERE Articulos.codigart = Lineas.codigart)
WHERE Articulos.codigart = Lineas.codigart)
Marta Zorrilla 2008-2009 53
54. IMD XIX :: SELECT
IMD XIX SELECT
Búsquedas Cualificadas. Cond. de Subsentencias. • Listar los artículos que no han sido pedidos
Búsquedas Cualificadas. Cond. de Subsentencias.
(Ejemplos con predicados IN y EXIST)
(Ejemplos con predicados IN y EXIST)
entre el 24 de Septiembre y el 21 de
Noviembre de 2006.
SELECT DISTINCT Articulos.codigart, descrart FROM Articulos
SELECT DISTINCT Articulos.codigart, descrart FROM Articulos
WHERE Articulos.codigart NOT IN (SELECT Lineas.codigart FROM Lineas, Pedidos
WHERE Articulos.codigart NOT IN (SELECT Lineas.codigart FROM Lineas, Pedidos
WHERE Pedidos.numped = Lineas.numped
WHERE Pedidos.numped = Lineas.numped
AND Pedidos.fechaped
AND Pedidos.fechaped
BETWEEN '2006/09/24' AND '2006/11/21')
BETWEEN '2006/09/24' AND '2006/11/21')
• Encontrar los proveedores de Madrid a los que se les ha realizado algún pedido entre el
24/09/2006 y el 21/11/2006 .
SELECT DISTINCT Proveedores.codigpro, nombrpro FROM Proveedores
SELECT DISTINCT Proveedores.codigpro, nombrpro FROM Proveedores
WHERE EXISTS ((SELECT ** FROM Pedidos
WHERE EXISTS SELECT FROM Pedidos
WHERE Proveedores.codigpro = Pedidos.codigpro
WHERE Proveedores.codigpro = Pedidos.codigpro
AND fechaped BETWEEN '2006/09/24' AND '2006/11/21')
AND fechaped BETWEEN '2006/09/24' AND '2006/11/21')
AND localpro = 'Madrid‘
AND localpro = 'Madrid‘
Marta Zorrilla 2008-2009 54
55. IMD XX :: SELECT
IMD XX SELECT
Funciones de grupo (Ejemplo)
Funciones de grupo (Ejemplo) COUNT(*)
COUNT(*) Nº de filas que componen
Nº de filas que componen
el grupo.
el grupo.
Con las filas de la información de
Con las filas de la información de COUNT(campo)
COUNT(campo) Nº de filas con valor
Nº de filas con valor
proceso correspondiente a una asignado al campo (nulos
asignado al campo (nulos
proceso correspondiente a una
instrucción SELECT se pueden no cuentan).
no cuentan).
instrucción SELECT se pueden
establecer grupos. SUM(exp) Suma de valores obtenidos
Suma de valores obtenidos
establecer grupos. SUM(exp)
con la expresión en cada
con la expresión en cada
En cada uno de estos grupos,
En cada uno de estos grupos, fila.
fila.
mediante las funciones de grupo, se
mediante las funciones de grupo, se AVG(exp) Media.
AVG(exp) Media.
pueden efectuar ciertos cálculos.
pueden efectuar ciertos cálculos. MAX(exp)
MAX(exp) Máximo.
Máximo.
• Encontrar cuántos artículos hay MIN(exp)
MIN(exp) Mínimo.
Mínimo.
registrados, el máximo y el mínimo STDEV(exp)
STDEV(exp) Desviación típica.
Desviación típica.
precio unitario, el precio unitario VAR(exp)
VAR(exp) Varianza.
Varianza.
medio y la valoración del almacén.
SELECT COUNT(codigart) AS Cantidad, MAX(preunart) AS Max,
SELECT COUNT(codigart) AS Cantidad, MAX(preunart) AS Max,
MIN(preunart) AS Min, AVG(preunart) AS Precio_medio,
MIN(preunart) AS Min, AVG(preunart) AS Precio_medio,
SUM(preunart*stockart) AS Valoración
SUM(preunart*stockart) AS Valoración
FROM Articulos
FROM Articulos
Marta Zorrilla 2008-2009 55
56. IMD XXI :: SELECT
IMD XXI SELECT
Funciones de fecha (Ejemplo)
Funciones de fecha (Ejemplo) DAY(fecha)
DAY(fecha) Devuelve el día de mes de
Devuelve el día de mes de
fecha.
fecha.
Los datos de tipo fecha son
Los datos de tipo fecha son MONTH (fecha)
MONTH (fecha) Devuelve el mes de fecha.
Devuelve el mes de fecha.
almacenados como una unidad de
almacenados como una unidad de YEAR (fecha)
YEAR (fecha) Devuelve el año de fecha.
Devuelve el año de fecha.
información. Cuando se necesita
información. Cuando se necesita
trabajar con componentes de una DATEPART(dw,fecha) Devuelve el día de la
DATEPART(dw,fecha) Devuelve el día de la
trabajar con componentes de una semana
fecha, es preciso utilizar funciones
fecha, es preciso utilizar funciones semana correspondiente
correspondiente
aa fecha (el 11 domingo,
fecha (el domingo,
de fecha.
de fecha. el 22 lunes, ...).
el lunes, ...).
• Listar día, mes y año de cada pedido, así como el día de la semana al que
corresponden sus fechas.
SELECT numped, fechaped,
SELECT numped, fechaped,
DAY(fechaped) as dia_mes, MONTH(fechaped) as mes,
DAY(fechaped) as dia_mes, MONTH(fechaped) as mes,
YEAR(fechaped) as año, DATEPART(dw,fechaped) as dia_sem
YEAR(fechaped) as año, DATEPART(dw,fechaped) as dia_sem
FROM Pedidos
FROM Pedidos
Marta Zorrilla 2008-2009 56
57. IMD XXII :: SELECT
IMD XXII SELECT
Agrupamiento de datos (Ejemplo)
Agrupamiento de datos (Ejemplo)
La cláusula GROUP permite formar grupos con las filas de datos que
La cláusula GROUP permite formar grupos con las filas de datos que
tengan valores iguales para determinados campos.
tengan valores iguales para determinados campos.
La respuesta tiene tantas filas como grupos haya establecido la
La respuesta tiene tantas filas como grupos haya establecido la
instrucción.
instrucción.
• Obtener el importe de cada pedido sin aplicar el IVA.
SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe
SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe
FROM Lineas
FROM Lineas
GROUP BY numped
GROUP BY numped
Marta Zorrilla 2008-2009 57
58. IMD XXIII :: SELECT
IMD XXIII SELECT
Agrupamiento de Datos. Cond. de agrupamiento
Agrupamiento de Datos. Cond. de agrupamiento
(Ejemplo)
(Ejemplo)
• Listar el importe, sin aplicar el IVA, de los pedidos que tienen más de una línea.
SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe
SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe
FROM Lineas
FROM Lineas
GROUP BY numped
GROUP BY numped
HAVING COUNT(*))> 1
HAVING COUNT(* > 1
Marta Zorrilla 2008-2009 58
59. IMD XXII :: SELECT
IMD XXII SELECT
Agrupamiento de datos WITH CUBE (Ejemplo)
Agrupamiento de datos WITH CUBE (Ejemplo)
El operador CUBE mantiene los grupos formados por GROUP BY yy
El operador CUBE mantiene los grupos formados por GROUP BY
además añade los superagregados para cada columna.
además añade los superagregados para cada columna.
• Obtener el nº de unidades pedidas de cada artículo por pedido, el nº total de uds
pedidas por artículo y el nº de unidades pedidas por pedido .
SELECT descrart, numped, sum(unilin) as unidadesPedidas
SELECT descrart, numped, sum(unilin) as unidadesPedidas
FROM articulos inner join lineas on articulos.codigart=lineas.codigart
FROM articulos inner join lineas on articulos.codigart=lineas.codigart
GROUP BY descrart, numped
GROUP BY descrart, numped
WITH CUBE ; ;
WITH CUBE
Marta Zorrilla 2008-2009 59
60. IMD XXII :: SELECT
IMD XXII SELECT
Agrupamiento de datos WITH ROLLUP (Ejemplo)
Agrupamiento de datos WITH ROLLUP (Ejemplo)
El operador ROLLUP mantiene los grupos formados por GROUP BY yy
El operador ROLLUP mantiene los grupos formados por GROUP BY
además añade los superagregados de la primera columna del group by.
además añade los superagregados de la primera columna del group by.
• Obtener el nº de unidades pedidas de cada artículo por pedido y el nº total de uds
pedidas por artículo.
SELECT descrart, numped, sum(unilin) as unidadesPedidas
SELECT descrart, numped, sum(unilin) as unidadesPedidas
FROM articulos inner join lineas on articulos.codigart=lineas.codigart
FROM articulos inner join lineas on articulos.codigart=lineas.codigart
GROUP BY descrart, numped
GROUP BY descrart, numped
WITH ROLLUP ; ;
WITH ROLLUP
Marta Zorrilla 2008-2009 60
61. IMD XXIV :: SELECT
IMD XXIV SELECT
Funciones de clasificación (Ejemplo)
Funciones de clasificación (Ejemplo) ROW_NUMBER() OVER (<partición><orden>)
ROW_NUMBER() OVER (<partición><orden>)
nº secuencial de un fila de una partición de un
nº secuencial de un fila de una partición de un
Permiten establecer un valor de
Permiten establecer un valor de cjto de resultados.
cjto de resultados.
categoría para cada fila devuelta de
categoría para cada fila devuelta de RANK() OVER (<partición><orden>)
RANK() OVER (<partición><orden>)
una partición.
una partición. rango de la fila en la partición de un cjto de
rango de la fila en la partición de un cjto de
resultados.
resultados.
DENSE_RANK() OVER (<partición><orden>)
DENSE_RANK() OVER (<partición><orden>)
• Clasifica los pedidos por el número rango de la fila en la partición de un cjto de
de líneas de pedido que tienen. rango de la fila en la partición de un cjto de
resultados sin espacio en la clasificación.
resultados sin espacio en la clasificación.
NTILE(nº entero) OVER (<partición><orden>)
NTILE(nº entero) OVER (<partición><orden>)
Distribuye las filas en los grupos especificados
Distribuye las filas en los grupos especificados
por nº entero.
por nº entero.
SELECT numped, numlineas,
SELECT numped, numlineas,
row_number() over (order by numlineas) AS num_fila,
row_number() over (order by numlineas) AS num_fila,
rank () over (order by numlineas) AS ranking,
rank () over (order by numlineas) AS ranking,
dense_rank() over (order by numlineas) AS dense_ranking,
dense_rank() over (order by numlineas) AS dense_ranking,
ntile(4) over (order by numlineas) as quartil
ntile(4) over (order by numlineas) as quartil
FROM (SELECT numped, count(*) numlineas from lineas group by numped) as resultado
FROM (SELECT numped, count(*) numlineas from lineas group by numped) as resultado
Marta Zorrilla 2008-2009 61
62. IMD XXV :: SELECT
IMD XXV SELECT
Ordenación del Resultado (Ejemplo)
Ordenación del Resultado (Ejemplo)
[ORDER BY colum1 {{[ASC] | |DESC }}[, colum2 {{[ASC] | |DESC }, .... ] ]] ]
[ORDER BY colum1 [ASC] DESC [, colum2 [ASC] DESC }, ....
colum1, colum2, ...: son nombres de elementos (campos, expresiones
colum1, colum2, ...: son nombres de elementos (campos, expresiones
o funciones) de la lista de selección o la posición que ocupan en ella.
o funciones) de la lista de selección o la posición que ocupan en ella.
ASC: quiere decir ordenación ascendente (opción por defecto) yyDESC
ASC: quiere decir ordenación ascendente (opción por defecto) DESC
descendente.
descendente.
• Listar los valores de los campos que componen el índice de unicidad de la tabla
Lineas (numped, numlin), por orden decreciente de nº de pedido y de nº de línea.
SELECT numped, numlin
SELECT numped, numlin
FROM Lineas
FROM Lineas
ORDER BY 1 DESC, 2 DESC
ORDER BY 1 DESC, 2 DESC
Marta Zorrilla 2008-2009 62
63. IMD XXVI :: SELECT
IMD XXVI SELECT
Guardar Resultado en una Tabla (Ejemplo)
Guardar Resultado en una Tabla (Ejemplo)
INTO tabla_adicional
INTO tabla_adicional
tabla_adicional: es el nombre de la tabla a generar, que ha de ser
tabla_adicional: es el nombre de la tabla a generar, que ha de ser
único. Esta tabla hereda el esquema de la lista de selección (nombres
único. Esta tabla hereda el esquema de la lista de selección (nombres
campos, tipos de datos, ...).
campos, tipos de datos, ...).
• Crear una tabla temporal, llamada t1, para guardar el importe, sin aplicar el IVA, de
los pedidos que tienen más de una línea.
SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe
SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe
INTO #t1
INTO #t1
FROM Lineas
FROM Lineas
GROUP BY numped
GROUP BY numped
HAVING COUNT(*) > 1
HAVING COUNT(*) > 1
Marta Zorrilla 2008-2009 63
64. IMD XXVII :: SELECT
IMD XXVII SELECT
Unión de Sentencias (Ejemplo)
Unión de Sentencias (Ejemplo)
Permite combinar los resultados de dos o más consultas. Para ello se
Permite combinar los resultados de dos o más consultas. Para ello se
requiere el operador UNION [ALL].
requiere el operador UNION [ALL].
• Listar todos los proveedores de las tablas Proveedores y Proveedores_Anulados
ordenados por su código.
SELECT codigpro, nombrpro, localpro
SELECT codigpro, nombrpro, localpro
FROM Proveedores
FROM Proveedores
UNION
UNION
SELECT codigp, nombrp, localp
SELECT codigp, nombrp, localp
FROM Proveedores_Anulados
FROM Proveedores_Anulados
ORDER BY 1
ORDER BY 1
Marta Zorrilla 2008-2009 64
65. IMD XXVIII: SELECT
IMD XXVIII: SELECT
EXCEPT e INTERSECT de Sentencias (Ejemplo)
EXCEPT e INTERSECT de Sentencias (Ejemplo)
EXCEPT Devuelve los valores distintos de la primera consulta que no
EXCEPT Devuelve los valores distintos de la primera consulta que no
son devueltos por la segunda consulta.
son devueltos por la segunda consulta.
INTERSECT Devuelve los distintos valores que son devueltos por
INTERSECT Devuelve los distintos valores que son devueltos por
ambas consultas.
ambas consultas.
• Listar los clientes exceptuando aquellos que son también Proveedores.
SELECT codigcli, nombrcli, localcli
SELECT codigcli, nombrcli, localcli
FROM clientes
FROM clientes
EXCEPT
EXCEPT
SELECT codigpro, nombrpro, localpro
SELECT codigpro, nombrpro, localpro
FROM Proveedores
FROM Proveedores
Marta Zorrilla 2008-2009 65
66. IMD XXIX :: SELECT
IMD XXIX SELECT
Uso de funciones (Ejemplo)
Uso de funciones (Ejemplo)
• Obtener el precio y la descripción de los artículos haciendo uso de la función
dame_precio_articulos(@codigo_art).
SELECT codigart as Codigo, descrart as Descripcion,
SELECT codigart as Codigo, descrart as Descripcion,
dbo.dame_precio_articulo(codigart) as Precio
dbo.dame_precio_articulo(codigart) as Precio
FROM ARTICULOS
FROM ARTICULOS
• Obtener los artículos haciendo uso de la función dame_precio_articulos cuyo precio sea
superior a 190 €
SELECT codigart as Codigo, descrart as Descripcion, preunart as Precio
SELECT codigart as Codigo, descrart as Descripcion, preunart as Precio
FROM ARTICULOS
FROM ARTICULOS
WHERE dbo.dame_precio_articulo(codigart) > 190
WHERE dbo.dame_precio_articulo(codigart) > 190
Marta Zorrilla 2008-2009 66
67. IMD XXX: INSERT con SELECT
IMD XXX: INSERT con SELECT
• Incorporar a la tabla proveedores, los procedentes de la tabla temporal prov_tmp. Se
considera que esta tabla tiene la misma estructura que la tabla proveedores.
INSERT INTO proveedores
INSERT INTO proveedores
SELECT codigpro, cifpro, nombrpro, direcpro, cpostpro, localpro,
SELECT codigpro, cifpro, nombrpro, direcpro, cpostpro, localpro,
telefpro, faxpro, procepro
telefpro, faxpro, procepro
FROM prov_tmp
FROM prov_tmp
Marta Zorrilla 2008-2009 67
68. IMD XXXI: UPDATE, DELETE con SELECT
IMD XXXI: UPDATE, DELETE con SELECT
• Actualizar los precios en un 2% de los artículos del grupo Bebidas.
UPDATE articulo
UPDATE articulo
SET preunart = preunart **1.02
SET preunart = preunart 1.02
WHERE tipo_id IN
WHERE tipo_id IN
(SELECT tipo_id
(SELECT tipo_id
FROM TipoArticulo
FROM TipoArticulo
WHERE tipo_nombre = 'Bebidas')
WHERE tipo_nombre = 'Bebidas')
• Borrar los pedidos de los proveedores no comunitarios
DELETE FROM pedidos
DELETE FROM pedidos
FROM pedidos INNER JOIN
FROM pedidos INNER JOIN
proveedores ON proveedores.codigpro = pedidos.codigpro
proveedores ON proveedores.codigpro = pedidos.codigpro
WHERE procepro = 'No UE'
WHERE procepro = 'No UE'
Marta Zorrilla 2008-2009 68
69. IMD XXXII: SELECT, UPDATE con CASE
IMD XXXII: SELECT, UPDATE con CASE
• Listar los artículos mostrando su precio categorizado por alto, bajo y no establecido.
SELECT ‘precio' =
SELECT ‘precio' =
CASE
CASE
WHEN preunart IS NULL THEN ‘No establecido'
WHEN preunart IS NULL THEN ‘No establecido'
WHEN preunart < 200 THEN ‘Bajo‘
WHEN preunart < 200 THEN ‘Bajo‘
ELSE ‘Alto'
ELSE ‘Alto'
END,
END,
descrart
descrart
FROM articulos
FROM articulos
• Actualizar los artículos con precio < 10 con 5% y los > =10 con un 7%
UPDATE articulos SET preunart=
UPDATE articulos SET preunart=
CASE
CASE
WHEN preunart <10 THEN preunart*1.05
WHEN preunart <10 THEN preunart*1.05
ELSE preunart*1.07
ELSE preunart*1.07
END
END
Marta Zorrilla 2008-2009 69
70. IMD XXXIII :: WITH (Ejemplo 1)
IMD XXXIII WITH (Ejemplo 1)
WITH vista temporal en la que apoyarse para realizar otro SELECT
WITH vista temporal en la que apoyarse para realizar otro SELECT
• Listar los pedidos cuyo monto es superior a la media
WITH total_pedidos (numped, valor) as
WITH total_pedidos (numped, valor) as
((SELECT numped, sum(unilin*preunlin) from lineas
SELECT numped, sum(unilin*preunlin) from lineas
group by numped
group by numped
))
SELECT numped, valor
SELECT numped, valor
from total_pedidos
from total_pedidos
where total_pedidos.valor>=
where total_pedidos.valor>=
((select avg(lineas.unilin*lineas.preunlin) from lineas)
select avg(lineas.unilin*lineas.preunlin) from lineas)
Marta Zorrilla 2008-2009 70
71. IMD XXXIII :: WITH (Ejemplo 2)
IMD XXXIII WITH (Ejemplo 2)
• Listar los pedidos que se encuentran en la posición 50 a 60 según el orden de fecha
de pedido.
WITH pedidosOrdenados AS
WITH pedidosOrdenados AS
(SELECT numped, fechaped,
(SELECT numped, fechaped,
ROW_NUMBER() OVER (order by fechaped) as RowNumber
ROW_NUMBER() OVER (order by fechaped) as RowNumber
FROM pedidos)
FROM pedidos)
SELECT **
SELECT
FROM pedidosOrdenados
FROM pedidosOrdenados
WHERE RowNumber between 50 and 60;
WHERE RowNumber between 50 and 60;
Marta Zorrilla 2008-2009 71
72. IMD XXXIII :: WITH (Ejemplo con recursividad)
IMD XXXIII WITH (Ejemplo con recursividad)
• Listar los jefes con las personas a su cargo, indicando el nivel jerárquico
WITH JefeAQuienReportas(supervisor, dni, nivel) AS
WITH JefeAQuienReportas(supervisor, dni, nivel) AS
((
SELECT supervisor, dni, 0 AS nivel
SELECT supervisor, dni, 0 AS nivel
FROM empleados empleados(dni,…,supervisor, dep)
FROM empleados
WHERE supervisor IS NULL
WHERE supervisor IS NULL
UNION ALL
UNION ALL
SELECT e.supervisor, e.dni, nivel + 1
SELECT e.supervisor, e.dni, nivel + 1
FROM empleados e
FROM empleados e
INNER JOIN JefeAQuienReportas d
INNER JOIN JefeAQuienReportas d
ON e.supervisor = d.dni
ON e.supervisor = d.dni
))
SELECT supervisor, dni, nivel
SELECT supervisor, dni, nivel
FROM JefeAQuienReportas ; ;
FROM JefeAQuienReportas
Marta Zorrilla 2008-2009 72
73. Lenguaje de definición de
Lenguaje de definición de
datos
datos
SQL Server 2005
SQL Server 2005
(Parte 2)
(Parte 2)
74. CREATE VIEW
CREATE VIEW
Para crear una vista en la base de datos. Su sintaxis es:
CREATE VIEW [ [< nombreBD > . .] ][ [< propietario > . .] ]nombre [ [((campo [ [,...n ] ]))] ]
CREATE VIEW < nombreBD > < propietario > nombre campo ,...n
[ [WITH <view_attribute> [ [,...n ] ]] ]
WITH <view_attribute> ,...n
ASAS
Instrucción_Select
Instrucción_Select
[ [WITH CHECK OPTION ] ]
WITH CHECK OPTION
nombreBD: es el nombre de la base de datos en la que se crea.
nombreBD: es el nombre de la base de datos en la que se crea.
propietario: cuenta de usuario que crea la vista
propietario: cuenta de usuario que crea la vista
nombre: es el nombre de la vista que se va aacrear.
nombre: es el nombre de la vista que se va crear.
campo: es el nombre que se va aautilizar para una columna en una vista.
campo: es el nombre que se va utilizar para una columna en una vista.
instrucción_Select: consulta aatravés de la cuál se define la vista
instrucción_Select: consulta través de la cuál se define la vista
view_attribute: toma uno de los siguientes valores
view_attribute: toma uno de los siguientes valores
[ [ENCRYPTION ]:]:evita que la vista se publique como parte de la réplica de SQL Server
ENCRYPTION evita que la vista se publique como parte de la réplica de SQL Server
[ [SCHEMABINDING ]:]:enlaza la vista al esquema de las tablas subyacentes. Cuando se especifica, las tablas base
SCHEMABINDING enlaza la vista al esquema de las tablas subyacentes. Cuando se especifica, las tablas base
no se pueden modificar de una forma que afecte aala definición de la vista.
no se pueden modificar de una forma que afecte la definición de la vista.
[ [VIEW_METADATA ]:]:Especifica que la instancia de SQL Server devolverá aalas API de DB-Library, ODBC yy
VIEW_METADATA Especifica que la instancia de SQL Server devolverá las API de DB-Library, ODBC
OLE DB la información de metadatos sobre la vista en vez de las tablas base.
OLE DB la información de metadatos sobre la vista en vez de las tablas base.
[ [WITH CHECK OPTION ] ]: :Exige que todas las instrucciones de modificación de datos ejecutadas contra la
WITH CHECK OPTION Exige que todas las instrucciones de modificación de datos ejecutadas contra la
vista se adhieran aalos criterios establecidos en la instrucción Select.
vista se adhieran los criterios establecidos en la instrucción Select.
Marta Zorrilla 2008-2009 74
75. CREATE VIEW .. Ejemplo
CREATE VIEW Ejemplo
CREATE VIEW dbo.EncabezadoPedido
CREATE VIEW dbo.EncabezadoPedido
AS
AS
SELECT dbo.Pedidos.numped, dbo.Pedidos.fechaped, dbo.Pedidos.codigpro,
SELECT dbo.Pedidos.numped, dbo.Pedidos.fechaped, dbo.Pedidos.codigpro,
dbo.Pedidos.ivaped, dbo.Pedidos.fentrped, dbo.Proveedores.nombrpro,
dbo.Pedidos.ivaped, dbo.Pedidos.fentrped, dbo.Proveedores.nombrpro,
dbo.Proveedores.direcpro, dbo.Proveedores.cpostpro, dbo.Proveedores.localpro,
dbo.Proveedores.direcpro, dbo.Proveedores.cpostpro, dbo.Proveedores.localpro,
dbo.Proveedores.telefpro, dbo.Proveedores.faxpro,
dbo.Proveedores.telefpro, dbo.Proveedores.faxpro,
dbo.Proveedores.procepro, dbo.Proveedores.emailpro, dbo.Proveedores.cifpro
dbo.Proveedores.procepro, dbo.Proveedores.emailpro, dbo.Proveedores.cifpro
FROM
FROM dbo.Proveedores INNER JOIN
dbo.Proveedores INNER JOIN
dbo.Pedidos ON dbo.Proveedores.codigpro = dbo.Pedidos.codigpro
dbo.Pedidos ON dbo.Proveedores.codigpro = dbo.Pedidos.codigpro
Marta Zorrilla 2008-2009 75