45222529-SQL-Server
June 9, 2016 | Author: ilanantoni | Category: N/A
Short Description
Download 45222529-SQL-Server...
Description
Sql Server Creación de una Base de Datos Create database nombre_bd on primary -- siempre va a venir la configuracion del archivo fisico ( -- al archivo principal se le pone la extension "mdf" --especificaion de archivo (principal) ), Filegroup nombre_filegroup -- es secundario su ventaja es de que este filegroup -- puede alojar info. de las tablas de usuario =) ( -- al archivo secundario se le pone la extension "ndf" --especificaion de archivo (secundario) ) log on ---- siempre va a venir la configuracion del archivo logico ( -- al archivo logico se le pone la extension "ldf" -- especificaion de archivo ) go --Especificaion de archivo name =nombre logico filename= 'ruta de archivo fisico' size= tamaño inicial del archivo maxsize= maximo tamaño de crecimietno filegrowth= valor de crecimiento --ejemplo-Create database bd_prueba on primary ( name=bd_prueba_data, filename = 'c:\bd_prueba_data.mdf' , size = 5 ) log on ( name=bd_prueba_log, filename = 'c:\bd_prueba_log.ldf' , size = 2 ) go sp_help db bd_prueba go
Use master go CREATE DATABASE COMPRAS ON (NAME='Compra.dat', FILENAME='C:\Data\Compras.mdf', SIZE=10MB, MAXSIZE=15MB, FILEGROWTH=10%) LOG ON (NAME='Compra01', FILENAME='C:\Data\Compras01.ldf', SIZE=7MB, MAXSIZE=9MB, FILEGROWTH=1MB) GO CREATE DATABASE LOGISTICA ON (NAME=Logistica01, FILENAME='E:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Logistica01.mdf', SIZE=15MB, MAXSIZE=25MB, FILEGROWTH=1MB), (NAME=Logistica02, FILENAME='E:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Logistica02.ndf', SIZE=10MB, MAXSIZE=15MB, FILEGROWTH=1MB) LOG ON (NAME=Logistica03, FILENAME='E:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Logistica03.Ldf', SIZE=5MB, FILEGROWTH=1MB) GO ------------------------------------------------1)TAMAÑO DE LA B.D:30 MB 2)MAXIMO TAMAÑO DE LA B.D: NO TIENE LIMITE -----------------------------------------------SP_HELPDB LOGISTICA ----------------------------------------------------------CREATE DATABASE FINANZAS ON (NAME=Finanzas01, FILENAME='C:\Data\Finanzas01.mdf', SIZE=25MB, FILEGROWTH=1MB) LOG ON (NAME=Finanzas02, FILENAME='C:\Data\Finanzas02.ldf', SIZE=10MB, FILEGROWTH=1MB), (NAME=Finanzas03, FILENAME='C:\Data\Finanzas03.ldf', SIZE=5MB, FILEGROWTH=1MB), (NAME=Finanzas04, FILENAME='C:\Data\Finanzas04.ldf',
SIZE=4MB, FILEGROWTH=1MB) GO ----------------------------------------------------------1>TAMAÑO DE LA B.D:44 2>MAXIMO TAMAÑO DE LA B.D: NO TIENE LIMITE ------------------------------------------------------------------------------ Agregar archivo de registro -----------------ALTER DATABASE FINANZAS ADD FILE (NAME=finanzas05, FILENAME='C:\Data\Finanzas05.ndf', SIZE=20MB) ------------ Agregar archivo de log de transaccion ------------ALTER DATABASE FINANZAS ADD LOG FILE (NAME=finanzas06, FILENAME='C:\Data\Finanzas06.ldf', SIZE=4MB) ------------------------------------------------------------ALTER DATABASE FINANZAS modify FILE (NAME=finanzas05, SIZE=30MB) ---------------------------------------------------------------------- BACKUP DE LA BASE DE DATOS -----------------------BACKUP DATABASE FINANZAS TO DISK='C:\Data\finanzas.bk' --------- RESTAURAR LA BASE DE DATOS -----------------------RESTORE DATABASE FINANZAS FROM DISK='C:\Data\finanzas.bk' -------------------------------------------------------------Drop database FINANZAS,COMPRAS
RENOMBRANDO BD : -- ALTER DATABASE -- AUMENTO Y DISMINUCION -- AUMENTANDO EL TAMAÑO DE LA BD -- SOL_01 (AUMENTAMOS TAMAÑO A UN ARCHIVO) SP_HELPDB BD3598 GO ALTER DATABASE BD3598 MODIFY FILE ( NAME=CONTA_DATA, SIZE=15 ) GO SP_HELPDB BD3598 GO -- SOL_02 (ADICIONANDO UN NUEVO ARCHIVO) -- COMO SE DESEA SEPARAR LA INFORMACION DE LA -- NUEVA AREA, SE CREARA UN NUEVO FILEGROUP ALTER DATABASE BD3598 ADD FILEGROUP FG_PRODUCCION GO -- LUEGO ADICIONAMOS UN NUEVO ARCHIVO DE DATOS -- DENTRO DEL FILEGROUP ALTER DATABASE BD3598
ADD FILE ( NAME=PRODUCCION_DATA, FILENAME='D:\3598\SECUNDARIOS\PROD_DATA.NDF', SIZE=10 ) TO FILEGROUP FG_PRODUCCION GO SP_HELPDB BD3598 GO USE BD3598 GO -- CREANDO UNA TABLA ALMACENANDOLA DENTRO DE UN -- FILEGROUP DISTINTO DEL PRINCIPAL CREATE TABLE PROD_TERMINADOS ( CODIGO INT, FECHA_PROD DATETIME ) ON FG_PRODUCCION GO SP_HELP PROD_TERMINADOS GO ---------------------------------------------- RENOMBRAR BD Y SUS ARCHIVOS ---------------------------------------------- RECOMENDACION: /* LA BD NO DEBE ENCONTRARSE ACTIVA. SE DEBE ENCONTRAR EN MODO DE UN UNICO USUARIO. */ -- CAMBIAR EL NOMBRE DE LA BD BD3598 POR -- BD_IDAT USE MASTER GO ALTER DATABASE BD3598 MODIFY NAME=BD_IDAT GO SP_HELPDB BD3598 GO SP_HELPDB BD_IDAT GO -- RENOMBRAR LOS NOMBRES LOGICOS DE LOS ARCHIVOS -- DE LA BD ALTER DATABASE BD_IDAT MODIFY FILE ( NAME=BD3598_DATA, NEWNAME=BD_IDAT_DATA ) GO SP_HELPDB BD_IDAT GO ---------------------------------ALTER DATABASE BD_IDAT MODIFY FILE ( NAME=BD_IDAT_DATA,
SIZE=20 ) GO SP_HELPDB BD_IDAT GO -- AL TRATAR DE REDUCIR EL TAMAÑO DEL ARCHIVO -- MODIFY FILE NO LO PERMITE (NVO_TAM > TAM_ACTUAL) ALTER DATABASE BD_IDAT MODIFY FILE ( NAME=BD_IDAT_DATA, SIZE=5 ) GO -- ERROR -- REDUCIENDO CORRECTAMENTE EL TAMAÑO DE UNA BD. --DBCC SHRINKDATABASE(NOM_BD, TAM_%_A_REDUCIR) --GO --DBCC SHRINKFILE(NOM_LOG_ARCH, NVO_TAM_MB) --GO USE BD_IDAT GO SP_HELPDB BD_IDAT GO DBCC SHRINKFILE(BD_IDAT_DATA, 5) GO SP_HELPDB BD_IDAT GO
CREACION BD - CONFIGURACION -- CREAR UNA ESTRUCTURA DE CARPETAS EN UNA -- UNIDAD DE DISCO DISTINTA A C: -- UNIDAD:\3598 -- CARPETA PRINCIPAL -|__ PRINCIPAL -- SUBCARPETA -|__ SECUNDARIOS -- SUBCARPETA -- CREANDO LA BD PARA LOS COMANDOS ALTER -- DATABASE. CREATE DATABASE BD3598 ON PRIMARY ( NAME=BD3598_DATA, FILENAME='D:\3598\PRINCIPAL\BD3598_DATA.MDF', SIZE=5 ), FILEGROUP FG_CONTA ( NAME=CONTA_DATA, FILENAME='D:\3598\SECUNDARIOS\CONTA_DATA.NDF', SIZE=10 ) LOG ON ( NAME=BD3598_LOG, FILENAME='D:\3598\BD3598_LOG.LDF', SIZE=3 ) GO
-- LISTANDO LA ESTRUCTURA DE LA BD SP_HELPDB BD3598 GO USE BD3598 GO CREATE TABLE CLIENTES ( CODIGO INT, NOMBRE VARCHAR(50)) GO INSERT INTO CLIENTES VALUES(1,'MIGUEL DIAZ') GO SELECT * FROM CLIENTES GO -- ESTABLECIENDO A SOLO LECTURA A LA BD ALTER DATABASE BD3598 SET READ_ONLY GO -- CAMBIA EL IDIOMA DEL SQL SET LANGUAGE SPANISH GO INSERT INTO CLIENTES VALUES(2,'KARINA TORRES') GO SELECT * FROM CLIENTES GO -- ESTABLECIENDO A LECTURA-ESCRITURA A LA BD ALTER DATABASE BD3598 SET READ_WRITE GO -- ESTABLECER EL ACCESO A UN UNICO USUARIO ALTER DATABASE BD3598 SET SINGLE_USER GO SP_HELPDB BD3598 GO -- RESTABLECEMOS EL ACCESO MULTIUSUARIO A LA BD ALTER DATABASE BD3598 SET MULTI_USER -- RESTRICTED_USER GO -- DEJANDO FUERA DE LINEA (DESACTIVANDO LA BD) -- A LA BD USE MASTER GO ALTER DATABASE BD3598 SET OFFLINE GO -- VOLVIENDO A ACTIVAR LA BD ALTER DATABASE BD3598 SET ONLINE GO SP_HELPDB BD3598 GO -- ESTABLECIENDO EL MODELO DE RECUPERACION
-- A FULL (MODELO COMPLETO) -- RECOVERY: SIMPLE, BULK_LOGGED, FULL ALTER DATABASE BD3598 SET RECOVERY FULL -- SIMPLE, BULK_LOGGED GO
CONSTRAIN create table Persona (Codigo int, Nombre varchar(70), Telefono varchar(9), Nacimiento datetime) ALTER Table Persona add constraint dTelf DEFAULT '999-99-9'for telefono Insert into Persona values(1,'juan','av.Los alamos 450','458-2189',getdate()) insert into Persona(Codigo,Nombre,Direccion,Nacimiento) values(2,'Jose','av.Los proceres 145',getdate()) ----------------------------------------------------ALTER Table Persona add constraint unom unique(nombre) Insert into Persona values(2,'claudia','av.Los alamos 450','478-7189',getdate()) insert into Persona values(3,'claudia','av.Los perros 456','477-2189',getdate()) ----------------------------------------------------ALTER Table Persona add constraint ctelf check(telefono like '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]') Insert into Persona values(4,'Martin','av.Arequipa 789','549-8763',getdate()) insert into Persona values(5,'Fuller','av.La paz 120','A49-8763',getdate()) ----------------------------------------------------select * from SYSOBJECTS WHERE type='C'OR - CHECK type='PK'OR - CLAVE PRIMARIA type='F'OR - CLAVE FORANEA type='D'OR - DEFAULT type='U'OR - TABLAS type='p'or -PROCEDIMIENTOS type='K'-UNIQUE ALTER TABLE PERSONA DROP CTELF ______________________________________________________________________ ______________________ SELECT: SELECT * FROM PRODUCTS SELECT ProductName,QuantityPerUnit FROM PRODUCTS SELECT PRODUCTID AS Codigo, PRODUCTNAME AS NOMBRE, UNITPRICE AS PRECIO FROM PRODUCTS WHERE UNITPRICE>50
ORDER BY PRECIO DESC ____________________________________________________________________ SELECT C.CATEGORYNAME, P.PRODUCTNAME, P.UNITPRICE FROM PRODUCTS P,CATEGORIES C WHERE C.CATEGORYID=P.CATEGORYID INSERT: _____________________________________________________________________ INSERT INTO GATEGORIES(CATEGORYNAME)VALUES('BEBIDAS') SELECT * FROM ALUMNOS INSERT INTO ALUMNOS VALUES('200','MARIA') UPDATE: _____________________________________________________________________ UPDATE PRODUCTS SET UNITPRICE=UNITPRICE*1.10, WHERE CATEGORYID>5 SELECT * FROM PRODUCTS DELETE -----------------------------DELETE FROM PRODUCTS DELETE FROM PRODUCTS WHERE UNITPRICE>50
CREATE TABLE ALUMNO (NOMBRE VARCHAR(10), NOTA1 INT, NOTA2 INT, NOTA3 INT) INSERT INSERT INSERT INSERT
INTO INTO INTO INTO
ALUMNO ALUMNO ALUMNO ALUMNO
VALUES('JUAN',12,11,10) VALUES('MANUEL',11,17,20) VALUES('PEDRO',12,12,10) VALUES('MARTIN',17,18,10)
SELECT * FROM ALUMNO MOSTRAR TODAD LAS COLUMNAS DE LAS TABLAS ALUMNO MOSTRAR TODAS LAS COLUMNA DE TLA TABLA ALUMNO ORDENADO ALFABETICAMENTE MOSTRAR NOMBRE Y PROMEDIO DE LA TABLA ALUMNO 1 ____________________________________________ SELECT * FROM ALUMNO 2 ____________________________________________ SELECT * FROM ALUMNO ORDER BY NOMBRE 3 ____________________________________________ SELECT NOMBRE,((NOTA1+NOTA2+NOTA3)/3) AS PROMEDIO FROM ALUMNO 4 ____________________________________________ SELECT NOMBRE,((NOTA1+NOTA2+NOTA3)/3) AS PROMEDIO FROM ALUMNO ORDER BY PROMEDIO DESC 5 ____________________________________________ SELECT NOMBRE,((NOTA1+NOTA2+NOTA3)/3) AS PROMEDIO FROM ALUMNO ORDER BY NOMBRE 6
___________________________________________ SELECT * FROM ALUMNO WHERE NOTA3 BETWEEN 13 AND 15 ORDER BY NOMBRE 7 ___________________________________________ 8 ___________________________________________ SELECT NOMBRE FROM ALUMNO WHERE NOMBRE LIKE'[J]%' ORDER BY NOMBRE 9 __________________________________________ SELECT NOMBRE FROM ALUMNO WHERE NOMBRE LIKE '%[U]%' 10 __________________________________________ SELECT NOMBRE FROM ALUMNO WHERE NOMBRE LIKE '%[A,E,I,O,U]%' ORDER BY NOMBRE
Backup : -- COPIAS DE SEGURIDAD CREATE DATABASE BD3598 GO -- CAMBIA EL IDIOMA DEL SQL SET LANGUAGE SPANISH -- ESTABLECER EL MODELO DE RECUPERACION -- COMPLETO ALTER DATABASE BD3598 SET RECOVERY FULL GO USE BD3598 GO CREATE TABLE PRODUCTOS ( COD_PROD INT, NOM_PROD VARCHAR(20) ) GO -- INSERTANDO INSERT INTO PRODUCTOS VALUES(1,'MOUSE') INSERT INTO PRODUCTOS VALUES(2,'TECLADO') GO SELECT * FROM PRODUCTOS -- COPIA DE SEGURIDAD COMPLETA BACKUP DATABASE BD3598 TO DISK='D:\BD3598_FULL.BACK' WITH INIT GO -- WHIT INIT = REESTABLE EL TAMAÑO DE LA COPIA DE SEGURIDAD...
-- INSERCION DE NUEVOS PRODUCTOS INSERT INTO PRODUCTOS VALUES(100,'PRODUCTO INSERT INTO PRODUCTOS VALUES(200,'PRODUCTO INSERT INTO PRODUCTOS VALUES(300,'PRODUCTO INSERT INTO PRODUCTOS VALUES(400,'PRODUCTO INSERT INTO PRODUCTOS VALUES(500,'PRODUCTO GO
100') 200') 300') 400') 500')
-- AGREGAMOS UNA NUEVA COLUMNA ALTER TABLE PRODUCTOS ADD PRECIO MONEY GO SELECT * FROM PRODUCTOS GO UPDATE PRODUCTOS SET PRECIO = 100 GO -- COPIA DE SEGURIDAD DIFERENCIAL BACKUP DATABASE BD3598 TO DISK='D:\BD3598_DIFF.BAK' WITH DIFFERENTIAL, INIT GO -- INSERTAMOS NUEVOS PRODUCTOS INSERT INTO PRODUCTOS VALUES(1000,'PRODUCTO 1000',50) INSERT INTO PRODUCTOS VALUES(2000,'PRODUCTO 2000',80) INSERT INTO PRODUCTOS VALUES(3000,'PRODUCTO 3000',90) INSERT INTO PRODUCTOS VALUES(4000,'PRODUCTO 4000',50) INSERT INTO PRODUCTOS VALUES(5000,'PRODUCTO 5000',60) GO UPDATE PRODUCTOS SET NOM_PROD=NOM_PROD+' MODIF.' WHERE COD_PROD IN (2,200,2000,500,5000) GO -- GENERAMOS LA COPIA DE SEGURIDAD DEL REGISTRO -- DE TRANSACCIONES BACKUP LOG BD3598 TO DISK='D:\BD3598_LOG01.BAK' WITH INIT GO -- SE ELIMINAN ALGUNOS PRODUCTOS SELECT * FROM PRODUCTOS DELETE PRODUCTOS WHERE COD_PROD IN (1,100,1000) GO -- GENERAMOS UNA NUEVA COPIA DE SEGURIDAD -- DE REGISTRO DE TRANSACCIONES BACKUP LOG BD3598 TO DISK = 'D:\BD3598_LOG02.BAK' WITH INIT GO
Reduccion de Archivos :
USE BD3598 GO CREATE TABLE CLIENTES ( COD_CLI INT PRIMARY KEY, NOM_CLI VARCHAR(80), ) GO -- TAMAÑO DEL ARCHIVO LOGICO: BD3598_LOG SP_HELPDB BD3598 GO -- INSERTANDO 500000 FILAS DE PRUEBA DECLARE @CONTA INT SELECT @CONTA=1 WHILE @CONTA10.5 ORDER BY NOMBRE --2.SELECT NOMBRE,COUNT(NOTA)AS NUM FROM ALUMNO A,NOTA B WHERE A.ALUMNOID=B.ALUMNOID GROUP BY A.ALUMNOID,NOMBRE HAVING COUNT(NOTA)>2 ORDER BY AVG(COUNT)DESC --3.SELECT DISTINCT NOMBRE FROM ALUMNO A,NOTA B WHERE A.ALUMNOID=B.ALUMNOID AND NOTA IN(11,12) --4.SELECT NOMBRE,COUNT(NOTA) AS DESAP FROM ALUMNO A,NOTA B WHERE A.ALUMNOID=B.ALUMNOID AND NOTA=200) go sp_helpconstraint Cursos go /* Para Desactivar o Activar un Constraint (Check o Foreign Key) -- Desactivamos Alter table NomTabla NOCHECK { Nombre_Constraint | All } -- Activamos Alter table NomTabla CHECK { Nombre_Constraint | All } */ /* Para Evitar la Comprobación de los valores de las columnas al momento de crear un nuevo constraint. Alter Table NomTabla WITH NOCHECK ADD Constraint NomConstraint Tipo_Constraint Expresion_Constraint -- With NoCheck, no comprueba que los registros -- cumplan el criterio de Expresion_Constraint, -- sólo crea al Constraint. ----*/
With Check, (Predeterminado), antes de crear el constraint, SQL verificará que todos los registros por la columna del Constraint cumplen con Expresion_Constraint.
/* FOREIGN KEY */ Sintaxis: Alter Table NomTblSecundaria Add [ Constraint NomConstraint ] Foreign Key(Col_Tbl_Sec) References NomTblPrincipal(Col_Tbl_Princ) [ on delete cascade on update cascade ] -- en cambio, al crear la tabla secundaria Create Table Principal ( NomCol Tipo_Dato { Primary Key o UNIQUE }
) go Create Table Secundaria ( NomCol_sec Tipo_Dato, .... NomCol_Prin Tipo_Dato References NomTbl_Principal(NomCol) ) go
SEGURIDAD Administrador- Creacion de Usuarios USE [master] GO CREATE LOGIN [USQL1] WITH PASSWORD=N'' MUST_CHANGE, DEFAULT_DATABASE=[BDSEGURIDAD], DEFAULT_LANGUAGE=[Español], CHECK_EXPIRATION=ON, CHECK_POLICY=ON GO USE [BDPEDIDOS] GO CREATE USER [USQL1] FOR LOGIN [USQL1] GO USE [BDSEGURIDAD] GO CREATE USER [USQL1] FOR LOGIN [USQL1] GO /* Otorgando el derecho de leer e insertar registros en la tabla categorias al usuario USQL1 (Permiso a Nivel de Objeto) */ use bdpedidos go grant select, insert on dbo.categorias to USQL1 go /* Otorgando el derecho de creación de tablas al usuario USQL1 en la base de datos BDSEGURIDAD. (Permiso a nivel de instrucción) */ use bdseguridad go grant create table to USQL1 go -- Otorgar el permiso de Alterar el Esquema grant alter on schema::dbo to USQL1
go /* USE [master] GO CREATE LOGIN [USQL2] WITH PASSWORD=N'P@ssw0rd', DEFAULT_DATABASE=[BDSEGURIDAD], DEFAULT_LANGUAGE=[Español], CHECK_EXPIRATION=ON, CHECK_POLICY=ON GO USE [BDSEGURIDAD] GO CREATE USER [USQL2] FOR LOGIN [USQL2] GO */ -- Creamos un Esquema create schema marketing go -- Cambiando el esquema predeterminado al -- usuario USQL2, de dbo por marketing alter user USQL2 with default_schema=marketing go /* al momento de la creacion de un usuario de bd se puede establecer el nombre del esquema que quiera asignarsele. CREATE USER Nom_Usuario WITH Default_Schema=Nombre_Schema */ /* Recuerde, para que un usuario de BD, pueda crear objetos, es necesario a parte del permiso de CREATE TABLE el permiso de ALTER ON SCHEMA. */ -- Dándole el permiso de creacion de tablas, -- procedimientos almacenados a un Rol de BD, -- al cual el usuario USQL2 forma parte. -- Un Rol de BD es como un grupo de usuarios. CREATE ROLE gMarketing go -- agregando al usuario USQL2 al Rol gMarketing -- sp_addrolemember 'Nombre_Rol','Nom_Usuario' sp_addrolemember 'gMarketing','USQL2' go -- finalmente le otorgamos el derecho de -- creación de tablas y proc. almacenados. -- Esto permitirá que cualquier usuario -- miembro de este Rol, pueda realizar estas -- acciones. GRANT CREATE TABLE, CREATE PROCEDURE TO gMarketing go -- no olvidar alterar el esquema GRANT ALTER ON SCHEMA::marketing TO gMarketing
go -- otorgar el derecho de leer e insertar en -- todas las tablas del esquema. GRANT SELECT, INSERT ON SCHEMA::marketing TO gMarketing go /* deny insert on marketing.Nom_Tabla to usuario deny insert on schema::marketing to usuario */
-- usuario USQL1 use bdpedidos go select * from dbo.categorias go insert into dbo.categorias values('Artefactos') go select * from dbo.categorias go -------------------------------use bdseguridad go create table vendedor ( cod_ven int, nom_ven varchar(50) ) go -- Error, falta un permiso (Alter Schema) -- Después de otorgar el derecho de Alterar el -- Esquema create table vendedor ( cod_ven int, nom_ven varchar(50) ) go -- si el usuario USQL1, intenta listar el -- contenido de la tabla Vendedor select * from dbo.Vendedor go -- usuario usql2 CREATE TABLE PRODUCTOS ( COD_PROD INT, NOM_PROD VARCHAR(50) ) GO INSERT INTO marketing.PRODUCTOS VALUES(1,'LG Scarlet 32') go
SELECT * FROM marketing.PRODUCTOS go CREATE PROC LISTAR_PRODUCTOS AS SELECT * FROM marketing.PRODUCTOS ORDER BY NOM_PROD go EXEC LISTAR_PRODUCTOS go -- Error, no tiene el permiso de EXECUTE
TRANSACCIONES : -- "NUEVAS" INSTRUCCIONES T-SQL USE BDPEDIDOS GO -- TOP(n) -- SQL 2000 SELECT TOP 3 * FROM CLIENTES GO DECLARE @N INT SELECT @N=5 SELECT TOP @N * FROM CLIENTES GO -- SQL DINAMICO DECLARE @CAD VARCHAR(500) SELECT @CAD='SELECT TOP ' DECLARE @N INT SELECT @N=5 SELECT @CAD=@CAD + STR(@N,3) + ' * FROM CLIENTES' -- PRINT @CAD EXEC(@CAD) GO -------------------------------------------------------------- VARIANTE DECLARE @N INT SELECT @N=4 SET ROWCOUNT @N -- ESTABLECIENDO EL LIMITE -- DE FILAS A MOSTRAR SELECT * FROM CLIENTES SELECT * FROM CAB_PEDIDO SET ROWCOUNT 0 -- RESTABLECE SIN RESTRICCION GO SELECT * FROM CLIENTES GO -- SQL 2005 DECLARE @N INT SELECT @N=4 SELECT TOP(@N) * FROM CLIENTES GO
-- Se puede utilizar: INSERT, UPDATE y DELETE CREATE TABLE CLIENTES_AMERICA ( COD_CLI CHAR(5) PRIMARY KEY, NOM_CLI VARCHAR(50), PAIS_CLI VARCHAR(30) ) GO DECLARE @N INT SELECT @N=15 INSERT TOP @N CLIENTES_AMERICA SELECT COD_CLI, NOM_CLI, PAIS FROM CLIENTES WHERE PAIS IN ('MEXICO','BRAZIL','ARGENTINA') GO SELECT * FROM CLIENTES_AMERICA GO /* DECLARE @N INT SELECT @N=15 INSERT CLIENTES_AMERICA SELECT TOP(@N) COD_CLI, NOM_CLI, PAIS FROM CLIENTES WHERE PAIS IN ('MEXICO','BRAZIL','ARGENTINA') GO */ /* SET y SELECT -----------SELECT ABC='JUAN' DECLARE @ABC VARCHAR(5) -- SET @ABC='JUAN' SELECT @ABC='JUAN' PRINT @ABC DECLARE @CANTIDAD INT SET @CANTIDAD=(SELECT COUNT(*) FROM CLIENTES) PRINT @CANTIDAD GO DECLARE @CANTIDAD INT SELECT @CANTIDAD=COUNT(*) FROM CLIENTES PRINT @CANTIDAD GO */ --------------------------------- OUTPUT -------------------------------/* Permite acceder a las tablas internas INSERTED y DELETED, para mostrar los nuevos registros, o los registros eliminados y/o actualizados */ insert into clientes_america
output system_user, inserted.nom_cli, inserted.pais_cli, getdate() -- into NombreTabla select cod_cli,nom_cli,pais from clientes where pais='UK'
go
----------------------------------- Funciones de Ranking -- ROW_NUMBER(), RANK(), DENSE_RANK() y NTILE(n) ---------------------------------SELECT COD_CLI,NOM_CLI,PAIS, ROW_NUMBER() OVER(ORDER BY PAIS) AS NRO, ROW_NUMBER() OVER(PARTITION BY PAIS ORDER BY PAIS) AS NRO_PART, RANK() OVER(ORDER BY PAIS) AS 'RANK', DENSE_RANK() OVER(ORDER BY PAIS) AS 'DENSE', NTILE(10) OVER(ORDER BY PAIS) AS 'NTILE' FROM CLIENTES GO SET ROWCOUNT 0 SELECT * FROM CLIENTES SELECT * FROM EMPLEADOS ---------------------------------------- TRANSACCIONES ---------------------------------------- SQL 2000 y SQL 2005 -- SINTAXIS: BEGIN TRAN [SACTION] -- INSTRUCCIONES SQL -" -" IF @@ERROR0 -- HUBO UN ERROR EN ALGUNA -- INSTRUCCION ROLLBACK TRAN [SACTION] ELSE -- SINO HUBO ERROR COMMIT TRAN [SACTION] GO ------------------------------begin tran declare @err_eli int, @err_ins int insert into clientes_america values('XYZ04','CLIENTE XYZ01','Peru') set @err_ins=@@error print 'Error='+str(@err_ins) delete clientes where cod_cli='OCEAN' set @err_eli=@@error print 'Error='+str(@err_eli)
go
-- Hubo un Error en alguna instruccion if @err_ins0 or @err_eli0 RollBack Tran else -- Sino, No hubo Error en ninguna -- instruccion Commit Tran
select * from clientes where cod_cli='FISSA' go SP_HELPCONSTRAINT CAB_PEDIDO GO -- cambiando el tipo de dato a la columna -- cod_cli de cab_pedido de nchar(5) a -- char(5) SELECT * FROM CAB_PEDIDO alter table cab_pedido alter column cod_cli char(5) go -- creando el foreign key entre cab_pedido -- y clientes alter table cab_pedido with nocheck add foreign key(cod_cli) references clientes(cod_cli) go select * from clientes_america where cod_cli='XYZ01' go
funciones def.usuario : use northwind go -- Funciones Definidas por el Usuario /* 1. Funcion Escalar Devuelve un valor escalar (un numero, una cadena, una fecha) Sintaxis: CREATE FUNCTION NomFuncion (@Prm Tipo_Dato) RETURNS Tipo_Dato_Devolver AS BEGIN -- Instrucciones SQL RETURN @Var_Tipo_Dato_Devolver -- Podría utilizarse también la sgte. forma: -- RETURN (SELECT UnaColumna_UnaFila FROM ... )
END GO */ -- Ejemplo /* Crear una Función Escalar que devuelva el nombre del dia de la semana de una fecha. */ ALTER FUNCTION FN_DIA_SEMANA(@FECHA DATETIME) RETURNS VARCHAR(50) AS BEGIN -- MOMBRE DEL DIA DECLARE @NOM VARCHAR(50) SELECT @NOM=DATENAME(DW, @FECHA) -- AGREGAMOS EL DIA SELECT @NOM=@NOM + ', '+STR(DAY(@FECHA),2) -- AGREGAMOS EL MES
SELECT @NOM=@NOM + ' DE '+DATENAME(MM,@FECHA) -- AGREGAMOS EL AÑO SELECT @NOM=@NOM + ' DE '+ STR(YEAR(@FECHA),4) RETURN @NOM -- RETURN (SELECT DATENAME(DW, @FECHA)) END GO SET LANGUAGE SPANISH GO SELECT FECHA_LARGA=DBO.FN_DIA_SEMANA(GETDATE()) GO SELECT ORDERID, CUSTOMERID, FECHA_LARGA=DBO.FN_DIA_SEMANA(ORDERDATE) FROM ORDERS WHERE MONTH(ORDERDATE)=12 AND YEAR(ORDERDATE)=1996 GO /* Crear una Función Escalar que devuelva la cantidad de ordenes por un codigo de cliente en un año específico. */ CREATE FUNCTION FN_ORDENES_AÑO (@COD_CLI CHAR(5), @AÑO INT) RETURNS INT AS BEGIN RETURN ( select count(*) from orders where customerid=@COD_CLI and YEAR(orderdate)=@AÑO ) END GO select top 3 companyname, cant_1996=dbo.FN_ORDENES_AÑO(customerid,1996), cant_1997=dbo.FN_ORDENES_AÑO(customerid,1997), cant_1998=dbo.FN_ORDENES_AÑO(customerid,1998) from customers go /* 2. Función de Tipo Tabla en Línea Devuelve el contenido de una sentencia SELECT, como una Tabla, a diferencia de uan vista en donde también se utiliza un SELECT, en la función el SELECT puede utilizar argumentos, variables o parámetros. */ create view v_productos as select productid, productname, categoryid from products go select * from v_productos go create function fn_productos(@codcat int) returns table as return (
select productid, productname, categoryid from products where categoryid=@codcat )
go select * from dbo.fn_productos(7) go
/* Crear una función de tipo tabla que devuelva según un año enviado como parámetro los nombres de los 5 clientes que han comprado menos, y la cantidad de ordenes que hayan realizado. Considere comprar menos a los clientes que hayan realizado pocos pedidos en ese año. */ create function fn_clientes(@año int) returns table as return( select top 5 companyname, cant=count(*) from customers c inner join orders o on c.customerid=o.customerid where year(orderdate)=@año group by companyname order by cant asc ) go select * from dbo.fn_clientes(1996) go /* 3. Función Tipo Tabla de Múltiples Instrucciones Devuelve una tabla, que debe haber sido definida en la cabecera de la función. Esta tabla debe ser poblada por instrucciones INSERT INTO ... VALUES o por INSERT INTO .... SELECT .... FROM ..... Este tipo de función es utilizada para devolver datos resumidos. Sintaxis: CREATE FUNCTION NombreFunción (@prm Tipo_Dato, .....) RETURNS @NomTabla TABLE (NomCol1
Tipo_Dato, NomCol2
Tipo_Dato, ...)
AS BEGIN -- Múltiples instrucciones SQL -- Luego debemos poblar la tabla INSERT INTO @NomTabla VALUES( ........) Ó INSERT INTO @NomTabla SELECT ...... FROM ....... TABLA RETURN -- esa instruccion devuelve la tabla END GO */
/* Crear una funcion de tipo Tabla que liste los nombres de los productos, el precio y el stock de los productos de acuerdo a un codigo de categoria enviado como parámetro. */ create alter function fn_tabla_prod_cat (@cod_cat int) returns @tbl table (nomprod varchar(50), precio int, stock int) as begin -- adicionamos la información de los productos -- de una categoria insert into @tbl select productname, unitprice,unitsinstock from products where categoryid=@cod_cat -- variables para capturar el promedio de los -- precios y la suma de los stock declare @prom_precio int,@suma_stock int select @prom_precio=AVG(precio), @suma_stock=SUM(stock) from @tbl -- insertamos los datos obtenidos insert into @tbl values( 'Resumen de la categoria '+str(@cod_cat,1), @prom_precio,@suma_stock) insert into @tbl values( 'Promedio de Precios:',@prom_precio,0) insert into @tbl values( 'Suma de Stocks:',0,@suma_stock) -- devolvemos la tabla @tbl return end go select * from fn_tabla_prod_cat(7) go
PRACTICA Resuelta: /*1.-que nombres de categoria de producto fue la mas vendida el primer año y cuanto fue el importe vendido */ select*from select*from select*from select*from
productos cab_pedido det_pedido categorias
select top 1 c.nom_cat,importe=sum(d.cantidad*d.precio) from categorias as c inner join productos as p on c.cod_cat=p.cod_cat inner join det_pedido as d on p.cod_prod=d.cod_prod
inner join cab_pedido as ca on ca.num_pedido=d.num_pedido where year(ca.fecha)=1996 group by c.nom_cat /*2.-Listar el total facturado por el empleado mas antiguo(utilice al campo fecha de contrato por el que hara la comprobacion de la antiguedad), debera mostrar un codigo,apellido,fecha de contrato, cantidad de ordenes y el monto total genenrado por estas ordenes(cantidad*precio) */ select*from productos select*from cab_pedido select*from det_pedido select*from categorias select*from empleados select top 1 e.cod_emp,e.apellidos,e.fecha_contrato,cant_ordenes=count(ca.num_pedid o),importe= sum(d.cantidad*d.precio) from empleados as e inner join cab_pedido as ca on e.cod_emp=ca.cod_emp inner join det_pedido as d on ca.num_pedido=d.num_pedido group by e.cod_emp,e.apellidos, e.fecha_contrato order by year(e.fecha_contrato) asc /*3.-Crear una funcion de tipo tabla que devuela a la lista del mejor cliente por pais en un año determinado, el mejor cliente por pais se considerara de acuerdo ala mayor cantidad de pedidos que ha realizado el cliente en el respectivo año.Debera devolver el nombre del pais, el nombre del cliente y la cantidad total de pedido realizadas por el respectivo cliente.*/ select*from select*from select*from select*from select*from
productos cab_pedido det_pedido categorias empleados
select cl.pais,cl.nom_cli,cant_pedidos=count(ca.num_pedido) from clientes as cl inner join cab_pedido as ca on cl.cod_cli=ca.cod_cli where year(ca.fecha)=1997 group by cl.pais,cl.nom_cli order by cant_pedidos desc /*4.-Crear un procedimiento almacenado que de acuerdo a un año enviado como parametro, liste el nombre del dia de la semana, cuantos pedidos se emitieron por cada uno de los dias de la semana cuantos pedidos se emitieron por cada uno de los dias de la semana, la cantidad total de pedidos en el año solicitado y su porcentaje en relacion a la cantidad total del año enviado, el porcentaje se obtiene: Porcentaje=(cantidad_pedido_semana*100)/ (cantidad_total_pedidos) */ CREATE PROCEDURE USP_PROB4 @AÑO INT
AS declare @sum int select @sum=count(num_pedido) from cab_pedido where year(fecha)=1996 select DIA=datename(dw,fecha),CANT_PED_DIA=count(num_pedido),CANT_TOTAL_AÑO=@ sum, PORCENTAJE=round((count(num_pedido)*100)/152.00,2) from cab_pedido where year(fecha)=@AÑO group by datename(dw,fecha) GO EXEC USP_PROB4 1996 --PROCEDIMIENTOS ALMACENADOS DE LOS EJERCICIOS QUE DEJO
/*1.- CREAR UN PROC. ALMACENADO QUE DE ACUERDO A UNA OPCION DE TIPO ENTERA PERMITA DEVOLVER EL APELLIDO DE LOS EMPLEADOS, SU FECHA DE NAC, SU FECHA DE CUMPLEAÑOS EN EL AÑO ACTUAL, DE QUIENES CUMPLIERON O FALTAN CUMPLIR. ( 0 = CUMPLIERON, 1 = FALTAN CUMPLIR)*/ CREATE PROC USP_PROBLEMA1 @OPCION INT AS IF @OPCION=0 SELECT APELLIDOS,FECHA_NAC,CUMPLEANOS=STR(MONTH(FECHA_NAC),2)+'-' +STR(DAY(FECHA_NAC),2) FROM EMPLEADOS where month(getdate())>month(fecha_nac) else SELECT APELLIDOS,FECHA_NAC,CUMPLEANOS=STR(MONTH(FECHA_NAC),2)+'-' +STR(DAY(FECHA_NAC),2) FROM EMPLEADOS where month(getdate())
View more...
Comments