Краткий справочник по SQL


Просто заметки по sql. Ничего серьезного

0. Подготовка и настройка БД (самый быстрый способ через докер)


$ PG_VER=11.5
$ echo "START postgres:${PG_VER}";
START postgres:11.5
$ sudo mkdir -p /var/tmp/pg_data/local/${PG_VER}
[sudo] пароль для avis: 
$ docker run --rm -d --name postgres -e POSTGRES_PASSWORD=1234 --net=host -v /var/tmp/pg_data/local/${PG_VER}:/var/lib/postgresql/data/ postgres:${PG_VER}
0f94fd225233acadceb2bac3877168124039beba1c540d380962d9d2149d27f8
$ psql -h localhost -p 5432 -U postgres
psql (9.5.23, сервер 11.5 (Debian 11.5-3.pgdg90+1))
ПРЕДУПРЕЖДЕНИЕ: psql имеет базовую версию 9.5, а сервер - 11.
                Часть функций psql может не работать.
Введите "help", чтобы получить справку.

postgres=# 

Подробнее см.

1. DDL (Data Definition Language) - Язык описания структуры данных

Основные команды: Create, Drup,

Создание БД. CREATE DATABASE


CREATE DATABASE local_db;

CREATE DATABASE

Удаление БД. DROP DATABASE


DROP DATABASE local_db

DROP DATABASE

Создание таблицы. CREATE TABLE


CREATE TABLE movies (
    id INTEGER NOT NULL,
    name TEXT,
    genre TEXT,
    year INTEGER,
    rating NUMERIC(2, 1),
    PRIMARY KEY (id)
);

CREATE TABLE

Удаление таблицы. DROP TABLE


DROP TABLE movies;

DROP TABLE

Добавление нового столбца. ALTER TABLE


ALTER TABLE movies ADD country TEXT;

ALTER TABLE

Удаление столбца. ALTER TABLE


ALTER TABLE movies DROP COLUMN country;

ALTER TABLE

2. DML (Data Manipulation Language) - Язык манипуляции с данными

Основные команды: Select, Insert, Update, Delete

Вставка данных INSERT


INSERT INTO movies (id, name, genre, year, rating)
VALUES (1, 'Avatar', 'action', 2009, 7.9);

INSERT 0 1

Вставка нескольких строк с данными INSERT


INSERT INTO movies (id, name, genre, YEAR, rating) VALUES
(2, 'Jurassic World', 'action', 2015, 7.3),
(3, 'The Avengers', 'action', 2012, 8.1),
(4, 'The Dark Knight', 'action', 2008, 9.0),
(5, 'Star Wars: Episode I - The Phantom Menace', 'action', 1999, 6.6);

INSERT 0 4

Выборка всех данных. SELECT


SELECT * FROM movies;

 id |                   name                    | genre  | year | rating 
----+-------------------------------------------+--------+------+--------
  1 | Avatar                                    | action | 2009 |    7.9
  2 | Jurassic World                            | action | 2015 |    7.3
  3 | The Avengers                              | action | 2012 |    8.1
  4 | The Dark Knight                           | action | 2008 |    9.0
  5 | Star Wars: Episode I - The Phantom Menace | action | 1999 |    6.6
(5 строк)
в postgres эквивалент

TABLE movies; 

Выборка NULL и NOT NULL значений. SELECT


INSERT INTO movies (id, name, genre, year)
VALUES (6, 'No rating movie', 'action', 2009);

INSERT 0 1


SELECT * FROM movies
WHERE rating IS NULL;

 id |      name       | genre  | year | rating 
----+-----------------+--------+------+--------
  6 | No rating movie | action | 2009 |       
(1 строка)


SELECT * FROM movies
WHERE rating IS NOT NULL;

 id |                   name                    | genre  | year | rating 
----+-------------------------------------------+--------+------+--------
  1 | Avatar                                    | action | 2009 |    7.9
  2 | Jurassic World                            | action | 2015 |    7.3
  3 | The Avengers                              | action | 2012 |    8.1
  4 | The Dark Knight                           | action | 2008 |    9.0
  5 | Star Wars: Episode I - The Phantom Menace | action | 1999 |    6.6
(5 строк)

Обновление данных. UPDATE

До обновления


SELECT * FROM movies WHERE id = 1;

 id |  name  | genre  | year | rating 
----+--------+--------+------+--------
  1 | Avatar | action | 2009 |    7.9
(1 строка)


UPDATE movies
SET rating = 9.0
WHERE id = 1;

UPDATE 1

После обновления


SELECT * FROM movies WHERE id = 1;

 id |  name  | genre  | year | rating 
----+--------+--------+------+--------
  1 | Avatar | action | 2009 |    9.0
(1 строка)

Удаление данных. DELETE


DELETE FROM movies WHERE id = 1;

DELETE 1

Агрегатные функции: AVG, COUNT, MIN, MAX, SUM и т.п.

Подсчет количества записей в таблице. SELECT COUNT


SELECT COUNT(*) FROM movies;

 count 
-------
     5
(1 строка)

Выборка уникальных записей. SELECT DISTINCT


SELECT DISTINCT genre FROM movies;

 genre  
--------
 action
(1 строка)

Выборка по критерию. SELECT ... WHERE

Выбрать все фильмы, у которых рейтинг строго больше 8


SELECT * FROM movies WHERE rating > 8;    

 id |      name       | genre  | year | rating 
----+-----------------+--------+------+--------
  3 | The Avengers    | action | 2012 |    8.1
  4 | The Dark Knight | action | 2008 |    9.0
(2 строки)


INSERT INTO movies (id, name, genre, year, rating) VALUES
(7, 'Se7en', 'drama', 1995, 8.6),
(8, 'Seven', 'drama', 1979, 6.1);

INSERT 0 2

Выбрать все фильмы, у которых название совпадает по шаблону


SELECT * FROM movies WHERE name LIKE 'Se_en';

 id | name  | genre | year | rating 
----+-------+-------+------+--------
  7 | Se7en | drama | 1995 |    8.6
  8 | Seven | drama | 1979 |    6.1
(2 строки)

Параметры like:

  1. _ - любой 1 символ
  2. % - любые символы
Пример
  1. LIKE 'A%' - начинается с "A"
  2. LIKE '%a' - заканчивается на "a"