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" -->