Skip to content

Instantly share code, notes, and snippets.

@WesGlassmeyer
Last active March 14, 2021 18:27
Show Gist options
  • Save WesGlassmeyer/a2fc190f83acd885a5591466aafa1a53 to your computer and use it in GitHub Desktop.
Save WesGlassmeyer/a2fc190f83acd885a5591466aafa1a53 to your computer and use it in GitHub Desktop.
SQL Drills

In these drills, you'll practice executing basic CRUD (create, read, update, delete) operations in the psql shell.

Before you get started, download this SQL data dump. Create and populate a new database using the data dump (make sure to update the path with the location where you saved the file):

psql -U dunder_mifflin_admin -d restaurants-app -f ~/Downloads/nyc-restaurants-data-backup.sql

Take a moment to get familiar with this new database. You can use \dt+ to see a list of public tables and \d <TABLENAME> to see a description of those tables.

Once you've successfully completed a drill, paste your query into a Gist to reference later on.

1. Get all restaurants

Write a query that returns all of the restaurants, with all of the fields.

SELECT * FROM restaurants;

2. Get Italian restaurants

Write a query that returns all of the Italian restaurants, with all of the fields

SELECT * FROM restaurants WHERE cuisine = 'Italian';

3. Get 10 Italian restaurants, subset of fields

Write a query that gets 10 Italian restaurants, returning only the id and name fields.

SELECT id, name FROM restaurants WHERE cuisine = 'Italian' LIMIT 10;

4. Count of Thai restaurants

Write a query that returns the number of Thai restaurants.

SELECT COUNT(*) FROM restaurants WHERE cuisine = 'Thai';

5. Count of restaurants

Write a query that returns the total number of restaurants.

SELECT COUNT(*) FROM restaurants;

6. Count of Thai restaurants in zip code

Write a query that returns the number of Thai restaurants in the 11372 zip code.

SELECT COUNT(*) FROM restaurants WHERE cuisine = 'Thai' AND address_zipcode = '11372';

7. Italian restaurants in one of several zip codes

Write a query that returns the id and name of five Italian restaurants in the 10012, 10013, or 10014 zip codes. The initial results (before limiting to five) should be alphabetically sorted.

SELECT id, name, FROM restaurants 
WHERE cuisine = 'Italian' 
AND address_zipcode > '10011'
AND ADDRESS_ZIPCODE < '10015'
ORDER BY name ASC
LIMIT 5;

8. Create a restaurant

Create a restaurant with the following properties:

name: 'Byte Cafe',
borough: 'Brooklyn',
cuisine: 'coffee',
address_building_number: '123',
address_street: 'Atlantic Avenue',
address_zipcode: '11231'
INSERT INTO restaurants
	(name, borough , cuisine, address_building_number , address_street , address_zipcode )
VALUES (
	'Byte Cafe',
	'Brooklyn',
	'coffee',
	'123',
	'Atlantic Avenue',
	'11231'
);

9. Create a restaurant and return id and name

Create a restaurant with values of your choosing, and return the id and name.

INSERT INTO restaurants
	(name, borough , cuisine, address_building_number , address_street , address_zipcode )
VALUES (
	'Great Cafe',
	'Brooklyn',
	'coffee',
	'42',
	'Atlantic Avenue',
	'11231'
)
RETURNING id, name;

10. Create three restaurants and return id and name

Create three restaurants using a single command, with values of your choosing, returning the id and name of each restaurant.

INSERT INTO restaurants
	(name, borough , cuisine, address_building_number , address_street , address_zipcode )
VALUES (
	'Great Cafe',
	'Brooklyn',
	'coffee',
	'42',
	'Atlantic Avenue',
	'11231'
),
(
	'Eagles Nest',
	'Brooklyn',
	'American',
	'653',
	'Broadway St',
	'11231'
),
(
	'Milk and Eggs',
	'Brooklyn',
	'Breakfast',
	'999',
	'Market St',
	'11231'
)
RETURNING id, name;

11. Update a record

Update the record whose value for nyc_restaurant_id is '30191841'. Change the name from 'Dj Reynolds Pub And Restaurant' to 'DJ Reynolds Pub and Restaurant'.

UPDATE restaurants SET name = 'DJ Reynolds Pub and Restaurant'
	WHERE NYC_RESTAURANT_ID = 30191841;

12. Delete by id

Delete the grade whose id is 10.

DELETE FROM grades WHERE id = 10;

13. A blocked delete

Try deleting the restaurant with id of 22. What error do you get?

Paste the error text for the answer. We'll learn about foreign key constraints in the next reading, but take two seconds and come up with your own theory about what this message means.

SQL Error [23503]: ERROR: update or delete on table "restaurants" violates foreign key constraint "grades_restaurant_id_fkey" on table "grades"
  Detail: Key (id)=(22) is still referenced from table "grades".
  • There is relational data linking that restaurant to a grade and so we can't delete because the grades hold the primary key.

14. Create a table

Create a new table called inspectors with the following properties:

first_name: String of inspector's first name, required
last_name: String of inspector's last name, required
borough: The borough the inspector works in, not required, one of Bronx, Brooklyn, Manhattan, Queens, Staten Island.

inspectors should also have a system generated primary key property, id.

Note that the borough property requires you to use an enumerated type, which is a list of set values you can use for a property. You can use an existing enumerated type that will already be in the table: borough_options.

CREATE TABLE inspectors (
	id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
	first_name TEXT NOT NULL,
	last_name TEXT NOT NULL,
	borough borough_options
);

15. Update a table

Add a notes field to the grades table. notes are not required, and are text.

ALTER TABLE grades ADD COLUMN notes TEXT;

16. Drop a table

Drop the inspectors table from the database.

DROP TABLE IF EXISTS inspectors;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment