You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.3 KiB
4.3 KiB
PostGres - Advanced
Lesson Objectives - important
- Linking Tables
- Alias
- Indexes
- Default Values
- Constraints
- Distinct
Lesson Objectives - good to know about
- EER Diagrams
- Unions
- Truncate
- Views
- Functions
- Stored Procedures
- Triggers
- Transactions
- Locks
- Privileges
- Denormalization
- Excel -> CSV -> MySQL
Important
Linking Tables
- Some Nice Visuals
- One to Many/Many to One Relationships
- customer has many orders
- One to One Relationships
- each user has one address
- only one person at that address
- Many to Many Relationships
- actors and movies
- Self Referncing Relationships
- customer referral
Alias
SELECT t1.column1 as col1, t2.column2 as col2
FROM table1 as t1
INNER JOIN table2 as t2
ON t1.common_filed = t2.common_field;
Indexes
CREATE INDEX index_name ON table_name (column_name);CREATE INDEX index_name ON table_name (column1_name, column2_name);- Primary Key
- use
\d table_nameto view indexes
Default Values
CREATE TABLE people (id SERIAL, name VARCHAR(16), age INT DEAFULT 0);
\d people
INSERT INTO people (name) VALUES ('matt');
SELECT * FROM people;
Constraints
- NOT NULL
- Unique
- Foreign Keys
CREATE TABLE companies(
id SERIAL,
name VARCHAR(16) NOT NULL,
city VARCHAR(16)
);
INSERT INTO companies ( city ) VALUES ('Palo Alto');
CREATE TABLE people(
id INT,
name VARCHAR(16),
email VARCHAR(32) UNIQUE,
company_id INT REFERENCES companies(id)
);
\d people
INSERT INTO people (name, email, company_id) VALUES ('bob', 'bob@bob.com', 999) -- bad company_id
INSERT INTO people (name, email, company_id) VALUES ('bob', 'bob@bob.com', 1) -- not unique email
Distinct
SELECT DISTINCT city FROM people;
Good to Know About
EER Diagrams
Unions
SELECT name FROM people UNION SELECT name FROM companies; -- show distinct values
SELECT name FROM people UNION ALL SELECT name FROM companies; -- show duplicates
Truncate
TRUNCATE TABLE people; -- delete all data, but don't delete table itself
Views
CREATE VIEW new_yorkers AS SELECT * FROM people WHERE city = 'NYC';
\dv
SELECT * FROM new_yorkers
Functions
CREATE FUNCTION add_numbers(a integer, b integer) RETURNS integer AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql;
\df
SELECT add_numbers(2,4);
Stored Procedures
CREATE PROCEDURE add_person(new_name VARCHAR(16))
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO people (name) VALUES (new_name);
END
$$;
\df
call add_person('matt');
Triggers
CREATE TABLE backup_people (id INT, name VARCHAR(16), age INT);
CREATE FUNCTION moveDeleted() RETURNS trigger AS $$
BEGIN
INSERT INTO backup_people VALUES (OLD.id, OLD.name, OLD.age);
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER archive_person
BEFORE DELETE on people
FOR EACH ROW
EXECUTE PROCEDURE moveDeleted();
\df
DELETE FROM people WHERE id = 1;
Transactions
BEGIN;
INSERT INTO people (name) VALUES ('matt');
SELECT * FROM people;
-- start a different session and run SELECT * FROM people;
-- Switch back to original session
COMMIT;
-- in other session run SELECT * FROM people;
OR
BEGIN;
INSERT INTO people (name) VALUES ('matt');
SELECT * FROM people;
asdfasdfasdfasdfasdfasdf;
ROLLBACK;
SELECT * FROM people;
Locks
BEGIN;
LOCK TABLE people IN ROW EXCLUSIVE MODE;
SELECT * FROM people WHERE id = 12 FOR UPDATE;
-- start a new session and run UPDATE people SET name = 'Matt' WHERE id = 12;
-- switch back to original session
UPDATE people SET age = 43 WHERE id = 12;
SELECT * FROM people;
END;
Privileges
Denormalization
| id | name | age | company_id | company_name | company_address |
|---|---|---|---|---|---|
| 1 | matt | 43 | 1 | SF |
Excel -> CSV -> MySQL
- Create sheet
- File -> Download -> .csv
COPY people (name, age, ancestry, city) FROM '/Users/matthuntington/Downloads/people.csv' DELIMITER ',' CSV;
SQL Injection
- input with value
Huntington'; DROP TABLE people;
