SQLite3 tutorial

In lab, we will get practice with the most widely distribute relational DBMS engine available - SQLite. While SQLite is not the most powerful engine, it is relatively simple to start up (no server set up, very little configuration, no dependencies) and implements most common features of SQL.

We will practice using SQLite by defining a simple relational schema, loading in data, and writing queries.

Getting started

To begin, copy my settings file into your home directory to automatically change default sqlite3 settings:

$ cp /home/soni/public/cs44/.sqliterc ~/
Next, run sqlite3 on the command line and the name of the database you are creating. For example:
$ sqlite3 universityDB
To verify that you properly imported settings, you should see a message about "Loading resources". You can also use .show and examine foreign_keys:
$ sqlite3 universityDB
-- Loading resources from /home/asas/.sqliterc

sqlite> .show
     echo: off
  explain: off
  headers: on
     mode: column
nullvalue: ""
   output: stdout
separator: "$"
    stats: off
    width: 

sqlite> PRAGMA foreign_keys;
foreign_keys
------------
1   	

Creating Tables

Using the given relational schema, create 4 tables using the CREATE TABLE command. Be sure to specify types, primary constraints, and foreign key constraints

Student(id:integer, name:varchar, major:varchar, level:varchar, age:integer)
Faculty(id:integer, name:varchar, dept:varchar)
Class(name:varchar, time:varchar, room:varchar, facultyID:integer))
Enrolled(studentID:integer, className:varchar)

As an example this is the SQL command for Student:
CREATE TABLE Student(
	id INTEGER PRIMARY KEY,
  name VARCHAR,
  major VARCHAR,
  level VARCHAR,
  age INTEGER);

In the above schema, italics form the primary key. Add foreign key constraints (studentID refers to Student(id), className refers to Class(name), facultyID refers to Faculty(id)).

When done, use .table to see all tables created and .schema to review your full schema.

Importing data

Most SQL engines have some built-in command to bulk-load entries from some file on disk. I have provided 4 files, one each for the tables you just defined. These files are located in my public space:

$ ls ~soni/public/cs44/universityDB/
class_start  enrolled_start  faculty_start  student_start

o import, use the following command:
.import 'filename' Table
For example:
.import '/home/soni/public/cs44/universityDB/student_start' Student
Load all four tables in order of dependencies (do not load Enrolled before Student otherwise your foreign key will not be satisfied).
sqlite> SELECT * FROM Student;
id          name        major       level       age       
----------  ----------  ----------  ----------  ----------
1111        Mo          CS          SO          20        
1122        Peter       English     JR          20        
1234        Tyler       Math        FR          18        
2222        Jo          Math        SR          21        
2323        Jo          Math        JR          22        
3333        Tanya       Math        JR          21        
4444        Malik       CS          JR          20        
4545        Sarah       English     SR          21        
5555        Chris       Math        FR          19        
6666        Charles     English     FR          18        
6767        Sarah       Math        FR          18        
7777        Josh        CS          SO          19        
7878        Heather     Math        SR          22        
8888        Elmo        CS          SO          20        
9999        Jo          Math        FR          19
Do your results match the original file?

At this point, you should be able to exit and reload the database. All contents are saved in the file you originally invoked when running sqlite (i.e., universityDB). Note that the file is saved locally.

sqlite> .exit
$ sqlite3 universityDB
SQLite version 3.7.9 2011-11-01 00:52:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .table
Class     Enrolled  Faculty   Student 

Practice queries

See if you can answer these queries. The files are small enough that you can manually check for correctness.
  1. Find the names of all CS Majors (Major = 'CS') who are enrolled in the course 'Math06'. (1 result)
  2. Find the name and age of all Junior (Level = 'JR') Math Majors. (2 results)
  3. Find the names of all classes that either meet in room R300 or are taught by 'Kelemen' (7 results)
  4. Find the names of all CS Majors (Major = 'CS') who are enrolled in the course 'Math21' and are older than some Math freshman (Level='FR') (2 results).
  5. For each Level, print the Level and the average age of students of that Level. (4 results)
  6. Find the names of all students who are not enrolled in any class taught by 'Kelemen'. (4 results)
  7. Find the names of all pairs of students who are enrolled in some class together (54 results).
  8. Find the names of faculty members who teach in every room.
  9. Find the names of faculty members who teach in every room in which some class is taught in the time period 'MWF9-10'.