Команды MySQL, одна статья сделает все за вас

задняя часть база данных MySQL SQL

Оригинальная статья, краткое изложение опыта и жизненные перипетии на всем пути от набора в школу до фабрики А

Нажмите, чтобы узнать подробностиwww.coderccc.com

Основные операции MySQL могут включать два аспекта: общие операторы MySQL, такие как часто используемые операторы CRUD, и расширенные функции MySQL, такие как хранимые процедуры, триггеры, обработка транзакций и т. д. Эти два аспекта можно разделить следующим образом:

MySQL基本操作总结.png

  • Общие операторы MySQL

    1. CRUD для таблиц (или баз данных)
    2. CRUD для табличных данных, где запросы к табличным данным являются наиболее часто используемыми и более сложными. Запросы можно разделить на однотабличные или многотабличные запросы: однотабличный запрос SELECT и многотабличный запрос соединения (INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN) и комбинированный запрос UNION и UNION ALL.
    3. Порядок выполнения каждого ключевого слова в операторе SQL
  • Расширенные возможности MySQL

    1. хранимая процедура
    2. Обработка транзакции
    3. курок

1. Оператор операции с таблицей (или базой данных)

1.1 Таблица запросов (или база данных)

  1. Получить все доступные базы данных:SHOW DATABASES;
  2. выберите базу данных:USE customers;
  3. Используется для отображения информации о состоянии сервера базы данных:SHOW STATUS;
  4. Используется для отображения разрешений безопасности авторизованных пользователей:SHOW GRANTS;
  5. Используется для отображения сервера базы данных или предупреждающих сообщений:SHOW ERRORSилиSHOW WARNINGS;
  6. Используется для отображения инструкции создания при создании базы данных.:SHOW CREATE DATABASE customers;
  7. Используется для отображения инструкции создания при создании таблицы.:SHOW CREATE TABLE customers;
  8. Получить все доступные таблицы в текущей выбранной базе данных:SHOW TABLES;
  9. Получить информацию обо всех столбцах таблицы:SHOW COLUMNS FROM tableName; в то время как оператор DESCRIBE имеет тот же эффект:DESCRIBE tableName;

1.2. Создайте новую таблицу (или) базу данных

  1. новая база данных:CREATE DATABASE customers;

  2. Чтобы создать таблицу, вы можете использовать оператор CREATE TABLE.:

     CREATE TABLE customers(
       cust_id INT NOT NULL AUTO_INCREMENT,
       cust_name CHAR(50) NOT NULL,
       cust_age INT NULL DEFAULT 18,
       PRIMARY KEY(cust_id)
     )ENGINE=INNODB;
    

    Есть такие детали:

    1. позволятьNULLзначение, это означает, что разрешено не указывать значение этого столбца при вставке данных строки, иNOT NULLЭто означает, что при вставке или обновлении данных в этом столбце значение этого столбца должно быть указано явно;
    2. DEFAULTУказывает значение столбца по умолчанию.При вставке данных строки, если значение столбца не задано, будет использоваться указанное значение по умолчанию;
    3. PRIMARY KEYИспользуется для указания первичного ключа. Первичный ключ может указывать столбец данных и может состоять из комбинации нескольких столбцов данных, напримерPRIMARY KEY(cust_id,cust_name);
    4. ENGINEИспользуется для указания типа двигателя. Распространенными типами движков являются следующие: (1) InnoDB — это движок, который поддерживает надежную обработку транзакций, но не поддерживает полнотекстовый поиск; (2) MyISAM — чрезвычайно высокопроизводительный движок, который поддерживает полнотекстовый поиск, но не поддерживает Обработка транзакций (3) ПАМЯТЬ функционально эквивалентна MyISAM, но поскольку данные хранятся в памяти, она выполняется быстро (особенно подходит для временных таблиц);
  3. можно использовать при создании таблицыFOREIGN KEYЧтобы создать внешний ключ, то есть FOREIGN KEY в одной таблице указывает на PRIMARY KEY в другой таблице. Внешний ключ FOREIGN KEY используется для ограничения действия соединения по уничтожению таблиц и обеспечения целостности данных двух таблиц. Это также предотвращает вставку недопустимых данных в столбец внешнего ключа, поскольку значение столбца должно указывать на первичный ключ другой таблицы. Примеры:

     CREATE TABLE Orders
     (
     Id_O int NOT NULL,
     OrderNo int NOT NULL,
     Id_P int,
     PRIMARY KEY (Id_O),
     FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
     )
    

1.3 Удаление таблицы (или базы данных)

  1. удалить базу данных:DROP DATABASE customers;
  2. удалить таблицу, используя предложение DROP TABLE:DROP TABLE customers.

1.4 Обновление таблицы

  1. Чтобы обновить информацию о структуре таблицы, вы можете использоватьALTER TABLEпредложение, например добавление столбца в таблицу:ALTER TABLE vendors ADD vend_name CHAR(20); также часто используется для определения внешних ключей, например:

     ALTER TABLE customers 
     ADD CONSTRAINT fk_custormer_orders
     FOREIGN KEY(cust_id) REFERENCES orders (order_cust)
    
  2. Чтобы переименовать таблицу, используйте предложение RENAME.RENAME TABLE backup_customers TO customers, backup_vendors TO vendors;изменить несколько имен таблиц, разделенных запятыми

2 Оператор манипулирования табличными данными

2.1 Запрос данных таблицы

Основной оператор запроса

  1. Запросите информацию об одном столбце, нескольких столбцах или всех столбцах в таблице в соответствии с условиями фильтра.SELECT FROM WEHERE:SELECT cust_id,cust_name FROM customers WHERE cust_id=10086; Операторы условий фильтрации: =, ,!=,,>=, BETWEEN AND, IS NULL;
  2. Дедупликация для столбца запрашиваемой информацииDISTINCT:SELECT DISTINCT cust_name FROM customers;
  3. Ограничьте количество строк в результатах запроса с одним столбцом:SELECT cust_name FROM customers LIMIT 5; за LIMIT следует значение, означающее, что данные берутся из 0-й строки, а всего берется 5 строк данных; если LIMIT 5, 5 означает, что данные берутся из пятой строки (фактически 6-й строка в базе данных), и всего берется 5 строк данных. Примечание: данные отсчитываются с строки 0;
  4. ORDER BYПредложение принимает один или несколько столбцов и соответствующим образом сортирует вывод:SELECT cust_id,cust_name FROM customers ORDER BY cust_id DESC, cust_name;
  5. INОператор используется для указания диапазона условий, каждому из которых может соответствовать:SELECT cust_id, cust_name FROM customers WHERE cust_id IN (1000,2000). Кроме того, оператор NOT можно использовать вместе с оператором IN, чтобы указать, что извлекаются все данные, не соответствующие условиям;
  6. LIKEОператор используется для обозначения нечеткого запроса, а с ним используются подстановочные знаки: **%**, % означает, что любой символ появляется любое количество раз;_,_Указывает, что может совпадать только один символ:SELECT cust_id,cust_name FROM customers WHERE cust_name LIKE '%happy%';
  7. Использовать групповой запрос и может соответствовать определенным условиям группового фильтраGROUP BY HAVING. Например, получите номер заказа и общую сумму заказа, общая сумма заказа которого больше или равна 50, и отсортируйте по общей сумме:SELECT order_num,SUM(quantity*item_price) AS order_total FROM orderitems GROUP BY order_num HAVING SUM(quantity*item_price)>=50 ORDER BY order_total
  8. Сравнение WHERE и HAVING. WHERE — фильтрация на уровне строк, а HAVING — фильтрация на уровне группы. Данные, отфильтрованные по WHERE, не отображаются в группе. Подстановочные знаки в WHERE и соединение нескольких предложений WHERE также применяются к предложению HAVING;
  9. Примечания по использованию GROUP BY: (1) Группировка может быть вложена в предложение GROUP BY (то есть группировка по нескольким столбцам).GROUP BY cust_id, cust_name), но когда данные агрегируются, это выполняется для последней указанной группировки; (2) каждый столбец, указанный в предложении GROUP BY, должен быть столбцом поиска или допустимым выражением. (3) Если есть значение NULL, вернуть значение NULL как группу.Если есть несколько строк значений NULL, они будут сгруппированы в одну группу
  10. Вложите запросы в другие запросы, назовите этоподзапрос. Процесс выполнения идет изнутри наружу, а результат внутреннего запроса используется как условие внешнего запроса:SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'happy'). Конечно, запрос к нескольким таблицам может быть запросом на соединение.

присоединиться к запросу

  1. Внутренние соединения, также известные как внутренние соединения, основаны на проверках на равенство между двумя таблицами. Если никакие условия фильтра не добавлены, это вызовет «декартово произведение».SELECT vend_name,prod_name,prod_price FROM vendors INNER JOIN products ON vendors.vend_id=products.vend_id; Вы также можете использовать WHERE для запросов на соединение с несколькими таблицами, но более рекомендуется использовать такие методы соединения, как INNER JOIN;
  2. Внешние соединения включают левые внешние соединенияLEFT JOINи правое внешнее соединениеRIGHT JOINи полностью подключенFULL JOIN. Например, чтобы запросить количество заказов на одного клиента:SELECT customers.cust_id,orders.orders_num FROM customers LEFT JOIN orders ON orders.cust_id =customers.cust_id; LEFT JOIN вернет все данные в левой таблице, RIGHT JOIN вернет все данные в правой таблице, а FULL JOIN вернет все данные в левой и правой таблицах;
  3. Запросы соединения используются с агрегатными функциями. Например, чтобы запросить количество заказов для каждого клиента:SELECT customers.cust_name,customers.cust_id,COUNT(orders.order_num) AS num_ord FROM customers INNER JOIN orders ON customers.cust_id=orders.cust_id GROUP BY customers.cust_id;

Комбинированный запрос

  1. Множественные запросы (SELECT) могут использовать UNION для объединения нескольких результатов запроса в один набор результатов и возврата,UNION должен содержать два или более запросов SELECT, и каждый проход должен содержать одни и те же столбцы, выражения или агрегатные функции.Типы данных не обязательно должны быть одинаковыми, и MySQL выполнит неявное преобразование типов.SELECT vend_id,prod_id,prod_price FROM products WHERE prod_price>5 UINON SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN (1001,1002);

  2. UNIONТо, что возвращается, это результат после дедупликации, если вам не нужна дедупликация, вы можете использовать ееUNION ALL;

  3. Несколько комбинированных запросов можно сортировать с помощью ORDER BY, но сортируется конечный набор результатов, а не один запрос SELECT, поэтому для комбинированного запроса имеется только одно предложение ORDER BY.SELECT vend_id,prod_id,prod_price FROM products WHERE prod_price>5 UINON SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN (1001,1002) ORDER BY vend_id

Используйте функции для обработки данных

  1. Объединить имена столбцов:SELECT Concat (vendName,'(',vendCountry,')') FROM vendors ORDER BY vendName;

  2. Выполните вычисление арифметического выражения:SELECT prodId, quantity,price, quantity*price AS expandedPrice FROM orderItems;

  3. Функции обработки текста, такие как Upper(), LTrim(), RTrim() и другие функции. Например, используйте функцию «Верхний», чтобы преобразовать текст в верхний регистр:SELECT vendName, Upper(vendName) FROM vendors ORDER BY vendName;

  4. Функции обработки времени и даты, такие как Date(), Day() и т. д.SELECT custId, orderNum FROM orders WHERE Date(orderDate)='2015-09-01';

  5. Функции числовой обработки, такие как Abs(), Cos() и т. д.;

  6. Часто используемые агрегатные функции. Например, AVG(), COUNT(), MAX(), MIN() и SUM().SELECT COUNT(*) AS numbers, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max,AVG(prod_price) AS price_avg FROM products;

2.2 Вставка данных таблицы

  1. Чтобы вставить данные строки в таблицу, вы можете использовать предложение INSERT INTO.Более безопасный способ — указать имя столбца.INSERT INTO customers (cust_name, cust_email) VALUES('happy','happy@gmail.com'); Предварительным условием того, что имя столбца может быть опущено в предложении INSERT INTO, является то, что столбец может быть определен как значение NULL или задано значение по умолчанию при определении столбца;
  2. Если вы вставляете несколько строк данных, вы можете разделить несколько наборов значений запятыми.INSERT INTO customers (cust_name, cust_email) VALUES('happy','happy@gmail.com'),('smart','smart@gmail.com');
  3. Чтобы вставить запрошенные данные в таблицу, вы можете использовать оператор INSERT SELECT.INSERT INTO customers(cust_id,cust_contact) SELECT cust_id, cust_contact FROM customers WHERE cust_id>5; SELECT может иметь условия фильтрации WHERE; INSERT SELECT обычно используется для копирования данных таблицы

2.3 Обновление данных таблицы

  1. Чтобы обновить данные таблицы, используйте предложение UPDATE:UPDATE customers SET cust_name ='happy',cust_email='happy@gmail.com' WHERE cust_id = 1001;
  2. Примечание. Если для строки не указано условие WHERE, все данные в столбце таблицы будут обновлены..

2.4 Удалить данные таблицы

  1. Если вы удаляете данные из таблицы, вы можете использовать предложение DELETE.DELETE FROM customers WHERE cust_id = 10086; Удаляемые данные должны быть данными строки в таблице, а не столбца. Следовательно, по сравнению с предложением UPDATE, в предложении DELETE не нужно указывать, какой столбец, а нужно только указать конкретное имя таблицы;
  2. Примечание. Если указанное условие WHERE не будет добавлено, все данные строк во всей таблице будут удалены. Кроме того, DELETE удаляет только данные в таблице, но не удаляет информацию о структуре таблицы;
  3. Если вы хотите удалить все данные в таблице, вы можете использоватьTRUNCATE, что более эффективно, чем удаление DELETE;

3. Порядок выполнения ключевых слов в SQL

В операторе SQL каждое ключевое слово будет выполняться по порядку, и каждый шаг операции будет генерировать виртуальную таблицу, а конечная виртуальная таблица будет возвращена как окончательный результат выполнения. Ниже приведен порядок выполнения часто используемых ключевых слов:

(8)SELECT (9)DISTINCT<select_list>
(1)FROM <left_table>
(3)<join_type> JOIN <right_table>
(2)            ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY<group_by_list>
(6)WITH{CUBE|ROLLUP}
(7)HAVING<having_condition>
(10)ORDER BY<order_by_list>
(11)LIMIT<limit_number>
  1. FROM: Вычислить декартово произведение таблицы слева ОТ и таблицы справа и сгенерировать виртуальную таблицу VT1;
  2. ON: ON фильтрует виртуальную таблицу VT1, в виртуальную таблицу VT2 будут записываться только те строки, которые удовлетворяют условиям ;
  3. JOIN: Если это OUT JOIN, то несопоставленные строки в зарезервированной таблице (например, левая таблица или правая таблица) будут добавлены в виртуальную таблицу VT2 как внешние строки, тем самым сгенерировав виртуальную таблицу VT3;
  4. WHERE: выполнить фильтрацию по условию WHERE в виртуальной таблице VT3, только записи, удовлетворяющие , будут помещены в виртуальную таблицу VT4;
  5. GROUP BY: В соответствии со столбцами в предложении GROUP BY сгруппируйте виртуальную таблицу VT4, чтобы создать виртуальную таблицу VT5;
  6. CUBE|ROLLUP: выполнить операцию CUBE или ROLLUP для виртуальной таблицы VT5, чтобы сгенерировать виртуальную таблицу VT6;
  7. HAVING: выполнить фильтрацию по условию HAVING в виртуальной таблице VT6, только записи, удовлетворяющие , будут вставлены в виртуальную таблицу VT7;
  8. SELECT: выполнить операцию SELECT, выбрать указанный столбец и вставить его в виртуальную таблицу VT8;
  9. DISTINCT: Дедуплицирует записи в виртуальной таблице VT8 для создания виртуальной таблицы VT9;
  10. ORDER BY: Сортировка записей в виртуальной таблице VT9 в соответствии с для создания виртуальной таблицы VT10;
  11. LIMIT: Извлеките запись указанной строки, сгенерируйте виртуальную таблицу VT11 и верните результат.

4. Указатель

Создание индекса MySQL очень важно для эффективной работы MySQL, и индекс может значительно повысить скорость поиска MySQL. Индекс делится на индекс с одним столбцом и составной индекс. Одностолбцовые индексы, т. е. индекс содержит только один столбец, и составные индексы, т. е. индекс содержит несколько столбцов.

4.1 Создайте индекс

Существует два способа создания индекса: один — создать его напрямую с помощью CREATE INDEX, а другой — добавить его, изменив структуру таблицы с помощью оператора ALTER TABLE.

  1. Используйте СОЗДАТЬ ИНДЕКС

    Синтаксис:

      CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
      [USING index_type]
      ON table_name (index_col_name,...)
    

    Соответствующая информация о синтаксической переменной выглядит следующим образом:

    [UNIQUE|FULLTEXT|SPATIAL]

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

    index_name

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

    index_type

    index_typeУказывает конкретную реализацию индекса.В MySQL есть две разные формы индекса - индекс BTREE и индекс HASH. Только BTREE можно использовать в таблицах с механизмом хранения MyISAM и InnoDB, и его значение по умолчанию — BTREE; в таблицах с механизмом хранения MEMORY или HEAP можно использовать два типа индексов, HASH и BTREE, и значение по умолчанию равно ХЭШ.

    index_colname

    index_col_nameУказывает имя поля, которое необходимо проиндексировать.Мы также можем создать составной индекс для нескольких полей, разделив несколько имен полей запятыми. Кроме того, для полей типа CHAR или VARCHAR мы также можем использовать только первую часть содержимого поля для создания индекса, просто добавим команду типа (длина) после соответствующего имени поля, указав, что только содержимое поля необходимо использовать первые символы длины для создания индекса. Здесь мы берем поле cust_name таблицы клиентов (тип VARCHAR(50)) в качестве примера и используем 6-символьный префикс поля cust_name для создания индекса.

     CREATE INDEX idx_cust_name ON user (cust_name(6));
    
  2. Используйте ИЗМЕНИТЬ ТАБЛИЦУ

    Синтаксис:

     ALTER TABLE table_name
     ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name 
     (index_col_name,...) [USING index_type]
    

4.2 Удаление индекса

Удалить индекс указанного имени в указанной таблице, синтаксис:

ALTER TABLE table_name
DROP INDEX index_name;

Например, чтобы удалить индекс с именем idx_cust_name, его оператор SQL выглядит следующим образом:

ALTER TABLE customers
DROP INDEX idx_cust_name;

4.3 Изменить индекс

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

--先删除
ALTER TABLE user
DROP INDEX idx_user_username;
--再以修改后的内容创建同名索引
CREATE INDEX idx_cust_name ON customers (cust_name(8));

4.4 Индекс просмотра

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

--如果查看索引前,没有使用user db_name等命令指定具体的数据库,则必须加上FROM db_name
SHOW INDEX FROM table_name [FROM db_name]
--如果查看索引前,没有使用user db_name等命令指定具体的数据库,则必须加上db_name.前缀
SHOW INDEX FROM [db_name.]table_name

5. Хранимые процедуры

  1. Что такое хранимая процедура? Проще говоря, хранимая процедура — это набор одного или нескольких операторов MySQL, сохраненных для повторного использования или для реализации сложных бизнес-функций, которые можно рассматривать как пакетный файл;
  2. Зачем использовать хранимые процедуры? (1) Упрощает сложные операции за счет инкапсуляции обработки в простые в использовании блоки; (2) Это обеспечивает целостность данных, не требуя итеративного создания серии шагов обработки, если все разработчики и приложения используют одну и ту же хранимую процедуру, используемый код то же самое; (3) упростить управление изменениями. Если есть изменения в именах таблиц, именах столбцов или бизнес-логике, нужно изменить только код хранимой процедуры, а разработчикам, которые ее используют, даже не нужно знать эти изменения, то есть безопасность; (4) Улучшить производительность, потому что использование хранимых процедур Это быстрее, чем использование только операторов SQL, (5) хранимые процедуры могут быть использованы для написания кода с более гибкими функциями. Таким образом, хранимые процедуры имеют три характеристики:Простой и многоразовый, безопасный и высокопроизводительный;
  3. Недостатки хранимых процедур? (1) Написание хранимых процедур сложнее, чем базовые операторы SQL, и требует более высоких навыков; (2) Может не быть полномочий для создания хранимых процедур, и администраторы баз данных могут ограничивать полномочия на создание хранимых процедур, позволяя пользователям использовать хранимые процедуры, в то время как не позволяйте пользователям свободно создавать хранимые процедуры;

Создать хранимую процедуру

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

     DELIMITER //
     CREATE PROCEDURE ordertotal(
     IN custid INT,
     IN taxable BOOLEAN,
     OUT ototal DECIMAL(8,2)
     )COMMENT 'obtain total order price'
     
     BEGIN
     
     /*declare variable for total*/
     DECLARE total DECIMAL(8,2);
     DECLARE taxrate INT DEFAULT 6;
     
     
     /*get the order total*/
     
     SELECT SUM(item_price*item_quantity) INTO total
     FROM customers
     WHERE cust_id = custid;
     
     /*is this taxable?*/
     
     IF taxable THEN
     	SELECT total+(total/100*taxrate) INTO total;
     END IF;
     SELECT total INTO ototal;
     END //
    

Есть такие детали: 1. ИспользуйтеCREATE PROCEDUREоператор для создания, круглые скобки () — это параметры хранимой процедуры, где типы параметров: 1.INТип, указывающий, что он передается хранимой процедуре; 2.OUTТип, указывающий результат, возвращаемый хранимой процедурой, при вызове хранимой процедуры нужно передать переменную, начинающуюся с @; 3.INOUTТип, указывающий, что его можно передавать внутрь и наружу в хранимой процедуре; 2.DECLAREИспользуется для объявления переменной, такой как общая сумма, налоговая ставка. Обратите внимание, что при определении переменных в MySQL имя переменной идет первым, а тип данных — после. 3. Конкретная логика хранимой процедуры написана наBEGIN ENDмежду; 4. Присвойте значения переменным с помощьюINTOключевое слово; 5. Поскольку он используется в каждом операторе SQL в хранимой процедуре, в качестве разделителя он будет конфликтовать с одним SQL, поэтому его можно использоватьDELIMITERПереопределите классификатор, например // является разделителем в этом примере, естественная хранимая процедура заканчивается END // вместо END. В то же время, после того, как разделитель // появится в парах, он возвращается к стандартному ";" в качестве разделителя;

выполнить хранимую процедуру

  1. Хранимые процедуры выполняются с использованием предложения CALL, которое принимает имя хранимой процедуры и параметры, которые необходимо передать.

     CALL ordertotal(1,TRUE,@total);
     SELECT @total;
    

Если в хранимой процедуре определен входной параметр типа OUT, переменная, такая как здесь @total, должна быть передана при выполнении хранимой процедуры, и переменная начинается с @. Если в хранимой процедуре нет параметров, просто используйте пустые скобки.CALL ordertotal();

удалить хранимую процедуру

  1. Чтобы удалить хранимую процедуру, вы можете использовать предложение DROP PROCEDURE. какDROP PROCEDURE ordertotal;

хранимая процедура запроса

  1. Отобразите оператор для создания хранимой процедуры, вы можете использовать SHOW CREATE PROCEDURE. какSHOW CREATE PROCEDURE ordertotal;
  2. Запросите статус всех хранимых процедур, если вы используете COMMENT для добавления комментария в определение хранимой процедуры, вы можете просмотреть его. В то же время вы можете LIKE фильтровать результаты. какSHOW PROCEDURE STATUS LIKE '%order%';

6. Обработка транзакций

  1. Что такое транзакция?

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

  2. Ключевые идеи:

    1. Транзакция: относится к группе операторов SQL;
    2. Откат: относится к процессу отмены указанного оператора SQL;
    3. Отправить: относится к записи результата несохраненного оператора SQL в таблицу базы данных;
    4. Точка хранения: относится к временному заполнителю, установленному в транзакции, к которому может быть применен резервный вариант;
  3. Как создать исполнительную транзакцию?

     START TRANSACTION;
     INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('1',5,18);
     SELECT * FROM customers;
     SAVEPOINT insertinto;
     INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('2',5,18);
     ROLLBACK TO insertinto;
    

    Результат выполнения: вставка данных ('1', 5, 18) действительна, потому что она начнет откат только с точки сохранения SAFEPOINT, то есть результат выполнения оператора SQL до точки сохранения SAFEPOINT. все еще действует.

    Есть такие детали:

    1. STAET TRANSACTIONИспользуется для представления следующего набора операторов SQL в виде транзакции;
    2. SAFEPOINTИспользуется для указания зарезервированной точки вставки;
    3. ROLLBACK TOУказывает, что откат начинается с указанной точки хранения, т. е. результат выполнения инструкции SQL до точки хранения все еще действителен. Если только использоватьROLLBACKОткат означает, что все результаты выполнения оператора SQL после STAET TRANSACTION будут отменены;
  4. Операции фиксации (записи или сохранения) MySQL выполняются автоматически, что называется неявной фиксацией. Однако в блоке транзакции фиксация не выполняется неявно, и для фиксации используется предложение COMMIT. как:

     START TRANSACTION;
     INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('1',5,18);
     INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('2',5,18);
     COMMIT;
    

Используйте COMMIT для отправки транзакции.Если оба оператора SQL выполнены успешно, данные будут записаны в таблицу.

7. Триггеры

  1. Что такое триггер?

    Когда возникает определенный оператор SQL, необходимы триггеры для автоматического выполнения некоторых других операторов SQL. Триггеры могут реагировать только на три конкретные операции: DELETE, INSERT и UPDATE.

  2. Создать триггер?

    При создании триггера необходимо указать четыре самых важных элемента информации: 1. Глобально уникальное имя триггера 2. Таблица, связанная с триггером 3. Когда выполняется триггер (до или после выполнения операции) 4. Триггер должен реагировать на действия (DELETE, INSERT или UPDATE);

    Поскольку триггеры могут реагировать только на три определенных типа операций, можно создать три типа триггеров: триггеры INSERT, триггеры DELETE и триггеры UPDATE.

    ВСТАВИТЬ триггер

    При выполнении триггера INSERT также следует отметить несколько моментов: 1. В коде триггера INSERT можно ссылаться на виртуальную таблицу с именем NEW, а NEW можно использовать для доступа к вновь вставленным данным строки 2. Триггеры BEFORE INSERT 3. Для столбцов AUTO_INCREMENT NEW содержит 0 до выполнения INSERT и содержит новое самостоятельно сгенерированное значение после выполнения INSERT.

    Создайте триггер INSERT, который каждый раз вставляет строку данных и каждый раз возвращает идентификатор текущей вставленной строки данных.

     /*创建触发器*/
     CREATE TRIGGER insertcustomers AFTER INSERT ON customers
     FOR EACH ROW SELECT NEW.cust_id INTO @newinsertid;
     
     /*执行触发器*/
     INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('2',5,18);
     SELECT @newinsertid;
    

    Есть такие детали:

    1. Используйте CREATE TRIGGER для создания триггеров;
    2. AFTER INSERT указывает, что триггер выполнит характерную операцию после вставки данных строки;
    3. FOR EACH ROW означает, что триггер срабатывает для каждой вставленной строки данных;
    4. Для триггеров INSERT виртуальная таблица NEW может использоваться для использования только что вставленных данных строки. Например, в примереSELECT NEW.cust_id INTO @newinsertidУказывает, что идентификатор вновь вставленных данных строки присваивается переменной @newinsertid;

    УДАЛИТЬ триггер

    Триггеры DELETE должны знать следующие две точки до или после выполнения инструкции DELETE:

    1. В коде триггера DELETE можно сослаться на виртуальную таблицу с именем OLD для доступа к удаленной строке;
    2. Данные в таблице OLD доступны только для чтения и не могут быть обновлены, в то время как в триггере INSERT данные вставленной строки могут быть обновлены через NEW;

    Например, для таблицы клиентов при удалении строки данных вернутьcust_idа такжеcust_name:

     /*创建DELETE触发器*/
     
     DELIMITER //
     CREATE TRIGGER insertcustomers AFTER DELETE ON customers
     FOR EACH ROW 
     BEGIN 
       SELECT OLD.cust_name INTO @deletecustname;
       SELECT OLD.cust_id INTO @deletecustid;
     END //
     
     /*调用DELETE触发器*/
     DELETE FROM customers WHERE cust_id = 3;
     SELECT @deletecustname;
     SELECT @deletecustid;
    

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

    ОБНОВЛЕНИЕ триггера

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

    1. В триггере BEFORE UPDATE вы можете использовать NEW и OLD для доступа к данным, но в триггере AFTER UPDATE использование NEW для доступа к данным сообщит об ошибке, и для доступа к данным можно использовать только OLD;
    2. В триггере BEFORE UPDATE значение в NEW может быть изменено, то есть разрешено изменять данные, которые будут использоваться для UPDATE;
    3. Данные строки в OLD можно только читать и нельзя обновлять;

    Пример триггера UPDATE выглядит следующим образом:

     /*创建UPDATE触发器*/
     
     DELIMITER //
     CREATE TRIGGER insertcustomers BEFORE UPDATE ON customers
     FOR EACH ROW 
     BEGIN 
     
     SELECT NEW.cust_name INTO @beforeupdate;
     SET NEW.cust_name = 'reset_name';
     SELECT OLD.cust_name INTO @afterupdate;
     END //
     
     /*调用UPDATE触发器*/
     UPDATE customers SET cust_name = 'happy' WHERE cust_id = 5;
     SELECT @beforeupdate;
     SELECT @afterupdate;
    

    Вывод: «happay» для @beforeupdate и «reset_name» для @afterupdate. Есть такие детали:

    1. Данные в НОВОЙ виртуальной таблице могут быть изменены, как здесьSET NEW.cust_name = 'reset_name';, будет обновленоcust_name由“happy”变成了“reset_name”;
    2. В триггере BEFORE UPDATE вы можете использовать NEW и OLD для доступа к данным, в то время как использование NEW в триггере AFTER UPDATE для доступа к данным сообщит об ошибке;
  3. Удалить триггер?

    Чтобы удалить триггеры, вы можете использовать инструкцию DROP TRIGGER, напримерDROP TRIGGER insertcustomers;. Триггеры нельзя обновить или перезаписать. Если вы хотите изменить триггер, вы должны удалить триггер.