14. MySQL 8 -JOIN, INNER JOIN, LEFT и RIGHT JOIN объединение таблиц

JOIN, INNER JOIN, LEFT, RIGHT JOIN - механизмы объединения данных получаемых из разных таблиц. Например, вам нужно выбрать данные из двух-трех таблиц. Придется выбрать тип объединения и написать оператор SELECT, который используя JOIN "достанет" нужные данные

Пікірлер: 63

  • @user-os1xg1rh4c
    @user-os1xg1rh4c4 жыл бұрын

    про JOINы очень туманно рассказано, с учетом оговорок и повторных импортов таблиц тяжеловато переваривать )

  • @user-vf3gw7ik4j

    @user-vf3gw7ik4j

    2 жыл бұрын

    просто надо больше практиковаться. например, "на котиках")

  • @user-un5ri4qk5j
    @user-un5ri4qk5j3 жыл бұрын

    Прописал первый запрос тот что был у автора, в ответе получил страну, в которой живу )))))

  • @igorkomarov6607
    @igorkomarov66074 жыл бұрын

    Ну тебя штормит! У меня к концу ролика морская болезнь разыгралась/видео лайк

  • @vanderdt2
    @vanderdt23 жыл бұрын

    А вот и он! Первый ролик, при просмотре которого пришла мысль "Нифига не понятно".... когда вы выдаете результаты умозаключений, хорошо бы еще озвучить КАК вы дошли до данного результата. Т.е. анализ действий. Как пример: 7:00.... Как вы дошли до "id=capital", в данном случае, понятно только вам ) Но надо признать, я ждал его раньше. Но ваш уровень объяснения - просто поражает ) Грацио!

  • @HtmllabRu

    @HtmllabRu

    3 жыл бұрын

    Если уже посмотрели 13 роликов, жму руку!👍 🤝 Обычно мы связываем таблицы country и city по полям code и countrycode соответственно. Думаю вы уже разобрались, но на всякий случай добавлю, что в таблице country есть числовое поле capital (столица), которое содержит id номера города из таблицы city. Если сделать объединение на этих полях «id=capital», то найдём все страны с их столицами. А если добавить условие с названием страны, то найдём отдельную страну с её столицей.

  • @vanderdt2

    @vanderdt2

    3 жыл бұрын

    @@HtmllabRu На что только не пойдешь, когда горит задача, решение которой зависит от того, о чем вы рассказывайте! Жму вам руку !

  • @vanderdt2

    @vanderdt2

    3 жыл бұрын

    @@HtmllabRu Ашо момент... "Если уж пошла такая пьянка", и автор канала отвечает... Не могли бы вы, быть может, в одном ролике рассказать об отличиях MySQL и MariaDB. Вроде одно и то же, но синтаксис иногда выругивается (либо, опять же, я кривой)

  • @user-xp6uu5yu6t
    @user-xp6uu5yu6t4 жыл бұрын

    Круто! Спасибо! :)

  • @samiraxmedov3394

    @samiraxmedov3394

    3 жыл бұрын

    Что круто я не понял дудуш

  • @user-xp6uu5yu6t

    @user-xp6uu5yu6t

    3 жыл бұрын

    @@samiraxmedov3394 что конкретно?

  • @samiraxmedov3394

    @samiraxmedov3394

    3 жыл бұрын

    @@user-xp6uu5yu6t я новичек, сам смотрю в ютубе и учусь , но очень сложно с джоинами , только сегодня начал учить уже голова болит(( завтра на свежую голову начну, вопрос есть такой что вот интежер и варчар в каких имено моменте надо выписывать, ну эт я понял сто id int, name email vharcar

  • @user-xp6uu5yu6t

    @user-xp6uu5yu6t

    3 жыл бұрын

    @@samiraxmedov3394 так у тебя проблемы не с join, а с типами данных. Начни сначала основы основ. Когда конкретно для столбцов применяются те или иные типы данных, а позже уже переходи к объединению таблиц. И не пытайся все в один день понять, разбивай информацию по дням, а лучше одну тему в день , для осмысления. Если я правильно тебя поняла, если нет, то поясни.

  • @samiraxmedov3394

    @samiraxmedov3394

    3 жыл бұрын

    @@user-xp6uu5yu6t спасибо, но реально желание есть выучить🙏🏼

  • @alexeicodes
    @alexeicodes3 жыл бұрын

    То есть, насколько я понял, различие USING и ON является в том, что при ON мы должны указать(и приравнять ещё) какие 2 столбца в таблицах связаны с друг другом, а при USING - мы выбираем только одно название столбца, только лишь потому, что мы заранее знаем, что и в первой таблице, и во второй - связанные столбцы имеют одно название, верно всё?

  • @HtmllabRu

    @HtmllabRu

    3 жыл бұрын

    ON может содержать двух и более столбцов: ON a.c1 = b.c1 AND a.c2 = b.c2 AND a.c3 = b.c3 USING тоже, но с условием, что столбцы в таблицах одноимённые: USING (c1, c2, c3)

  • @AndreyShevchenko-ub2ew
    @AndreyShevchenko-ub2ew3 жыл бұрын

    Нормально джойны зашли, вот пример тройного джойна, который выводит все страны, и их столицы, где русскоговорящее население составляет >10%. : SELECT co.name, ci.name, cl.language, cl.percentage FROM country AS co JOIN city AS ci JOIN countrylanguage AS cl ON co.capital = ci.id AND co.code = cl.countrycode WHERE cl.language = 'Russian' AND cl.percentage > 10 ORDER BY cl.percentage DESC;

  • @ArthasLIO
    @ArthasLIO5 жыл бұрын

    Будут видео с триггерами, функциями, процедурами и транзакциями?

  • @HtmllabRu

    @HtmllabRu

    5 жыл бұрын

    Да, после некоторой паузы

  • @vladbelov8397
    @vladbelov83973 жыл бұрын

    В данный раздел для понимания нужно вставить графическую таблицу вариантов JOIN из coderoad.ru/5706437/%D0%9A%D0%B0%D0%BA%D0%B0%D1%8F-%D1%80%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0-%D0%BC%D0%B5%D0%B6%D0%B4%D1%83-%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B8%D0%BC-JOIN-%D0%BB%D0%B5%D0%B2%D1%8B%D0%BC-JOIN-%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%BC-JOIN-%D0%B8-%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%BC-JOIN

  • @HtmllabRu

    @HtmllabRu

    3 жыл бұрын

    Мне нравится эта схема 👍

  • @user-os1xg1rh4c
    @user-os1xg1rh4c4 жыл бұрын

    *ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(idor der)... PRIMARY KEY Без нижнего подчеркивания оказалось ! Моя ошибка

  • @user-os1xg1rh4c
    @user-os1xg1rh4c4 жыл бұрын

    Не все смотрят ваши видео подряд за раз, как я. Наверно, хорошо бы дать на старте пояснения кратко, как открыть схему, с которой вы начинаете. Или хотя бы ссылку на урок, где это раскрыто - урок 7.

  • @HtmllabRu

    @HtmllabRu

    4 жыл бұрын

    Спасибо)

  • @vladyckroitenberg7870
    @vladyckroitenberg78702 жыл бұрын

    оч исчерпывающе и антологично; видно автор на теме не один комплект коронок сгрыз, но просматривать приходится на скорости 1,75.

  • @HtmllabRu

    @HtmllabRu

    2 жыл бұрын

    Vladyck, 👍

  • @user-hd3ht2do4c
    @user-hd3ht2do4c3 жыл бұрын

    А существует разница в порядке таблиц до и после INNER JOIN? То есть разница между таблица1 INNER JOIN таблица2 и таблица2 INNER JOIN таблица1

  • @HtmllabRu

    @HtmllabRu

    3 жыл бұрын

    только в порядке столбцов в результирующей выборке

  • @TheTempest_
    @TheTempest_ Жыл бұрын

    Жесть у меня рандом сразу Турцию выдал

  • @qweasd2275
    @qweasd22754 жыл бұрын

    А можно пример связи 3 таблиц с inner join из world ?

  • @HtmllabRu

    @HtmllabRu

    4 жыл бұрын

    Там в каждой таблице есть столбец с кодом страны, потому пример может показаться несколько искусственным. Допустим нужно узнать в какой стране находится город Moscow и какие языки в этой стране используются (другими словами, что авторы world поместили в базу) SELECT city.name 'город', country.name 'страна', count(language) 'кол-во языков' FROM city INNER JOIN country INNER JOIN countrylanguage ON country.code = city.countrycode AND countrylanguage.countrycode = country.code WHERE city.name = 'Moscow' GROUP BY 1,2; +--------+--------------------+---------------+ | город | страна | кол-во языков | +--------+--------------------+---------------+ | Moscow | Russian Federation | 12 | +--------+--------------------+---------------+

  • @brainstormhs
    @brainstormhs4 жыл бұрын

    Пробовал посчитать сколько человек говорят на том или ином языке в каждом регионе. В итоге MySQL результат выдал, но результат был не точный (некоторые значения проверял - там явные откланения на +/- 100 человек). Вроде переполнение BigInt не должно быть... Хотя маленькие значения считает неплохо.

  • @HtmllabRu

    @HtmllabRu

    4 жыл бұрын

    Покажете ваш SELECT?

  • @brainstormhs

    @brainstormhs

    4 жыл бұрын

    @@HtmllabRu Ну возьмем такой код : SELECT co.Name, cl.Language, co.Population, cl.Percentage, (co.Population*cl.Percentage) AS 'POPxPerc' FROM country co INNER JOIN countrylanguage cl ON Code = CountryCode WHERE co.Code = 'TUR'; Тут тысячи умножаются на проценты (с 1 запятой, на 100 не делю) в конце должны получаться нули, но их там нету.. (выдает для арабского языка 93227398.4) При этом проверка данных для арабского языка считает сама по себе нормально: select 66591000*1.4 \G; выдает 66591000*1.4: 93227400.0

  • @pavelgrigorov1296
    @pavelgrigorov12964 жыл бұрын

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

  • @HtmllabRu

    @HtmllabRu

    4 жыл бұрын

    SELECT t1.field FROM t1 LEFT JOIN (t2, t3) ON (t2.a = t1.a AND t3.b = t2.b)

  • @pavelgrigorov1296

    @pavelgrigorov1296

    4 жыл бұрын

    @@HtmllabRu благодарю!!!!!

  • @pavelgrigorov1296

    @pavelgrigorov1296

    4 жыл бұрын

    @@HtmllabRu я сделал так же, только через INNER JOIN результат одинаковый , не понимаю в чем разница

  • @pavelgrigorov1296

    @pavelgrigorov1296

    4 жыл бұрын

    @@HtmllabRu t3 - это таблица со сложенным ключем, я правильно понял?

  • @HtmllabRu

    @HtmllabRu

    4 жыл бұрын

    @@pavelgrigorov1296 тут t2 таблица с двумя полями из t1 и t3. INNER JOIN все соответствия строк из одной таблицы строкам из другой LEFT JOIN показывает все записи из левой таблицы, и какие есть соответствия из правой

  • @user-er5ux4xv7e
    @user-er5ux4xv7e4 жыл бұрын

    Если ищем страну и ее столицу, вот так вроде как по-чище и читается проще: SELECT country.name AS country, city.name AS capital FROM country INNER JOIN city ON country.capital = city.id WHERE country.name = 'Turkey';

  • @kas-cor
    @kas-cor4 жыл бұрын

    16:10 создаю таблицы, 19:39 забываем что только что их создали, и говорим что ни как не могли этого сделать.

  • @mount_and_blade_viewer

    @mount_and_blade_viewer

    4 жыл бұрын

    hahaha

  • @dmitriynikitin4948

    @dmitriynikitin4948

    3 жыл бұрын

    та да , шиза ? или возможно он это видео записывал в два захода и забыл

  • @singlebw4065
    @singlebw40653 жыл бұрын

    Как одним запросом получить 2 таблицы из бд. Как вообще получить просто 2 и более таблицы. Есть у меня 6 таблиц, поля совпадают. Я хотел что бы по клику на сайте я получил все полностью таблицы с разным наполнением и отрисовать их на сайте.

  • @HtmllabRu

    @HtmllabRu

    3 жыл бұрын

    Есть два способа. Первый: создать объединение таблиц - тяжелую операцию с выборкой, где после FROM будет несколько таблиц через запятую, или воспользоваться INNER JOIN (или другими JOINами). При этом задать таблицам псевдонимы и указать эти псевдонимы для каждого поля, чтобы не было конфликтов из-за одноименных полей Второй: Создать SELECT для каждой таблицы, а потом объединить их оператором UNION. Но! Придётся в каждом SELECT сделать одинаковое "количество мест". То есть, если в одном SELECT 7 полей, а во втором 3 поля, то во втором придется дописать 4 раза null или пустую строку

  • @singlebw4065

    @singlebw4065

    3 жыл бұрын

    @@HtmllabRu Я пробовал писать типа SELECT t1. *, t2. * FROM t1, t2. Так у меня выводит только 1ю таблицу при чëм каждая строка * на кол-во элементов в t2. Пробовал t1 INNER JOIN t2 вижу только одну таблицу. И вот интересно если даже удасться получить все таблицы это будет массив склеиных таблиц? Ну то есть колонка id будет 1,2,3, 1,2,3,4, ... . Сгруппироватьвообще можно? Просто 6 таблиц 1 запросом. допустим в 1м массиве 1 таблица, во 2м 2я и т. д. По конкретней бы пример. Везде показывают только выборку, но мне куски не нужны, мне полностью как есть все таблицы с разным наполненением.

  • @HtmllabRu

    @HtmllabRu

    3 жыл бұрын

    @@singlebw4065 Вот тут рассказываю о Union kzread.info/dash/bejne/ZqGDxq6Co9Tgaaw.html. С его помощью можно реализоваться следующий пример (внимание! При существовании удаляется база db1): drop database if exists db1; create database db1; use db1; create table tbl1(id integer, title varchar(100)); insert into tbl1(id, title) values(1, "Hello"); insert into tbl1(id, title) values(2, "world"); select * from tbl1; create table tbl2(id integer, title varchar(100), price decimal(6,2)); insert into tbl2(id, title, price) values(1, "Привет", 1000.50); insert into tbl2(id, title, price) values(2, "MySQL", 2300); insert into tbl2(id, title, price) values(3, "!", 456.78); select * from tbl2; #Через UNION select id 'Идентификатор', title 'Название', price 'Цена' from tbl2 union all select id, title, 0 from tbl1; #Через UNION с указанием таблиц select id 'Идентификатор', title 'Название', price 'Цена', 'tbl2' as 'Таблица' from tbl2 union all select id, title, 0, 'tbl1' from tbl1; #Через JOIN select id 'Идентификатор', title 'Название', price 'Цена' from tbl2 union all select id, title, 0 from tbl1; Но мне кажется вы хотите не объединение таблиц через JOIN, и даже не объединение запросов, а что-то вроде процедуры, которая бы выводила в консоли отдельные таблицы (тут нужно заметить, что результат SELECT всегда одна таблица, потому такая процедура будет содержать несколько операторов SELECT). Поправьте, если я не понял ваш вопрос. Вот пример функции (видео по функциям есть тут kzread.info/dash/bejne/lIGAscmmo9ObaJs.html): use db1; delimiter // drop procedure if exists showDataTables // create procedure showDataTables() begin select id, title from tbl1; select id, title, price from tbl2; end // delimiter ; call showDataTables(); Можно было бы поработать с параметрами или затронуть курсоры, но для меня было важно написать максимально простой пример, который, как мне кажется, вам мог бы помочь

  • @singlebw4065

    @singlebw4065

    3 жыл бұрын

    @@HtmllabRu Если более детально описать то вот что я задумал. Что бы на сайте не держать таблицы я решил сохранить их в бд. В таблицах описаны услуги электромонтажа. Кстате заголовки я тоже решил сохранить там что бы ориентироваться и клиенту если что можно было в базе изменить имя а не лазить по коду. Уж не знаю насколько грамотно, на грабли самому приходиться наступать. Придёт время ошибки мои вылезут. 1. таблица black_work id services unit price 1 Монтаж под ключ (черновой этап) NULL NULL 2 Точка без гофротрубы вывод 250 3 Точка с гофротрубой вывод 300 4 Подрозетники (ГКЛ) шт. 100 ........... и не известно сколько там ещё будет 2. таблица clean_work id services unit price 1 Монтаж под ключ (чистовой этап) NULL NULL 2 Фурнитура в подрозетники шт. 100 3 Фурнитура накладная шт. 300 ........... и не известно сколько там ещё будет ....... 6. таблица pipe_install id services unit price 1 Монтаж трубы NULL NULL 2 Гофротруба до Ø32 мм м.п. 15 ........... и не известно сколько там ещё будет Вот UNION то что впринципе надо. На php $tables = ["black_work", "clean_work", "cable_laying", "low_volt_system", "retro_wiring", "pipe_install"]; $queryStr = ""; foreach ($tables as $item) { if($item == $tables[count($tables) - 1]){ $queryStr .= "SELECT * FROM $item"; break; } $queryStr .= "SELECT * FROM $item UNION "; } Вообщем это вот такой запрос SELECT * FROM black_work UNION SELECT * FROM clean_work UNION SELECT * FROM cable_laying UNION SELECT * FROM low_volt_system UNION SELECT * FROM retro_wiring UNION SELECT * FROM pipe_install Таблицы не объединяю вместе т.к. разные виды работ. И получаю 0: {id: 1, services: "Монтаж под ключ (черновой этап)", price: null, unit: null} 1: {id: 2, services: "Точка без гофротрубы", price: 250, unit: "вывод"} 2: {id: 3, services: "Точка с гофротрубой", price: 300, unit: "вывод"} 3: {id: 4, services: "Подрозетники (ГКЛ)", price: 100, unit: "шт"} 4: {id: 5, services: "Подрозетники (кирпич)", price: 150, unit: "шт"} 5: {id: 6, services: "Подрозетники (бетон)", price: 250, unit: "шт"} 6: {id: 7, services: "Штроба (кирпич)", price: 120, unit: "шт"} 7: {id: 8, services: "Штроба (бетон)", price: 180, unit: "шт"} 8: {id: 9, services: "Распред/коробка (сварка)", price: 300, unit: "шт"} 9: {id: 10, services: "Распред/коробка (опресовка)", price: 350, unit: "шт"} 10: {id: 11, services: "Ниша под встр/щит", price: 1000, unit: "от"} 11: {id: 12, services: "Отверстия проходные до Ø32 мм", price: 200, unit: "шт"} 12: {id: 13, services: "Лоток (метал)", price: 300, unit: "м.п"} 13: {id: 1, services: "Монтаж под ключ (чистовой этап) ", price: null, unit: null} 14: {id: 2, services: "Фурнитура в подрозетники", price: 100, unit: "шт"} 15: {id: 3, services: "Фурнитура накладная", price: 200, unit: "шт"} 16: {id: 4, services: "Точечные светильники в ГКЛ", price: 150, unit: "шт"} 17: {id: 5, services: "Светильники настенные (Бра)", price: 250, unit: "шт"} 18: {id: 6, services: "Люстра", price: 500, unit: "от"} 19: {id: 7, services: "Светодиодная лента", price: 150, unit: "п.м"} .............. 39: {id: 4, services: "Фурнитура (с рамками)", price: 200, unit: "шт"} 40: {id: 5, services: "Распред/коробка (на клемах)", price: 350, unit: "шт"} 41: {id: 1, services: "Монтаж трубы", price: null, unit: null} 42: {id: 2, services: "Гофротруба до Ø32 мм", price: 15, unit: "м.п."} 43: {id: 3, services: "Гофротруба Ø50 мм", price: 25, unit: "м.п."} 44: {id: 4, services: "Труба ПНД/ПВХ до Ø32 мм", price: 40, unit: "м.п."} 45: {id: 5, services: "Труба ПНД/ПВХ Ø50 мм", price: 60, unit: "м.п."} 46: {id: 6, services: "Металлорукав до Ø32 мм", price: 40, unit: "м.п."} Существует ли что-нибудь в sql что бы получить данные 0: [ массив 1й таблицы ] 1: [ массив 2й таблицы ] .... 1: [ массив 6й таблицы ] Щас сижу про JSON в MariaDB почитываю на всякий пожарный. Ещё кстате пытался заносить данные из консоли, так сказать научиться и потренироваться. оказалось там и показывает кракозябры хотя в графической таблице нормально всё. Еле нашёл причину. Оказывается в файле mariaDB.conf нужно было default-character-set = cp866 ставить.

  • @singlebw4065

    @singlebw4065

    3 жыл бұрын

    @@HtmllabRu Также мне пришлось таблицы переписывать что бы заголовок вставить в 1й id каждой таблицы. Я на тот момент подумал, а нет ли способа запросом сдвинуть все строки таблицы на +1 по id что бы 1я ячейка освободилась и в неё можно было что либо положить.

  • @natalya.provkova2002
    @natalya.provkova20023 жыл бұрын

    Извините конечно.. Но про JOINы, мало, что понятно(

  • @HtmllabRu

    @HtmllabRu

    3 жыл бұрын

    Ок. Попробуем так: - есть таблица пользователей user с полями iduser и name - и таблица статей articles с полями idarticles, content и user_iduser. Таблицы связаны отношением один ко многим (один пользователь пишет много статей, не рассматриваем вариант с многоавторскими статьями) Чтобы выбрать из таблиц всех пользователей с их статьями, нужно написать запрос SELECT name, content FROM user INNER JOIN articles ON iduser = user_iduser; Будут показаны все имена пользователей и статья, которые они написали. То есть будет найдено однозначное соответствие записей второй таблице записям в другой. Фрагмент ON iduser = user_iduser в запросе с INNER JOIN отвечает за такое однозначное соответствие одних записей другим. Без этого фрагмента, записям одной таблице будут сопоставлены все (любые) записи другой таблицы (а общее количество полученных записей будет равно произведению количества строк одной и другой таблицы).

  • @natalya.provkova2002

    @natalya.provkova2002

    3 жыл бұрын

    ​@@HtmllabRu А RIGHT JOIN выводит все из правой, а там где, где нет пары выставляет NULL. А LEFT JOIN выводит все из левой таблицы (которая слева от оператора), а там, где нет пары выставляет NULL. Верно?)

  • @HtmllabRu

    @HtmllabRu

    3 жыл бұрын

    Точно 👍

  • @user-jx7di6tp2n
    @user-jx7di6tp2n3 жыл бұрын

    JOIN нафиг не нужны, нормальные программисты их не используют, после применения потом жалуются, типо у меня запросы тормозят, у меня база виснет и тп.

  • @radikovichkz2470
    @radikovichkz24704 жыл бұрын

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

  • @scherbakovss2012
    @scherbakovss20128 ай бұрын

    22:40 SELECT * FROM customer LEFT JOIN `order` ON customer.idcustomer = `order`.customer_id;