+-----------+----------+
| firstname | lastname |
+-----------+----------+
| alice | bob |
+-----------+----------+
SELECT
firstname,
lastname
FROM
Employee
WHERE
lastname = 'bob'
>
, <, >=, <=, = age >= 21- Not equal: <> or != isDeleted != TRUE
- Within a range temperature BETWEEN 68 AND 75
- Member of a set companyname in ('Microsoft', 'LinkedIn')
- String ends with email LIKE '%.gov'
- String includes summary LIKE '%spicy%'
- String length billing_state LIKE '__'
SELECT
productname
FROM
Product
WHERE (
unitprice > 60
AND unitsinstock > 20
)
- lower
- max
- min
- count
- substr
- ...
SELECT productname
FROM Product
WHERE lower(productname) LIKE '%dride%'
SELECT 'bob marley' LIKE '%marley'; -- TRUE
- ORDER BY
- ASC or DESC
SELECT productname, unitprice
FROM Product
ORDER BY unitprice DESC
- one to one
- one to many
- many to many
# Order
+----+------------+---------+
| id | customerid | amount |
+----+------------+---------+
| 1 | 1 | 99.00 |
| 2 | 1 | 212.00 |
| 3 | 3 | 14.50 |
| 4 | 12 | 1000.00 |
+----+------------+---------+
# Customer
+----+------+
| id | name |
+----+------+
| 1 | mike |
| 2 | mark |
| 3 | lisa |
+----+------+
SELECT *
FROM Order o
INNER JOIN Customer c
ON o.customerid = c.id
+----+------------+--------+----+------+
| id | customerid | amount | id | name |
+----+------------+--------+----+------+
| 1 | 1 | 99.00 | 1 | mike |
| 2 | 1 | 212.00 | 1 | mike |
| 3 | 3 | 14.50 | 3 | lisa |
+----+------------+--------+----+------+
- rows from the left will always be selected
SELECT *
FROM Order o
LEFT JOIN Customer c
ON o.customerid = c.id
+----+------------+---------+----+------+
| id | customerid | amount | id | name |
+----+------------+---------+----+------+
| 1 | 1 | 99.00 | 1 | mike |
| 2 | 1 | 212.00 | 1 | mike |
| 3 | 3 | 14.50 | 3 | lisa |
| 4 | 12 | 1000.00 | | |
+----+------------+---------+----+------+
- rows from the right will always be selected
SELECT *
FROM Order o
RIGHT JOIN Customer c
ON o.customerid = c.id
+----+------------+--------+----+------+
| id | customerid | amount | id | name |
+----+------------+--------+----+------+
| 1 | 1 | 99.00 | 1 | mike |
| 2 | 1 | 212.00 | 1 | mike |
| 3 | 3 | 14.50 | 3 | lisa |
| | | | 2 | mark |
+----+------------+--------+----+------+
SELECT *
FROM Order o
FULL JOIN Customer c
ON o.customerid = c.id
+----+------------+---------+----+------+
| id | customerid | amount | id | name |
+----+------------+---------+----+------+
| 1 | 1 | 99.00 | 1 | mike |
| 2 | 1 | 212.00 | 1 | mike |
| 3 | 3 | 14.50 | 3 | lisa |
| | | | 2 | mark |
| 4 | 12 | 1000.00 | | |
+----+------------+---------+----+------+
SELECT o.id,
o.customerid,
o.amount,
c.name
FROM Order o
INNER JOIN Customer c
ON o.customerid = c.id
+----+------------+--------+------+
| id | customerid | amount | name |
+----+------------+--------+------+
| 1 | 1 | 99.00 | mike |
| 2 | 1 | 212.00 | mike |
| 3 | 3 | 14.50 | lisa |
+----+------------+--------+------+
- perform calculations on a set of values
- SUM adds values together
- COUNT counts the number of values
- MIN/MAX find min/max value
- AVG calculates the average of values
select SUM(amount) from Order
- find total amount per customer
SELECT c.id,
c.name,
o.amount,
FROM Order o
INNER JOIN Customer c
ON o.customerid = c.id
+----+------+--------+
| id | name | amount |
+----+------+--------+
| 1 | mike | 99.00 |
| 1 | mike | 212.00 |
| 3 | lisa | 14.50 |
+----+------+--------+
- collapse the id using
GROUP BY
and sum theamount
SELECT c.id,
c.name,
sum(o.amount),
FROM Order o
INNER JOIN Customer c
ON o.customerid = c.id
GROUP BY c.id
+----+------+--------+
| id | name | amount |
+----+------+--------+
| 1 | mike | 311.00 |
| 3 | lisa | 14.50 |
+----+------+--------+
- second filtering after all the groups are done
SELECT month,
sum(amount)
FROM Customer
GROUP BY month
HAVING sum(amount) >= 300
- nested SELECT query
SELECT *
FROM Product
WHERE categoryid=(
SELECT id
FROM Category
WHERE categoryname='Beerages'
)
INSERT INTO Customer
VALUES (8424, 'alice', 'sleeps')
Name: bob
INSERT INTO Customer (name, notes)
VALUES ('bob ', 'bob notes')
Name: '); DROP TABLE Customer; --
INSERT INTO Customer (name, notes)
VALUES (''); DROP TABLE Customer; --', 'bob notes')
DELETE FROM Customer
WHERE name = 'alice'
- queries either happens or ignored
BEGIN;
INSERT INTO Customer ....;
COMMIT; -- save!
BEGIN;
INSERT INTO Customer ....;
ROLLBACK; -- revert!
Order
+----+-----------+----------+
| id | unitprice | quantity |
+----+-----------+----------+
| 1 | 9.00 | 14 |
| 2 | 7.00 | 8 |
+----+-----------+----------+
UPDATE Order
SET quantity = 50
WHERE id=1
Order
+----+-----------+----------+
| id | unitprice | quantity |
+----+-----------+----------+
| 1 | 9.00 | 50 |
| 2 | 7.00 | 8 |
+----+-----------+----------+
- for quick retrieval later
# People
+----+-----------+-----------+
| id | firstname | last_name |
+----+-----------+-----------+
| 1 | rick | sanchez |
| 2 | mike | north |
| 3 | mark | grabanski |
| 4 | morty | smith |
| 5 | jerry | smith |
| 6 | summer | smith |
| 7 | beth | smith |
+----+-----------+-----------+
# Index: People (last_name)
+-----------+-----------+
| value | records |
+-----------+-----------+
| grabanski | 3 |
| north | 2 |
| sanchez | 1 |
| smith | 4,5, 6, 7 |
+-----------+-----------+
SELECT * FROM Order WHERE orderid = 10793
CREATE INDEX order_orderid ON Order(orderid)
SELECT * FROM Order WHERE orderid = 10793
CREATE INDEX order_orderid_customerid
ON Order(orderid, customerid)
- name/type pairs
CREATE TABLE UserPreferences (
id INT PRIMARY KEY, -- an integer
favorite_color CHAR(6), -- exactly 6 characters
age SMALLINT, -- an "small" integer
birth_date DATE, -- date (may or may not include time)
notes VARCHAR(255), -- up to 255 characters
is_active BOOLEAN -- boolean
)
CREATE TABLE UserPreferences (
id INT PRIMARY KEY NOT NULL, -- required
favorite_color CHAR(6),
age SMALLINT,
birth_date DATE NOT NULL, -- required
notes VARCHAR(255),
is_active BOOLEAN NOT NULL -- required
)
CREATE TABLE UserAccount (
email VARCHAR(255) UNIQUE NOT NULL,
name VARCHAR(255)
)
CREATE UNIQUE INDEX useraccount_email ON UserAccount(email)
- combination of NOT NULL and UNIQUE
CREATE TABLE UserAccount (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255)
)
# Order
+----+------------+---------+
| id | customerid | amount |
+----+------------+---------+
| 1 | 1 | 99.00 |
| 2 | 1 | 212.00 |
| 3 | 3 | 14.50 |
| 4 | 12 | 1000.00 |
+----+------------+---------+
# Customer
+----+------+
| id | name |
+----+------+
| 1 | mike |
| 2 | mark |
| 3 | lisa |
+----+------+
CREATE TABLE Customer (
id SERIAL PRIMARY KEY,
name VARCHAR(255)
)
CREATE TABLE Order (
id SERIAL PRIMARY KEY,
customerid INTEGER NOT NULL REFERENCES Customer(id),
amount REAL
)