Поиграйте с mysql на фронтэнде

Node.js
Поиграйте с mysql на фронтэнде

Эта статья подробно расскажет об использовании Mysql, некоторых распространенных ошибках и о том, как использовать Nodejs для подключения к базе данных.В будущем набор CRM-систем на основе базы данных Mysql будет открыт.

0.0, структура узла системы CRM намерена использовать Eggjs или Nestjs, так что следите за обновлениями.

0.1 Предпосылки

  • Программное обеспечение для визуализации базы данных, использованное в статье,NavicatPremiumЕсли у вас возникнут проблемы с установкой, обратитесь за помощью к Du Niang или Gu Dad.

  • Установите базу данных mysql и запустите ее, версия на моей стороне 8.0

  • Это информация Mysql на моем Mac

    mysql.png

1. Введение в SQL

  • SQL (язык структурированных запросов): язык структурированных запросов. По сути, он определяет правило для работы со всеми реляционными базами данных.
  • общие правила грамматики
    • Операторы SQL могут быть записаны на одной или нескольких строках, заканчивающихся точкой с запятой.
    • Пробелы и сужения могут быть использованы для улучшения читабельности операторов.
    • Оператор SQL базы данных Mysql не чувствителен к регистру, поэтому для ключевых слов рекомендуется использовать верхний регистр.
    • Однострочные комментарии: - Содержание аннотации содержимого аннотации # (собственная аннотация mysql)
    • Многострочный комментарий: /※Содержание комментария※/
  • Классификация SQL
    • DDL (язык определения данных): язык определения данных, используемый для управления базами данных, таблицами, столбцами и т. д.
    • DML (язык манипулирования данными): язык манипулирования данными. Используется для добавления, удаления и изменения данных в таблицах базы данных.
    • DQL (язык запросов данных): язык запросов данных. Используется для запроса записей в таблице базы данных
    • DCL (язык управления данными): язык управления данными. Используется для определения прав доступа к базе данных и уровней безопасности, а также для создания пользователей.

2, база данных операций DDL и таблица данных

2.1, запрос DDL и создание базы данных

  • запросить все базы данных

      SHOW DATABASES;
    
    • как показано на рисунке

      show_databases.png

  • Создать оператор для запроса базы данных

      SHOW CREATE DATABASE 数据库的名称;
    
    • как показано на рисунке

      show_create_database_mysql.png

  • создать базу данных

      CREATE DATABASE 数据库的名称;
    
    • как показано на рисунке
      create_database_db1.pngЕсли появится сообщение о том, что база данных создана успешно, а база данных слева не отображается, щелкните правой кнопкой мыши имя ссылки (test1) и нажмите «Обновить».refresh_database.png
  • Создать базу данных (решение, если база данных не существует, создать ее)

      CREATE DATABASE IF NOT EXISTS 数据库的名称;
    
    • как показано на рисункеcreate_database_is_not_exists_db2.png
  • Создайте базу данных (судим, если база данных не существует, создайте ее и укажите набор символов)

      CREATE DATABASE IF NOT EXISTS 数据库的名称 CHARACTER SET 字符集名称;
    
    • как показано на рисунке

create_database_character_utf8_db3.png

2.2, изменение DDL, удаление, использование базы данных

  • Изменить базу данных (изменить набор символов utf8 --> gbk)

      ALTER DATABASE 数据库名称 CHARACTER SET GBK; 
    
  • удалить базу данных

      DROP DATABASE 数据库名称;
    
  • Удалить базу данных (решение, если база данных существует, удалить ее)

      DROP DATABASE IF EXISTS 数据库名称
    
  • использовать базу данных

      USE 数据库名称;
    
  • Просмотр текущей используемой базы данных

     SELECT DATABASE();
    
    • как показано на рисункеselect_database.png

2.3, база данных операций DDL и таблица данных

  • Таблица данных запроса DDL

    • Запросить все таблицы данных в базе данных

        SHOW TABLES;
      
    • как показано на рисунке

      show_tables_mysql.png

    • структура таблицы поиска

          DESC 表名;
      
    • как показано на рисунке

      desc_mysql_user.png

      Объяснение поля

      • ПолеId: поле
      • Тип: тип, соответствующий полю
      • Null: пустое поле
      • Ключ: ключ, окончательный индекс, используемый оценкой оптимизатора.
      • По умолчанию: значение по умолчанию
      • Дополнительно: дополнительная описательная информация
    • Запросить набор символов в таблице данных

          SHOW TABLE STATUS FROM mysql LIKE 'user';
      

      show_table_charster.png

  • DDL создает таблицу данных

    • Создать таблицу данных
      CREATE TABLE 表名(
          列名 数据类型 约束,
          列名 数据类型 约束,
          ...
          列名 数据类型 约束
      );
      
      create_db1_user.png
      • Типы
        • INT соответствует числу в js
        • VARCHAR соответствует строке в js
        • DATE соответствует ГГГГ-ММ-ДД даты в js
        • ВРЕМЯ соответствует ЧЧ:ММ:СС даты в js
        • DATETIME соответствует YYYY-MM-DD HH:MM:SS даты в js
        • TIMESTAMP соответствует новой временной метке Date().getTime() в js
      • Дополнительные типы данных см.Тип данных MySQL
      • При создании многоколоночной таблицы данных каждый столбец отделяется запятой, и не пишите точку с запятой в последнем столбце, иначе будет сообщено об ошибке
    • Изменить имя таблицы
          ALTER TABLE 表名 RENAME TO 新表名; 
      
    • Изменить набор символов таблицы
          ALTER TABLE 表名 CHARACTER SET 字符集;
      
    • добавить столбец в таблицу
          ALTER TABLE 表名 ADD 列名 数据类型;
      
    • Изменить тип данных столбца
          ALTER TABLE 表名 MODIFY 列名 数据类型;
      
    • Изменить имена столбцов и типы данных
          ALTER TABLE 表名 CHANGE 列名 新列名 新列名的数据类型;
      
    • удалить столбец
          ALTER TABLE 表名 DROP 列名;
      
    • как показано на рисунке
      ddl_table_desc.png
  • DDL удалить таблицу данных

       DROP TABLE 表名; 
    
  • DDL удалить таблицу данных (решение, удалить, если таблица данных существует)

      DROP TABLE IF EXISTS 表名;
    

3. Добавление, удаление и изменение данных таблицы DML (оператор создания данных в этой части скриншота находится вDDL创建数据表В главах есть скриншоты)

  • Данные новой таблицы DML

    • Добавить данные в указанный столбец, количество значений должно быть таким же, как количество столбцов, а типы данных должны быть во взаимно однозначном соответствии

          INSERT INTO 表名(列名,...) VALUES(值,...);
      

      DML_add_column_user.png

      • В настоящее время мы видим, что данные с идентификатором 1 и именем пользователя Zhang San были добавлены в базу данных.
      • На снимке экрана показан оператор select, который будет объяснен в разделе DQL.
    • добавить данные во все столбцы

          INSERT INTO 表名(列名1,列名2,...) VALUES(值1,值2,...);
      
    • Добавить данные во все столбцы (сокращенно, количество значений должно быть таким же, как количество столбцов в таблице, а типы данных должны быть во взаимно однозначном соответствии)

          INSERT INTO 表名 VALUES(值1,值2,...);
      

      DML_add_all_column_user.png

    • Добавляйте данные в таблицу партиями (несколько значений должны быть разделены запятыми и заканчиваться точкой с запятой)

          INSERT INTO 表名(列名1,列名2,...) VALUES(值1,值2,...),(值1,值2,...),...;
      
          INSERT INTO 表名 VALUES(值1,值2,...),(值1,值2,...),...;
      

      DML_add_many_column_user.png

  • DML изменить данные таблицы

      UPDATE 表名 SET 列名1=值1, 列名2=值2,... [WHERE条件];
    

    DML_modify_column_user.pngПри изменении данных таблицы необходимо написать оператор WHERE, иначе будут изменены данные всех столбцов.

  • DML удалить данные таблицы

      DELETE FROM 表名 [WHERE条件]; 
    

    DML_delete_column_user.pngПри удалении данных таблицы необходимо написать оператор WHERE, иначе все данные в таблице будут удалены

------------- база данныхDDL、DMLОбычно используемые предложения и ямы, на которые часто наступают, в основном закончены, и вот-вот наступит следующее.DQLчасть----------------

3. Данные запроса DQL

Преамбула: все[]Оба представляют необязательные операторы

3.1 Подготовка данных перед запросом Данные, которые мы создали на этапе DDL, недостаточны для поддержки нашего следующего объяснения. Итак, вам нужно создать новую таблицу данных

    -- 数据准备;
    -- 使用数据库;
    -- USE db1;
    -- -- 创建数据表;
    CREATE TABLE product(
            id INT, -- 商品编号,唯一标识;
            name VARCHAR(30), -- 商品名称;
            price DOUBLE, -- 商品价格;
            brand VARCHAR(30), -- 商品品牌;
            stock INT,	-- 商品库存;
            insert_time DATE -- 商品入库时间
    );
    INSERT INTO product VALUES
    (1, '华为手机',4999.99, '华为', 30, '2020-05-07'),
    (2, '诺基亚手机',999.1, '诺基亚', 31, '2020-05-08'),
    (3, '苹果手机',5999.99, '华为', 32, '2020-05-09'),
    (4, '华为电脑',8999.99, '华为', 33, '2020-06-07'),
    (5, '诺基亚电脑',3999.99, '诺基亚', 34, '2020-07-07'),
    (6, '苹果电脑',12990.99, '苹果', 35, '2020-08-07'),
    (7, '华硕电脑',6999.99, '华硕', null, '2020-09-07');
    SELECT * FROM product;
   

DQL_data_reday_product.png

3.2. Основной синтаксис запроса и отношения последовательности DQL следующие:

    SELECT 
        字段列表
    FROM
        表名列表
    WHERE
        条件列表
    GROUP BY
        分组列表
    HAVING
        分组后的列表
    ORDER BY
        排序 升序、降序(asc,desc)
    LIMIT
        分页
  • Узнать все

      SELECT * FROM 表名;
    

    select_all_column_product.png

  • Запросить данные указанного столбца, или вы можете запросить все данные через указанный столбец

      SELECT 列1,列2,... FROM 表名;
    

    select_id_name_product.png

  • Удалить повторяющийся запрос

      SELECT DISTINCT 列1,列,... FROM 表名;  
    

    select_distinct_product.png

  • Вычислить значение столбца

      SELECT 列1 运算符(+-*/) 列名2 FROM 表名;
    

    select_add10_product.png

    • Если оператор sql написан какSELECT name, stock+10 FROM product;Тогда запас компьютеров ASUS по-прежнему равен нулю;
  • запрос псевдонима

      SELECT 列1 AS 别名1, 列2 FROM 表名;     
    

    select_add10_alias_roduct.png

  • Запрос псевдонима (сокращенно, оставьте пробел между именем столбца и псевдонимом)

      SELECT 列1 别名1, 列2 FROM 表名;
    

    select_add10_alias_product1.png

3.2.1, запрос данных таблицы DQL --- условный запрос

  • грамматика

      SELECT 列名 FROM 表名 [WHERE 条件];
    
  • Категории условий запроса см.

  • Далее мы передадим некоторые каштаны 🌰 некоторым часто используемым в работеWHERE条件语句объяснять

    • 1. Проверьте продукты, запасы которых больше 33;

          SELECT * FROM product WHERE stock>33;
      
    • 2. Узнайте о продуктах под брендом Nokia;

          SELECT * FROM product WHERE brand='诺基亚';
      
    • 3. Запрос продуктов на сумму от 5000 до 10000;

      方法一
          SELECT * from product WHERE price>5000 AND price <1000;
      方法二
          SELECT * FROM product WHERE price BETWEEN 5000 AND 10000;
      
    • 4. Запросите информацию о продукте с запасами 30, 33, 35.

      方法一
          SELECT * FROM product WHERE stock = 30 OR stock = 33 OR stock = 35; 
      方法二
          SELECT * FROM product WHERE stock IN(30,33,35); 
      
    • 5. Запросите продукты, запасы которых пусты.

          SELECT * FROM product WHERE stock IS NULL; 
      
    • 6. Запросите продукты, запасы которых не равны нулю

          SELECT * FROM product WHERE stock IS NOT NULL;
      
    • 7. Найдите продукты, названия которых начинаются с Nokia.

          SELECT * FROM product WHERE name LIKE '诺基亚%';
      
    • 8. Запросите продукты, название которых содержит as;

          SELECT * FROM product WHERE name LIKE '%为%';
      
    • 9. -- Запросите продукт, название которого состоит из 5 символов (результатом являются две части данных мобильного телефона Nokia и компьютера Nokia);

          SELECT * FROM product WHERE name LIKE '_____';
      

3.2.2, запрос данных таблицы DQL --- запрос агрегатной функции

  • Что такое агрегатная функция и что она может делать

    • Агрегатная функция состоит в том, чтобы взять столбец данных в целом и выполнить продольный расчет.
  • Синтаксис (WHERE — необязательное условие)

      SELECT 函数名(列名) FROM 表名 [WHERE条件]
    
  • Классификация функций метода агрегатных функций

  • Далее мы все же перейдем от некоторых каштанов🌰 к некоторым часто используемым в работе聚合函数объяснять

      1. Запрос общего количества элементов в продукте
      SELECT COUNT(*) FROM product;
      
      1. Получить предмет с самой высокой ценой среди предметов;

      `` SELECT MAX(price) FROM product;

      1. Получите минимальный запас;
      SELECT MIN(stock) FROM product;
      
      1. Получить общий инвентарь (сумма инвентаря)
      SELECT SUM(stock) FROM product;
      
      1. Получить полный перечень продуктов с брендом Nokia;
      SELECT SUM(stock) FROM product WHERE brand='诺基亚';
      

3.2.3, запрос данных таблицы DQL --- запрос сортировки

  • что такое запрос сортировки и что он может сделать
    • В основном это упорядочивание данных в столбцах таблицы в порядке возрастания и убывания.
  • грамматика
        SELECT 列1,列2,... FROM 表名 [WHERE条件] ORDER BY 列名1 排序方式, 列名2 排序方式,...
    
    • ГДЕ необязательное условие
    • Существует только два способа сортировки: по возрастанию (ASC) по убыванию (DESC), и метод сортировки по умолчанию — по возрастанию (ASC).
    • В одной таблице можно сортировать несколько столбцов. Если есть несколько условий сортировки, второе условие будет оцениваться только в том случае, если предыдущие условия совпадают.
  • Далее мы все же перейдем от некоторых каштанов🌰 к некоторым часто используемым в работе排序查询объяснять
      1. Сортировать по элементам в порядке возрастания
          SELECT * FROM product ORDER BY stock ASC;
      
      1. Запросите информацию о мобильном телефоне, включенную в название продукта, и отсортируйте сумму в порядке убывания;
      SELECT * FROM product WHERE name like '%手机%' ORDER BY price DESC; 
      
      1. Сортировать по количеству по возрастанию, если количество одинаковое, то сортировать по инвентарю по убыванию;
      SELECT * FROM product ORDER BY price ASC, stock DESC;
      

3.2.4, запрос данных таблицы DQL --- групповой запрос

  • грамматика

      SELECT 列名列表 FROM 表名 [WHERE条件] GROUP BY 分组列名 [HAVING分组后的条件筛选] [ORDER BY 分组后的排序]
    
  • Пришло время каштанов, а дальше мы еще будем использовать каштаны🌰, чтобы рассказать о некоторых часто используемых в работе分组查询объяснять

      1. Сгруппировать по брендам, получить общее количество каждой группы товаров;
      SELECT brand, SUM(price) FROM product GROUP BY brand;
      
      1. Сгруппируйте продукты на сумму более 5000 юаней по брендам и получите общую сумму каждой группы продуктов;
      SELECT brand, SUM(price) FROM product WHERE price>5000 GROUP BY brand;
      
      1. Сгруппируйте продукты на сумму более 5000 юаней по брендам, получите общую сумму каждой группы продуктов и отобразите только продукты на общую сумму более 8000 юаней.
      SELECT brand, SUM(price) getSum FROM product WHERE price >5000 GROUP BY brand HAVING getSum >8000
      
      1. Сгруппируйте продукты на сумму более 5000 юаней по брендам, получите общую сумму каждой группы продуктов, отобразите только продукты на общую сумму более 8000 юаней и отсортируйте их в порядке убывания общей суммы;
      SELECT brand, SUM(price) getSum FROM product WHERE price>5000 GROUP BY brand HAVING getSum>8000 ORDER BY getSum DESC;
      

3.2.4, запрос данных таблицы DQL --- пейджинговый запрос

  • грамматика

      SELECT 列名列表 FROM 表名 [WHERE条件] [GROUP BY 分组列名] [HAVING 分组后的过滤条件] [ORDER BY 排序(ASC、DESC)] LIMIT N,M 从第N条记录开始,返回M条记录;
    
  • Пришло время каштанов, а дальше мы еще будем использовать каштаны🌰, чтобы рассказать о некоторых часто используемых в работе分页查询объяснять

      1. Сколько частей отображается на каждой странице -- отображаются три части данных;
      SELECT * FROM product LIMIT 0 , 3;
      

      limit01.png

      limit02.png

      limit03.png

      • Теперь в таблице продуктов всего 7 элементов данных.Когда мы передаем 0,3 для ограничения, он будет отображать первые три элемента данных.
      • Когда мы перейдем в 3,3 к пределу, он будет отображать четвертые-шестые данные
      • Когда мы передаем 6,3 для ограничения, он будет отображать только седьмой фрагмент данных.
      • Итак, первый параметр лимита начинается с 0
      • Если количество запросов ограничения больше, чем общее количество, будет отображаться только оставшееся общее количество.

------------- база данныхDQLОбычно используемые предложения и ямы, на которые часто наступают, в основном закончены, и вот-вот наступит следующее.约束часть----------------

4. Ограничения

  • Что такое запрос сортировки
    • Ограничения в основном заключаются в наложении ряда ограничений на столбцы таблицы. Гарантия правильности, достоверности и целостности данных! ! !
  • Классификация ограничений
    • PRIMARY KEY ограничение первичного ключа Каждая таблица допускает только один первичный ключ, а столбец не допускает дубликатов и не допускает нулевых значений.
    • Ограничение самоувеличения AUTO_INCREMENT вступает в силу при использовании с PRIMARY KEY AUTO_INCREMENT.При добавлении данных, если столбец изменен для записи нуля, он автоматически увеличится с 1
    • Уникальное ограничение UNIQUE, данные измененного столбца в таблице не могут повторяться
    • NOT NULL не является нулевым ограничением. Данные столбца в таблице не могут быть нулевыми.
    • Ограничение внешнего ключа FOREIGN KEY используется для усиления связи между одним или несколькими столбцами данных в двух таблицах (основной таблице и подчиненной таблице).
    • ВНЕШНИЙ КЛЮЧ НА КАСКАД ОБНОВЛЕНИЯ
    • ВНЕШНИЙ КЛЮЧ НА КАСКАД УДАЛЕНИЯ
  • Пришло время каштанов, а дальше мы еще будем использовать каштаны🌰, чтобы рассказать о некоторых часто используемых в работе约束объяснять
    • ограничение первичного ключа
      • Создайте студенческую таблицу (идентификатор, имя, возраст) идентификатор возраста в качестве первичного ключа
        CREATE TABLE student(
         id INT PRIMARY KEY,
         name VARCHAR(30),
         age INT
        );
        
        • INSERT INTO student VALUES(null, "Zhang San",33); Это приведет к ошибке. После добавления первичного ключа в столбец значение не может быть null
      • удалить первичный ключ
        ALTER TABLE student DROP PRIMARY KEY;
        
      • Добавить первичный ключ группы в столбец по отдельности
        ALTER TABLE student MODIFY id INT PRIMARY KEY; 
        
    • Увеличение ограничения первичного ключа
      • Создайте таблицу учеников (идентификатор, имя, возраст). Идентификатор возраста установлен на автоинкремент первичного ключа.
        CREATE TABLE student(
         id INT PRIMARY KEY AUTO_INCREMENT,
         name VARCHAR(30),
         age INT
        );
        
        • INSERT INTO student VALUES(null, "Zhang San",33); Это можно написать, потому что установлено ограничение автоинкремента первичного ключа, и окончательный результат равен 1, Zhang San, 22
      • Удалить ограничение автоинкремента
        ALTER TABLE student MODIFY id INT;
        
      • Добавить ограничения автоинкремента для столбцов по отдельности
        ALTER TABLE student MODIFY id INT AUTO_INCREMENT;
        
    • уникальное ограничение
      • Создать студент-таблицу (идентификатор, имя, возраст) возрастной идентификатор возраста устанавливается в качестве основного ключа, а возраст устанавливается уникальным
        CREATE TABLE student(
         id INT PRIMARY KEY AUTO_INCREMENT,
         name VARCHAR(30),
         age INT UNIQUE
        );
        
        • ВСТАВИТЬ В ЗНАЧЕНИЯ ученика (ноль, «Чжан Сан», 33); ВСТАВИТЬ В ЗНАЧЕНИЯ ученика (ноль, «Чжан Сан», 33); При добавлении тех же данных к уникальному возрасту ограничения данные не будут добавлены
      • удалить уникальное ограничение
        ALTER TABLE student DROP INDEX age;
        
      • Добавляйте уникальные ограничения для столбцов по отдельности
        ALTER TABLE student MODIFY age INT UNIQUE;
        
        • Добавьте то же значение в столбец таблицы после удаления уникального ограничения, затем снова установите уникальное ограничение для этого столбца.
    • Ненулевое ограничение
      • Создайте таблицу учеников (идентификатор, имя, возраст). Для идентификатора возраста установлено значение автоинкремента первичного ключа, для возраста установлено уникальное значение, а для имени установлено значение, отличное от нуля.
        CREATE TABLE student(
         id INT PRIMARY KEY AUTO_INCREMENT,
         name VARCHAR(30) NOT NULL,
         age INT UNIQUE
        );
        
        • INSERT INTO student VALUES(null, null,33); это сообщит об ошибке
      • удалить ненулевое ограничение
        ALTER TABLE student MODIFY name varchar(30);
        
      • Добавить ненулевое ограничение только к столбцу
        ALTER TABLE student MODIFY name  varchar(30) NOT NULL;
        
        • Добавьте нулевое значение после удаления ненулевого ограничения и продолжайте добавлять ненулевое ограничение в нулевой столбец.В версии Mysql5.7 ошибки не будет, будет предупреждение и добавление в mysql8. х сообщит об ошибке
    • ограничения внешнего ключа
      • Что такое ограничение внешнего ключа и что оно может делать

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

          CREATE TABLE 表名(
              列名 数据类型 约束,
              CONSTRAINT 外键名 FOREIGN KEY(本表外键列名) REFERENCES 主表名(主表主键列名)
          );
          -- 创建用户表;
           CREATE TABLE user(
                   id INT PRIMARY KEY AUTO_INCREMENT,
                   name VARCHAR(30) NOT NULL UNIQUE,
                   age INT NOT NULL UNIQUE
           );
           -- -- 添加数据;
           INSERT INTO user VALUES(null, "张三",33), (null, "李四", 23);
        
           -- 创建指纹表,并且添加外键;
           CREATE TABLE fingerprint(
                   id INT PRIMARY KEY AUTO_INCREMENT,
                   number VARCHAR(40),
                   uid INT,
                   CONSTRAINT fu_fk1 FOREIGN KEY (uid) REFERENCES user(id)
           );
           INSERT INTO fingerprint VALUES(null, '12234',1),(null, "2234",2);
           SELECT * FROM fingerprint;
           
        

        foreign_fingerprint.png

        • uid на рисунке соответствует id в пользовательской таблице, то есть данные с id 1 в таблице отпечатков были связаны с данными с id 1 в пользовательской таблице.
        • Если вы добавите часть данных в таблицу отпечатков, чтобы связать первичный ключ, которого нет в пользовательской таблице, будет сообщено об ошибке.
        • Если вы удалите данные с идентификатором 2 в пользовательской таблице, будет сообщено об ошибке, поскольку данные с идентификатором 2 были связаны с таблицей отпечатков пальцев.
      • удалить внешний ключ

          ALTER TABLE 表名 DROP FOREIGN KEY 外键名
          ALTER TABLE fingerprint DROP FOREIGN KEY fu_fk1;
        
      • Добавить внешние ключи по отдельности

          ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(本表外键列名) REFERENCES 主表名(主表主键列名)
          ALTER TABLE fingerprint ADD CONSTRAINT fu_fk1 FOREIGN KEY (uid) REFERENCES user(id);
        

------------- база данных约束Обычно используемые предложения и ямы, на которые часто наступают, в основном закончены, и вот-вот наступит следующее.多表操作часть----------------

5. Работа за несколькими столами

  • Что такое многостоловая работа
    • То есть есть несколько таблиц, и между таблицами существует определенная связь, которая требует внешних ключей для ограничения
  • Типы многостоловых операций
    • один на один
    • один ко многим
    • многие ко многим

5.1. Один на один

  • Применимая сцена

    • Например, отпечатки пальцев людей и людей, у человека может быть только один набор отпечатков пальцев, а набор отпечатков пальцев может соответствовать только одному человеку.
    • Другим примером является лицо и удостоверение личности.У человека может быть только одно удостоверение личности, а удостоверение личности может соответствовать только одному человеку.
  • принцип построения таблицы

    • Создайте внешний ключ в любой таблице, чтобы связать первичный ключ другой таблицы.
  • Возьми каштан 🌰

      -- 创建person表;
      CREATE TABLE person(
              id INT PRIMARY KEY AUTO_INCREMENT, -- 唯一标识 编号;
              name VARCHAR(30) NOT NULL					-- 姓名
      );
      INSERT INTO person VALUES (null, "张三"), (null, "李四");
    
      -- 创建身份证表 card 并且设置外键关联person表中的id;
      CREATE TABLE card(
              id INT PRIMARY KEY AUTO_INCREMENT, -- 唯一标识 编号;
              naem VARCHAR(200) NOT NULL UNIQUE, -- 身份证号码是唯一的
              pid INT,													-- 外键列, pid代表 person表中的id
              CONSTRAINT cp_fk1 FOREIGN KEY (pid) REFERENCES person(id)
      );
      INSERT INTO card VALUES (null, "12345",1), (null,"22345",2);
    
    • В это время создается отношение один к одному. В это время вы скажете, как я узнаю, что они связаны. Не паникуйте, Navicat Premium предоставляет наглядную диаграмму взаимосвязей таблиц.er.png er1.png

5.2, один ко многим

  • Применимая сцена

    • Пользователи и заказы, пользователь может иметь несколько заказов
    • Категории продуктов и продукты, одна категория продуктов может иметь несколько продуктов
  • принцип построения таблицы

    • Установите внешние связи в нескольких словах, свяжите односторонний первичный ключ
  • Возьми каштан 🌰

      -- 创建用户表;
      CREATE TABLE user(
      id INT PRIMARY KEY AUTO_INCREMENT, -- 唯一标识,编号
      name VARCHAR(30)									-- 用户名称
      );
      -- 用户表中添加数据;
      INSERT INTO user VALUES (null, '张三'), (null, '李四');
      -- 创建订单表;
      CREATE TABLE orderList(
              id INT PRIMARY KEY AUTO_INCREMENT,  -- 唯一标识,编号
              name VARCHAR(30),										-- 商品名称
        uid INT, 													  -- 外键列, uid表示关联 user表中的id;	
              CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES user(id)
      );
      -- 订单表中添加数据
      INSERT INTo orderList VALUES (null, '华为手机',1),(null, '华为电脑',1),(null, '爱疯手机',2),(null, '锤子手机',2);
    
    • Далее, давайте посмотрим на диаграмму отношения «один ко многим».one_many.png

5.3, многие ко многим

  • Применимая сцена

    • Студенты и курсы, студент может выбрать несколько курсов, и курсы также могут быть выбраны несколькими студентами
  • принцип построения таблицы

    • В случае "многие ко многим" только третья промежуточная таблица может использоваться для связывания таблиц, которые необходимо связать. Промежуточная таблица должна содержать не менее двух столбцов. Эти два столбца используются в качестве внешнего ключа промежуточного table, чтобы связать первичный ключ соответствующей таблицы.
  • Возьми каштан 🌰

      -- 创建db2数据库;
      CREATE DATABASE db2;
      -- 使用 db2数据库;
      USE db2;
      -- 创建person表;
      CREATE TABLE student(
              id INT PRIMARY KEY AUTO_INCREMENT, -- 唯一标识,编号;
              name VARCHAR(30)									 -- 用户名
      );
      -- -- 添加数据;
      INSERT INTO student VALUES (null, "张三"), (null, "李四");
    
      -- 创建课程表;
      CREATE TABLE course(
              id INT PRIMARY KEY AUTO_INCREMENT, -- 唯一标识,编号;
              name VARCHAR(30)									 -- 课程名称;
      );
      INSERT INTO course VALUES (null, "语文"), (null, "数学");
    
      -- 创建第三章中间表;
      CREATE TABLE stu_course(
              id INT PRIMARY KEY AUTO_INCREMENT,	-- 唯一标识,编号;
              sid INT,        -- 外键列 sid表示关联 student 表的主键id
              cid INT,				-- 外键列 cid表示关联 course 表的主键id
              CONSTRAINT sc_fk1 FOREIGN KEY (sid) REFERENCES student(id),
              CONSTRAINT sc_fk2 FOREIGN KEY (cid) REFERENCES course(id)
      );
      -- 添加数据
      INSERT INTO stu_course VALUES (null, 1,1),(null, 1,2),(null, 2,1),(null, 2,2);
    
    • Структура ассоциации промежуточной таблицы stu_course выглядит следующим образом.
      • Чжан Сан --> Язык
      • Чжан Сан --> Математика
      • Ли Си --> Китайский
      • ЛИ СИ -> Математика
    • Диаграмма нижеm_m.png

5.4, ​​многотабличный запрос

  • Сначала подготовьте волну данных

      CREATE TABLE user (
              id INT PRIMARY KEY auto_increment,
              NAME VARCHAR(20) NOT NULL,
              age INT NOT NULL
       ); 
       INSERT INTO user VALUES 
       (null, "张三", 23),
       (null, "李四", 24),
       (null, "王五", 25),
       (null, "赵六", 26);
    
    
    
       CREATE TABLE orderlist (
              id INT PRIMARY KEY auto_increment,
              number VARCHAR(30),
              uid INT,
              CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES user(id)
       );
      -- -- 添加数据;
       INSERT INTO orderlist VALUES 
       (NULL, "001", 1),
       (NULL, "002", 1),
       (NULL, "003", 2),
       (NULL, "004", 2),
       (NULL, "005", 3),
       (NULL, "006", 3),
       (NULL, "007", null);
      -- 
       CREATE TABLE category (
       id	 INT PRIMARY KEY auto_increment,
       NAME VARCHAR(20) NOT NULL
       );
       INSERT INTO category VALUES 
       (null,"手机数码"),
       (null,"电脑办公"),
       (null,"烟酒茶糖"),
       (null,"鞋靴箱包");
    
       CREATE TABLE product (
              id INT PRIMARY KEY auto_increment,
              NAME VARCHAR(30) NOT NULL,
              cid INT,
              CONSTRAINT pc_fk1 FOREIGN KEY(cid) REFERENCES category(id)
       ); 
       INSERT INTO product VALUES 
       (null,"华为手机", 1),
       (null,"小米手机", 1),
       (null,"联想电脑", 2),
       (null,"苹果电脑", 2),
       (null,"中华香烟", 3),
       (null,"玉溪香烟", 3),
       (null,"计生用品", null);
    
      -- 用户 -- 商品 中间表对应关系;
       CREATE TABLE us_pro (
              upid INT PRIMARY KEY auto_increment,
              uid INT, -- 和用户表建立关系;
              pid INT,	-- 和商品表建立关系;
              CONSTRAINT up_fk1 FOREIGN KEY (uid) REFERENCES user(id),
              CONSTRAINT up_fk2 FOREIGN KEY (pid) REFERENCES product(id)
       );
       INSERT INTO us_pro
       VALUES
              ( null, 1, 1 ),
              ( null, 1, 2 ),
              ( null, 1, 3 ),
              ( null, 1, 4 ),
              ( null, 1, 5 ),
              ( null, 1, 6 ),
              ( null, 1, 7 ),
              ( null, 2, 1 ),
              ( null, 2, 2 ),
              ( null, 2, 3 ),
              ( null, 2, 4 ),
              ( null, 2, 5 ),
              ( null, 2, 6 ),
              ( null, 2, 7 ),
              ( null, 3, 1 ),
              ( null, 3, 2 ),
              ( null, 3, 3 ),
              ( null, 3, 4 ),
              ( null, 3, 5 ),
              ( null, 3, 6 ),
              ( null, 3, 7 ),
              ( null, 4, 1 ),
              ( null, 4, 2 ),
              ( null, 4, 3 ),
              ( null, 4, 4 ),
              ( null, 4, 5 ),
              ( null, 4, 6 ),
              ( null, 4, 7 );
    
    • Схема взаимосвязей структуры выглядит так

      mtom.png

5.4.1 Запрос внутреннего соединения

  • принцип запроса
    • Внутренний запрос соединения заключается в запросе данных с частью пересечения.
  • Возьми каштан 🌰
    • Запрос информации о пользователе и соответствующей информации о заказе

        -- 显示内连接
        SELECT * FROM user u INNER JOIN orderlist o ON u.id = o.uid;
        -- 隐示内连接
        SELECT * FROM user u, orderlist o WHERE u.id = o.uid; 
      

      test1.png

5.4.2, запрос внешнего соединения

  • Левый внешний запрос соединения

    • принцип запроса
      • Запросить все данные в левой таблице и пересечение двух таблиц
  • Правый запрос внешнего соединения

    • принцип запроса
      • Запросить все данные правой таблицы и пересечение двух таблиц
  • Возьми каштан 🌰

      -- 查询用户表全部的数据以及订单表中有交集的数据;    
      -- 左外连接查询
      SELECT * FROM USER u LEFT OUTER JOIN orderlist o ON u.id=o.uid;
      -- 右外连接查询
      SELECT * FROM orderlist o RIGHT OUTER JOIN USER u ON u.id=o.uid;  
    

    test02.png

5.4.3 Подзапросы

  • принцип запроса

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

      -- 单行单列
      -- 比如我们要查询用户表中年龄最大的用户
      SELECT * FROM user WHERE age=(SELECT MAX(age) FROM user);
      
      -- 多行单列;
      -- 查询张三和李四的订单表;
      SELECT * FROM orderlist WHERE uid in (SELECT u.id FROM user u WHERE id in (1,2));
      
      -- 多行多列;
      -- 查询订单表中id>4的订单信息和对应的用户信息;
      -- 外连接查询
       SELECT * FROM user u RIGHT JOIN (SELECT * FROM orderlist WHERE id>4) o  on u.id = o.uid;
      -- 内连接查询
       SELECT * FROM user u ,(SELECT * FROM orderlist WHERE id>4) o WHERE u.id = o.uid; 
    

---------- Знания базы данных CRUD, задействованные в работе, вероятно, таковы, пожалуйста, задавайте вопросы ------------

-----------продлить------------