mysql——leetcode问题记录

问题:

表1: Person

+-------------+---------+
| 列名         | 类型     |
+-------------+---------+
| PersonId    | int     |
| FirstName   | varchar |
| LastName    | varchar |
+-------------+---------+
PersonId 是上表主键

表2: Address

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| AddressId   | int     |
| PersonId    | int     |
| City        | varchar |
| State       | varchar |
+-------------+---------+
AddressId 是上表主键

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:

FirstName, LastName, City, State

#=》
select FirstName, LastName, City, State
from Person p left join Address a
on p.PersonId = a.PersonId

错误点:这里之前where代替on,出现报错,查询详细原因如下

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下:

1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

left join,right join,full join具有特殊性

不管on上的条件是否为真都会返回leftright表中的记录,full则具有leftright的特性的并集。 

inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

原文地址:https://www.cnblogs.com/fish-101/p/10713697.html

时间: 2024-10-31 00:26:02

mysql——leetcode问题记录的相关文章

mysql中判断记录是否存在方法比较【转】

把数据写入到数据库的时,常常会碰到先要检测要插入的记录是否存在,然后决定是否要写入. 我这里总结了判断记录是否存在的常用方法: sql语句:select count(*) from tablename; 然后读取count(*)的值判断记录是否存在.对于这种方法性能上有些浪费,我们只是想判断记录记录是否存在,没有必要全部都查出来. 以下这个方法是我推荐的. sql语句:select 1 from tablename where col = col limit 1; 然后读取语句执行所影响的行数.

mysql 的一些记录的操作

①:删除表记录 用delete删除记录 DELETE 语句有如下格式: DELETE FROM tbl_name WHERE 要删除的记录 WHERE 子句指定哪些记录应该删除.它是可选的,但是如果不选的话,将会删除所有的记录.这意味 着最简单的 DELETE 语句也是最危险的. 这个查询将清除表中的所有内容.一定要当心! 为了删除特定的记录,可用 WHERE 子句来选择所要删除的记录.这类似于 SELECT 语句中的 WHERE 子句. mysql> delete from pet where

mysql关联删除记录

在项目开发过程中,要删除表中的记录数据,但是给的字段值不是本表中的字段值,试了很多方法都没有成功,最后看到这个方法挺好用的: DELETE g FROM ws_group_users g, yf_user u WHERE g.userid=u.id and u.phone=? mysql关联删除记录,布布扣,bubuko.com

mysql 删除重复记录

mysql删除重复记录的原理是: 将需要比较的列放到group by后,取出主键的最小值,再删除不在这个临时表主键的行 命令行格式如下 delete from users  where id not in ( select id from ( select min(id)  from users group by name,sex )  as tmp); 需要比较的列是name和sex,取出id后再从users表中取出id查看该id是否在临时表中存在,不存在则删除掉.

创建角色随机名字(mysql抽取随机记录)和mysql游标的使用

最近在开发中遇到了一些问题,在此记录一下解决的方法,已作备忘. 1.现在创建游戏角色的时候,基本上都是支持角色名字随机的,以前此功能在客户端用代码实现,然后向服务器请求并验证,后来发现有时候连续几次都失败,所以改成在服务器实现.实现方法主要考虑使用mysql随机查询记录,在网上查了很多方案,然后用在了我们游戏中. 实现方案是,将所有随机名字都插入到一张表中,然后从中随机取一条当前角色表中没有出现过的名字. BEGIN DECLARE randnum int DEFAULT 0; SELECT F

MySQL高效获取记录总数

通常mysql获取查询记录总数我们使用如下语句: SELECT COUNT(*) FROM users WHERE k='avs';  或:SELECT id FROM goods WHERE k='avs' LIMIT 10; 但是记录总数总是需要单独的语句来查询,例如在分页查询程序中就有这样的问题,其实mysql可以在一次查询中获取记录和总数的,这就是要使用SQL_CALC_FOUND_ROWS参数,使用方法如下: SELECT SQL_CALC_FOUND_ROWS goods WHERE

MyBatis+MySQL 返回插入记录的主键ID

今天用到了多个表之间的关系,另一个表中的一个字段要以第一个表的主键作为外键. 下面说两种方法,MyBatis+MySQL 返回插入记录的主键ID: 第一种: <insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User"> insert into us

MySQL从库记录binlog日志出错一例

昨天晚上学习视频"L11-16-配置MySQL从库记录binlog及其生产应用场景w",开头部分就卡住了. 在数据库的配置文件/data/3307/my.cnf里,开启参数"log-bin = /data/3307/mysql-bin",并增加"log-slave-updates"参数之后,重启数据库服务. 测试创建1个新库"create database oldgirl02;"之后,即使过滤新生成的logbin日志文件还是没

MySQL 的优化记录

当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的.而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量: 字段 尽量使用TINYINT.SMALLINT.MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED VARCHAR的