Here is the login Sequence
Here is the game sequence diagram
use Community_Assist
--stored procedures
--script
--parameterized view
go
Create proc usp_CityProc
@City nvarchar(255)
As
Select PersonLastname [Last],
personFirstName [first],
PersonEmail Email,
PersonAddressCity City
From Person p
inner join PersonAddress pa
on p.PersonKey=pa.PersonKey
Where PersonAddressCity=@City
exec usp_CityProc 'Kent'
--more complicated procedure
--3 different stages (just the inserts, try catch error trapping
--check to see if already exits
--Register a new user
--insert into person
--when insert into person you need to hash the password
--insert into personAddress
--insert into contacts
go
Create proc usp_RegisterMark2
@lastName nvarchar(255),
@firstName nvarchar(255),
@Email nvarchar(255),
@Password nvarchar(255),
@Apartment nvarchar(255) =null,
@Street nvarchar(255),
@City nvarchar(255)= 'Seattle',
@State nchar(2) ='WA',
@Zip nchar(10),
@home nvarchar(255)= null,
@work nvarchar(255) =null
As
--get the random number seed
Declare @seed int = dbo.fx_GetSeed()
--Declare variable to store the hash
Declare @hashed varbinary(500)
--hash the plain text password
set @hashed = dbo.fx_HashPassword(@seed, @password)
--insert Person
Insert into Person(PersonLastName,
PersonFirstName, PersonEmail, PersonPassWord,
PersonEntryDate, PersonPassWordSeed)
Values(@lastName,@firstName,@email,
@hashed,GetDate(),@seed)
--get the most recent identity from Person
Declare @PersonKey int = Ident_Current('Person')
--insert into PersonAddress
Insert into PersonAddress (PersonAddressApt,
PersonAddressStreet, PersonAddressCity,
PersonAddressState, PersonAddressZip, PersonKey)
Values(@Apartment,@Street, @City,@state,@zip, @PersonKey)
--insert into contact
if @home is not null
begin
Insert into Contact(ContactNumber, ContactTypeKey, PersonKey)
Values(@home, 1, @PersonKey)
end
if @work is not null
begin
Insert into Contact(ContactNumber, ContactTypeKey, PersonKey)
Values(@Work, 2, @PersonKey)
end
go
exec usp_RegisterMark2
@lastName='Branson',
@firstName='Martin',
@Email='bmartin@gmail.com',
@Password='BransonPass',
@Street='1001 North Elsewhere',
@Zip='98100',
@home='2065552314'
Select * from Contact
--second version with try catch
--transactions
go
Alter proc usp_RegisterMark2
@lastName nvarchar(255),
@firstName nvarchar(255),
@Email nvarchar(255),
@Password nvarchar(255),
@Apartment nvarchar(255) =null,
@Street nvarchar(255),
@City nvarchar(255)= 'Seattle',
@State nchar(2) ='WA',
@Zip nchar(10),
@home nvarchar(255)= null,
@work nvarchar(255) =null
As
--get the random number seed
Declare @seed int = dbo.fx_GetSeed()
--Declare variable to store the hash
Declare @hashed varbinary(500)
--hash the plain text password
set @hashed = dbo.fx_HashPassword(@seed, @password)
--begin transaction
begin tran
--begin try
Begin try
--insert Person
Insert into Person(PersonLastName,
PersonFirstName, PersonEmail, PersonPassWord,
PersonEntryDate, PersonPassWordSeed)
Values(@lastName,@firstName,@email,
@hashed,GetDate(),@seed)
--get the most recent identity from Person
Declare @PersonKey int = Ident_Current('Person')
--insert into PersonAddress
Insert into PersonAddress (PersonAddressApt,
PersonAddressStreet, PersonAddressCity,
PersonAddressState, PersonAddressZip, PersonKey)
Values(@Apartment,@Street, @City,@state,@zip, @PersonKey)
--insert into contact
if @home is not null
begin
Insert into Contact(ContactNumber, ContactTypeKey, PersonKey)
Values(@home, 1, @PersonKey)
end
if @work is not null
begin
Insert into Contact(ContactNumber, ContactTypeKey, PersonKey)
Values(@Work, 2, @PersonKey)
end
Commit tran --write the transaction
End try --end the try
Begin Catch --catch an error
Rollback tran --undo anything that has been done
print Error_Message()
End catch
go
exec usp_RegisterMark2
@lastName='Branson',
@firstName='Martin',
@Email='bmartin@gmail.com',
@Password='BransonPass',
@Street='1001 North Elsewhere',
@Zip='98100',
@home='2065552314'
--third and final version
--we will check to see if person exists
go
Alter proc usp_RegisterMark2
@lastName nvarchar(255),
@firstName nvarchar(255),
@Email nvarchar(255),
@Password nvarchar(255),
@Apartment nvarchar(255) =null,
@Street nvarchar(255),
@City nvarchar(255)= 'Seattle',
@State nchar(2) ='WA',
@Zip nchar(10),
@home nvarchar(255)= null,
@work nvarchar(255) =null
As
if Not exists
(Select * from Person
Where PersonEmail=@Email
And PersonLastName = @LastName
And PersonFirstName=@FirstName)
Begin --begin if
--get the random number seed
Declare @seed int = dbo.fx_GetSeed()
--Declare variable to store the hash
Declare @hashed varbinary(500)
--hash the plain text password
set @hashed = dbo.fx_HashPassword(@seed, @password)
--begin transaction
begin tran
--begin try
Begin try
--insert Person
Insert into Person(PersonLastName,
PersonFirstName, PersonEmail, PersonPassWord,
PersonEntryDate, PersonPassWordSeed)
Values(@lastName,@firstName,@email,
@hashed,GetDate(),@seed)
--get the most recent identity from Person
Declare @PersonKey int = Ident_Current('Person')
--insert into PersonAddress
Insert into PersonAddress (PersonAddressApt,
PersonAddressStreet, PersonAddressCity,
PersonAddressState, PersonAddressZip, PersonKey)
Values(@Apartment,@Street, @City,@state,@zip, @PersonKey)
--insert into contact
if @home is not null
begin
Insert into Contact(ContactNumber, ContactTypeKey, PersonKey)
Values(@home, 1, @PersonKey)
end
if @work is not null
begin
Insert into Contact(ContactNumber, ContactTypeKey, PersonKey)
Values(@Work, 2, @PersonKey)
end
Commit tran --write the transaction
End try --end the try
Begin Catch --catch an error
Rollback tran --undo anything that has been done
print Error_Message()
End catch
End--end if
Else --if person does exist
Begin
print 'Already in database'
End
go
exec usp_RegisterMark2
@lastName='Branson',
@firstName='Martin',
@Email='bmartin@gmail.com',
@Password='BransonPass',
@Street='1001 North Elsewhere',
@Zip='98100',
@home='2065552314'
--create a stored procedure to
--update address information
go
Create proc usp_UpdateAddress
@PersonAddressApt nvarchar(255),
@PersonAddressStreet nvarchar(255),
@PersonAddressCity nvarchar(255),
@PersonAddressState nvarchar(255),
@PersonAddressZip nvarchar(255),
@PersonKey int
As
Begin tran
Begin try
Update PersonAddress
Set PersonAddressApt=@personAddressApt,
PersonAddressStreet=@personAddressStreet,
PersonAddressCity=@PersonAddressCity,
PersonAddressState = @PersonAddressState,
PersonAddressZip=@PersonAddressZip
Where PersonKey = @PersonKey
Commit tran
End Try
Begin Catch
Rollback tran
print Error_message()
End Catch
Select * from PersonAddress
Exec usp_UpdateAddress
@PersonAddressApt='10A',
@PersonAddressStreet='1001 North Mann Street',
@PersonAddressCity='Seattle',
@PersonAddressState='Wa',
@PersonAddressZip='98001',
@PersonKey=1
use Community_Assist
--temporary tables
Create table #TempTable
(
PersonKey int,
personLastName nvarchar(255),
PersonFirstName nvarchar(255),
PersonEmail nvarchar(255)
)
Insert into #tempTable (PersonKey, personLastName,PersonFirstName, PersonEmail)
Select Personkey, PersonLastName, PersonFirstName, PersonEmail
From Person
Select * from #TempTable
Create table ##TempTable2
(
PersonKey int,
personLastName nvarchar(255),
PersonFirstName nvarchar(255),
PersonEmail nvarchar(255)
)
Insert into ##tempTable2 (PersonKey, personLastName,PersonFirstName, PersonEmail)
Select Personkey, PersonLastName, PersonFirstName, PersonEmail
From Person
--functions--scalar
go
Create function fx_Cube
(@number int)
returns int
As
Begin
Declare @cube int
Set @Cube = @number * @number * @number
return @Cube
End
Go
Select EmployeeKey, dbo.fx_Cube(EmployeeKey) as cubed from Employee
Select * from Person
go
/* this one doesn't work for some reason
Alter Function fx_Address
(@Address nvarchar(255),
@apartment nvarchar(255),
@City nvarchar(255),
@State nvarchar(255),
@Zip nvarchar(255))
returns nvarchar(255)
As
Begin
Declare @complete nvarchar(255)
if @Apartment is not null
Begin
set @complete = @address + ' ' + @Apartment + ' '
+ @city + ', ' + @state + ' ' + @zip
End
Else
Begin
set @complete = @address + ' ' + @city + ', ' + @state + ' ' + @zip
End
return @Complete
End */
go
go
Alter function fx_OneLineAddress
(@Apartment nvarchar(255),
@Street nvarchar(255),
@City nvarchar(255),
@State nchar(2),
@Zip nchar(9))
returns nvarchar(255)
as
Begin
Declare @address nvarchar(255)
if @Apartment is null
Begin
Set @Address=@Street + ', ' + @City + ', ' + @state + ' ' + @zip
End
else
Begin
Set @Address= @Street + ', ' + @Apartment + ', ' + @City + ', ' + @state + ' ' + @zip
End
return @Address
End
go
Select PersonLastName, PersonFirstName,
dbo.fx_oneLineAddress(
PersonAddressApt,
PersonAddressStreet,
PersonAddressCity,
PersonAddressState,
PersonAddressZip) as [Address]
From Person p
inner Join PersonAddress pa
on p.PersonKey = pa.PersonKey
go
Create function fx_RequestMax
(@GrantTypeKey int,
@RequestAmount money)
returns money
As
Begin
Declare @Max money
Select @Max=GrantTypeMaximum from GrantType
Where GrantTypeKey = @GrantTypeKey
Declare @Differance money
set @Differance = @max - @RequestAmount
Return @Differance
End
go
Select GrantRequestKey, GrantRequestDate, GrantRequestAmount,
dbo.fx_RequestMax(GrantTypeKey, GrantRequestAmount) as Diff
From GrantRequest
Artist Class
package com.spconger; public class Artist { private String artistName; private String artistURL; private String artistInfo; public String getArtistName() { return artistName; } public void setArtistName(String artistName) { this.artistName = artistName; } public String getArtistURL() { return artistURL; } public void setArtistURL(String artistURL) { this.artistURL = artistURL; } public String getArtistInfo() { return artistInfo; } public void setArtistInfo(String artistInfo) { this.artistInfo = artistInfo; } }
Here is the fan Class
package com.spconger; import java.util.ArrayList; public class Fan { private String Name; private String Email; private ArrayList<Artist>followArtists; private ArrayList<String> genres; private ArrayList<String> alerts; public Fan() { followArtists = new ArrayList<Artist>(); } public String getName() { return Name; } public void setName(String name) { Name = name; } public String getEmail() { return Email; } public void setEmail(String email) { Email = email; } public ArrayList<Artist> getFollowArtists() { return followArtists; } public void AddArtist(Artist a){ followArtists.add(a); } public void RemoveArtist(Artist a){ followArtists.remove(a); } }
Here is the Program class where I call the classes and methods
package com.spconger; import java.util.ArrayList; public class Program { public static void main(String[] args) { Fan f = new Fan(); f.setName("Joe Demaggio"); f.setEmail("JD@gmail.com"); Artist a1 = new Artist(); a1.setArtistName("ACDC"); f.AddArtist(a1); Artist a2 = new Artist(); a2.setArtistName("Bob Dylan"); f.AddArtist(a2); Artist a3 = new Artist(); a3.setArtistName("Ozzy Osborne"); f.AddArtist(a3); ArrayList<Artist>artists = f.getFollowArtists(); for(Artist a : artists){ System.out.println(a.getArtistName()); } System.out.println(); f.RemoveArtist(a1); ArrayList<Artist>artists1 = f.getFollowArtists(); for(Artist a : artists1){ System.out.println(a.getArtistName()); } } }
--set operators
--union joins two different tables
--both sides of the union need to have a similar structure
use Community_Assist
Select PersonLastName, PersonFirstName, PersonEmail
From Person
Union
Select EmployeeLastName, EmployeeFirstName, EmployeeEmail
From MetroAlt.dbo.Employee
Select PersonLastName, PersonFirstName, PersonEmail, PersonAddressCity
From Person p
Inner Join PersonAddress pa
ON p.PersonKey=pa.PersonKey
Union
Select EmployeeLastName, EmployeeFirstName, EmployeeEmail, EmployeeCity
From MetroAlt.dbo.Employee
--intersect returns all the values that are in both
--selects
Select PersonAddressCity
From PersonAddress pa
Intersect
Select EmployeeCity
From MetroAlt.dbo.Employee
Select EmployeeCity
From MetroAlt.dbo.Employee
intersect
Select PersonAddressCity
From PersonAddress pa
--Except returns only those values that are in
--the first query that are NOT in the second
Select PersonAddressCity
From PersonAddress pa
Except
Select EmployeeCity
From MetroAlt.dbo.Employee
Select EmployeeCity
From MetroAlt.dbo.Employee
except
Select PersonAddressCity
From PersonAddress pa
--modify data
--basic insert
Insert into Person(PersonLastName, PersonFirstName, PersonEmail,PersonEntryDate)
values ('Johnson','Rupert','rj@outlook.com',getDate())
--insert multiple rows
Insert into Person(PersonLastName, PersonFirstName, PersonEmail,PersonEntryDate)
values ('Lexington','Mark','marklex@gmail.com', GetDate()),
('Ford', 'Harrison', 'Hansolo@starwars.com', GetDate())
--create variable for password and seed
Declare @seed int = dbo.fx_getseed()
Declare @password varbinary(500) = dbo.fx_HashPassword(@seed, 'MoonPass')
Insert into Person(PersonLastName, PersonFirstName,
PersonEmail, PersonPassWord, PersonEntryDate,
PersonPassWordSeed)
Values('Moon', 'Shadow','shadow@gmail.com', @password, GetDate(),@seed)
--the ident_current function returns the last autonumber (identity) created
--in the database named
Insert into PersonAddress(
PersonAddressStreet,
PersonAddressCity, PersonAddressState,
PersonAddressZip, PersonKey)
Values ('1010 South Street', 'Seattle', 'WA', '98000',IDENT_CURRENT('Person'))
Select * from PersonAddress
--update changes existing data.
--it is one of the most dangerous
--SQL Commands
Update Person
Set PersonFirstName='Jason'
where PersonKey =1
--begin a manual transaction (allows undo)
Begin tran
Update Person
Set PersonLastName='Smith',
PersonEmail='rs@outlook.com'
Where personKey=130
Select * from Person
Select * from GrantType
Rollback tran --undo transaction
Commit Tran -- write the results to the database
--update everything on purpose
Update GrantType
Set GrantTypeMaximum=GrantTypeMaximum * 1.05,
GrantTypeLifetimeMaximum=GrantTypeLifetimeMaximum * 1.1
Delete From Person where personkey=1
--won't work because of referential integrity constraints
begin tran
--but it will work on a child table
--this command will delete all the records
--in the personAddress table
Delete from Personaddress
Select * from personAddress
rollback tran
Create table People
(
lastname nvarchar(255),
firstname nvarchar(255),
email nvarchar(255)
)
Insert into people(lastname, firstname, email)
select personlastname, personfirstName, personEmail
from person
Select * from people
Delete from people
Where email ='JAnderson@gmail.com'
--another way to delete all
--the records in a table
Truncate table people
--Drops the whole table
Drop table people
Here are the whiteboard drawings we did in class. The first is for a CROSS JOIN. in a CROSS JOIN, each row in the first table is matched to every row in the second table. This gives you a result set that shows every possible combination of values. A CROSS JOIN ignores any actual relationships between the tables, that is why they don't have an ON clause to specify the relationship. A CROSS JOIN can be useful for some things, but it is very rare that you will want to use one. In fact, almost never.
An INNER JOIN returns only matching rows, that is only rows where the primary key of the first table is a foreign key in the second table. Any unmatched records are ignored. This is the kind of join you will use at least 90% of the time. It allows you to see all the sales belonging to a particular customer, for instance, or all the people who have donated money.
An OUTER JOIN returns all the records from one side of the relationship and only matching records from the other side. In a LEFT OUTER JOIN the query returns all the records in the first table listed and only matching records in the second. A RIGHT OUTER JOIN reverses that, returning all the records from the second table and only matching records from the first. A FULL OUTER JOIN returns all the records from both tables whether they match or not. OUTER joins are useful for finding records that DON'T match: Customers that don't have orders, Inventory items that no one has ever purchased, etc. Again, only use OUTER JOINS when you are looking for mismatches.
--table expressions
--sub query in the from clause
--sub queries must be aliased
Select PersonLastName, PersonFirstName, PersonEmail, City
From (Select PersonLastname, PersonFirstName, PersonEmail, PersonAddressCity City
From Person p
inner join PersonAddress pa
on p.PersonKey = pa.PersonKey
where PersonAddressCity='Bellevue') as BellevueResidents
--same but with wildcard
Select *
From (Select PersonLastname, PersonFirstName, PersonEmail, PersonAddressCity City
From Person p
inner join PersonAddress pa
on p.PersonKey = pa.PersonKey
where PersonAddressCity='Bellevue') as BellevueResidents
--another table expression example
Select GrantType, total, Average
From (Select GrantTypeName GrantType, Sum(GrantRequestAmount) as Total,
Avg(GrantRequestAmount) as Average
From GrantRequest gr
inner join GrantType gt
on gr.GrantTypeKey=gt.GrantTypeKey
Group by GrantTypeName) as TypeTotals
--Common table expressions are similar
--to reqular expressions except
--the subquery is defined first which
--is better logically
With BellevueResidents as
(
Select PersonLastname, PersonFirstName, PersonEmail, PersonAddressCity City
From Person p
inner join PersonAddress pa
on p.PersonKey = pa.PersonKey
where PersonAddressCity='Bellevue'
) Select * from BellevueResidents
go
-- a second example
with typeTotals as
(
Select GrantTypeName GrantType, Sum(GrantRequestAmount) as Total,
Avg(GrantRequestAmount) as Average
From GrantRequest gr
inner join GrantType gt
on gr.GrantTypeKey=gt.GrantTypeKey
Group by GrantTypeName
)Select GrantType, Total, Average from TypeTotals
go
--Declare @City nvarchar(255) ='Kent'
Declare @city nvarchar(255)
set @city ='Kent';
With BellevueResidents as
(
Select PersonLastname, PersonFirstName, PersonEmail, PersonAddressCity City
From Person p
inner join PersonAddress pa
on p.PersonKey = pa.PersonKey
where PersonAddressCity=@city
) Select * from BellevueResidents
go
--views are basically stored queries-- they usually
--represent "a view" some user has of the data
--they also can be used to obscure the underlying
--structure of the database, because the user
--of a view can only see the aliases for the columns
--and can't see the underlying tables
Create view vw_Employee
As
Select
PersonLastName [Last Name],
PersonFirstName [First Name],
PersonEmail Email,
EmployeeHireDate [Hire Date],
EmployeeAnnualSalary [Annual Salary],
PositionName [Position]
From Person p
inner join Employee e
on p.Personkey=e.PersonKey
inner join EmployeePosition ep
on e.EmployeeKey = ep.EmployeeKey
inner join Position ps
on ep.PositionKey=ps.PositionKey
Go
Select [last name], [first name], Email from vw_Employee
Where [Annual Salary] > 0
order by [Last Name]
--schemabinding makes it so that the
--tables underlying the view
--cannot be changed
--at least not without removing the view
go
Create view vw_Donations with schemabinding
As
Select PersonLastName,
PersonFirstName,
PersonEmail,
DonationDate,
DonationAmount
From dbo.person p
inner join dbo.donation d
on p.PersonKey=d.PersonKey
go
Select * from vw_Donations
go
--this won't work because table bound to view
Alter table Donation
Drop column DonationDate
go
--a schema, in this context, is a set of objects
--with common ownership
--dbo, database owner, is the default schema
Create schema managerSchema
go
--here is a view that is owned by the managerSchema
Create view managerSchema.RequestSummary
As
Select GrantTypeName GrantType, Sum(GrantRequestAmount) as Total,
Avg(GrantRequestAmount) as Average
From GrantRequest gr
inner join GrantType gt
on gr.GrantTypeKey=gt.GrantTypeKey
Group by GrantTypeName
go
--table valued function is a function that
--returns a table as a result
--this one takes a parameter @City
--that must be provided by the user
Create function fx_GetCities(@city nvarchar(255))
returns table
As
Return
(
Select PersonLastname, PersonFirstName, PersonEmail, PersonAddressCity City
From Person p
inner join PersonAddress pa
on p.PersonKey = pa.PersonKey
where PersonAddressCity=@city
)
--using the function
go
Select * from dbo.fx_GetCities('Kent')