cheatsheets/mysql.md

268 lines
5.8 KiB
Markdown
Raw Permalink Normal View History

---
2018-12-25 12:25:48 +00:00
title: MySQL
2020-07-05 11:11:36 +00:00
updated: 2020-07-05
2018-11-20 03:21:34 +00:00
category: Databases
---
2018-12-25 12:25:48 +00:00
### Browsing
2018-12-25 12:25:48 +00:00
```sql
SHOW DATABASES;
SHOW TABLES;
SHOW FIELDS FROM table / DESCRIBE table;
SHOW CREATE TABLE table;
SHOW PROCESSLIST;
KILL process_number;
2018-12-25 12:25:48 +00:00
```
2018-11-20 03:21:34 +00:00
### Select
2018-12-25 12:25:48 +00:00
```sql
SELECT * FROM table;
SELECT * FROM table1, table2;
SELECT field1, field2 FROM table1, table2;
2018-12-25 12:25:48 +00:00
SELECT ... FROM ... WHERE condition
2021-11-03 11:05:54 +00:00
SELECT ... FROM ... WHERE condition GROUP BY field;
SELECT ... FROM ... WHERE condition GROUP BY field HAVING condition2;
SELECT ... FROM ... WHERE condition ORDER BY field1, field2;
SELECT ... FROM ... WHERE condition ORDER BY field1, field2 DESC;
SELECT ... FROM ... WHERE condition LIMIT 10;
2018-12-25 12:25:48 +00:00
SELECT DISTINCT field1 FROM ...
SELECT DISTINCT field1, field2 FROM ...
```
2018-11-20 03:21:34 +00:00
### Select - Join
2018-12-25 12:25:48 +00:00
```sql
SELECT ... FROM t1 JOIN t2 ON t1.id1 = t2.id2 WHERE condition;
SELECT ... FROM t1 LEFT JOIN t2 ON t1.id1 = t2.id2 WHERE condition;
2018-12-25 12:25:48 +00:00
SELECT ... FROM t1 JOIN (t2 JOIN t3 ON ...) ON ...
```
2018-11-20 03:21:34 +00:00
### Conditions
2018-12-25 12:25:48 +00:00
```sql
field1 = value1
field1 <> value1
field1 LIKE 'value _ %'
field1 IS NULL
field1 IS NOT NULL
field1 IS IN (value1, value2)
field1 IS NOT IN (value1, value2)
condition1 AND condition2
condition1 OR condition2
```
### Create / Open / Delete Database
```sql
CREATE DATABASE DatabaseName;
CREATE DATABASE DatabaseName CHARACTER SET utf8;
USE DatabaseName;
DROP DATABASE DatabaseName;
ALTER DATABASE DatabaseName CHARACTER SET utf8;
```
### Backup Database to SQL File
```bash
mysqldump -u Username -p dbNameYouWant > databasename_backup.sql
```
### Restore from backup SQL File
```bash
2022-05-19 12:57:35 +00:00
mysql -u Username -p dbNameYouWant < databasename_backup.sql;
```
### Repair Tables After Unclean Shutdown
```bash
mysqlcheck --all-databases;
mysqlcheck --all-databases --fast;
```
2018-12-25 12:25:48 +00:00
### Insert
```sql
INSERT INTO table1 (field1, field2) VALUES (value1, value2);
2018-12-25 12:25:48 +00:00
```
### Delete
2018-12-25 12:25:48 +00:00
```sql
DELETE FROM table1 / TRUNCATE table1
DELETE FROM table1 WHERE condition
2022-09-14 03:08:20 +00:00
DELETE FROM table1, table2 WHERE table1.id1 =
2018-12-25 12:25:48 +00:00
table2.id2 AND condition
```
### Update
2018-12-25 12:25:48 +00:00
```sql
UPDATE table1 SET field1=new_value1 WHERE condition;
2018-12-25 12:25:48 +00:00
UPDATE table1, table2 SET field1=new_value1, field2=new_value2, ... WHERE
table1.id1 = table2.id2 AND condition;
2018-12-25 12:25:48 +00:00
```
### Create / Delete / Modify Table
2018-12-25 12:25:48 +00:00
#### Create
```sql
CREATE TABLE table (field1 type1, field2 type2);
CREATE TABLE table (field1 type1, field2 type2, INDEX (field));
CREATE TABLE table (field1 type1, field2 type2, PRIMARY KEY (field1));
CREATE TABLE table (field1 type1, field2 type2, PRIMARY KEY (field1,field2));
2018-12-25 12:25:48 +00:00
```
```sql
CREATE TABLE table1 (fk_field1 type1, field2 type2, ...,
FOREIGN KEY (fk_field1) REFERENCES table2 (t2_fieldA))
[ON UPDATE|ON DELETE] [CASCADE|SET NULL]
```
```sql
CREATE TABLE table1 (fk_field1 type1, fk_field2 type2, ...,
FOREIGN KEY (fk_field1, fk_field2) REFERENCES table2 (t2_fieldA, t2_fieldB))
```
```sql
CREATE TABLE table IF NOT EXISTS;
2018-12-25 12:25:48 +00:00
```
```sql
CREATE TEMPORARY TABLE table;
2018-12-25 12:25:48 +00:00
```
#### Drop
```sql
DROP TABLE table;
DROP TABLE IF EXISTS table;
2018-12-25 12:25:48 +00:00
DROP TABLE table1, table2, ...
```
#### Alter
```sql
ALTER TABLE table MODIFY field1 type1
ALTER TABLE table MODIFY field1 type1 NOT NULL ...
ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1
ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 NOT NULL ...
ALTER TABLE table ALTER field1 SET DEFAULT ...
ALTER TABLE table ALTER field1 DROP DEFAULT
ALTER TABLE table ADD new_name_field1 type1
ALTER TABLE table ADD new_name_field1 type1 FIRST
ALTER TABLE table ADD new_name_field1 type1 AFTER another_field
ALTER TABLE table DROP field1
ALTER TABLE table ADD INDEX (field);
```
#### Change field order
```sql
ALTER TABLE table MODIFY field1 type1 FIRST
ALTER TABLE table MODIFY field1 type1 AFTER another_field
ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 FIRST
ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 AFTER
another_field
```
### Keys
```sql
CREATE TABLE table (..., PRIMARY KEY (field1, field2))
CREATE TABLE table (..., FOREIGN KEY (field1, field2) REFERENCES table2
(t2_field1, t2_field2))
```
### Users and Privileges
2018-12-25 12:25:48 +00:00
```sql
CREATE USER 'user'@'localhost';
2018-12-25 12:25:48 +00:00
GRANT ALL PRIVILEGES ON base.* TO 'user'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, DELETE ON base.* TO 'user'@'localhost' IDENTIFIED BY 'password';
REVOKE ALL PRIVILEGES ON base.* FROM 'user'@'host'; -- one permission only
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'host'; -- all permissions
FLUSH PRIVILEGES;
2018-12-25 12:25:48 +00:00
```
```sql
SET PASSWORD = PASSWORD('new_pass');
SET PASSWORD FOR 'user'@'host' = PASSWORD('new_pass');
SET PASSWORD = OLD_PASSWORD('new_pass');
2018-12-25 12:25:48 +00:00
```
```sql
DROP USER 'user'@'host';
2018-12-25 12:25:48 +00:00
```
Host % indicates any host.
### Main Data Types
2018-12-25 12:25:48 +00:00
```sql
2021-12-12 23:23:19 +00:00
TINYINT (1o: -128 to +127)
2018-12-25 12:25:48 +00:00
SMALLINT (2o: +-65 000)
MEDIUMINT (3o: +-16 000 000)
INT (4o: +- 2 000 000 000)
BIGINT (8o: +-9.10^18)
```
```sql
Precise interval: -(2^(8*N-1)) -> (2^8*N)-1
```
⚠ INT(2) = "2 digits displayed" -- NOT "number with 2 digits max"
```sql
FLOAT(M,D)
DOUBLE(M,D)
FLOAT(D=0->53)
```
⚠ 8,3 -> 12345,678 -- NOT 12345678,123!
```sql
TIME (HH:MM)
YEAR (AAAA)
DATE (AAAA-MM-JJ)
DATETIME (AAAA-MM-JJ HH:MM; années 1000->9999)
TIMESTAMP (like DATETIME, but 1970->2038, compatible with Unix)
```
```sql
VARCHAR (single-line; explicit size)
TEXT (multi-lines; max size=65535)
BLOB (binary; max size=65535)
```
Variants for TEXT&BLOB: `TINY` (max=255), `MEDIUM` (max=~16000), and `LONG` (max=4Go). Ex: `VARCHAR(32)`, `TINYTEXT`, `LONGBLOB`, `MEDIUMTEXT`
```sql
ENUM ('value1', 'value2', ...) -- (default NULL, or '' if NOT NULL)
```
### Reset Root Password
2018-12-25 12:25:48 +00:00
```bash
$ /etc/init.d/mysql stop
```
```bash
$ mysqld_safe --skip-grant-tables
```
```bash
$ mysql # on another terminal
mysql> UPDATE mysql.user SET password=PASSWORD('new_pass') WHERE user='root';
```
```bash
## Switch back to the mysqld_safe terminal and kill the process using Control + \
$ /etc/init.d/mysql start
```
Your commands may vary depending on your OS.