1、left join、right join、inner join三者区别

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

新建两张表进行测试:

表a

CREATE TABLE a (
user_id VARCHAR() DEFAULT NULL,
user_name VARCHAR() DEFAULT NULL,
user_age VARCHAR() DEFAULT NULL,
user_num VARCHAR() DEFAULT NULL,
user_sex VARCHAR() DEFAULT NULL
)

表b

CREATE TABLE b (
user_id VARCHAR() DEFAULT NULL,
user_phone VARCHAR() DEFAULT NULL
)

插入数据:

insert into a (user_id, user_name, user_age, user_num, user_sex) values('','test001','','','male');
insert into a (user_id, user_name, user_age, user_num, user_sex) values('','test002','','','female');
insert into b (user_id, user_phone) values ('','')

2、相关测试

测试left join

SELECT * FROM a LEFT JOIN b  ON a.user_id= b.user_id;

测试right join

SELECT * FROM a RIGHT JOIN b  ON a.user_id= b.user_id;

测试inner join

SELECT * FROM a INNER JOIN b  ON a.user_id= b.user_id;

3、其他提示

有时候也可以换种思路进行sql写法:

比如:想取a表数据,user_id不在b表的信息

left join会有两条数据

本来预期的结果是002这条记录。变成了两条,所以这种用法不可取。

right join

看似可以,再往b加条数据

变成这样了,001怎么又冒出来了,所以这种不可取。

inner join

这样更不行了,也不可取。

换种思路比如

1、not in

比如可以写:

select *from a where a.user_id not in(select b.user_id from b)【选取a表id不在b表的数据】

2、not exists 

select *from a where a.user_id not exists(select b.user_id from b)【选取a表id不在b表的数据】

当然数据量大的话,要看看这两种的性能了:

 选中SQL,右键 点击 解释计划 【F5快捷键】

查看耗费和基数,耗费和基数越小,代表查询效率越高。所以这个时候选用not exists性能更佳。

另外数据量大的话可以通过建立索引也可以提高效率

小数据量distinct 稍稍快点
稍大的数据量group by 稍稍快点

 

浅谈Sql各种join的用法的更多相关文章

  1. 浅谈sql 、linq、lambda 查询语句的区别

    浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...

  2. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  3. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  4. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  5. 浅谈sql中的in与not in,exists与not exists的区别

    转 浅谈sql中的in与not in,exists与not exists的区别   12月12日北京OSC源创会 —— 开源技术的年终盛典 »   sql exists in 1.in和exists ...

  6. 浅谈SQL注入风险 - 一个Login拿下Server(转)

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  7. 浅谈SQL优化入门:3、利用索引

    0.写在前面的话 关于索引的内容本来是想写的,大概收集了下资料,发现并没有想象中的简单,又不想总结了,纠结了一下,决定就大概写点浅显的,好吧,就是懒,先挖个浅坑,以后再挖深一点.最基本的使用很简单,直 ...

  8. 【SqlServer系列】浅谈SQL Server事务与锁(上篇)

    一  概述 在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章视图采用图文的方式来与大家一起探讨. “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及 ...

  9. 浅谈SQL Server内部运行机制

    对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL的哪些方面是他们的挑战 或者软肋呢? 那就是 ...

随机推荐

  1. maven项目在eclipse的library中没有Maven Dependencies

    今天使用maven创建了一个多模块的项目,在分别创建完父项目和各个子模块后,编译父项目的时候,父项目工程目录上出现了一堆红叉叉,点进去一看,是找不到依赖的类,但是pom文件中相应jar的depende ...

  2. 配置OpenVpn使用证书和用户名密码双验证

    修改OpenVpn的主配置文件 添加一下内容: [root@check1 openvpn]# tail -3 server.conf auth-user-pass-verify /etc/openvp ...

  3. Spring_Bean 之间的关系

    beans-relation.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns=& ...

  4. Ubuntu 通过APT安装Tomcat

    Ubuntu 通过APT安装Tomcat 安装 sudo apt-get install tomcat8 tomcat8-docs tomcat8-examples tomcat8-admin # s ...

  5. javascript练习题(2):变量作用域

    1. 外层变量在内部可以找到,反之找不到 以下看个案例: var a=10; function aaa(){ alert(a); } function bbb(){ var a=20; aaa(); ...

  6. 在UIElement外面多套一层布局面板(Grid、StackPanel)的意义

    在一个UIElement或多个UIElement外面套上一层布局面板(Grid.StackPanel),可以起到统一管理作用(非重点关注):另外,更重要的是:可以起到扩大UIElement操作有效范围 ...

  7. uva 11825 巧妙地子集枚举方法

    https://vjudge.net/problem/UVA-11825 题目大意,有n台服务器,有n种服务,每台服务器都运行着所有的服务,一台服务器可以被攻击一次其中的一种服务,当你选择攻击某台服务 ...

  8. python面向对象( item系列,__enter__ 和__exit__,__call__方法,元类)

    python面向对象进阶(下)   item系列 __slots__方法 __next__ 和 __iter__实现迭代器  析构函数 上下文管理协议 元类一.item系列 把对象操作属性模拟成字典的 ...

  9. 字段值为NULL时的like注意事项

    null like '%%'是有问题的 mysql中应该这样写COALESCE($ZU.mobile,'') like '%%' 或者 where IsNull([table].[column],'' ...

  10. WindowManager实现悬浮可拖动效果

    现在360手机卫士有个流量统计的效果,开启流量统计后,在桌面上会出现一个显示流量的窗体,在任何界面都可以自由拖动. 模仿这个功能,做了一个统计手机信号强度的Demo, 界面效果如下: 从上面的截图可以 ...