Tsql

4,507 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,507
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
127
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Tsql

  1. 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. 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. 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. 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. 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. 6. Lenguaje de definición de Lenguaje de definición de datos datos SQL Server 2005 SQL Server 2005 (Parte 1) (Parte 1)
  7. 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. 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
  9. 9. IDD I :: CREATE DATABASE. Ejemplo IDD I CREATE DATABASE. Ejemplo CREATE DATABASE [compras] CREATE DATABASE [compras] ON (NAME = N'compras', ON (NAME = N'compras', FILENAME = N'C:datacompras.mdf' , , FILENAME = N'C:datacompras.mdf' SIZE = 2, MAXSIZE = 3000,FILEGROWTH = 10%) SIZE = 2, MAXSIZE = 3000,FILEGROWTH = 10%) LOG ON (NAME = N'compras_log', LOG ON (NAME = N'compras_log', FILENAME = N'C:datacompras_log.LDF' , , FILENAME = N'C:datacompras_log.LDF' SIZE = 1, FILEGROWTH = 10%) SIZE = 1, FILEGROWTH = 10%) COLLATE Modern_Spanish_CI_AS COLLATE Modern_Spanish_CI_AS Marta Zorrilla 2008-2009 9
  10. 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. 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. 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
  13. 13. IDD I :: CREATE DATABASE – TABLE. Ejemplo IDD I CREATE DATABASE – TABLE. Ejemplo CREATE DATABASE MyDB CREATE DATABASE MyDB ON PRIMARY ON PRIMARY ( (NAME='MyDB_Primary', NAME='MyDB_Primary', FILENAME= FILENAME= 'c:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLdataMyDB_Prm.mdf', 'c:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLdataMyDB_Prm.mdf', SIZE=4MB, MAXSIZE=10MB, FILEGROWTH=1MB), SIZE=4MB, MAXSIZE=10MB, FILEGROWTH=1MB), FILEGROUP MyDB_FG1 FILEGROUP MyDB_FG1 ( (NAME =='MyDB_FG1_Dat1', NAME 'MyDB_FG1_Dat1', FILENAME == FILENAME 'c:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLdataMyDB_FG1_1.ndf', 'c:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLdataMyDB_FG1_1.ndf', SIZE ==1MB, MAXSIZE=10MB, FILEGROWTH=1MB), SIZE 1MB, MAXSIZE=10MB, FILEGROWTH=1MB), ( (NAME =='MyDB_FG1_Dat2', NAME 'MyDB_FG1_Dat2', FILENAME == FILENAME 'c:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLdataMyDB_FG1_2.ndf', 'c:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLdataMyDB_FG1_2.ndf', SIZE ==1MB, MAXSIZE=10MB, FILEGROWTH=1MB) SIZE 1MB, MAXSIZE=10MB, FILEGROWTH=1MB) LOG ON LOG ON ( (NAME='MyDB_log', NAME='MyDB_log', FILENAME == FILENAME 'c:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLdataMyDB.ldf', 'c:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLdataMyDB.ldf', SIZE=1MB, MAXSIZE=10MB, FILEGROWTH=1MB); SIZE=1MB, MAXSIZE=10MB, FILEGROWTH=1MB); CREATE TABLE MyTable CREATE TABLE MyTable ( (cola int PRIMARY KEY, colb char(8) ) ) cola int PRIMARY KEY, colb char(8) ON MyDB_FG1; ON MyDB_FG1; Marta Zorrilla 2008-2009 13
  14. 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. 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. 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. 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. 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. 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. 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. 21. SQL Server 2005 Tabla del catálogo: sysindexes Índice no cluster Índice cluster Marta Zorrilla 2008-2009 21
  22. 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. 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. 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. 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. 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. 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. 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. 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
  30. 30. Manipulación de datos Manipulación de datos SQL Server 2005 SQL Server 2005
  31. 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. 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. 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. 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. 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
  36. 36. Datos Datos Marta Zorrilla 2008-2009 36
  37. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 73. Lenguaje de definición de Lenguaje de definición de datos datos SQL Server 2005 SQL Server 2005 (Parte 2) (Parte 2)
  74. 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. 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

×