Michael Kowalczyk 11 months ago
parent e9c9f8d3cc
commit 1cda7cceb1

@ -0,0 +1,39 @@
Indexes
=======
* An index is a data structure (usually a B-tree) for fast column lookups.
* You don't need to (and probably shouldn't) put an index on every column, but if for example a column is used in the WHERE clause of an SQL statement, you should consider adding an index to that column.
* If a table is not indexed, queries may go slow because the database may have to do a full table scan (i.e. linear search).
CREATE TABLE RandomData(
ID INTEGER PRIMARY KEY,
Num FLOAT NOT NULL
);
INSERT INTO RandomData(Num) VALUES (RANDOM());
INSERT INTO RandomData(Num) VALUES (RANDOM());
INSERT INTO RandomData(Num) VALUES (RANDOM());
INSERT INTO RandomData(Num) VALUES (RANDOM());
INSERT INTO RandomData(Num) VALUES (RANDOM());
INSERT INTO RandomData(Num) VALUES (RANDOM());
INSERT INTO RandomData(Num) VALUES (RANDOM());
SELECT * FROM RandomData;
INSERT INTO RandomData(Num) SELECT a.Num/b.Num AS Num FROM RandomData AS a JOIN RandomData AS b ON a.ID != b.ID;
INSERT INTO RandomData(Num) SELECT a.Num/b.Num AS Num FROM RandomData AS a JOIN RandomData AS b ON a.ID != b.ID;
INSERT INTO RandomData(Num) SELECT a.Num/b.Num AS Num FROM RandomData AS a JOIN RandomData AS b ON a.ID != b.ID;
SELECT COUNT(*) FROM RandomData;
SELECT * FROM RandomData WHERE ID=1234567; /* SQLite automatically puts an index on PRIMARY KEY and UNIQUE columns */
SELECT * FROM RandomData WHERE Num>=.998 AND Num<=.999; /* Not indexed; it takes a second. */
CREATE INDEX Idx_RandomData_Num ON RandomData(Num); /* Naming convention for an index: Idx_TableName_ColumnName; */
SELECT * FROM RandomData WHERE Num>=.998 AND Num<=.999;
DROP INDEX Idx_RandomData_Num;
SELECT * FROM RandomData LIMIT 10;

@ -0,0 +1,53 @@
Transactions
============
A transaction is a sequence of statements that are treated as one unit; either all of them occur or none of them.
Syntax and features vary somewhat based on the DBMS.
Classic example: moving money from one bank account to another.
Autocommit mode:
Every statement is treated as a transaction of its own.
Most DBMSs have autocommit mode on by default.
To do a multi-statement transaction: BEGIN...COMMIT
Systems support various means to explicitly ROLLBACK a transaction using if statements, etc.
SQLite Example:
---------------
CREATE TABLE Customers(
CustomerID INTEGER PRIMARY KEY,
Name TEXT NOT NULL
);
CREATE TABLE Accounts(
AccountID INTEGER PRIMARY KEY,
CustomerID INTEGER NOT NULL,
Balance INTEGER NOT NULL,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID),
CHECK (Balance >= 0) /* Enforces a constraint that no account may be overdrawn. */
);
INSERT INTO Customers (Name) VALUES("DrKow");
INSERT INTO Accounts (CustomerID, Balance) VALUES(1,1000);
INSERT INTO Accounts (CustomerID, Balance) VALUES(1,2000);
/* This statement is a single-line transaction; since it failed for one row, it will not modify any rows. */
UPDATE Accounts SET Balance = Balance - 1500;
BEGIN;
UPDATE OR ROLLBACK Accounts SET Balance = Balance + 50 WHERE AccountID=1;
UPDATE OR ROLLBACK Accounts SET Balance = Balance / 0 WHERE AccountID=1; /* This makes it crash, but the transaction is safely rolled back. */
UPDATE OR ROLLBACK Accounts SET Balance = Balance - 50 WHERE AccountID=2;
COMMIT;
/* The following command will also be rolled back, because the non-negative balance constraint would be violated. */
BEGIN;
UPDATE OR ROLLBACK Accounts SET Balance = Balance + 5000 WHERE AccountID=1;
UPDATE OR ROLLBACK Accounts SET Balance = Balance - 5000 WHERE AccountID=2;
COMMIT;
/* Note that the "OR ROLLBACK" part is required in SQLite; if you run the command above without it, 5000 will be added to one account without deducting it from the other. */
SELECT Name,AccountID,Balance FROM Customers JOIN Accounts ON Customers.CustomerID=Accounts.CustomerID;

@ -0,0 +1,35 @@
'Created with https://www.planttext.com/
@startuml
skin rose
title Bird database
class Species {
SpeciesID
Name
}
class Regions {
RegionID
Name
}
class Sightings {
SightingID
Latitude
Longitude
Date
}
class Spotters {
SpotterID
Name
}
Regions -right- Species: "0..* 0..*"
Species -right- Sightings: "1 0..*"
Sightings -right- Spotters: "0..* 0..1"
@enduml

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@ -0,0 +1,79 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Homework 1: Bird database</title>
<link rel="stylesheet" href="../style.css">
<style>
img {
border: 1px solid black;
}
</style>
</head>
<body>
<div id="page">
<h1>Homework 1: Bird database</h1>
<p>This homework gives pracice with the most important aspects of SQL we covered.</p>
<h2>Assignment</h2>
<p>
Write commands to implement the database represented in the class diagram below in SQLite. You can use <a href="https://sql.js.org/examples/GUI/">this SQL interpreter</a> or a local installation of SQLite, at your discretion. You will be submitting <strong>all of the SQL commands</strong> to implement the database, as described below.
</p>
<h2>Database design</h2>
<p>
<img src="class diagram.png" width="550"><br>
Implement the database as pictured above. Note that the many-to-many relationship between Species and Regions will require a junction table. Write the following in SQL (invent data as necessary).
<ul>
<li>Create all tables
<ul>
<li>Use a primary key for each table (a junction table should get a two-column primary key if each pairing should happen at most once)</li>
<li>Declare foreign key constraints where appropriate</li>
<li>Declare an index for the SpotterID foreign key column of Sightings</li>
</ul>
</li>
<li>Fill tables with initial data
<ul>
<li>Put in at least 6 actual bird species</li>
<li>Put in the regions: Midwest, Northeast, South, West</li>
<li>Put in 3 spotters (one of them should be JD - the Math/CS department head who is a birder)</li>
<li>Put in at least 4 sightings; at least two of them should be by JD</li>
<li>Associate each bird with the regions it actually lives in</li>
</ul>
</li>
<li>
Include the following query commands:
<ul>
<li>Select the lat, lon, date, and species name for each sighting made by JD.</li>
<li>Pick some specific bird species and write a query that selects all region names in which it lives.</li>
</ul>
</li>
<li>
Include the following update command:
<ul>
<li>Update some bird's name to its scientific name.</li>
</ul>
</li>
<li>
Include the following delete command:
<ul>
<li>Delete a given spotter by ID and NULL out his/her ID in all of the associated sightings. Do this as a transaction and specify OR ROLLBACK for the commands therein.</li>
</ul>
</li>
</ul>
</p>
<p>Note that in real life, it would likely be useful to have a geospatial index on latitude and longitude. SQLite doesn't support this, but there are <a href="https://www.gaia-gis.it/fossil/libspatialite/index">add-ons</a> and <a href="https://www.linkedin.com/pulse/what-geospatial-index-gaurav-pandey">workarounds</a> (though that is not required for this assignment).</p>
<hr>
<p>Submit a text document with all of your SQL commands in Educat, by November 6, 2024.</p>
</div>
</body>
</html>

@ -0,0 +1,75 @@
.tab {
padding-left: 15px;
}
body {
background-color: #ffffb0;
margin: 0;
padding: 0;
}
#page {
margin-left: 30px;
margin-right: 30px;
margin-top: 10px;
margin-bottom: 10px;
background-color: #fffff0;
padding: 7px;
border-style: double;
border-color: #000000;
border-width: 3px;
}
.underline {
text-decoration: underline;
}
img {
max-width: 100%;
height: auto;
border: 1px solid black;
}
/* This is so code samples look reasonable */
pre {
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
overflow-x: auto;
border-width: 1px;
border-color: black;
border-style: solid;
background-color: white;
padding: 4px;
}
blockquote {
border-width: 1px;
border-color: black;
border-style: solid;
background-color: white;
padding: 4px;
}
.output {
border-width: 3px;
border-style: double;
border-color: white;
background-color: #000000;
color: #ffffff;
padding: 3px;
}
img {
max-width: 100%;
}
table {
border-collapse: collapse;
}
td, th {
border: 1px solid black;
padding: 4px;
background-color: white;
}

@ -43,6 +43,7 @@
<ul>
<li><code>git commit</code> - makes a new commit.</li>
<li><code>git branch <em>branchName</em></code> - makes a new branch.</li>
<li><code>git branch -f <em>branchName</em> <em>target</em></code> - forces the given branch to move to the target commit or branch.</li>
<li><code>git checkout <em>branchName</em></code> - changes to the given branch.</li>
<li><code>git checkout -b <em>branchName</em></code> - <strong>creates and</strong> changes to the given branch.</li>
<li><code>git merge <em>branchName</em></code> - merges the given branch in with the current one.</li>

Loading…
Cancel
Save