25 примеров команды SELECT в MySQL

MYSQL 17.09.19 19.11.21 900
Бесплатные курсына главную сниппетов

Если вы используете базу данных MySQL, это очень важно, чтобы вы работали комфортно с командной строкой MySQL.

На этом уроке мы расскажем, как использовать команду SELECT в MySQL с несколькими практическими примерами.

1. Основной пример команды SELECT

Во-первых, для подключения к командной строке MySQL, выполните следующие действия в вашей строке операционной системы.

# mysql -u root -p
Password:

 

Далее, просмотреть все доступные базы данных.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| andreyexbase       |
| crm                |
+--------------------+
8 rows in set (0.00 sec)

 

Выберите базу данных, где вы хотите работать. В этом примере я выбрал базы данных “andreyexbase”, где расположена таблица “worker”, которая используется в качестве примера для всех выбранных команды, приведенные в этой статье.

mysql> USE andreyexbase;
Database changed

mysql> DESC worker;

 

Основное использование команды SELECT является просмотр строк из таблицы. Ниже приведен пример команды SELECT, где будет отображать все строки из таблицы “worker”.

mysql> SELECT * FROM worker;
+-----+--------+------------+--------+
| id  | name   | dept       | salary |
+-----+--------+------------+--------+
| 100 | AndreyEx | Sales      |   5000 |
| 200 | Boris  | IT |   5500 |
| 300 | Anna | IT |   7000 |
| 400 | Anton  | Marketing  |   9500 |
| 500 | Dima  | IT |   6000 |
| 501 | Maxs   | Accounting |   NULL |
+-----+--------+------------+--------+
6 rows in set (0.01 sec)

 

Или выбрать конкретные столбцы, указав имена столбцов (вместо *, который даст все столбцы).

mysql> SELECT name, salary FROM worker;
+--------+--------+
| name   | salary |
+--------+--------+
| AndreyEx |   5000 |
| Boris  |   5500 |
| Anna |   7000 |
| Anton  |   9500 |
| Dima  |   6000 |
| Maxs   |   NULL |
+--------+--------+
6 rows in set (0.00 sec)

 

Примечание: Если вы новичок в MySQL, прочитайте нашу предыдущую статью о том, как создать базу данных MySQL и таблицы, прежде чем продолжить этот учебник.

2. Выберите одну из двух – виртуальная таблица

dual представляет собой виртуальную таблицу. Она на самом деле не существует. Но, вы можете использовать эту таблицу, чтобы выполнить некоторые действия без таблиц.

Например, вы можете использовать выбор в две таблицы для выполнения арифметических операций, как показано ниже.

mysql> SELECT 2+3 FROM DUAL;
+-----+
| 2+3 |
+-----+
|   5 |
+-----+
1 row in set (0.00 sec)

 

Вы можете также использовать двойную таблицу для просмотра текущей даты и времени. Функция now() в MySQL аналогична функции sysdate() в базе данных Oracle.

mysql> SELECT NOW() FROM DUAL;
+---------------------+
| now()               |
+---------------------+
| 2013-09-14 09:15:35 |
+---------------------+
1 row in set (0.00 sec)

 

Если вы не укажете любую таблицу, MySQL будет считать, что вы хотите использовать двойную. Следующий пример точно такой же, как указано выше. Просто, чтобы избежать путаницы, я рекомендую вам использовать “from dual” в эти ситуации для лучшей читаемости и ясности.

mysql> SELECT 2+3;
+-----+
| 2+3 |
+-----+
|   5 |
+-----+
1 row in set (0.00 sec)

mysql> SELECT NOW();
+---------------------+
| now()               |
+---------------------+
| 2013-09-14 09:16:45 |
+---------------------+
1 row in set (0.00 sec)

 

3. Основные условия WHERE для ограничения записей

Вместо того, чтобы отобразить все записи из таблицы, вы можете также использовать условие WHERE для просмотра только записи, которые соответствует определенному условию, как показано ниже.

mysql> SELECT * FROM worker WHERE salary > 6000;
+-----+--------+------------+--------+
| id  | name   | dept       | salary |
+-----+--------+------------+--------+
| 300 | Anna | IT |   7000 |
| 400 | Anton  | Marketing  |   9500 |
+-----+--------+------------+--------+
2 rows in set (0.00 sec)

 

Кроме знака “больше >” вы можете также использовать “равно =”, “не равно! =”, как показано ниже.

mysql> SELECT * FROM worker WHERE salary < 6000; mysql> SELECT * FROM worker WHERE salary  SELECT * FROM worker WHERE salary >= 6000;

mysql> SELECT * FROM worker WHERE salary = 6000;

mysql> SELECT * FROM worker WHERE salary != 6000;

 

4. Строки в условии WHERE

Предыдущий пример показывает, как ограничить записи, основанные на численных условиях. Этот пример объясняет, как ограничить записи на основе строковых значений.

Точное совпадение строк работает как числовое совпадение с помощью “равным =”, как показано ниже. Этот пример покажет всех сотрудников, которые принадлежат к отделу IT.

mysql> SELECT * FROM worker WHERE dept = 'IT';
+-----+--------+------------+--------+
| id  | name   | dept       | salary |
+-----+--------+------------+--------+
| 200 | Boris  | IT |   5500 |
| 300 | Anna | IT |   7000 |
| 500 | Dima  | IT |   6000 |
+-----+--------+------------+--------+
3 rows in set (0.00 sec)

 

Пожалуйста, обратите внимание, что сравнение чувствительно к регистру. Таким образом, следующий точно так же, как и выше выберите команду.

mysql> SELECT * FROM worker WHERE dept = 'IT';

 

Вы можете также использовать !=. Для отображения всех сотрудников, который не принадлежат к отделу IT, как показано ниже.

mysql> SELECT * FROM worker WHERE dept != 'IT';

 

Кроме того, можно выполнить частичное совпадение строки с помощью % в ключевых словах. Ниже будут показаны все сотрудников фамилия которых начинается с “And”.

mysql> SELECT * FROM worker WHERE name LIKE 'And%';

 

Ниже будут показаны все сотрудники имя которых заканчивается на “ex”.

mysql> SELECT * FROM worker WHERE name LIKE '%ex';

 

Вы также можете дать % в обоих направлениях. В этом случае, он будет искать для данного ключевого слова в любом месте строки. Ниже будут показаны все сотрудники, которые содержат “Andr” в их имени в любом месте.

mysql> SELECT * FROM worker WHERE name LIKE '%Andr%';

 

5. Объединение WHERE с OR, AND

Вы можете также использовать OR, AND, NOT в WHERE для объединения нескольких условий. В следующем примере показаны все сотрудники, которые находятся в отделении «IT» и с зарплатой> = 6000. Это будет отображать записи только тогда, когда оба условия выполнены.

mysql> SELECT * FROM worker WHERE dept = 'IT' AND salary >= 6000;
+-----+--------+------------+--------+
| id  | name   | dept       | salary |
+-----+--------+------------+--------+
| 300 | Anna | IT |   7000 |
| 500 | Dima  | IT |   6000 |
+-----+--------+------------+--------+
2 rows in set (0.00 sec)

 

Следующий такой же, как и выше, но использует условие OR. Таким образом, это будет отображать записи до тех пор, пока любое из условия совпадет.

mysql> SELECT * FROM worker WHERE dept = 'IT' OR salary >= 6000;
+-----+--------+------------+--------+
| id  | name   | dept       | salary |
+-----+--------+------------+--------+
| 200 | Boris  | IT |   5500 |
| 300 | Anna | IT |   7000 |
| 400 | Anton  | Marketing  |   9500 |
| 500 | Dima  | IT |   6000 |
+-----+--------+------------+--------+
4 rows in set (0.00 sec)

 

6. Объединение значений столбцов с помощью CONCAT в SELECT

Вы можете использовать функцию CONCAT в команде SELECT, объединить значения из нескольких столбцов и отображать их. Следующий пример сочетает в себе имя и отдел (только для отображения), как показано ниже.

mysql> SELECT ID, CONCAT(NAME, ' FROM ', DEPT) AS NAME, SALARY FROM worker;
+-----+------------------------+--------+
| id  | name                   | salary |
+-----+------------------------+--------+
| 100 | AndreyEx from Sales      |   5000 |
| 200 | Boris from IT  |   5500 |
| 300 | Anna from IT |   7000 |
| 400 | Anton from Marketing   |   9500 |
| 500 | Dima from IT  |   6000 |
| 501 | Maxs from Accounting   |   NULL |
+-----+------------------------+--------+
6 rows in set (0.00 sec)

 

7. Общее количество записей Count

Использование COUNT(*) в команде SELECT, чтобы отобразить общее количество записей в таблице.

mysql> SELECT COUNT(*) FROM worker;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)

 

8. Группировка в команде Select

Команда Group By будет группировать записи на основе определенных условий. В следующем примере отображается общее число сотрудников в каждом отделе.

mysql> SELECT DEPT, COUNT(*) FROM worker GROUP BY DEPT;
+------------+----------+
| dept       | count(*) |
+------------+----------+
| Accounting |        1 |
| Marketing  |        1 |
| Sales      |        1 |
| IT |        3 |
+------------+----------+
4 rows in set (0.00 sec)

 

Пожалуйста, обратите внимание, что при использовании GROUP BY, вы можете использовать некоторые функции, чтобы получить более значимый вывод. В приведенном выше примере, мы использовали COUNT(*) группу по командам. Точно так же вы можете использовать sum(), avg(), и т.д., при указании GROUP BY.

9. Использование HAVING вместе с GROUP BY

При использовании GROUP BY, вы можете также использовать HAVING для дальнейшего ограничения записи.

В следующем примере, он отображает только те отделы, где число работника составляет более 1.

mysql> SELECT COUNT(*) AS CNT, DEPT FROM worker GROUP BY DEPT HAVING CNT > 1;
+-----+------------+
| CNT | dept       |
+-----+------------+
|   3 | IT |
+-----+------------+
1 row in set (0.00 sec)

 

10. Определение псевдонима с помощью ключевого слова ‘AS’

Вместо того, чтобы отобразить имя столбца, как указано в таблице, вы можете использовать свое собственное имя на дисплее, используя ключевое слово AS.

В следующем примере, даже при том, что настоящее имя столбца ID, он отображается как EmpId.

mysql> SELECT ID AS EMPID, NAME AS EMPNAME, DEPT AS DEPARTMENT FROM worker;
+-------+---------+------------+
| EMPID | EMPNAME | DEPARTMENT |
+-------+---------+------------+
|   100 | AndreyEx  | Sales      |
|   200 | Boris   | IT |
|   300 | Anna  | IT |
|   400 | Anton   | Marketing  |
|   500 | Dima   | IT |
|   501 | Maxs    | Accounting |
+-------+---------+------------+
6 rows in set (0.00 sec)

 

Обратите внимание, что ключевое слово AS является необязательным. Следующий пример точно такой же, как и выше.

mysql> SELECT id empid, name empname, dept department FROM worker;

 

11. Left Join в команде SELECT

В следующем примере команда SELECT объединяет две таблицы. т.е. сотрудник и отдел. Для объединения их, он использует общий столбец между двумя этими таблицами отдела. Колонка “Location” показана на выходе из таблицы отдела.

mysql> SELECT worker.*, department.location FROM worker LEFT JOIN department ON ( worker.dept = department.dept );
+-----+--------+------------+--------+----------+
| id  | name   | dept       | salary | Location |
+-----+--------+------------+--------+----------+
| 100 | AndreyEx | Sales      |   5000 | RUSSIA      |
| 200 | Boris  | IT |   5500 | RUSSIA      |
| 300 | Anna | IT |   7000 | India    |
| 400 | Anton  | Marketing  |   9500 | India    |
| 500 | Dima  | IT |   6000 | UK       |
| 501 | Maxs   | Accounting |   NULL | RUSSIA      |
+-----+--------+------------+--------+----------+

 

Вы можете также использовать имя псевдонима таблицы в команде JOIN, как показано ниже. В этом примере я использовал “E” в качестве псевдонима для таблицы сотрудников, и “D” в качестве псевдонима для таблицы отделов. Это делает выбор команды меньше и легче читать.

mysql> SELECT E.*, d.location FROM worker AS E LEFT JOIN department AS D ON ( e.dept = d.dept );

 

Примечание: Join сама по себе огромная тема, которую мы будем обсуждать в деталях как отдельный учебник.

12. Анализ производительности с помощью EXPLAIN

Когда ваш запрос на выборку медлителен, или ведет себя таким образом, что вы не понимаете, используйте команду EXPLAIN, которая будет отображать дополнительную информацию, MySQL использует внутренне для выполнения запроса. Это может дать вам некоторое представление о производительности вашего выбора команды MySQL.

mysql> EXPLAIN SELECT E.*, D.LOCATION FROM worker AS E LEFT JOIN DEPARTMENT AS D ON ( E.DEPT = D.DEPT );
+----+-------------+-------+--------+---------------+---------+---------+-----------------+------+-------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref             | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+-----------------+------+-------+
|  1 | SIMPLE      | PS    | ALL    | NULL          | NULL    | NULL    | NULL            |    6 |       |
|  1 | SIMPLE      | P     | eq_ref | PRIMARY       | PRIMARY | 3       | acme.E.dept     |    1 |       |
+----+-------------+-------+--------+---------------+---------+---------+-----------------+------+-------+
2 rows in set (0.00 sec)

 

13. Форсировать запрос SELECT, используя INDEX

При выполнении запроса на выборку, и объединения двух таблиц, MySQL будет решать, как эффективно использовать любые доступные индексы в таблицах. Ниже приведены несколько способов борьбы с индексами в SELECT.

Прежде чем вы решите использовать один из перечисленных выше, вы должны действительно понять влияние этих команд, если вы будете неправильно использовать их, то это замедлит команду SELECT.

Следующие примеры MySQL использовать worker_emp_nm_idx для этого запроса.

mysql> SELECT * FROM worker FORCE INDEX (worker_EMP_NM_IDX) WHERE NAME LIKE 'And%';

 

Чтобы отобразить все доступные индексы конкретной таблицы, используйте команду “show index”. В следующем примере отображаются все индексы, доступные в таблице сотрудника.

mysql> SHOW INDEX FROM PROFILES;
+----------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table    | Non_unique | Key_name                | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+----------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| worker |          0 | PRIMARY                 |            1 | id          | A         |         156 |     NULL | NULL   |      | BTREE      |         |
| worker |          0 | worker_emp_nm_idx     |            1 | name        | A         |         156 |     NULL | NULL   |      | BTREE      |         |
+----------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

 

14. Сортировка записей с помощью ORDER BY

Примечание: по умолчанию будет сортировать по убыванию. Если вы ничего не укажите, он будет по возрастанию.
Следующие записи будут указываться в алфавитном порядке, основанном на столбце DEPT.

mysql> SELECT * FROM worker ORDER BY DEPT;
+-----+--------+------------+--------+
| id  | name   | dept       | salary |
+-----+--------+------------+--------+
| 501 | Maxs   | Accounting |   NULL |
| 400 | Anton  | Marketing  |   9500 |
| 100 | AndreyEx | Sales      |   5000 |
| 200 | Boris  | IT |   5500 |
| 300 | Anna | IT |   7000 |
| 500 | Dima  | IT |   6000 |
+-----+--------+------------+--------+
6 rows in set (0.01 sec)

 

Обратите внимание, что по умолчанию он будет сортировать в порядке возрастания. Если вы хотите отсортировать по убыванию, укажите ключевое слово “DESC” после “ORDER BY”, как показано ниже.

mysql> SELECT * FROM worker ORDER BY DEPT DESC;
+-----+--------+------------+--------+
| id  | name   | dept       | salary |
+-----+--------+------------+--------+
| 200 | Boris  | IT |   5500 |
| 300 | Anna | IT |   7000 |
| 500 | Dima  | IT |   6000 |
| 100 | AndreyEx | Sales      |   5000 |
| 400 | Anton  | Marketing  |   9500 |
| 501 | Maxs   | Accounting |   NULL |
+-----+--------+------------+--------+
6 rows in set (0.00 sec)

 

Вы также можете указать по нескольким столбцам, как показано ниже.

mysql> SELECT * FROM worker ORDER BY DEPT, SALARY DESC;

 

15. Ограничить количество записей

Вместо того, чтобы отображать все записи, вы можете просто ограничить, сколько записей MySQL должен отображаться с помощью LIMIT, как показано ниже.

Формат Limit:

LIMIT start_record, number_of_records

 

Следующий пример будет начинаться с номером записи 0 (который является первой записью), и выдаст 3 записи.

mysql> SELECT * FROM worker LIMIT 0,3;
+-----+--------+------------+--------+
| id  | name   | dept       | salary |
+-----+--------+------------+--------+
| 100 | AndreyEx | Sales      |   5000 |
| 200 | Boris  | IT |   5500 |
| 300 | Anna | IT |   7000 |
+-----+--------+------------+--------+
3 rows in set (0.00 sec)

 

Ниже будут начинаться с номером записи 1 (которая является второй записью), и выдаст 3 записи.

mysql> SELECT * FROM worker LIMIT 1,3;
+-----+--------+------------+--------+
| id  | name   | dept       | salary |
+-----+--------+------------+--------+
| 200 | Boris  | IT |   5500 |
| 300 | Anna | IT |   7000 |
| 400 | Anton  | Marketing  |   9500 |
+-----+--------+------------+--------+
3 rows in set (0.00 sec)

 

Вы также можете опустить start_record, в этом случае, он всегда будет начинаться с номером записи 0 (т.е. первая запись).

В следующем примере, мы указали только одно значение. Таким образом, это будет исходить из рекордного числа 0, а также отображать 3 записи.

mysql> SELECT * FROM worker LIMIT 3;
+-----+--------+------------+--------+
| id  | name   | dept       | salary |
+-----+--------+------------+--------+
| 100 | AndreyEx | Sales      |   5000 |
| 200 | Boris  | IT |   5500 |
| 300 | Anna | IT |   7000 |
+-----+--------+------------+--------+
3 rows in set (0.00 sec)

 

16. Ограничить количество записей с OFFSET

Формат ограничения OFFSET:

LIMIT number_of_records OFFSET start_record

 

Вы также можете использовать ключевое слово OFFSET, где вы будете указывать начальную запись после ключевого слова OFFSET.

Ниже будет отображаться в общей сложности 3 записей. Так как смещение определяется как 1, то начнет со 2-й записи.

mysql> SELECT * FROM worker LIMIT 3 OFFSET 1
+-----+--------+------------+--------+
| id  | name   | dept       | salary |
+-----+--------+------------+--------+
| 200 | Boris  | IT |   5500 |
| 300 | Anna | IT |   7000 |
| 400 | Anton  | Marketing  |   9500 |
+-----+--------+------------+--------+
3 rows in set (0.00 sec)

 

17. Получить уникальные значения из столбца

Чтобы отобразить все уникальные значения из столбца, используйте DISTINCT.

Следующий пример покажет все уникальные значения DEPT из таблицы сотрудников.

mysql> SELECT DISTINCT DEPT FROM worker;
+------------+
| dept       |
+------------+
| Sales      |
| IT |
| Marketing  |
| Accounting |
+------------+

 

18. Сумма всех значений в столбце

Чтобы добавить все значения из столбца, используйте функцию sum().

Следующий пример покажет сумму столбца заработной платы для всех работников, которые принадлежат к отделу IT.

mysql> SELECT SUM(SALARY) FROM worker WHERE DEPT = 'IT';
+-------------+
| sum(salary) |
+-------------+
|       18500 |
+-------------+
1 row in set (0.01 sec)

 

19. Среднее значение всех значений в столбце

Для того, чтобы вывести среднее арифметическое всех значений из столбца, используйте функцию avg().

Следующий пример покажет среднюю зарплату каждого и каждого отдела. Объединение GROUP BY с функцией avg().

mysql> SELECT DEPT,AVG(SALARY) FROM worker GROUP BY DEPT;
+------------+-------------+
| dept       | avg(salary) |
+------------+-------------+
| Accounting |        NULL |
| Marketing  |   9500.0000 |
| Sales      |   5000.0000 |
| IT |   6166.6667 |
+------------+-------------+
4 rows in set (0.03 sec)

 

20. SELECT в команде SELECT

Пример, приведенный ниже, является очень неточным. Там нет никаких причин, чтобы сделать это таким образом. Но это показывает вам, как вы можете использовать команду SELECT. В этом примере “ACTION” дает имя псевдонима для выбора подзапроса. Вы должны указать псевдоним в этом примере. “ACTION” это просто название. Вы можете изменить его как угодно.

mysql> SELECT * FROM (SELECT * FROM worker) AS ACTION WHERE ID

 

21. Использование оператора Select при выводе в файл

Используя SELECT INTO, вы можете сохранить вывод команды в файл.

Вместо того, чтобы отображать выходные данные на экране, следующий пример команды select будет сохранять вывод выбора команды в файл /tmp/worker.txt.

mysql> SELECT * INTO OUTFILE '/tmp/worker.txt' FROM worker;
Query OK, 6 rows affected (0.00 sec)

# cat /tmp/worker.txt
100     AndreyEx  Sales   5000
200     Boris   IT      5500
300     Anna  IT      7000
400     Anton   Marketing       9500
500     Dima   IT      6000
501     Maxs    Accounting      \N

 

Вы также можете сохранить вывод в файл с разделителями запятыми, указав “FIELDS TERMINATED BY”, как показано в приведенном ниже примере.

mysql> SELECT * INTO OUTFILE '/tmp/worker1.txt'   FIELDS TERMINATED BY ',' FROM worker;
Query OK, 6 rows affected (0.00 sec)

# cat /tmp/worker1.txt
100,AndreyEx,Sales,5000
200,Boris,IT,5500
300,Anna,IT,7000
400,Anton,Marketing,9500
500,Dima,IT,6000
501,Maxs,Accounting,\N

 

22. Выполнение процедур на наборе данных

Кроме того, можно вызвать процедуру MySQL, которая будет обрабатывать данные с выходом команды SELECT.

В следующем примере выполнения процедуры salary_report () на выходе данного команды SELECT.

mysql> SELECT ID, SALARY FROM worker PROCEDURE SALARY_REPORT();

 

23. Показать случайную запись из таблицы

С помощью команды rand вы можете отобразить случайную запись из таблицы. Это может быть полезно в ситуациях, где вы показываете некоторый случайный совет дня из таблицы.

mysql> SELECT * FROM worker ORDER BY RAND() LIMIT 1;
+-----+-------+------------+--------+
| id  | name  | dept       | salary |
+-----+-------+------------+--------+
| 200 | Boris | IT |   5500 |
+-----+-------+------------+--------+
1 row in set (0.00 sec)

 

Та же команда выполнится в следующий раз, и даст другую запись, как показано ниже.

mysql> SELECT * FROM worker ORDER BY RAND() LIMIT 1;
+-----+--------+-------+--------+
| id  | name   | dept  | salary |
+-----+--------+-------+--------+
| 100 | AndreyEx | Sales |   5000 |
+-----+--------+-------+--------+
1 row in set (0.00 sec)

 

Можно также передать текущую дату и время, как соль, используя функцию now() к команде rand, как показано ниже.

mysql> SELECT * FROM worker ORDER BY RAND(NOW()) LIMIT 1;
+-----+-------+-----------+--------+
| id  | name  | dept      | salary |
+-----+-------+-----------+--------+
| 400 | Anton | Marketing |   9500 |
+-----+-------+-----------+--------+
1 row in set (0.00 sec)

 

24. Высокий приоритет команды Select

При использовании ключевого слова HIGH_PRIORITY в операторе SELECT, даст конкретному оператору SELECT более высокий приоритет, чем любому обновление в таблице.

Будьте очень осторожны, когда вы используете эту команду, вы можете привести к замедлению работы других обновлений. Используйте это только в тех ситуациях, когда вам нужно, чтобы получить запись очень быстро. Также убедитесь, что команда SELECT очень хорошо оптимизирована, прежде чем выполнить его.

mysql> SELECT HIGH_PRIORITY * FROM worker WHERE ID = 100;

 

25. Последовательное чтение в команде Select

Если вы хотите последовательное чтение. При выборе строки из таблицы, если вы должны ждать какой-либо другой процесс, чтобы изменить значение, то Вам необходимо включить режим блокировки таблицы, когда вы читаете записи.

Если вы не понимаете, влияние того, как это работает, вы можете поставить себя в сложную ситуацию, если вы пытаетесь использовать их на большой таблице.

Следующая команда не позволит другому сеансу MySQL изменять записи, которые запрашиваются у оператора SELECT, пока она не прочитает все эти записи.

mysql> SELECT * FROM worker WHERE ID = 100 LOCK IN SHARE MODE;

 

Обратите внимание, что вы также можете сделать “FOR UPDATE”, как показано ниже, которые будут блокировать другие сеансы “SELECT … LOCK IN SHARE MODE”, пока эта транзакция не закончится.

mysql> SELECT * FROM worker WHERE ID = 100 FOR UPDATE;

 

 

Руководство по MySQLРуководство по MySQL 544 страницы · 2016 · 4.78 MB · русский by Тахагхогхи С. & Вильямс Хью Е.
MySQL по максимумуMySQL по максимуму 866 страниц · 2018 · 102.51 MB · русский by Бэрон Шварц & Петр Зайцев & Вадим Ткаченко
 
на главную сниппетов
Курсы