Databaser, Department of Computing Science, Umeå University - jem@cs.umu.se
Databaser Finns några olika typer Relationsdatabaser är vanligast Vi kommer bara att prata om relationsdatabaser
Strukturerad information Bygger på att man lagrar strukturerad information Begrepp: Databas Databashanterare Modell Schema
Princip Kalle Anka Fågelvägen 12 123 45 Ankeborg Kajsa Anka Dungränd 3 123 82 Ankeborg 0191 123 238 0191 234 832 Joakim von Anka Sedelvägen 99 123 32 Ankeborg 0191 992 991
Efternamn Förnamn Gatuadress Postnummer Telefon Ort Förnamn Efternamn Gatuadress Postnummer Ort Telefon
Kalle Anka Fågelvägen 12 123 45 Ankeborg 0191 123 238 Kajsa Anka Dungränd 123 82 Ankeborg 0191 234 832 Joakim von Anka Sedelvägen 99 123 32 Ankeborg 0191 992 991 Indexering Man indexerar inte allt
Organisera Anta att vi har ett antal studenter som läser kurser på universitetet, då vill vi snabbt kunna se vem som har läst vad etc (tänk LADOK). Hur ska man då göra för att lägga upp en databas för sådan info?
ID Persontabell Förnamn Efternamn Förnamn Efternamn Personnr Gatuadr Ort Postnr telefon email kurs 1 ant kurs 1 klar kurs 1 betyg lab 1 lab 2 lab 3 lab 4 lab 5 lab 6 lab 7 tenta 1 tenta 2 tenta 3 tenta 4 tenta 5 tenta 6 tenta 7 ansv lärare kurs 2 ant kurs 2 klar kurs 2 betyg... ID Adresstabell Gatuadr Postnr Ort Emailtabell ID Email Bläääää Telefontabell ID Telefon Personnrtabell ID Personnr Kurstabell ID Kod Namn Datum etc
Telefontabell Kurstabell Emailtabell Adresstabell Persontabell Personnrtabell
Emailtabell Persontabell PKC PID KID Kurstabell EPC EID PID
SQL Structured Query Language Standard Man skriver SQL och bäddar in det i andra språk
Exempel import sqlite3 as dbman mydb = dbman.connect('test.db') cursor = mydb.cursor() cursor.execute('create table Person(first TEXT, last TEXT)') cursor.execute('insert into Person values ("Kalle","Anka")') cursor.execute('insert into Person values ("Joakim","von Anka")') cursor.execute('insert into Person values ("Tjatte","Anka")') cursor.execute('insert into Person values ("Fnatte","Anka")') cursor.execute('insert into Person values ("Knatte","Anka")') cursor.execute('insert into Person values ("Alexander","Lucas")') mydb.commit()
cursor.execute('select * from Person') for item in cursor.fetchall(): print item # (u'kalle', u'anka') # (u'joakim', u'von Anka') # (u'tjatte', u'anka') # (u'fnatte', u'anka') # (u'knatte', u'anka') # (u'alexander', u'lucas') cursor.execute('select first from Person') for item in cursor.fetchall(): print item # (u'kalle',) # (u'joakim',) # (u'tjatte',) # (u'fnatte',) # (u'knatte',) # (u'alexander',)
cursor.execute('select * from Person') for item in cursor.fetchall(): print "%s har efternamnet %s" % (item[0],item[1]) # Kalle har efternamnet Anka # Joakim har efternamnet von Anka # Tjatte har efternamnet Anka # Fnatte har efternamnet Anka # Knatte har efternamnet Anka # Alexander har efternamnet Lucas cursor.execute('select * from Person where last = "Anka"') print "\n\nfamiljen Anka\n" for item in cursor.fetchall(): print item[0] # Familjen Anka # # Kalle # Tjatte # Fnatte # Knatte
cursor.execute('select * from Person order by last') for item in cursor.fetchall(): print "%s %s" % (item[0],item[1]) # Kalle Anka # Tjatte Anka # Fnatte Anka # Knatte Anka # Alexander Lucas # Joakim von Anka mydb.close()
En person med flera emailadresser Persontabell 1 Joakim von Anka 2 Kalle Anka 3 Kajsa Anka 4 Tjatte Anka Emailtabell joakim@pluring.se 1 jva@disney.com 1 joakim@ankeborg.se 1 kalle@ankeborg.se 2
import sqlite3 db = sqlite3.connect('addresses.db') cursor = db.cursor() # Create person table cursor.execute('create table Person(first text, last text)') # Create email table cursor.execute('create table Email(adr text)') # Insert some info into person table cursor.execute('insert into Person(first,last) values ("Joakim","von Anka")') #Insert some info into email table cursor.execute('insert into Email(adr) values ("joakim@ankeborg.se")') # Ehhhhhhh # Let's start over by deleting everything cursor.execute('drop table Person') cursor.execute('drop table Email')
# Create person table cursor.execute('create table Person(pid integer primary key, first text, last text)') # Create email table cursor.execute('create table Email(adr text, belongsto integer)') # Insert some info into person table cursor.execute('insert into Person(first,last) values ("Joakim","von Anka")') jva = cursor.lastrowid #Insert some info into email table cursor.execute('insert into Email(adr,belongsto) values ("joakim@ankeborg.se",' + str(jva) + ')') cursor.execute('select * from Person inner join Email where Person.pid = Email.belongsto') print cursor.fetchall() [(1, u'joakim', u'von Anka', u'joakim@ankeborg.se', 1)]
cursor.execute(''' select Person.first, Person.last, Email.adr from Person inner join Email where Person.pid = Email.belongsto''' ) for item in cursor.fetchall(): print "%s %s\temail: %s" % (item[0],item[1],item[2]) Joakim von Anka Email: joakim@ankeborg.se
#Insert a second email address cursor.execute('insert into Email(adr,belongsto) values ("joakim@pluring.se",' + str(jva) + ')') cursor.execute(''' select Person.first, Person.last, Email.adr from Person inner join Email where Person.pid = Email.belongsto''' ) for item in cursor.fetchall(): print "%s %s\temail: %s" % (item[0],item[1],item[2]) Joakim von Anka Email: joakim@ankeborg.se Joakim von Anka Email: joakim@pluring.se
Ny version med finesser db = sqlite3.connect('addresses.db') cursor = db.cursor() # Set up tables cursor.execute('create table Person(pid integer primary key, first text, last text)') cursor.execute('create table Email(adr text, belongsto integer)') def addinfo(first,last,adrlist): cursor.execute("insert into Person(first,last) values (?,?)", (first,last)) id = cursor.lastrowid for adr in adrlist: cursor.execute("insert into Email values (?,?)",(adr,id))
# Populate with data addinfo('kalle','anka',['donald@disney.com','kalle@ankeborg.se']) addinfo('kajsa','anka',['kajsa@ankeborg.se']) addinfo('alexander','lucas',['alex@ankeborg.se','lucky@disney.com']) addinfo('joakim','von Anka',['joakim@pluring.se','joakim@jva.com','jva@disney.com']) addinfo('knatte','anka',['knatte@ankeborg.se','knatte@grongolingarna.org']) addinfo('fnatte','anka',['fnatte@ankeborg.se','fnatte@grongolingarna.org']) addinfo('tjatte','anka',['tjatte@ankeborg.se','tjatte@grongolingarna.org']) db.commit()
# List all email addresses cursor.execute('select adr from Email') for adr in cursor.fetchall(): print 'Email: %s' % adr Email: donald@disney.com Email: kalle@ankeborg.se Email: kajsa@ankeborg.se Email: alex@ankeborg.se Email: lucky@disney.com Email: joakim@pluring.se Email: joakim@jva.com Email: jva@disney.com Email: knatte@ankeborg.se Email: knatte@grongolingarna.org Email: fnatte@ankeborg.se Email: fnatte@grongolingarna.org Email: tjatte@ankeborg.se Email: tjatte@grongolingarna.org
# List all email address for all people cursor.execute('''select Person.pid, Person.first, Person.last, Email.adr from Person inner join Email where Person.pid = Email.belongsto order by Person.pid ''') previd = -1 for adr in cursor.fetchall(): if previd!= adr[0]: previd = adr[0] print "%s %s has the following email address(es)" % (adr[1],adr[2]) print '\t%s' % adr[3] Kalle Anka has the following email address(es) donald@disney.com kalle@ankeborg.se Kajsa Anka has the following email address(es) kajsa@ankeborg.se Alexander Lucas has the following email address(es) alex@ankeborg.se lucky@disney.com
# So let's find out who has an email address that ends in # '@grongolingarna.org' cursor.execute('''select Person.first, Person.last from Person inner join Email where Person.pid = Email.belongsto and Email.adr like '%@grongolingarna.org ''') for adr in cursor.fetchall(): print "%s %s" % (adr[0],adr[1]) Knatte Anka Fnatte Anka Tjatte Anka
# So let's find out who has an email address that ends in # '@grongolingarna.org' cursor.execute('''select Person.first, Person.last from Person inner join Email where Person.pid = Email.belongsto and Email.adr like '%@grongolingarna.org' order by Person.first ''') for adr in cursor.fetchall(): print "%s %s" % (adr[0],adr[1]) Fnatte Anka Knatte Anka Tjatte Anka