zoukankan      html  css  js  c++  java
  • LeetCode数据库篇|175组合两个表

    首发公众号:早起Python

    系列导读

    LeetCode176|第二高的薪水

    大家好,从今天起我们将对Leetcode中数据库相关题目进行讲解,如果对SQL相关操作还不是很了解的读者可以点击万字Mysql学习笔记复习。

    通过做题来学习是最有效的方式,阅读的同时一定要思考每种解法的异同,最好能够敲一遍。

    本文为第175题:组合两个表

    题目与SQL架构

    Create table Person (PersonId int, FirstName varchar(255), LastName varchar(255));
    Create table Address (AddressId int, PersonId int, City varchar(255), State varchar(255));
    Truncate table Person;
    insert into Person (PersonId, LastName, FirstName) values ('1', 'Wang', 'Allen');
    Truncate table Address;
    insert into Address (AddressId, PersonId, City, State) values ('1', '2', 'New York City', 'New York');

    第一种解法

    从题意上判断很简单,无论person是否有地址信息,说明地址信息(City, State)的查询结果允许为NULL。但是,姓名(FirstName, LastName)必须有

    直观的解法是基于Person表的左连接。

    注:写SQL语句的时候尽量按照执行顺序去写

    FROM...
    JOIN...
    ON...
    WHERE...
    GROUP BY...
    SELECT...
    HAVING...
    ORDER BY...
    LIMIT...

    先给出最简单直接的解法:

    SELECT P.FirstName, P.LastName, A.City, A.State
    FROM Person P 
    LEFT JOIN Address A
    ON P.PersonID = A.PersonID

    第二种解法

    另一种解法是将Address换成子查询临时表

    SELECT P.FirstName, P.LastName, A.City, A.State
    FROM Person P
    LEFT JOIN (SELECT DISTINCT PersonId, City, State 
               FROM Address) A
    on P.PersonId = A.PersonId;

    这种解法针对于大数据、建立合适索引的情况下速度会加快,但是如果数据量太小,由于子查询会再产生临时表,有时候执行速度不一定有提升,见仁见智。主流的做法就是JOIN连表,如果用WHERE或者建立多个子查询也可以解决这道题。个人认为相对而言意义偏小。

  • 相关阅读:
    Maven 入门 (1)—— 安装
    centos下保留python2安装python3
    chrome各版本下载
    nginx 图片访问404 (使用location中使用 root,alias的区别)
    centos7无GUI运行selenium chromedriver 亲测可用!
    常用xpath选择器和css选择器总结
    在flask中使用swagger(flasgger使用方法及效果展示)
    判断回文字符串、回文链表、回文数(python实现)
    (9) MySQL主主复制架构使用方法
    (10) 如何MySQL读压力大的问题
  • 原文地址:https://www.cnblogs.com/liuzaoqi/p/13041402.html
Copyright © 2011-2022 走看看