LINUX.ORG.RU

Логика работы объединений

 


0

2

Помогите понять логику работы объединений на низком уровне

MariaDB [bookbiz]> SELECT au1.au_lname, au1.au_fname, au1.city
-> FROM authors au1, authors au2
-> WHERE au1.city = au2.city
-> AND au2.au_lname = 'Karsen'
-> AND au2.au_fname = 'Livia';
Кто может объяснить пошагово как работает этот запрос ?


этот запрос бессмысленный

au_fname    au_lname     city
---------------------------------
Livia       Karson       New York
Ivan        Petrov       Moscow
Jack        Doe          New York
  1. сначала мы перемножаем таблицу на саму себя
    au_fname    au_lname     city      au_fname    au_lname     city    
    --------------------------------------------------------------------
    Livia       Karson       New York  Livia       Karson       New York
    Ivan        Petrov       Moscow    Livia       Karson       New York
    Jack        Doe          New York  Livia       Karson       New York
    Livia       Karson       New York  Ivan        Petrov       Moscow
    Ivan        Petrov       Moscow    Ivan        Petrov       Moscow
    Jack        Doe          New York  Ivan        Petrov       Moscow
    Livia       Karson       New York  Jack        Doe          New York
    Ivan        Petrov       Moscow    Jack        Doe          New York
    Jack        Doe          New York  Jack        Doe          New York
    
  2. затем выбираем из перемножения по условию совпадения города
    au_fname    au_lname     city      au_fname    au_lname     city    
    --------------------------------------------------------------------
    Livia       Karson       New York  Livia       Karson       New York
    Jack        Doe          New York  Livia       Karson       New York
    Ivan        Petrov       Moscow    Ivan        Petrov       Moscow
    Livia       Karson       New York  Jack        Doe          New York
    Jack        Doe          New York  Jack        Doe          New York
    
  3. затем выбираем оттуда по имени Livia Karson
    au_fname    au_lname     city      au_fname    au_lname     city    
    --------------------------------------------------------------------
    Livia       Karson       New York  Livia       Karson       New York
    Jack        Doe          New York  Livia       Karson       New York
    

Вот, мы выбрали тех, кто живет с Ливией в одном городе. Этот запрос лучше было бы писать через подзапрос - сначала выбрать город, затем отсеять по городу.

P.S. СУБД может выполнить (и скорее всего выполнит) запрос не так, как я описал. Это описание как читает запросы человек. Для того, чтобы узнать, как его вполнит бaза - explain plan.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.