Эта статья подробно расскажет об использовании Mysql, некоторых распространенных ошибках и о том, как использовать Nodejs для подключения к базе данных.В будущем набор CRM-систем на основе базы данных Mysql будет открыт.
0.0, структура узла системы CRM намерена использовать Eggjs или Nestjs, так что следите за обновлениями.
0.1 Предпосылки
-
Программное обеспечение для визуализации базы данных, использованное в статье,
NavicatPremium
Если у вас возникнут проблемы с установкой, обратитесь за помощью к Du Niang или Gu Dad. -
Установите базу данных mysql и запустите ее, версия на моей стороне 8.0
-
Это информация Mysql на моем Mac
1. Введение в SQL
- SQL (язык структурированных запросов): язык структурированных запросов. По сути, он определяет правило для работы со всеми реляционными базами данных.
- общие правила грамматики
- Операторы SQL могут быть записаны на одной или нескольких строках, заканчивающихся точкой с запятой.
- Пробелы и сужения могут быть использованы для улучшения читабельности операторов.
- Оператор SQL базы данных Mysql не чувствителен к регистру, поэтому для ключевых слов рекомендуется использовать верхний регистр.
- Однострочные комментарии: - Содержание аннотации содержимого аннотации # (собственная аннотация mysql)
- Многострочный комментарий: /※Содержание комментария※/
- Классификация SQL
- DDL (язык определения данных): язык определения данных, используемый для управления базами данных, таблицами, столбцами и т. д.
- DML (язык манипулирования данными): язык манипулирования данными. Используется для добавления, удаления и изменения данных в таблицах базы данных.
- DQL (язык запросов данных): язык запросов данных. Используется для запроса записей в таблице базы данных
- DCL (язык управления данными): язык управления данными. Используется для определения прав доступа к базе данных и уровней безопасности, а также для создания пользователей.
2, база данных операций DDL и таблица данных
2.1, запрос DDL и создание базы данных
-
запросить все базы данных
SHOW DATABASES;
-
как показано на рисунке
-
-
Создать оператор для запроса базы данных
SHOW CREATE DATABASE 数据库的名称;
-
как показано на рисунке
-
-
создать базу данных
CREATE DATABASE 数据库的名称;
- как показано на рисунке
Если появится сообщение о том, что база данных создана успешно, а база данных слева не отображается, щелкните правой кнопкой мыши имя ссылки (test1) и нажмите «Обновить».
- как показано на рисунке
-
Создать базу данных (решение, если база данных не существует, создать ее)
CREATE DATABASE IF NOT EXISTS 数据库的名称;
- как показано на рисунке
- как показано на рисунке
-
Создайте базу данных (судим, если база данных не существует, создайте ее и укажите набор символов)
CREATE DATABASE IF NOT EXISTS 数据库的名称 CHARACTER SET 字符集名称;
- как показано на рисунке
2.2, изменение DDL, удаление, использование базы данных
-
Изменить базу данных (изменить набор символов utf8 --> gbk)
ALTER DATABASE 数据库名称 CHARACTER SET GBK;
-
удалить базу данных
DROP DATABASE 数据库名称;
-
Удалить базу данных (решение, если база данных существует, удалить ее)
DROP DATABASE IF EXISTS 数据库名称
-
использовать базу данных
USE 数据库名称;
-
Просмотр текущей используемой базы данных
SELECT DATABASE();
- как показано на рисунке
- как показано на рисунке
2.3, база данных операций DDL и таблица данных
-
Таблица данных запроса DDL
-
Запросить все таблицы данных в базе данных
SHOW TABLES;
-
как показано на рисунке
-
структура таблицы поиска
DESC 表名;
-
как показано на рисунке
Объяснение поля
- ПолеId: поле
- Тип: тип, соответствующий полю
- Null: пустое поле
- Ключ: ключ, окончательный индекс, используемый оценкой оптимизатора.
- По умолчанию: значение по умолчанию
- Дополнительно: дополнительная описательная информация
-
Запросить набор символов в таблице данных
SHOW TABLE STATUS FROM mysql LIKE 'user';
-
-
DDL создает таблицу данных
- Создать таблицу данных
CREATE TABLE 表名( 列名 数据类型 约束, 列名 数据类型 约束, ... 列名 数据类型 约束 );
- Типы
- 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 удалить таблицу данных
DROP TABLE 表名;
-
DDL удалить таблицу данных (решение, удалить, если таблица данных существует)
DROP TABLE IF EXISTS 表名;
3. Добавление, удаление и изменение данных таблицы DML (оператор создания данных в этой части скриншота находится вDDL创建数据表
В главах есть скриншоты)
-
Данные новой таблицы DML
-
Добавить данные в указанный столбец, количество значений должно быть таким же, как количество столбцов, а типы данных должны быть во взаимно однозначном соответствии
INSERT INTO 表名(列名,...) VALUES(值,...);
- В настоящее время мы видим, что данные с идентификатором 1 и именем пользователя Zhang San были добавлены в базу данных.
- На снимке экрана показан оператор select, который будет объяснен в разделе DQL.
-
добавить данные во все столбцы
INSERT INTO 表名(列名1,列名2,...) VALUES(值1,值2,...);
-
Добавить данные во все столбцы (сокращенно, количество значений должно быть таким же, как количество столбцов в таблице, а типы данных должны быть во взаимно однозначном соответствии)
INSERT INTO 表名 VALUES(值1,值2,...);
-
Добавляйте данные в таблицу партиями (несколько значений должны быть разделены запятыми и заканчиваться точкой с запятой)
INSERT INTO 表名(列名1,列名2,...) VALUES(值1,值2,...),(值1,值2,...),...;
INSERT INTO 表名 VALUES(值1,值2,...),(值1,值2,...),...;
-
-
DML изменить данные таблицы
UPDATE 表名 SET 列名1=值1, 列名2=值2,... [WHERE条件];
При изменении данных таблицы необходимо написать оператор WHERE, иначе будут изменены данные всех столбцов.
-
DML удалить данные таблицы
DELETE FROM 表名 [WHERE条件];
При удалении данных таблицы необходимо написать оператор 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;
3.2. Основной синтаксис запроса и отношения последовательности DQL следующие:
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组列表
HAVING
分组后的列表
ORDER BY
排序 升序、降序(asc,desc)
LIMIT
分页
-
Узнать все
SELECT * FROM 表名;
-
Запросить данные указанного столбца, или вы можете запросить все данные через указанный столбец
SELECT 列1,列2,... FROM 表名;
-
Удалить повторяющийся запрос
SELECT DISTINCT 列1,列,... FROM 表名;
-
Вычислить значение столбца
SELECT 列1 运算符(+-*/) 列名2 FROM 表名;
- Если оператор sql написан как
SELECT name, stock+10 FROM product;
Тогда запас компьютеров ASUS по-прежнему равен нулю;
- Если оператор sql написан как
-
запрос псевдонима
SELECT 列1 AS 别名1, 列2 FROM 表名;
-
Запрос псевдонима (сокращенно, оставьте пробел между именем столбца и псевдонимом)
SELECT 列1 别名1, 列2 FROM 表名;
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条件]
-
Классификация функций метода агрегатных функций
-
Далее мы все же перейдем от некоторых каштанов🌰 к некоторым часто используемым в работе
聚合函数
объяснять-
- Запрос общего количества элементов в продукте
SELECT COUNT(*) FROM product;
-
- Получить предмет с самой высокой ценой среди предметов;
`` SELECT MAX(price) FROM product;
-
- Получите минимальный запас;
SELECT MIN(stock) FROM product;
-
- Получить общий инвентарь (сумма инвентаря)
SELECT SUM(stock) FROM product;
-
- Получить полный перечень продуктов с брендом Nokia;
SELECT SUM(stock) FROM product WHERE brand='诺基亚';
-
3.2.3, запрос данных таблицы DQL --- запрос сортировки
- что такое запрос сортировки и что он может сделать
- В основном это упорядочивание данных в столбцах таблицы в порядке возрастания и убывания.
- грамматика
SELECT 列1,列2,... FROM 表名 [WHERE条件] ORDER BY 列名1 排序方式, 列名2 排序方式,...
- ГДЕ необязательное условие
- Существует только два способа сортировки: по возрастанию (ASC) по убыванию (DESC), и метод сортировки по умолчанию — по возрастанию (ASC).
- В одной таблице можно сортировать несколько столбцов. Если есть несколько условий сортировки, второе условие будет оцениваться только в том случае, если предыдущие условия совпадают.
- Далее мы все же перейдем от некоторых каштанов🌰 к некоторым часто используемым в работе
排序查询
объяснять-
- Сортировать по элементам в порядке возрастания
SELECT * FROM product ORDER BY stock ASC;
-
- Запросите информацию о мобильном телефоне, включенную в название продукта, и отсортируйте сумму в порядке убывания;
SELECT * FROM product WHERE name like '%手机%' ORDER BY price DESC;
-
- Сортировать по количеству по возрастанию, если количество одинаковое, то сортировать по инвентарю по убыванию;
SELECT * FROM product ORDER BY price ASC, stock DESC;
-
3.2.4, запрос данных таблицы DQL --- групповой запрос
-
грамматика
SELECT 列名列表 FROM 表名 [WHERE条件] GROUP BY 分组列名 [HAVING分组后的条件筛选] [ORDER BY 分组后的排序]
-
Пришло время каштанов, а дальше мы еще будем использовать каштаны🌰, чтобы рассказать о некоторых часто используемых в работе
分组查询
объяснять-
- Сгруппировать по брендам, получить общее количество каждой группы товаров;
SELECT brand, SUM(price) FROM product GROUP BY brand;
-
- Сгруппируйте продукты на сумму более 5000 юаней по брендам и получите общую сумму каждой группы продуктов;
SELECT brand, SUM(price) FROM product WHERE price>5000 GROUP BY brand;
-
- Сгруппируйте продукты на сумму более 5000 юаней по брендам, получите общую сумму каждой группы продуктов и отобразите только продукты на общую сумму более 8000 юаней.
SELECT brand, SUM(price) getSum FROM product WHERE price >5000 GROUP BY brand HAVING getSum >8000
-
- Сгруппируйте продукты на сумму более 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条记录;
-
Пришло время каштанов, а дальше мы еще будем использовать каштаны🌰, чтобы рассказать о некоторых часто используемых в работе
分页查询
объяснять-
- Сколько частей отображается на каждой странице -- отображаются три части данных;
SELECT * FROM product LIMIT 0 , 3;
- Теперь в таблице продуктов всего 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;
- 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 предоставляет наглядную диаграмму взаимосвязей таблиц.
- В это время создается отношение один к одному. В это время вы скажете, как я узнаю, что они связаны. Не паникуйте, Navicat Premium предоставляет наглядную диаграмму взаимосвязей таблиц.
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);
- Далее, давайте посмотрим на диаграмму отношения «один ко многим».
- Далее, давайте посмотрим на диаграмму отношения «один ко многим».
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 выглядит следующим образом.
- Чжан Сан --> Язык
- Чжан Сан --> Математика
- Ли Си --> Китайский
- ЛИ СИ -> Математика
- Диаграмма ниже
- Структура ассоциации промежуточной таблицы stu_course выглядит следующим образом.
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 );
-
Схема взаимосвязей структуры выглядит так
-
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;
-
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;
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;