SQL Advanced-2-Self-соединение
SQL
Операции соединения обычно выполняются между разными таблицами, но операции также могут выполняться в пределах одной таблицы.macOS
Подключиться к базе данных через:
mysql -u root -p -- 后续输入密码

Основная операция
Создание и просмотр баз данных


// 1、创建表 create table user(字段1, 字段2, ..., 字段n ); // 最后的分号不能忘记
// 2、查看所有的表 show tables;
// 3、查看表的结构 desc user;
// 4、查看创建表的SQL语句 show create table user;
// 5、删除表 drop table user;
// 6、修改表名 alter table user rename to users; # 表名改为users;to可省略
mysql> create table products (id int primary key auto_increment,name varchar(50) default null, price int default null);

проблема
Вставка в таблицу в базе данных сегодня中文数据
Возникла проблема, когда:Это определенно проблема с кодировкой

процесс решения
- Изменить кодировку базы данных
mysql> alter table products default character set utf8; -- 直接修改数据库的编码,设置成utf8

Хотя кодировка всей таблицы была изменена, кодировка поля имени по-прежнему latin1, китайский язык не может быть вставлен, и его необходимо изменить.
Предыдущая кодировка:

- Изменить кодировку конкретного имени поля
Ключевое слово изменить
mysql> alter table products modify column name varchar(50) character set utf8;
Формат синтаксиса:
mysql>alter table <表名> modify column <字段> <字段类型> character set utf8; --将字段改成utf8类型


вставить новые данные
insert into <表名> <字段1,字段2,.....> values <对应的数据>

Случай 1 — переставляемый, комбинируемый
2 комбинации
- Упорядоченная пара упорядоченных пар, заключенная в угловые скобки
- Неупорядоченная неупорядоченная пара, заключенная в фигурные скобки
необходимость

Те же данные в результате, сгенерированном самосоединением SQL
select p1.name as name1, p2.name as name2
from products p1, products p2
name_1 name_2 ------ ------ 苹果 苹果 -- 出现相同的结果,如何去掉 苹果 橘子 苹果 香蕉 橘子 苹果 橘子 橘子 橘子 香蕉 香蕉 苹果 香蕉 橘子 香蕉 香蕉
select p1.name as name1, p2.name as name2
from products p1, products p2
where p1.name <> p2.name -- 指定两个表的中的2个名字不等
Примечание. Даже одна и та же таблица в SQL должна использоваться как другая таблица, если ей присвоено другое имя, это всего лишь два набора, которые хранят одни и те же данные.
Нет никакой разницы между самообъединением таблицы и объединением между разными таблицами.
расширять
Чтобы получить более 3 элементов, путем последовательного расширения нескольких таблиц:
select P1.name as name1, P2.name as name2, P3.name as name3 from Products P1,Products P2, Products P3 where P1.name > P2.name -- 只与字符顺序比自己靠前的商品进行比较 and P2.name2 > P3.name
Случай 2 — проблема с повторяющейся строкой
Найти повторяющиеся строки
на основе одного поля
Предположим, мы хотим найти повторяющиеся строки по полю имени (только одно поле), мы можем использовать следующий оператор:
select name, price, count(*) -- 分组之后统计每个组的行数 from Products group by name;
Отфильтровать строки меньше 1:
select name, price, count(*) from Products group by name having count(*) > 1; -- 过滤
Примечания. Сгруппируйте по полям с одинаковым значением, затем отобразите группы размером более 1.
на основе нескольких полей
Иногда повторяющиеся строки обнаруживаются на основе нескольких полей
SELECT col1, COUNT(col1), col2, COUNT(col2), ... FROM table_name GROUP BY col1, col2, ... HAVING -- 只有当列的组合重复时,才认为是重复行,用and进行关联 (COUNT(col1) > 1) AND (COUNT(col2) > 1) AND ...
удалить повторяющиеся строки
Удалив повторяющиеся строки, вы получите следующий результат

Использование функции экстремального значения rowid в Oracle
delete from Products P1 where rowid < ( -- 小于最大值的全部删除 select max(P2.rowid) -- 返回的是价格和名字都相同的商品所在的行 from Products P2 where P1.name = P2.name and P1.price = P2.price )
- Подзапрос возвращает строку товара с той же ценой и названием
- яблоки и бананы не имеют повторяющихся строк
- Есть апельсины, максимальное значение 4, а две строки (2, 3) меньше 4 будут удалены удалить
Использовать неравноправное соединение
delete from Products P1 where exists ( -- 存在于小于最大值的行全部删除delete select * from Products P2 where P1.name = P2.name and P1.price = P2.price and P1.rowid < P2.rowid )
Как удалить повторяющиеся строки в mysql
Справочное руководство: используется оператор удаления соединения,Сохраните самую большую запись строки и удалите все меньшие.
delete P1 from Products P1 inner join Products P2 where P1.id < P2.id -- 假设数据中存在自增id and P1.name = P2.name
Случай 3 — Локально несогласованные столбцы
необходимость
В той же таблице могут быть места не очень разумные: например,Адрес Маэды должен быть таким же, но таблица другая

Реализация SQL
- Найти записи одной и той же семьи, но с разными адресами
Сочетание самосоединения и неравноправного соединения
select distinct A1.name, A1.address from Address A1, Address A2 where A1.family_id = A2.family_id -- 同一家人 and A1.address <> A2.address; -- 住址不同
- Найдите записи товаров с одинаковой ценой, но разными названиями

select distinct P1.name, P1.price from Products P1, Products P2 -- 同一个表的自连接 where P1.price=P2.price -- 价格相同但是名称不同 and P1.name <> P2.name -- 非等值连接

Если в операторе запроса нет различий, в результатах появятся повторяющиеся значения.

неравноправный
использовать<、>、<>
Равные соединения называются «неравноправными». Среди них операторы сравнения, такие как > или