MySQL Notes

Posted by Will on August 29, 2021

Database operations

  • List databases
1
SHOW DATABASES;
  • Create database
1
CREATE DATABASE <database_name>;
  • Delete database
1
DROP DATABASE <database_name>;
  • Use database
1
USE <database_name>;
  • Show current database
1
SELECT database();

Table operations

  • List tables
1
SHOW TABLES;
  • Create table
1
2
3
4
5
CREATE TABLE <table_name>
(
  <column_name> <data_type> <constraint>,
  ...
);
  • Describe table
1
2
SHOW COLUMNS FROM <table_name>;
DESC <table_name>;
  • Delete tables
1
DROP TABLE <table_name>,...;

CRUD operations

  • Insert
1
2
INSERT INTO <table_name>(<column_name>,...) VALUES(<value>,...),...;
INSERT INTO <table_name> SET <column_name>=<value>,...;
  • Select
1
SELECT <column_name> AS <alias_name>,... FROM <table_name> WHERE <condition>;
  • Update
1
UPDATE <table_name> SET <column_name>=<value>,... WHERE <condition>;
  • Delete
1
DELETE FROM <table_name> WHERE <condition>;

Refined selection

  • Distinct
1
SELECT DISTINCT <column_name> FROM <table_name>;
  • Sort
1
SELECT <column_name> FROM <table_name> ORDER BY {<column_name> | <column_number>};
  • Limit (index starting from 0)
1
SELECT <column_name> FROM <table_name> LIMIT [<start_index>, ]<num_of_entries>;
  • Conditional
1
SELECT <column_name> FROM <table_name> WHERE <condition>;

Aggregate functions

  • Count
1
SELECT COUNT({* | <column_name>}) FROM <table_name> GROUP BY <column_name> HAVING <condition>;
  • Min / Max / Sum / Avg
1
SELECT {MIN | MAX | SUM | AVG}(<column_name>) FROM <table_name> GROUP BY <column_name> HAVING <condition>;

String functions

  • Concatenate
1
CONCAT(<column_name>,...);
  • Slice (index starting from 1)
1
SUBSTRING(<column_name>, <start_index>[, <stop_index>]);
  • Substitute
1
REPLACE(<column_name>, <pattern_string>, <replace_string>);
  • Reverse
1
REVERSE(<column_name>);
  • Length
1
CHAR_LENGTH(<column_name>);
  • Uppercase / Lowercase
1
2
UPPER(<column_name>);
LOWER(<column_name>);

Help functions

  • If null default value
1
IFNULL(<column_name>, <default_value>)
  • Round
1
2
ROUND(X)
ROUND(X, D)
  • Ternery
1
IF(<condition>, <yes_value>, <no_value>)

Data types

Type Syntax Description
Char CHAR(<length>) Fixed length
Varchar VARCHAR(<length>) Variable length
Integer INT  
Decimal DECIMAL(<precision>, <scale>) Precise
Float FLOAT Approximate
Double DOUBLE Approximate
Date DATE YYYY-MM-DD
Time TIME HH:MM:SS
Datetime DATETIME YYYY-MM-DD HH:MM:SS
Timestamp TIMESTAMP See example below
Year YEAR YYYY

TIMESTAMP is similar to DATETIME, but with smaller range and lower cost.

1
2
3
4
5
6
CREATE TABLE comments
(
  context VARCHAR(255),
  created_at TIMESTAMP DEFAULT NOW(),
  changed_at TIMESTAMP DEFAULT NOW() ON UPDATE CURRENT_TIMESTAMP
);

Constraints

Type Effect
NOT NULL Ensures that a column cannot be NULL
UNIQUE Ensures that all values in a column are different
PRIMARY KEY Uniquely identifies every row in a table
FOREIGN KEY References a primary key from another table or itself
CHECK Ensures that all values in a column satisify a condition
DEFAULT Default value for a column
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE <table_name>
(
  <column_name> <data_type> NOT NULL,
  <column_name> <data_type> UNIQUE,
  <column_name> <data_type> PRIMARY KEY,
  <column_name> <data_type> FOREIGN KEY REFERENCES <table_name>(<column_name>),
  <column_name> <data_type> DEFAULT <default_value>,
  <column_name> <data_type> CHECK (<condition>),
  PRIMARY KEY (<column_name>,...),
  FOREIGN KEY (<column_name>) REFERENCES <table_name>(<column_name>),
  CONSTRAINT <constraint_name> {CHECK ... | PRIMARY ... | FOREIGN ... },
  ...
);

Conditionals

  • Logical operater
1
SELECT <column_name> FROM <table_name> WHERE <condition> {AND | OR} <condition>;
  • Like
1
SELECT <column_name> FROM <table_name> WHERE <column_name> LIKE <pattern_string>;
  • Between … and … (inclusive)
1
SELECT <column_name> FROM <table_name> WHERE <column_name> BETWEEN <min_value> AND <max_value>;
  • In
1
SELECT <column_name> FROM <table_name> WHERE <column_name> IN (<value>,...);
  • Case
1
CASE WHEN <condition> THEN <value> ... ELSE <value> END
  • Wildcards
Symbol Match
% any number of any char
_ one of any char
\% literal %
\_ literal _

Table joins

Use <table_name>.<column_name> if there is ambiguity.

  • Inner join
1
SELECT <column_name> FROM <table_name> JOIN <table_name> ON <condition>;
  • Left / Right join
1
SELECT <column_name> FROM <table_name> {LEFT | RIGHT} JOIN <table_name> ON <condition>;

Tips

  • Use <column_name> IS NULL rather than <column_name> = NULL
  • Use COUNT(<column_name>) rather than COUNT(*) if NULL should not be counted
  • ON DELETE CASCADE ensures a row gets deleted automatically when the row it references is deleted

Examples

  • Select users who have liked all photos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
  username
FROM
  likes
  INNER JOIN users ON likes.user_id = users.id
GROUP BY
  user_id
HAVING
  COUNT(*) = (
    SELECT
      COUNT(*)
    FROM
      photos
  );
  • One to many relationship

One-to-many relationship

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
CREATE TABLE students
(
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255)
);

CREATE TABLE papers
(
  id INT AUTO_INCREMENT PRIMARY KEY,
  title VARCHAR(255),
  grade INT,
  student_id INT,
  FOREIGN KEY(student_id) REFERENCES students(id) ON DELETE CASCADE
);

SELECT
  name,
  IFNULL(AVG(grade), 0) AS average,
  CASE
    WHEN IFNULL(AVG(grade), 0) >= 75 THEN 'PASSING'
    ELSE 'FAILING'
  END AS passing_status
FROM
  students
  LEFT JOIN papers ON students.id = papers.student_id
GROUP BY
  students.id
ORDER BY
  average DESC;
  • Many to many relationship

Many-to-many relationship

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CREATE TABLE reviewers (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255)
);

CREATE TABLE series (
  id INT AUTO_INCREMENT PRIMARY KEY,
  title VARCHAR(255),
  released_year YEAR(4),
  genre VARCHAR(255)
);

CREATE TABLE reviews (
  id INT AUTO_INCREMENT PRIMARY KEY,
  rating DECIMAL(2, 1),
  series_id INT,
  reviewer_id INT,
  FOREIGN KEY (series_id) REFERENCES series(id),
  FOREIGN KEY (reviewer_id) REFERENCES reviewers(id)
);

SELECT
  title,
  rating,
  name
FROM
  reviews
  JOIN reviewers ON reviews.reviewer_id = reviewers.id
  JOIN series ON reviews.series_id = series.id
ORDER BY
  title,
  rating DESC;

References

Credits

I took this course by Colt Steele.