 Källkoden för /anders.enges/sql/default.asp
 Källkoden för /anders.enges/sql/default.asp 
<!--#include file="../inc/navstuff.asp" -->
<!--#include file="dbconn.asp" -->
<!--#include file="sqlinc.asp" -->
<p>
     	<b>Tag inte dessa sidor allt för allvarligt för tillfället. Det kommer 
          		mer och bättre snart. För tillfället vill jag bara testa 
          		några koncept.</b>
</p>
<p>
     	Structured Query Language (SQL) är ett "språk" som 
     	används för att hantera databaser. Nedan kommer en snabb 
     	genomgång av de vanligaste lösningarna i SQL med betoning på 
     	förfrågningar (SELECT)
</p>
<h4>
     	1. SELECT
</h4>
<p>
     	SELECT används för att få en del av en datatabell. Delen kan 
     	vara vissa kolumner eller vissa rader eller en kombination av dessa.
</p>
<p>
     	För exemplen antas det finnas två tabeller i en databas, bägge 
     	rätt enkla.
</p>
<%
Set C = Server.CreateObject("ADODB.Connection")
C.Open sqlConn
Set R = C.Execute("SELECT * From Arbete")
%>
<p>
     	<table border="0">
          		<tr>
               			<td valign="top">
                    				Tabellen <b>Arbete</b>:
                    				<br />
                    				<table border="0" cellspacing="0" cellpadding="1" bgcolor="#000000">
                         					<tr>
                              						<td>
                                   							<table border="0" cellpadding="3" cellspacing="0" bgcolor="#FFFFFF">
                                        								<TR bgcolor="#EEEEEE">
                                             									<%  For i = 0 to R.Fields.Count - 1 %>
                                             									<TD>
                                                  										<B>
                                                       											<%  = R(i).Name %>
                                                  										</B>
                                             									</TD>
                                             									<%  Next %>
                                        								</TR>
                                        								<%  Do While Not R.EOF %>
                                        								<TR>
                                             									<%  For i = 0 to R.Fields.Count - 1 %>
                                             									<TD valign="top" align="<%=align(R, i) %>">
                                                  										<%  = R(i) %>
                                             									</TD>
                                             									<%  Next %>
                                        								</TR>
                                        								<%
      R.MoveNext
Loop
R.Close
%>
                                   							</table>
                              						</td>
                         					</tr>
                    				</table>
               			</td>
               			<td valign="top">
                    				 
               			</td>
               			<td valign="top">
                    				Tabellen <b>Avdelningar</b>:
                    				<br />
                    				<%
Set C = Server.CreateObject("ADODB.Connection")
C.Open sqlConn
Set R = C.Execute("SELECT * From Avdelningar")
%>
                    				<table border="0" cellspacing="0" cellpadding="1" bgcolor="#000000">
                         					<tr>
                              						<td>
                                   							<table border="0" cellpadding="3" cellspacing="0" bgcolor="#FFFFFF">
                                        								<TR bgcolor="#EEEEEE">
                                             									<%  For i = 0 to R.Fields.Count - 1 %>
                                             									<TD>
                                                  										<B>
                                                       											<%  = R(i).Name %>
                                                  										</B>
                                             									</TD>
                                             									<%  Next %>
                                        								</TR>
                                        								<%  Do While Not R.EOF %>
                                        								<TR>
                                             									<%  For i = 0 to R.Fields.Count - 1 %>
                                             									<TD valign="top" align="<%=align(R, i) %>">
                                                  										<%  = R(i) %>
                                             									</TD>
                                             									<%  Next %>
                                        								</TR>
                                        								<%
      R.MoveNext
Loop
R.Close
C.Close
%>
                                   							</table>
                              						</td>
                         					</tr>
                    				</table>
               			</td>
          		</tr>
     	</table>
<p>
     	Enklaste formen av SELECT:
</p>
<div class="code">
     	SELECT <i>fältnamn</i> FROM <i>tabellnamn</i>
</div>
<p>
     	blir för tabellen Arbete (genom att klicka på SQL satsen så 
     	får du se resultatet):
</p>
     	<%  =insSQL(1) %>
<p>
     	* betyder alltså att raden kan läsas (på svenska) som:
     	<br>
     	VÄLJ allt FRÅN tabellen Arbete
</p>
<p>
     	Vill vi inte ha alla kolumner (fält) med kan man sätta dit 
     	fältnamnen, med komma mellan, enligt nedanstående exempel:
</p>
     	<%  =insSQL(2) %>
     	<%  =insSQL(3) %>
     	<%  =insSQL(4) %>
<p>
     	Prova på att översätta SELECT satsen till svenska.
</p>
<p>
     	Observera att fälten inte behöver sättas i "rätt" ordning, utan 
     	vi kan räkna upp dem vilken ordningsföljd som helst
</p>
<p>
     	Det kan även gå att sätta samma fält fler gånger, 
     	men resultatet blir kanske inte det du väntat dig... Mer om detta lite 
     	senare i texten
</p>
     	<%  =insSQL(5) %>
     	<h4>
          		2. Sortering av datat
     	</h4>
<p>
     	För sortering används ORDER BY villkor. Se nedanstående exempel 
     	som sortera enligt namn:
</p>
     	<%  =insSQL(6) %>
<p>
     	Ingenting hindrar att vi kombinerar sorteringar. Om vi gör detta kommer 
     	den att utföra sorteringen i den ordnings vi satt dit fältnamnen. I 
     	nedanstående exempel sorteras datat efter namn i första hand och om 
     	det finns flera likadana namn sordteras dessa efter datum
</p>
     	<%  =insSQL(7) %>
<p>
     	Sortering kan ske i antingen stigande ordning (a till ö - 
     	standardinställningen) eller fallande (ö till a). Vill vi få 
     	sorteringen fallande används ordet DESC. För stigande kan man 
     	använda ordet ASC, men det är onödigt. I nedanstående 
     	exempel sorteras namnet i stigande ordning men datumen i fallande.
</p>
     	<%  =insSQL(8) %>
<p>
     	Och nästa sorteras namnen omvänt men datum stigande
</p>
     	<%  =insSQL(9) %>
<p>
     	Det går även att sortera efter ett fält som inte visas. I 
     	nedanstående visas ID och namn, men datat sorteras efter datum
</p>
     	<%  =insSQL(10) %>
<h4>
     	3. Val av poster
</h4>
<h4>
     	3.1. Numeriska fält
</h4>
<p>
     	Vi är oftast inte intresserade av allt data som finns i en tabell, utan 
     	vill bara få vissa rader (poster). För detta används ordet 
     	WHERE. Se nedanstående exempel som bara visar personser från 
     	avdelning 1:
</p>
     	<%  =insSQL(11) %>
<p>
     	Vi kan här använda de vanliga operanderna:
</p>
<blockquote>
     	<table width="400" border="0" cellspacing="0" cellpadding="0">
          		<tr>
               			<td>
                    				=
               			</td>
               			<td>
                    				lika med
               			</td>
          		</tr>
          		<tr>
               			<td>
                    				<
               			</td>
               			<td>
                    				mindre än
               			</td>
          		</tr>
          		<tr>
               			<td>
                    				<=
               			</td>
               			<td>
                    				mindre än eller lika med
               			</td>
          		</tr>
          		<tr>
               			<td>
                    				>
               			</td>
               			<td>
                    				större än
               			</td>
          		</tr>
          		<tr>
               			<td>
                    				>=
               			</td>
               			<td>
                    				större än eller lika med
               			</td>
          		</tr>
          		<tr>
               			<td>
                    				<>
               			</td>
               			<td>
                    				olika
               			</td>
          		</tr>
     	</table>
</blockquote>
     	<%  =insSQL(12) %>
     	<%  =insSQL(13) %>
     	<%  =insSQL(14) %>
<h4>
     	3.2. Textfält
</h4>
<p>
     	Ovanstående exempel fungerar bra för nummeriska fält men om 
     	fältet innehållet text måste man skriva lite annorlunda. Text 
     	måste alltid omslutas med ' tecken. Se nedanstående exempel som 
     	väljer ut bara de poster där namn är Eva.
</p>
     	<%  =insSQL(15) %>
<p>
     	Samma operander som för numeriska fält fungerar även här, 
     	bara man kommer ihåg att omsluta texten med ' tecken. Se 
     	nedanstående exempel:
</p>
     	<%  =insSQL(16) %>
     	<%  =insSQL(17) %>
     	<%  =insSQL(18) %>
<p>
     	Eftersom ' tecknet anväds för att omsluta texter kan följande 
     	SELECT sats ge oss problem:
</p>
     	<%  =insSQL(27) %>
<p>
Däremot fungerar följande:
     	<%  =insSQL(28) %>
<p>
     	Observera att det inte är dubbelt citationstecken " i raden utan <b>två</b>
     	' tecken efter varandra!
</p>
<p>
     	<i><b>Tips:</b></i> I VB kan man använda Replace funktionen. Då kan man 
     	skriva följande:
</p>
<div class="code">
     	Dim villkor As String
     	<br />
     	Dim SQL As String
     	<br />
     	villkor = "rock<font color="#FF0000">'</font>n<font color="#FF0000">'</font>roll"
     	<br />
     	SQL = "SELECT * FROM Avdelningar WHERE Namn = <font color="#FF0000">'</font>" 
     	& Replace(villkor, "<font color="#FF0000">'</font>", "<font color="#FF0000">''</font>") 
     	& "<font color="#FF0000">'</font>"
     	<br />
     	...
     	<br />
</div>
<p>
     	Observera användningen av <font color="#FF0000">&</font> och <font color="#FF0000">
          		'</font> ovan.
</p>
<h4>
     	3.3. Datum
</h4>
<p>
     	Datum är ett mycket sorgligt kapitel. Det finns ett stort antal sätt 
     	att kombinera datum, och alla länder har sitt system. I Finland brukar vi 
     	skriva 12.2.2001 när vi avser 12:e februari år 2001. I andra 
     	länder kan detta skrivas på annat sätt. I vissa länder 
     	använder man "."i andra länder "-" eller 
     	"/". För att säkersälla att datum fungerar - oavsett 
     	landsinställningar - kan man använde s.k. "date literals". 
     	Dessa skall alltid omslutas med # tecken samt vara i formen mm/dd/yy eller 
     	mm/dd/yyyy - d.vs. månad med två siffror, ett /-tecken, dag med 
     	två siffror, ett /-tecken samt år med två eller fyra siffror. 
     	Lite beroende på landsintällningarna kan man få andra 
     	versioner att fungera, men kan aldrig vare helt säker...
</p>
<p>
     	Nedan är ett exempel på en SQL sats som plockar ut de poster vars 
     	Timmar fält är 12:e dagen i 2:a månaden år 2001 samt en 
     	som plockar ut de som är senare än detta datum.
</p>
     	<%  =insSQL(19) %>
<p>
     	Man kan aldrig vara helt säker på vad som sker med datum. Se 
     	på nedanstående exempel. Vad är det egentligen vi väljer? 
     	(Testdatabasen är gjord i Access 2000. Andra system uppför sig lite 
     	annorlunda)
</p>
     	<%  =insSQL(20) %>
     	<%  =insSQL(21) %>
     	<%  =insSQL(22) %>
     	<%  =insSQL(23) %>
     	<%  =insSQL(24) %>
     	<%  =insSQL(25) %>
     	<%  =insSQL(26) %>
<p>
     	Jag brukar ibland "förfalla i synd" och sätta in datum i 
     	textfält. Om man sätter dem i formen YYYYMMDD, t.ex. 20010923, 
     	så går de dessutom att sortera med vanlig textsortering. Hur vi 
     	gör beror lite på vad vi tänker göra med datumen. Om det 
     	är ett textfält så kan vi inte utföra matematiska 
     	beräkningar, t.ex. datum +30, men det är inte alltid detta 
     	behövs...
</p>
<h4>
     	3.4. Kombinationer av flera villkor
</h4>
<p>
     	Villkoren som sätts i WHERE delen av SQL satsen går även att 
     	kombinera med hjälp av de logiska operanderna AND, OR och NOT. Nedan 
     	kommer några exempel på detta:
</p>
     	<%  =insSQL(30) %>
     	<%  =insSQL(31) %>
     	<%  =insSQL(32) %>
<p>
     	AND och OR behöver man ofta, NOT kan man ofta arbeta sig förbi om det 
     	gäller de enklare jämförelserna. Nedanstående exempel 
     	gör samma sak, men är uttryckta på olika sätt. Avgör 
     	själv vilken du tycker är lättare.
</p>
     	<%  =insSQL(33) %>
     	<%  =insSQL(34) %>
<p>
     	Följande gör även den samma sak med det data vi nu har, men du 
     	måste fråga dig själv om det alltid är så, eller om 
     	det bara råkar vara en slump på grund av datats innehåll. Vad 
     	tror du?
</p>
     	<%  =insSQL(35) %>
<h4>
     	3.5. Parenteser
</h4>
<p>	Gör följande SELECT satser samma sak?</p>
     	<%  =insSQL(36) %>
     	<%  =insSQL(37) %>
     	<%  =insSQL(38) %>
<p>
     	Slutsats: Om man inte använder parenteser så utförs 
     	kombinationerna från vänster till höger. De två 
     	första gjorde samma sak, den tredje avvek från de två 
     	tidigare.
</p>
<!--#include file="../inc/footer.asp" -->