Sql Server

811 views

Published on

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

  • Be the first to like this

No Downloads
Views
Total views
811
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
61
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Sql Server

  1. 1. Mejores Prácticas de SQL Server. Gonzalo Sayago
  2. 2. Agenda <ul><li>Tipos de instrucciones. </li></ul><ul><li>Indices. </li></ul><ul><li>Formalizando el Join. </li></ul><ul><li>Relaciones Muchos a Muchos. </li></ul><ul><li>Fechas. </li></ul><ul><li>Insert con indices. </li></ul><ul><li>Union. </li></ul>
  3. 3. SQL <ul><li>Datos </li></ul><ul><li>DML (Data Manipulation Language) </li></ul><ul><ul><li>Select </li></ul></ul><ul><ul><li>Insert </li></ul></ul><ul><ul><li>Update </li></ul></ul><ul><ul><li>Delete. </li></ul></ul><ul><li>TCL (Transactional Control Language) </li></ul><ul><ul><li>Begin Trans </li></ul></ul><ul><ul><li>Commit </li></ul></ul><ul><ul><li>Rollback. </li></ul></ul><ul><li>Administración </li></ul><ul><li>DDL (Data Definition Language) </li></ul><ul><ul><li>Create </li></ul></ul><ul><ul><li>Alter </li></ul></ul><ul><ul><li>Drop. </li></ul></ul><ul><li>DCL (Data Control Language) </li></ul><ul><ul><li>Grant </li></ul></ul><ul><ul><li>Revoke. </li></ul></ul>
  4. 4. ¿Qué es índice? <ul><li>Es una estructura de datos que mejora la velocidad de acceso a los registros de una tabla. </li></ul>
  5. 5. Indices + Indices Branch Select Id, Name From Branch Where Id = @Id and Name = @Name Name+Id Select Id, Name From Branch Where Id = @Id and Name like @Name% Id+Name Select Id, Name From Branch Where Name = @Name Name Select Id, Name From Branch Where Id = @Id Id Consulta Indice
  6. 6. Indice (Arbol B+) <ul><li>Seek 6 </li></ul>Seek >=2 http:// www.seanster.com/BplusTree/BplusTree.html Clustered Index
  7. 7. Bookmark Lookup <ul><li>Select [Name] From [Area] Where [Id] = 3 </li></ul>
  8. 8. Bookmark Lookup <ul><li>Select [Name] From [Area] Where [Id] = 3 </li></ul>http:// www.seanster.com/BplusTree/BplusTree.html Area
  9. 9. TIP Select Name From Branch Where (Id < 2) Or (Id > 2) Select Name From Branch Where (Id <> 2) Index Scan Index Seek
  10. 10. Cluster y Non Cluster Index <ul><li>Puede haber un solo índice Clustered por tabla. </li></ul><ul><li>Los índices Clustered están asociados a la tabla. </li></ul><ul><li>Los índices non clustered puede haber mas de uno por tabla. </li></ul>
  11. 11. ¿Cuándo crear un índice?
  12. 12. Indices Select Name From Area Where Campo1 = @Param1 And Campo2 = @Param2 <ul><li>Indice sobre Campo1 </li></ul><ul><li>Indice sobre Campo2 </li></ul><ul><li>Indice sobre Campo1 y Campo2 </li></ul><ul><li>Indice compuesto sobre Campo1 y Campo2 </li></ul>
  13. 13. Select
  14. 14. Campos de un Select <ul><li>Tabla.columna </li></ul><ul><li>Vista.columna </li></ul><ul><li>Table_Alias.columna </li></ul><ul><li>Tabla.columna as Alias </li></ul><ul><li>Vista.columna as Alias </li></ul><ul><li>Table_Alias.columna as Alias </li></ul><ul><li>Tabla.columna Alias </li></ul><ul><li>Vista.columna Alias </li></ul><ul><li>Table_Alias.columna Alias </li></ul><ul><li>columna </li></ul>Expresion as Alias Expresion Alias Alias = Expresion Expresion * Tabla.* Vista.* Alias.*
  15. 15. <ul><li>Select [Id], [Name] </li></ul><ul><li>From [Branch] </li></ul><ul><li>Order By [Name] </li></ul>Select Resultado Branch
  16. 16. <ul><li>Select [Hola] = [Id], </li></ul><ul><li>[Como estas?] = [Name] </li></ul><ul><li>From [Branch] </li></ul><ul><li>Order By [Como estas?] </li></ul>Select Resultado Branch
  17. 17. <ul><li>Select [Branch].[Id], </li></ul><ul><li>[Branch].[Name], </li></ul><ul><li>[Area].[BranchId], </li></ul><ul><li>[Area].[Id], </li></ul><ul><li>[Area].[Name] </li></ul><ul><li>From [Branch], [Area] </li></ul>Branch Area Index Scan Index Scan Cuantos registros trae esta consulta? Los graficos son iguales Branch Area
  18. 18. Producto Cartesiano <ul><li>Dados los conjuntos A y B, se llama producto cartesiano de A con B al conjunto AxB definido por: </li></ul><ul><li>AxB = {(x, y) / x Є A e y Є B} </li></ul><ul><li>Es decir: </li></ul>A B AxB Select [Branch].[Id], [Branch].[Name], [Area].[BranchId], [Area].[Id], [Area].[Name] From [Branch], [Area] Branch Area
  19. 19. <ul><li>Select [Branch].[Id], [Branch].[Name], [Area].[Id], [Area].[Name], [Area].[BranchId] </li></ul><ul><li>From [Branch], [Area] </li></ul><ul><li>Where </li></ul><ul><li>[Branch].[Id] = [Area].[BranchId] </li></ul>O mas conocido como: Select [Branch].[Id], [Branch].[Name], [Area].[Id], [Area].[Name], [Area].[BranchId] From [Branch] Inner Join [Area] On [Branch].[Id] = [Area].[BranchId] Branch Area Area Branch
  20. 20. <ul><li>Select [Branch].[Id], [Branch].[Name], [Area].[Id], [Area].[Name], [Area].[BranchId] </li></ul><ul><li>From [Branch], [Area] </li></ul><ul><li>Where </li></ul><ul><li>[Branch].[Id] = [Area].[BranchId] </li></ul>Index Scan Index Seek Select [Branch].[Id], [Branch].[Name], [Area].[Id], [Area].[Name], [Area].[BranchId] From [Branch] Inner Join [Area] On [Branch].[Id] = [Area].[BranchId] Los gráficos son diferentes. Area Branch
  21. 21. Muchos a Muchos <ul><li>Factura </li></ul><ul><li>Artículo </li></ul><ul><li>ArtículoFactura </li></ul><ul><li>Quiero obtener todos los datos de la factura 1 con todos los artículos. </li></ul>
  22. 22. Muchos a Muchos <ul><li>Select F.*, A.* From Factura F </li></ul><ul><li>Inner Join ArtículoFactura FA FA.FacturaId = F.Id </li></ul><ul><li>Inner Join Artículo A on FA.ArticuloId = A.Id </li></ul><ul><li>Where F.Id = 1 </li></ul><ul><li>= </li></ul><ul><li>Select F.*, A.* From Factura F </li></ul><ul><li>Inner Join ArtículoFactura FA FA.FacturaId = F.Id </li></ul><ul><li>Inner Join Artículo A on FA.ArticuloId = A.Id </li></ul><ul><li>Where FA.FacturaId = 1 </li></ul>
  23. 23. Muchos a Muchos <ul><li>Select F.* From Factura F </li></ul><ul><li>Left Join ArtículoFactura FA FA.FacturaId = F.Id </li></ul><ul><li>Where FA.Cantidad Is Null Or FA.Cantidad > 100 </li></ul><ul><li>= </li></ul><ul><li>Select F.* From Factura F </li></ul><ul><li>Left Join ArtículoFactura FA FA.FacturaId = F.Id </li></ul><ul><li>Where FA.FacturaId Is Null Or FA.Cantidad > 100 </li></ul>
  24. 24. Constantes, Parametros y Valores
  25. 25. Constantes, Parametros y Valores <ul><li>Create Procedure Ejemplo1 </li></ul><ul><li>@id Int </li></ul><ul><li>As </li></ul><ul><li>Select Name From Area Where Id = @Id </li></ul><ul><li>Create Procedure Ejemplo2 </li></ul><ul><li>As </li></ul><ul><li>Select Name From Area Where Expire > GetDate() </li></ul>
  26. 26. Date y Time 4 bytes 1 minuto Del 1 de enero de 1900 hasta el 6 de junio de 2079 smalldatetime 8 bytes 3,33 Milisegundos Del 1 de enero de 1753 hasta el 31 de diciembre de 9999 datetime Tamaño Precisión Intervalo Tipo de dato
  27. 27. Funciones DateAdd y DateDiff Select Nombre From Promocion Where VigenteDesde <= GetDate() And DateAdd(day,1,VigenteHasta)>=GetDate() Select Nombre From Promocion Where VigenteDesde <= GetDate() And VigenteHasta >= GetDate()-1
  28. 28. Funciones DateAdd y DateDiff Supongamos que las promociones duran 30 dias: Select Nombre From Promocion Where DateDiff(day, VigenteDesde, Getdate()) < 30 Select Nombre From Promocion Where GetDate() - 30 < VigenteDesde
  29. 29. Date y Time Create Procedure Fechas @date_from smalldatetime=null, @date_to smalldatetime=null As Select Name From Area Where (CreateDate > @date_from Or @date_from Is Null) And (CreateDate < @date_to Or @date_to Is Null) Create Procedure Fechas @date_from smalldatetime=‘19000101’, @date_to smalldatetime=‘20790606’ As Select Name From Area Where (CreateDate > @date_from) And (CreateDate < @date_to)
  30. 30. Date y Time Create Procedure Fechas @date_from smalldatetime=null, @date_to smalldatetime=null As Select Name From Area Where (CreateDate > @date_from Or @date_from Is Null) And (CreateDate < @date_to Or @date_to Is Null) Create Procedure Fechas @date_from smalldatetime=‘19000101’, @date_to smalldatetime=‘20790606’ As Select Name From Area Where (CreateDate > @date_from) And (CreateDate < @date_to)
  31. 31. Date y Time Create Procedure Fechas @date_from smalldatetime=null, @date_to smalldatetime=null As Select Name From Area Where (CreateDate > @date_from Or @date_from Is Null) And (CreateDate < @date_to Or @date_to Is Null) Create Procedure Fechas @date_from smalldatetime=‘19000101’, @date_to smalldatetime=‘20790606’ As Select Name From Area Where (CreateDate between @date_from and @date_to)
  32. 32. Insert Statement
  33. 33. Insert Insert Into [Area] ([Name], [BranchId]) Values ('Plan', 1)
  34. 34. Union Statement
  35. 35. Union All Union La Union NO garantiza que los resultados estén ordenados. Para eso hay que usar un Order By.
  36. 36. Ultimo TIP <ul><li>Select Id, Name from Area </li></ul><ul><li>Where (Name = 'Default' and @Id Is Null) Or (Id = @Id) </li></ul><ul><li>= </li></ul><ul><li>Select Id, Name from Area Where (Name = 'Default' and @Id Is Null) </li></ul><ul><li>Union All </li></ul><ul><li>Select Id, Name from Area Where (Id = @Id) </li></ul><ul><li>= </li></ul><ul><li>If @Id Is Null </li></ul><ul><li>Select Id, Name from Area where Name = 'Default' </li></ul><ul><li>Else </li></ul><ul><li>Select Id, Name from Area where Id = @Id </li></ul>
  37. 37. Preguntas <ul><li>? </li></ul>
  38. 38. The End

×