Added missing files and removed unnessesary ones

This commit is contained in:
2023-07-16 16:44:42 +03:00
parent c3fa5367c3
commit 199dd693e4
41 changed files with 1442 additions and 50 deletions

377
SQL/Databases.md Normal file
View File

@ -0,0 +1,377 @@
# Базы данных
## Основы
### Основные определения
*База данных* - набор структурированной информации или данных, которые хранятся в компьютерной системе
*СУБД* - система управления БД
*SQL* - основной интерфейс работы с реляционными базами данных
*Транзакция* - Последовательность операция над БД, рассматриваемых СУБД, как одно целое
### Классификация
* Простейшие базы двнных
* SQL базы данных (реляционные)
* NoSQL базы данных (нереляционные)
* Комбинированные типы
### Реляционные базы данных
> Набор данных с предопределенными связями между ними. Эти данные организованны в виде набора таблиц, состоящих из столбцов и строк. В таблицах хранится информация об объектах, представленных в виде данных
### NoSQL базы данных
> База данных, в которой не используется табличная система строк и столбцов
### Основные функции
* Управление данными во внешней памяти
* Управление данными в оперативной памяти
* Управление транзакциями
* Ведение журнала выполнения операций в базе данных
* поддержка языков баз данных
### Основные БД
* SQL
* Oracle (Вы любите деньги больше, чем надо)
* Microsoft SQL Server (Вы любите деньги больше, чем надо)
* PostgreSQL (Халява)
* NoSQL
* MongoDB
* DB2
* Cassandra
### Первичный и внеший ключ
* *Ключ* - это колонка или колонки,не имеющие дублирующих значений.
* *Первичный ключ* - это поле или набор полей со значением, которые являются уникальными для всей таблицы.
* *Естественные* являются свойствами моделируемого объекта интересными сами по себе, даже если никто не стремится сделать из них ключ
* *Искусственные (суррогатные)* - придуманные коды для ссылки на данные или объекты
* *Внешний ключ* - столбец или группа столбцов, используемых в SQL БД для связи данных между таблицами
### Типы связи в SQL БД
1. "Один к одному"
Образуется когда ключевой столбец присутствует в другой таблице, в которой тоже является ключом либо свойствами столбца задана его уникальность. Используется, когда нужно разделить данные одной таблицы на несколько отдельных таблиц.
2. "Один к многим"
Одной записи первой таблицы соответсвует неколько записей в другой таблие. Символ ключа связи указывает, что таблица,к которой этот конец прилегает, находится на стороне "один", а символ бесконечности находится на стороне "многие".
3. "Многие к многим"
Если нескольким записям одно таблицы соответсвует несколько запясей из другой таблицы. Связь организовывается посредством связывающей таблицы.
### Реляционная алгебра. Операции
* *Проекция* - это столбец фильтра. Получаем содержимое только части столбцов.
* *Выборка* - это фильтрование строки. Включает в себя выбор строк.
* *Декартово произведение* - Каждому элементу из множества R сопоставлен в соответсвие определенный элемент из множества S, то возникает множество, сопоставленное из пар элементов множества R и S.
* *Объединение* - это отношение, которое включает в себя все кортежи обоих отношений без повторов.
* *Вычитание* - это разность односхемных отношений R и S назывется множество кортежей R, не входящих в S.
* *Пересечение* - это пересечение двух односхемных отношений R и S есть подмножество кортежей, принадлежащих обоим отношениям. Это можно выразить через разность: R-(R-S).
* *Соединение* - эта операция определяет подмножество декартова произведения двух разносхемных отношений. Предназначена для обеспечения выборки данных из двух таблиц и включение этих данных в один результативный набор.
### Нормализация и Денормализация
*Нормальная форма* - Свойство отношения, характеризующее его с точки зрения избыточности
*Нормализация* - процесс минимизации избыточности отношения(приведение к НФ)
*Денормализация* - намеренное приведение структуры базы данных в состояние, не соотвествующее критериям нормализации
## Основы синтаксиса
### Идентификаторы и ключевые слова
* *SELECT*, *UPDATE* и *VALUES* являются примерами ключевых слов, то есть слов, имеющих фиксированное значение в языке SQL
* Ключевые слова и идентификаторы без кавычек воспринимаются системой без учета регистра.
* Есть и другой тип идентификаторов: отделённые идентификаторы, или идентификаторы в ковычках
```sql
UPDATE my_table SET a = 5;
UPDATE "my_table" SET "a" = 5;
```
### Константы
* *Строковая константа в SQL* - обычная последовательность символов, заключённая в одинарные ковычки
```sql
SELECT 'foobar'
```
* Ещё один способ записи строковых констант - "заключение строк в доллары".
```sql
$$Жанна д Арк$$
```
* Числовые константы
* 42
* 3.5
* 5e2
* 1.925e-3
* Битовые константы похожи на обычные с дополнительной буквой перед опострофом, показывающих систему счисления
* B'1001'
* X'1FF'
* Константы: Со спецпоследовательностями (начинается с буквы E перед апострофом)
* \b - "забой" (BackSpace)
* \f - подача формы
* \n - новая строка
* \r - возврат каретки
* \t - табуляция
### Операторы
* ^ - возведение в степень
* IS TRUE, IS FALSE
* ISNULL
### Специальные знаки (Вот вооще не операторы)
**Вот с#ка не забудь про ;**
### Коментарии
```sql
-- Коментарий
```
```sql
/* многострочный
коментарий */
```
## Типы данных
### Числовые типы
* *smallint* (2 байта) - целое в небольшом диапозоне
* *integer* (4 байта) - типичный выбор для целых чисел
* *bigint* (8 байт) - целое в большом диапозоне
* *numeric* / *decimal* (переменный) - десятичное с указанной точностью
* *real* (4 байта) - десятичное с переменной точностью
* *double precision* (8 байт) - вещественное число с переменной точностью
* *smallserial* (2 байта) - небольшое целое с автоувелечением
* *serial* (4 байта) - целое с автоувеличением
* *bigserial* (8 байт) - большое целое с автоувеличением
* *money* - два знака после запятой, денежный тип
### Символьные типы данных
* *character varing(n)* / *varchar(n)* - строка ограниченной переменной длины
* *character(n)* / *char(n)* - строка фиксированной длины с пробелами
* *text* - строка неограничсенной переменной длины
### Логический тип данных
* *boolean* (1 байт) - TRUE / FALSE / NULL
### Типы данных даты и времени
* *date* - дата без времени YYYY-MM-DD
* *timestamp* - дата и время с точностью до микросекунды
* *interval* - интервал между датами
* *time* - время без даты. Удобный тип данных чем-то похожий на interval, который работает по модулю 24 (часа), то есть интервал, в котором отстутствуют дни
## DDL - Data Defintion Language
* CREATE - создание таблиц
* ALTER - используется для изменения объектов БД
* DROP - оспользуется для удаления БД
### Примеры
* Создать базу данных:
```sql
CREATE DATABASE test;
```
* Создать таблицу
```sql
CREATE TABLE films(
code char(5) CONSTRAINT firstkey PRIMARY KEY,
title varchar(40) NOT NULL,
did integer NOT NULL,
date_prod date,
kind varchar(10),
len interval hour to minute
);
```
* Добавить столбец
```sql
ALTER TABLE distributors ADD COLUMN adress varchar(30);
```
* Удалить столбец
```sql
ALTER TABLE distributors DROP COLUMN adress RESTRICT;
```
* Изменить тип данных
```sql
ALTER TABLE distributors
ALTER COLUMN address TYPE varchar(80),
ALTER COLUMN name TYPE varchar(100);
```
* Создать таблицу, если нет с таким же названием:
```sql
CREATE TABLE IF NOT EXISTS ... ;
```
* Получить всё из таблицы:
```sql
SELECT * FROM authors;
```
* Вставить что-то в таблицу:
```sql
INSERT INTO authors VALUES (1, 'Лёва Толстый');
```
## Фильтрация и компоновка данных
### Where
> Для осуществления фильтрации в SQL есть специальный оператор *WHERE*
```sql
SELECT * FROM stores WHERE amount > 10
```
### Агрегатные функции
> Агрегатные функции выполняют вычисления над набром значений и возвращает 1 значение. Агрегатные функции игранируют NULL значения (кроме COUNT)
* *СOUNT(\*)* - находит количество строк в запросе
* *COUNT(**expression**)* - находит количество строк в запросе, для которых **expression** не содержит значение NULL;
* *SUM* - сумма значений выьранных столбцов
* *MAX* - максимальное значение определённого столбца
* *MIN* - минимальное значение определённого столбца
* *AVG* - вычисление среднее значение столбца
### Группировка данных (*GROUP BY*)
> *GROUP BY* определяет, как строки будут группироваться, чтобы разделить их на логические наборы, благодаря чему становится возможном выполнение статических вычеслений отдельно в каждой группе
```sql
SELECT age, SUM(salary) as sum FROM workers GROUP BY age;
-- Сумма зарплат для каждого возраста
-- *as sum* меняет название столбца на нужное нам (было бы так, как написанно (SUM(salary)))
```
### Оператор *HAVING*
> Оператор *HAVING* позволяет определять условия выборки уже сгрупированных данных. *HAVING* применяется строго после GROUP_BY и может использовать результаты агрегатных функций
```sql
SELECT model, COUNT(model) as Qty_model, AVG(price) as Avg_price
FROM PC
GROUP BY model
HAVING AVG(price) < 800;
-- Фильтрует столбцы, которые были бы выданы после GROUP BY
```
### Оператор *SORT BY*
> *ORDER BY* используется для сортировки записей в наборе результатов запроса *SELECT*. Сортирует по возрастанию, но, если нужно сделать по убыванию, то используем *DESC* (от английского descending)
```sql
SELECT * FROM Sumproduct ORDER BY Amount DESC, City
-- Значала сортирует по Amount по убыванию, потом по городу по возростанию
```
### *LIMIT* и *OFFSET*
* *LIMIT* - макс количество выданных строк
* *OFFSET* - пропустить первые N строк
### Общий вид
```sql
SELECT столбцы
FROM ТАБЛИЦА
WHERE условие-фильтра
GROUP BY столбцы-для-группировки
HAVING фильтр-груп
ORDER BY столбцы для сортировки
LIMIT N
OFFSET K
```
```sql
SELECT name, AVG(salary) as avg_salary
FROM workers
GROUP BY name
HAVING name != 'JOHN'
ORDER BY avg_salary DESC
LIMIT 5
OFFSET 3
```
## Соединение и объединение таблиц
### *JOIN*
> *JOIN* позволяет соединения двух или более таблиц
#### Виды
* *JOIN* (только пересечение)
* *LEFT JOIN* (всё из первой и пересечение)
* *RIGHT JOIN* (всё из второй таблицы и пересечение)
* *FULL JOIN* (всё из обоих таблиц)
#### Пример
```sql
SELECT * FROM AUTHORS [LEFT/RIGHT/FULL/""] JOIN BOOKS
ON Author.id = Books.author_id
```
### *UNION*
> Выводит результаты двух *SELECT*. Удаляет дубликаты, если не *UNION ALL*. Кол-во и названия строк должны быть одинаковыми
#### Пример *UNION*
```sql
SELECT val1 FROM table1
UNION
SELECT val1 FROM table2
```
### *INTERSECT*
> Возвращает значения, которые выводят оба *SELECT*. Кол-во и названия строк должны быть одинаковыми. Синтаксис как у UNION
### *EXCEPT*
> Возвращает значения, которые выдал первый *SELECT*, но не второй. Кол-во и названия строк должны быть одинаковыми. Синтаксис как у UNION

12
SQL/compose.yaml Normal file
View File

@ -0,0 +1,12 @@
services:
db:
image: postgres
environment:
- POSTGRES_USER=tester
- POSTGRES_PASSWORD=example123!
- POSTGRES_DB=testing
ports:
- 5432:5432/tcp
volumes:
- ./data:/var/lib/postgresql/data
restart: always

44
SQL/task1.sql Normal file
View File

@ -0,0 +1,44 @@
/* CREATE TABLE IF NOT EXISTS stations(
id INT CONSTRAINT firstkey PRIMARY KEY,
city VARCHAR(21),
state VARCHAR(21),
lat_n INT,
long_w int
);
INSERT INTO stations VALUES (794, 'Kissee Mills', 'MO', 140, 73),
(824, 'Loma Mar', 'CA', 49, 131),
(603, 'Sandy Hook', 'CT', 72, 148),
(478, 'Tipton', 'IN', 34, 98),
(619, 'Arlington', 'CO', 75, 93),
(711, 'Turner', 'AR', 50, 101),
(839, 'Slidell', 'LA', 85, 152),
(411, 'Negreet', 'LA', 99, 105),
(588, 'Glencoe', 'KY', 46, 136),
(665, 'Chelsea', 'IA', 99, 60),
(342, 'Chignik Lagoon', 'AK', 103, 153),
(733, 'Pelahatchie', 'MS', 39, 28),
(441, 'Hanna City', 'IL', 51, 137),
(811, 'Dorrance', 'KS', 102, 122),
(698, 'Albany', 'CA', 50, 80),
(325, 'Monument', 'KS', 71, 142),
(414, 'Manchester', 'MD', 74, 37),
(113, 'Prescott', 'IA', 40, 66),
(971, 'Graettinger', 'IA', 95, 150),
(266, 'Cahone', 'CO', 116, 127),
(617, 'Sturgis', 'MS', 36, 126),
(495, 'Upperco', 'MD', 114, 30),
(473, 'Highwood', 'IL', 27, 151),
(756, 'Garden City', 'AL', 96, 105),
(225, 'Garden City', 'IA', 54, 119);
*/;
SELECT city, state FROM stations;
SELECT SUM(lat_n), SUM(long_W) FROM stations;
SELECT city FROM stations WHERE id % 2 = 0;
SELECT COUNT(city) - COUNT(DISTINCT(city)) FROM stations;
SELECT lat_n FROM stations WHERE lat_n BETWEEN 39 AND 137;
SELECT max(lat_n) FROM stations WHERE lat_n <= 137;
SELECT min(lat_n) FROM stations WHERE lat_n >= 39;
SELECT DISTINCT(city) FROM stations WHERE LOWER(RIGHT(city, 1)) in ('a', 'e', 'i', 'o', 'u', 'y');
SELECT DISTINCT(city) FROM stations WHERE LOWER(RIGHT(city, 1)) IN ('a', 'e', 'i', 'o', 'u', 'y') AND LOWER(LEFT(city, 1)) IN ('a', 'e', 'i', 'o', 'u', 'y');
SELECT DISTINCT(city) FROM stations WHERE LOWER(LEFT(city, 1)) NOT IN ('a', 'e', 'i', 'o', 'u', 'y');

47
SQL/task2.sql Normal file
View File

@ -0,0 +1,47 @@
DROP TABLE IF EXISTS Salary CASCADE;
CREATE TABLE Salary(
id INT PRIMARY KEY,
salary INT
);
DROP TABLE IF EXISTS Positions CASCADE;
CREATE TABLE Positions(
id INT PRIMARY KEY,
title VARCHAR(255)
);
DROP TABLE IF EXISTS People;
CREATE TABLE People(
id INT PRIMARY KEY,
name VARCHAR(255),
position_id INT REFERENCES Positions(id),
salary_id INT REFERENCES Salary(id)
);
INSERT INTO Salary VALUES (1, 10000), (2, 20000), (3, 3000);
INSERT INTO Positions VALUES (1, 'Дизайнер'), (2, 'Редактор'), (3, 'Программист');
INSERT INTO PEOPLE VALUES (1, 'Владмир', 1, 1), (2, 'Татьяна', 2, 2), (3, 'Александр', NULL, 2), (4, 'Борис', 2, NULL);
SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People JOIN Positions on People.position_id = Positions.id;
SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People RIGHT JOIN Positions on People.position_id = Positions.id;
SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People LEFT JOIN Positions on People.position_id = Positions.id
EXCEPT
SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People JOIN Positions on People.position_id = Positions.id;
SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People LEFT JOIN Positions on People.position_id = Positions.id
WHERE People.position_id ISNULL;
SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People FULL JOIN Positions on People.position_id = Positions.id
WHERE Positions.id ISNULL OR People.id ISNULL;
SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People LEFT JOIN Positions on People.position_id = Positions.id
UNION
SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People RIGHT JOIN Positions on People.position_id = Positions.id
EXCEPT
SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People JOIN Positions on People.position_id = Positions.id;
SELECT People.id, name, position_id, title, salary_id, salary FROM People
JOIN Positions on People.position_id = Positions.id
JOIN Salary ON People.salary_id = Salary.id;

154
SQL/task3.sql Normal file
View File

@ -0,0 +1,154 @@
DROP TABLE IF EXISTS product;
CREATE TABLE product(
maker varchar(10),
model varchar(50) PRIMARY KEY,
type varchar(50)
);
INSERT INTO product VALUES
('A', '1001', 'pc'),
('A', '1002', 'pc'),
('A', '1003', 'pc'),
('A', '2004', 'laptop'),
('A', '2005', 'laptop'),
('A', '2006', 'laptop'),
('B', '1004', 'pc'),
('B', '1005', 'pc'),
('B', '1006', 'pc'),
('B', '2007', 'laptop'),
('C', '1007', 'pc'),
('D', '1008', 'pc'),
('D', '1009', 'pc'),
('D', '1010', 'pc'),
('D', '3004', 'printer'),
('D', '3005', 'printer'),
('E', '1011', 'pc'),
('E', '1012', 'pc'),
('E', '1013', 'pc'),
('E', '2001', 'laptop'),
('E', '2002', 'laptop'),
('E', '2003', 'laptop'),
('E', '3001', 'printer'),
('E', '3002', 'printer'),
('E', '3003', 'printer'),
('F', '2008', 'laptop'),
('F', '2009', 'laptop'),
('G', '2010', 'laptop'),
('H', '3006', 'printer'),
('H', '3007', 'printer');
DROP TABLE IF EXISTS pc;
CREATE TABLE pc(
code INT PRIMARY KEY,
model varchar(50),
speed real,
ram smallint,
hd real,
price real
);
INSERT INTO pc VALUES
(1, '1001',2.66,1024,250,2114),
(2, '1002',2.10,512,250,995),
(3, '1003',1.42,512,80,478),
(4, '1004',2.80,1024,250,649),
(5, '1005',3.20,512,250,630),
(6, '1006',3.20,1024,320,1049),
(7, '1007',2.20,1024,200,510),
(8, '1008',2.20,2048,250,770),
(9, '1009',2.00,1024,250,650),
(10, '1010',2.80,2048,300,770),
(11, '1011',1.86,2048,160,959),
(12, '1012',2.80,1024,160,649),
(13, '1013',3.06,512,80,529);
DROP TABLE IF EXISTS laptop;
CREATE TABLE laptop(
code int PRIMARY KEY,
model varchar(50),
speed real,
ram smallint,
hd real,
screen real,
price real
);
INSERT INTO laptop VALUES
(1, '2001', 2.00, 2048, 240, 20.1, 3673),
(2, '2002', 1.73, 1024, 80, 17.0, 949),
(3, '2003', 1.80, 512, 60, 15.4, 549),
(4, '2004', 2.00, 512, 60, 13.3, 1150),
(5, '2005', 2.16, 1024, 120, 17.0, 2500),
(6, '2006', 2.0, 2048, 80, 15.4, 1700),
(7, '2007', 1.83, 1024, 120, 13.3, 1429),
(8, '2008', 1.60, 1024, 100, 15.4, 900),
(9, '2009', 1.60, 512, 80, 14.1, 680),
(10, '2010', 2.00, 2048, 160, 15.4, 2300);
DROP TABLE IF EXISTS printer;
CREATE TABLE printer(
code int PRIMARY KEY,
model varchar(50),
color boolean,
type varchar(10),
price real
);
INSERT INTO printer VALUES
(1, '3001', true, 'ink-jet', 99),
(2, '3002', false, 'laser', 239),
(3, '3003', true, 'laser', 899),
(4, '3004', true, 'ink-jet', 120),
(5, '3005', false, 'laser', 120),
(6, '3006', true, 'ink-jet', 100),
(7, '3007', true, 'laser', 200);
SELECT model, speed, hd FROM pc WHERE price < 700;
SELECT DISTINCT maker FROM product WHERE type = 'printer';
SELECT model, hd, screen FROM laptop WHERE price > 1000;
SELECT * FROM printer WHERE color;
SELECT maker, speed FROM product JOIN laptop ON product.model = laptop.model
WHERE hd >= 10;
(SELECT product.model, price FROM product JOIN pc ON product.model = pc.model WHERE maker = 'B'
UNION
SELECT product.model, price FROM product JOIN laptop ON product.model = laptop.model WHERE maker = 'B'
UNION
SELECT product.model, price FROM product JOIN printer ON product.model = printer.model WHERE maker = 'B') ORDER BY model;
SELECT DISTINCT maker FROM product WHERE type = 'pc'
EXCEPT
SELECT DISTINCT maker FROM product WHERE type = 'laptop';
SELECT model FROM printer WHERE price = (SELECT MAX(price) FROM printer);
SELECT AVG(speed) FROM pc;
SELECT AVG(speed) FROM laptop WHERE price > 100;
SELECT AVG(speed) FROM product JOIN pc ON product.model = pc.model WHERE maker = 'A';
SELECT DISTINCT maker, type FROM product WHERE maker in
(SELECT maker FROM product GROUP BY maker HAVING COUNT(DISTINCT type) = 1);
SELECT hd FROM pc GROUP BY hd HAVING COUNT(hd) >= 2 ORDER BY hd;
SELECT model, speed FROM laptop WHERE speed < (SELECT MIN(speed) FROM pc);
SELECT maker, price FROM printer JOIN product ON printer.model = product.model WHERE price = (SELECT MIN(price) FROM printer WHERE color) AND color;
SELECT maker, AVG(screen) FROM laptop JOIN product ON laptop.model = product.model GROUP BY maker ORDER BY maker;
SELECT maker FROM product WHERE type = 'pc' GROUP BY maker HAVING COUNT(type) >= 3;
SELECT maker, MAX(price) FROM product JOIN pc ON pc.model = product.model GROUP BY maker ORDER BY maker;
WITH MAX_PRICES as (
SELECT MAX(price) as price FROM laptop UNION SELECT MAX(price) as price FROM pc UNION SELECT MAX(price) as price FROM printer
)
SELECT model FROM laptop WHERE price = (SELECT MAX(price) FROM MAX_PRICES)
UNION
SELECT model FROM PC WHERE price = (SELECT MAX(price) FROM MAX_PRICES)
UNION
SELECT model FROM printer WHERE price = (SELECT MAX(price) FROM MAX_PRICES);
WITH LEAST_RAM as (
SELECT MIN(ram) as ram FROM pc
)
SELECT DISTINCT maker FROM product JOIN pc on product.model = pc.model WHERE
ram = (SELECT ram FROM LEAST_RAM) AND speed = (SELECT MAX(speed) FROM pc WHERE ram = (SELECT ram FROM LEAST_RAM))
INTERSECT
SELECT DISTINCT maker FROM product WHERE type='printer';
SELECT AVG(price) FROM (SELECT price FROM pc JOIN product ON pc.model = product.model WHERE maker = 'A'
UNION
SELECT price FROM laptop JOIN product ON laptop.model = product.model WHERE maker = 'A') as foo;

25
SQL/values.py Normal file
View File

@ -0,0 +1,25 @@
(794, 'Kissee Mills', 'MO', 140, 73),
(824, 'Loma Mar', 'CA', 49, 131),
(603, 'Sandy Hook', 'CT', 72, 148),
(478, 'Tipton', 'IN', 34, 98),
(619, 'Arlington', 'CO', 75, 93),
(711, 'Turner', 'AR', 50, 101),
(839, 'Slidell', 'LA', 85, 152),
(411, 'Negreet', 'LA', 99, 105),
(588, 'Glencoe', 'KY', 46, 136),
(665, 'Chelsea', 'IA', 99, 60),
(342, 'Chignik Lagoon', 'AK', 103, 153),
(733, 'Pelahatchie', 'MS', 39, 28),
(441, 'Hanna City', 'IL', 51, 137),
(811, 'Dorrance', 'KS', 102, 122),
(698, 'Albany', 'CA', 50, 80),
(325, 'Monument', 'KS', 71, 142),
(414, 'Manchester', 'MD', 74, 37),
(113, 'Prescott', 'IA', 40, 66),
(971, 'Graettinger', 'IA', 95, 150),
(266, 'Cahone', 'CO', 116, 127),
(617, 'Sturgis', 'MS', 36, 126),
(495, 'Upperco', 'MD', 114, 30),
(473, 'Highwood', 'IL', 27, 151),
(756, 'Garden City', 'AL', 96, 105),
(225, 'Garden City', 'IA', 54, 119)