SQL Advanced-2-Self-соединение

база данных

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);

проблема

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

процесс решения

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

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

Предыдущая кодировка:

  1. Изменить кодировку конкретного имени поля

Ключевое слово изменить

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

  1. Найти записи одной и той же семьи, но с разными адресами

Сочетание самосоединения и неравноправного соединения

select distinct A1.name, A1.address
from Address A1, Address A2
where A1.family_id = A2.family_id  -- 同一家人
and A1.address <> A2.address;  -- 住址不同

  1. Найдите записи товаров с одинаковой ценой, но разными названиями
select distinct P1.name, P1.price
from Products P1, Products P2  -- 同一个表的自连接
where P1.price=P2.price   -- 价格相同但是名称不同
and P1.name <> P2.name  -- 非等值连接

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

неравноправный

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