- Gain practice using Postgres SQL commands
- Understand CRUD
- Become familiar with Postgres documentation Postgres 9.3 Docs
- CRUD => Create, Read, Update, Destroy This is the lifecycle of data in an applicatoin. In SQL, CRUD can be mapped to the following INSERT, SELECT, UPDATE, DELETE.
Create INSERT
Read SELECT
Update UPDATE
Destroy DELETE
Click on the elephant in the top right corner of the page to open the postgres menu. Click "open psql" to open a psql terminal window. Insert the following commands in the psql terminal window. To close the window: \q.
CREATE DATABASE testdb;
Next, list all of the available databases:
\list
Now connect to the database we just created.
\connect testdb
Once we connect, our command prompt should look similar to this: testdb=#
Check what tables we have in our newly created database:
\dt
At this point we should have a database with no tables in it. So now we need to create tables.
Let's look at the Postgres docs for CREATE TABLE doc.
The basic structure for table creation:
CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);
Example:
This is an example of a instructors table. We will talk about the primary key soon.
CREATE TABLE instructors (
id SERIAL PRIMARY KEY,
name TEXT,
phone_no TEXT,
email TEXT
);
It denotes an attribute on a table that can uniquely identify the row.
SERIAL tells the database to automatically assign the next unused integer value to id whenever we insert into the database and do not specify id. In general, if you have a column that is set to SERIAL, it is a good idea to let the database assign the value for you.
Similar to how Ruby has types of data, SQL defines types that can be stored in the DB. Here are some common ones:
- Serial
- Integer
- Numeric // Numbers are exact, no rounding error
- Float // Rounding error is possible, but operations are faster than Numeric
- Text, Varchar
- Timestamp
- Boolean (True or False)
Let's say we no longer need the instructors table from above, to get rid of all of the data and the defiintion of the table, we can use the DROP statement. Here are the DROP TABLE doc.
DROP TABLE instructors;
CREATE TABLE instructors (id SERIAL PRIMARY KEY, name TEXT, phone_no TEXT, email TEXT);
The INSERT SQL command adds new data to a table. Here are the INSERT doc.
Below is an example INSERT command. It inserts a instructor into the instructors database.
INSERT INTO instructors (name, phone_no, email) VALUES ('Spencer Eldred', '123-4567', 'spencer@galvanize.it');
INSERT INTO instructors (name, phone_no, email) VALUES ('Jeff Taggart', '987-6543', 'taggart@galvanize.it');
INSERT INTO instructors (name, phone_no, email) VALUES ('Hunter Gillane', '567-1234', 'hunter@galvanize.it');
Our new row of data will look something like this:
id name phone_no email
1 Spencer Eldred 123-4567 spencer@galvanize.it
2 Jeff Taggart 987-6543 taggart@galvanize.it
3 Hunter Gillane 567-1234 hunter@galvanize.it
Even though we did not specify an id, one was created anyways. Since we have SERIAL as the data type of id, the database knows on a new insert to automatically assign a new unique id to the row.
A select statement allows you to get data from the database. Here are the SELECT doc. Also, postgres has a good SELECT tutorial.
SELECT * FROM instructors;
id | name | phone_no | email
----+----------------+----------+----------------------
1 | Spencer Eldred | 123-4567 | spencer@galvanize.it
2 | Jeff Taggart | 987-6543 | taggart@galvanize.it
3 | Hunter Gillane | 567-1234 | hunter@galvanize.it
(3 rows)
We can specify which attributes we want. If we only want the name and email of the instructor. Here is the query we'd use:
SELECT id, name, email FROM instructors;
id | name | email
----+----------------+----------------------
1 | Spencer Eldred | spencer@galvanize.it
2 | Jeff Taggart | taggart@galvanize.it
3 | Hunter Gillane | hunter@galvanize.it
(3 rows)
This will select the name and email from instructors table WHERE the name = "Spencer Eldred".
SELECT id, name, email FROM instructors WHERE name = 'Hunter Gillane';
id | name | email
----+----------------+---------------------
3 | Hunter Gillane | hunter@galvanize.it
(1 row)
You can also have more complex queries to get data. You can use boolean AND and OR operations in the selector: WHERE name = 'Spencer Eldred' OR email = 'hunter@galvanize.it'
SELECT name, email FROM instructors WHERE name = 'Spencer Eldred' OR email = 'hunter@galvanize.it';
name | email
----------------+----------------------
Spencer Eldred | spencer@galvanize.it
Hunter Gillane | hunter@galvanize.it
(2 rows)
You can order your results by using ORDER BY column_name: DESC - decending or ASC - ascending. ASC is alphabetical order for TEXT columns.
SELECT id, name, email FROM instructors ORDER BY name ASC;
id | name | email
----+----------------+----------------------
3 | Hunter Gillane | hunter@galvanize.it
2 | Jeff Taggart | taggart@galvanize.it
1 | Spencer Eldred | spencer@galvanize.it
(3 rows)
Your list could get really long if there were many instructors. We can limit the size of the list by using LIMIT. Let's instead only get the first name and email by using LIMIT 2:
SELECT name, email FROM instructors ORDER BY name ASC LIMIT 2;
name | email
----------------+----------------------
Hunter Gillane | hunter@galvanize.it
Jeff Taggart | taggart@galvanize.it
(2 rows)
The update statement is defined UPDATE doc in the postgres docs. It is used to change existing data in our database.
For example, use UPDATE if you want to change the phone number for Spencer:
UPDATE instructors SET phone_no='222-1234' WHERE name='Spencer Eldred';
SELECT id, name, phone_no FROM instructors WHERE name='Spencer Eldred';
id | name | phone_no
----+----------------+----------
1 | Spencer Eldred | 222-1234
(1 row)
Deleting works similarly to a select statement. Here are the DELETE doc
The statement below uses DELETE to destroy a specific row from the database instructors (WHERE phone_no='222-1234'):
DELETE FROM instructors WHERE phone_no='222-1234';
SELECT * FROM instructors;
id | name | phone_no | email
----+----------------+----------+----------------------
2 | Jeff Taggart | 987-6543 | taggart@galvanize.it
3 | Hunter Gillane | 567-1234 | hunter@galvanize.it
(2 rows)
** Notice that the id numbers did not change, even though id=1 was deleted. **