Запрос к базе в цикле
artshatov
5 марта 2018 в 12:15
В этой статье я попробую показать как избежать одного из признаков «загнивающего» кода, а именно SQL запросы внутри циклов. Примеры будут на простом PHP без использования ООП. Это значительно облегчит понимание. Прочтение займет от 5 до 10 минут.
Почему стоит избегать запросов внутри циклов?
Все очень просто. Каждый запрос это потеря времени на «подготовительные» и «заключительные» операции по обращению к БД. Предположим к каждому товару есть отдельная таблица для картинок, скидок и каких-нибудь опций(например выбор цвета платья). То есть для получения информации о каждом товаре, вам нужно будет выполнить 3 запроса. Т.е. 300 запросов на вывод 100 товаров + запрос на получение списка товаров. Итого 301 запрос на 100 товаров. И как результат, существенное снижение производительности вашего приложения. Этого можно и стоит избегать.
Ниже кусочек кода из OpenCart 3:
public function getProducts($data = array()) {
//…..
$query = $this->db->query($sql);
foreach ($query->rows as $result) {
// for never get one more time with same product id
if(!isset($product_data[$result[‘product_id’]])){
$product_data[$result[‘product_id’]] = $this->getProduct($result[‘product_id’]);
}
}
return $product_data;
}
/*
$this->getProduct($result[‘product_id’]) Делает выборку 1 товара из базы. Т.е. метод getProducts вытаскивает product_id-ы из базы, и потом в цикле “тащит” полные данные на каждого из товаров. Очень классное решение (сарказм).
*/
Задача для оптимизации
Рассмотрим задачу с двумя таблицами — Товары и Цены. У одного товара может быть несколько цен разного типа. Результат нужно получить в виде массива:
print_r($products)
/*
Array
(
[1] => Array
(
[product_id] => 1
[name] => Товар 1
[prices] => Array
(
[0] => Array
(
[price_id] => 45
[product_id] => 1
[type] => 3
[price] => 95.00
)
[1] => Array
(
[price_id] => 55
[product_id] => 1
[type] => 1
[price] => 90.00
)
[2] => Array
(
[price_id] => 58
[product_id] => 1
[type] => 2
[price] => 90.00
)
)
)
)
*/
Таблица товаров:
`product_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`product_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
INSERT INTO `product` (`product_id`, `name`) VALUES (1, ‘Товар 1’);
INSERT INTO `product` (`product_id`, `name`) VALUES (2, ‘Товар 2’);
INSERT INTO `product` (`product_id`, `name`) VALUES (3, ‘Товар 3’);
INSERT INTO `product` (`product_id`, `name`) VALUES (4, ‘Товар 4’);
INSERT INTO `product` (`product_id`, `name`) VALUES (5, ‘Товар 5’);
INSERT INTO `product` (`product_id`, `name`) VALUES (6, ‘Товар 6’);
INSERT INTO `product` (`product_id`, `name`) VALUES (7, ‘Товар 7’);
INSERT INTO `product` (`product_id`, `name`) VALUES (8, ‘Товар 8’);
INSERT INTO `product` (`product_id`, `name`) VALUES (9, ‘Товар 9’);
INSERT INTO `product` (`product_id`, `name`) VALUES (10, ‘Товар 10’);
Таблица цен:
`price_id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` int(11) NOT NULL,
`type` enum(‘1′,’2′,’3’) NOT NULL,
`price` decimal(10,2) NOT NULL,
PRIMARY KEY (`price_id`)
) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8;
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (55, 1, ‘1’, 90.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (58, 1, ‘2’, 90.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (45, 1, ‘3’, 95.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (56, 2, ‘1’, 90.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (49, 2, ‘2’, 45.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (42, 2, ‘3’, 96.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (57, 3, ‘1’, 23.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (47, 3, ‘2’, 53.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (51, 3, ‘3’, 12.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (43, 4, ‘1’, 89.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (46, 4, ‘2’, 4.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (52, 4, ‘3’, 15.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (54, 5, ‘1’, 43.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (41, 5, ‘2’, 44.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (48, 5, ‘3’, 34.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (44, 6, ‘1’, 26.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (59, 6, ‘2’, 26.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (60, 6, ‘3’, 26.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (53, 7, ‘1’, 87.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (61, 7, ‘2’, 87.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (50, 7, ‘3’, 77.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (62, 8, ‘1’, 77.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (63, 8, ‘2’, 77.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (64, 8, ‘3’, 77.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (65, 9, ‘1’, 77.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (66, 9, ‘2’, 77.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (67, 9, ‘3’, 77.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (68, 10, ‘1’, 77.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (69, 10, ‘2’, 77.00);
INSERT INTO `product_price` (`price_id`, `product_id`, `type`, `price`) VALUES (70, 10, ‘3’, 77.00);
Вариант с запросами внутри циклов:
<?php
define(‘DB_HOST’ , ‘localhost’);
define(‘DB_USER’ , ‘mysqluser’);
define(‘DB_PASSWORD’ , ‘password’);
define(‘DB_NAME’ , ‘habr’);
$conn = mysqli_connect(DB_HOST , DB_USER , DB_PASSWORD) or die(‘Can not connect to db’);
mysqli_select_db($conn , DB_NAME) or die(mysqli_error($conn));
mysqli_query($conn , ‘SET NAMES utf8’);
//получаем все товары – 7 шт.
$sql = ‘select * from product’;
$product_result = mysqli_query($conn , $sql);
//Объявляем массив куда будем собирать все товары
$products = array();
while ($product = mysqli_fetch_assoc($product_result)) {
//Получаем список цен у текущего товара.
$prices = array();
$sql = ‘select * from product_price WHERE product_id = ‘ . (int) $product[‘product_id’];
$price_result = mysqli_query($conn , $sql);
while ($price = mysqli_fetch_assoc($price_result)) {
$prices[] = $price;
}
//Полученный список цены помещаем в товар
$product[‘prices’] = $prices;
//Товар помещаем в массив товаров
$products[] = $product;
}
print_r($products);
if ($conn) {
mysqli_close($conn);
}
Итак, чтобы вывести 7 товаров мы сделали 1+7 запросов. Как можно оптимизировать:
- Выбираем товары из таблицы. Помещаем их в массив, но в качестве ключей будем использовать product_id;
- Выбираем все цены для найденных товаров;
- Найденные цены «распихиваем» по товарам.
Тоже самое, но на понятном языке PHP:
<?php
define(‘DB_HOST’ , ‘localhost’);
define(‘DB_USER’ , ‘mysqluser’);
define(‘DB_PASSWORD’ , ‘password’);
define(‘DB_NAME’ , ‘habr’);
$conn = mysqli_connect(DB_HOST , DB_USER , DB_PASSWORD) or die(‘Can not connect to db’);
mysqli_select_db($conn , DB_NAME) or die(mysqli_error($conn));
mysqli_query($conn , ‘SET NAMES utf8’);
//получаем 3 товара
$sql = ‘select * from product LIMIT 3’;
$product_result = mysqli_query($conn , $sql);
//Объявляем массив куда будем собирать все товары
$products = array();
while ($product = mysqli_fetch_assoc($product_result)) {
//Инициализируем цены
$product[‘prices’] = array();
//Создаем новый продукт. Ключ уже указываем в качестве product_id
$products[(int) $product[‘product_id’]] = $product;
}
//Проверяем что есть товары, для которых надо получить цены.
if (count($products) > 0 ) {
//Получаем список product_id-ов для которых теперь нам надо вытащить цены.
$product_ids = array_keys($products);
//составляем запрос на выборку
$sql = ‘select * from product_price where product_id in (‘ . implode(‘,’ , $product_ids ). ‘)’;
$prices_result = mysqli_query($conn , $sql) or die(mysqli_error($conn));
while ($price = mysqli_fetch_assoc($prices_result)) {
$products[(int) $price[‘product_id’]][‘prices’][] = $price;
}
}
print_r($products);
if ($conn) {
mysqli_close($conn);
}
Так теперь, для выборки любого количества товаров нужно будет выполнить всего 2 запроса. Работа такого скрипта будет иметь ощутимую разницу на выборках большого количества товаров. Данный подход можно обобщить. Например, избегайте в циклах обращение в внешним ресурсам(файловой системе, memcache, redis), если такое возможно. И помните о принципе разумности в принимаемых решениях.
Теги:
- php
- mysql
Хабы:
PHP
MySQL
Источник
Вопрос задан
9 лет 5 месяцев назад
Просмотрен
4k раза
Нужно чтобы в базу данных в определенную таблицу внеслись записиь с 5 по 1455.
Я делаю так:
<?
$dbhost = “localhost”; // Хост
$dbuser = “user”; // Имя пользователя
$dbpassword = “pass”; // Пароль
$dbname = “dbname”; // Имя базы данных
$link = mysql_connect($dbhost, $dbuser, $dbpassword);
mysql_select_db($dbname, $link);
$x = 5;
while (x < 1455):
$query = “insert into b_user_group values(“.$x.”,’8′,’NULL’, ‘NULL’)”;
$x++;
endwhile;
mysql_query($query, $link);
mysql_close($link);?>
Но не работает почему-то. В чем может быть дело?
задан 13 сен ’11 в 11:23
TchortTchort
87822 золотых знака2626 серебряных знаков8181 бронзовый знак
2
Вы запрос формируете в цикле, а выполняете его вне цикла. Один раз.
ответ дан 13 сен ’11 в 11:28
AliAli
2,12099 серебряных знаков1010 бронзовых знаков
1
$query = “insert into b_user_group values “;
$comma = 0;
while (x < 1455) {
if ($comma) { $query .= ‘, ‘; } else $comma++;
$query .= ‘(‘.$x.’,’8′,NULL, NULL)’;
$x++;
}
$query .= ‘;’;
mysql_query($query, $link);
ответ дан 13 сен ’11 в 11:49
Sh4dowSh4dow
14.3k11 золотой знак1919 серебряных знаков3434 бронзовых знака
1
цикл while должен выглядеть так:
while ($x < 1455):
$query = “insert into b_user_group values(‘”.$x++.”‘,’8′,’NULL’, ‘NULL’)”;
mysql_query($query, $link);
endwhile;
ответ дан 13 сен ’11 в 11:39
DL_DL_
86055 серебряных знаков1313 бронзовых знаков
2
$dbhost = “localhost”; // Хост
$dbuser = “user”; // Имя пользователя
$dbpassword = “pass”; // Пароль
$dbname = “dbname”; // Имя базы данных
$link = mysql_connect($dbhost, $dbuser, $dbpassword);
mysql_select_db($dbname, $link);
$x = 5;
$values = ”;
while ( x < 1455 ) {
if ( empty($values) ) {
$values .= ‘(‘ . $x . ‘,8,”NULL”,”NULL”)’;
} else {
$values .= ‘,(‘ . $x . ‘,8,”NULL”,”NULL”)’;
}
$x++;
}
$sql = ‘INSERT INTO `b_user_group` VALUES ‘ . $values;
mysql_query($sql, $link);
mysql_close($link);
ответ дан 20 июн ’13 в 4:59
NikolayNikolay
9611 серебряный знак88 бронзовых знаков
Всё ещё ищете ответ? Посмотрите другие вопросы с метками php mysql или задайте свой вопрос.
Источник
Я помню, было очень неплохая книга по MySQL, и автор оной был Кузнецов. Кажется, вот это она. Есть ещё вот такая, но я кажется знакомился только с первой. Не смотря на приличный опыт работы с этой БД, нашел для себя много интересного.
Сообщение от sergei1094
Спасибо вам в первую очередь за то что уделили для меня время
Спасибо на добром слове!
Сообщение от sergei1094
я книги читаю по 2-3 часа и понимаю в них то что вы объясняете тут одной, так сказать статьёй за 15 минут.
Уже подумываю написать свою
Сообщение от sergei1094
Опыта в процедурном коде php у меня в принципе хватает. Но, раньше не писал большие проекты, пользовался лишь вполне доступными SQL запросами на выборки апдэйты и инзерты, а тут как то настигла мысль попробовать переступить на ООП. Но и тут то всё пошло не так как я ожидал конечно
Как такового, “объектного” программирования в PHP, в чистом виде нет. В не в том смысле, что в PHP нет объектов или классов, а в том, что обычно эти объекты объединены в конечный продукт, который обычно называется “фреймворк” (framework). То есть, какие-то отдельные классы/библиотеки в “чистом PHP” используются крайне редко. Да и сайты на “чистом” PHP обычно имеет смысл писать только в очень редких/крайних случаях, кои случаются ну ооочень редко. Обычно, эти самые библиотеки, отлично прикручиваются к фреймворкам.
Для знакомства с фреймворками, могу порекомендовать, для начала CodeIgniter. У него конечно, масса недостатков, в т.ч. далеко не лучший шаблонизатор и множество других особенностей. Но он довольно прост в изучении и помогает понять общий концепт практически всех PHP-фреймворков. Ещё одно из его достоинств – есть документация на русском.
Следующий за ним, пожалуй будет Kohana. Изначально это был форк (клон) того самого CodeIgniter’a, потом вырос в отдельный фреймворк. Достаточно неплох для мелко-средних проектов, немного более, эм… более… более “продуманный” наверное, чем CodeIgniter, но всё так же не перегружен “лишним” функционалом, не перегружен классами “на все случаи жизни” и так далее. Удобная система моделей и вложенности.
Далее, можно посмотреть Yii он посложнее первых двух, и не нравится мне по ряду субъективных причин (хотя, я конечно не говорю об отсутствии у него своих достоинств). В нём уже присутствуют такие штуковины как “генераторы кода”, и “консольные команды”.
И самые пожалуй “жирные” фреймворки, это: Symfony, Laravel, Zend. Их я рекомендую после знакомства хотя бы с одним из более “мелких” фреймворков, т.к. понять их структуру и логику довольно не просто.
Сообщение от sergei1094
Чтобы расширить размер нужно выполнить команду SET group_concat_max_len =4096;
т.е. даже если и использовать эту функцию, она может обрезать данные вывода без уведомления об ошибке исчерпания ограничения?
Да, в MySQL есть некоторые ограничения, это НЕ последнее из них. В частности, не редко, при работе с базой напрямую, я использую вот такой запрос:
который говорит базе, в какой кодировке мы будем общаться с ней. То есть данные могут храниться в базе в одной кодировке, а передаваться в разных. Более того, в разных таблицах, могут быть разные кодировки, а в некоторых база (кажется и в MySQL тоже) даже в разных столбцах, могут быть разные кодировки.
Так же и с ограничением на длину результатов объединения. По умолчанию это значение равно 1024, но Вы легко можете его увеличить, единожды выполнив запрос указанный выше. Как мы можем видеть на этой странице, для 32-х битных версий MySQL максимальным значением будет: 4294967295 (что довольно таки, не мало), а для 64-битных, и того больше: 18446744073709551615.
Соответственно, выглядит всё в общей сложности примерно так:
1. Подключаемся к серверу БД
2. Выбираем базу (“USE mysql_database_name;”)
3. Устанавливаем кодировку по умолчанию “SET NAMES utf8;”
4. Устанавливаем максимальную длину для GROUP_CONCAT “SET group_concat_max_len = 4294967295”
5. Работаем с базой далее, как нам удобно (выполняем все остальные запросы). То есть, перед каждым запросом делать “SET NAMES” или “SET group_concat_max_len” не нужно!! Достаточно сделать это единожды, сразу после подключения к базе.
Отдельно стоит заметить, что group_concat_max_len — это имя переменной MySQL. Некоторые из них, можно изменять “на горячую”, т.е. с помощью SQL-запросов, некоторые только в конфигурации базы.
Ещё стоит обратить внимание, что существуют специальные функции для выбора БД, с котором будем работать или для установки кодировки по умолчанию и по возможности лучше использовать их, вместо соответствующих им SQL-запросов.
Добавлено через 9 минут
Ещё пожалуй, можно добавить то, что установка этой переменной будет действовать до перезагрузки сервер БД (после перезагрузки, сервер загрузит значения либо из файла конфигурации, либо установит значения по умолчанию).
Что бы посмотреть значения всех переменных MySQL, можно выполнить запрос:
Точно сказать, какие из них можно менять “на горячую”, я к сожалению не могу. Но просто посмотреть их, в образовательных целях – будет полезно.
Ещё на сервере обычно присутствует база с именем information_schema – в это базе хранится системная информация сервера БД, в частности пользователи БД и их права и многое другое… Рекомендую посмотреть на неё, в ознакомительных целях.
1
Источник
Бесплатный Видеокурс по PHP! Пример создания реального PHP-сайта с нуля! Подробнее |
Сегодня узнаем, как работать с циклами, т.е. выполнять один и тот же запрос несколько раз. В MySQL для работы с циклами применяются
операторы WHILE, REPEAT и LOOP.
Оператор цикла WHILE
Сначала синтаксис:
WHILE условие DO
запрос
END WHILE
Запрос будет выполняться до тех пор, пока условие истинно. Давайте посмотрим на примере, как это работает. Предположим, мы хотим знать названия,
авторов и количество книг, которые поступили в различные поставки. Интересующая нас информация хранится в двух таблицах – Журнал Поставок
(magazine_incoming) и Товар (products). Давайте напишим интересующий нас запрос:
SELECT magazine_incoming.id_incoming, products.name, products.author, magazine_incoming.quantity
FROM magazine_incoming, products
WHERE magazine_incoming.id_product=products.id_product;
А что, если нам необходимо, чтобы результат выводился не в одной таблице, а по каждой поставке отдельно? Конечно, можно написать 3 разных
запроса, добавив в каждый еще одно условие:
SELECT magazine_incoming.id_incoming, products.name, products.author, magazine_incoming.quantity
FROM magazine_incoming, products
WHERE magazine_incoming.id_product=products.id_product AND magazine_incoming.id_incoming=1;
SELECT magazine_incoming.id_incoming, products.name, products.author, magazine_incoming.quantity
FROM magazine_incoming, products
WHERE magazine_incoming.id_product=products.id_product AND magazine_incoming.id_incoming=2;
SELECT magazine_incoming.id_incoming, products.name, products.author, magazine_incoming.quantity
FROM magazine_incoming, products
WHERE magazine_incoming.id_product=products.id_product AND magazine_incoming.id_incoming=3;
Но гораздо короче сделать это можно с помощью цикла WHILE:
DECLARE i INT DEFAULT 3;
WHILE i>0 DO
SELECT magazine_incoming.id_incoming, products.name, products.author, magazine_incoming.quantity
FROM magazine_incoming, products
WHERE magazine_incoming.id_product=products.id_product AND magazine_incoming.id_incoming=i;
SET i=i-1;
END WHILE;
Т.е. мы ввели переменную i, по умолчанию равную 3, сервер выполнит запрос с id поставки равным 3, затем уменьшит i на единицу (SET i=i-1),
убедится, что новое значение переменной i положительно (i>0) и снова выполнит запрос, но уже с новым значением id поставки равным 2.
Так будет происходить, пока переменная i не получит значение 0, условие станет ложным, и цикл закончит свою работу.
Чтобы убедиться в работоспособности цикла создадим хранимую процедуру books и поместим в нее цикл:
DELIMITER //
CREATE PROCEDURE books ()
begin
DECLARE i INT DEFAULT 3;
WHILE i>0 DO
SELECT magazine_incoming.id_incoming, products.name, products.author,
magazine_incoming.quantity
FROM magazine_incoming, products
WHERE magazine_incoming.id_product=products.id_product
AND magazine_incoming.id_incoming=i;
SET i=i-1;
END WHILE;
end
//
Теперь вызовем процедуру:
CALL books ()//
Теперь у нас 3 отдельные таблицы (по каждой поставке). Согласитесь, что код с циклом гораздо короче трех отдельных запросов. Но в нашей
процедуре есть одно неудобство, мы объявили количество выводимых таблиц значением по умолчанию (DEFAULT 3), и нам придется с каждой
новой поставкой менять это значение, а значит код процедуры. Гораздо удобнее сделать это число входным параметром. Давайте перепишем
нашу процедуру, добавив входной параметр num, и, учитывая, что он не должен быть равен 0:
CREATE PROCEDURE books (IN num INT)
begin
DECLARE i INT DEFAULT 0;
IF (num>0) THEN
WHILE i
Убедитесь, что с другими параметрами, мы по-прежнему получаем таблицы по каждой поставке. У нашего цикла есть еще один недостаток – если случайно задать
слишком большое входное значение, то мы получим псевдобесконечный цикл, который загрузит сервер бесполезной работой. Такие ситуации предотвращаются
с помощью снабжения цикла меткой и использования оператора LEAVE, обозначающего досрочный выход из цикла.
CREATE PROCEDURE books (IN num INT)
begin
DECLARE i INT DEFAULT 0;
IF (num>0) THEN
wet : WHILE i 10) THEN LEAVE wet;
ENF IF;
SELECT magazine_incoming.id_incoming, products.name, products.author, magazine_incoming.quantity
FROM magazine_incoming, products
WHERE magazine_incoming.id_product=products.id_product AND magazine_incoming.id_incoming=i;
SET i=i+1;
END WHILE wet;
ELSE
SELECT ‘Задайте правильный параметр’;
END IF;
end
//
Итак, мы снабдили наш цикл меткой wet вначале (wet:) и в конце, а также добавили еще одно условие – если входной параметр больше 10
(число 10 взято произвольно), то цикл с меткой wet следует закончить (IF (i>10) THEN LEAVE wet). Таким образом, если мы случайно вызовем
процедуру с большим значением num, наш цикл прервется после 10 итераций (итерация – один проход цикла).
Циклы в MySQL, так же как и операторы ветвления, на практике в web-приложениях почти не используются. Поэтому для двух других видов циклов
приведем лишь синтаксис и отличия. Вряд ли вам доведется их использовать, но знать об их существовании все-таки надо.
Оператор цикла REPEAT
Условие цикла проверяется не в начале, как в цикле WHILE, а в конце, т.е. хотя бы один раз, но цикл выполняется. Сам же цикл выполняется, пока
условие ложно. Синтаксис следующий:
REPEAT
запрос
UNTIL условие
END REPEAT
Оператор цикла LOOP
Этот цикл вообще не имеет условий, поэтому обязательно должен иметь оператор LEAVE. Синтаксис следующий:
LOOP
запрос
END LOOP
На этом мы заканчиваем уроки посвященные SQL. Конечно, мы рассмотрели не все возможности этого языка запросов, но в реальной жизни вам вряд ли
придется столкнуться даже с тем, что вы уже знаете.
Напомню, на реальных сайтах, вы обычно вводите информацию в какие-нибудь html-формы, затем сценарий на каком-либо языке (php, java…) извлекает
эти данные из формы и заносит их в БД. При необходимости происходит обратный процесс, т.е. данные извлекаются из БД и выводятся на страницы
сайта. Оба процесса происходят посредством SQL-запросов. HTML вы знаете, с базами данных разобрались, SQL-запросы писать научились, осталось
изучить PHP, чтобы ваши сайты превратились в полноправные web-приложения. Это и есть ваш следующий шаг. До встречи в уроках PHP.
Предыдущий урок
Вернуться в раздел
Видеоуроки php + mysql
- Видеокурс “PHP и MySQL с Нуля до Гуру 2.0”
- Как создаётся движок сайта на PHP и MySQL
Если этот сайт оказался вам полезен, пожалуйста, посмотрите другие наши статьи и разделы.
Код кнопки: |
Теперь нажмите кнопку, что бы не забыть адрес и вернуться к нам снова.
Источник