本文介绍如何使用 SQL 来连接表。 SQL JOIN 的类型 左连接、内连接、完全连接、自连接和交叉连接是其他五种主要连接类型。 为了与数据库连接,我们必须在语句中显式或隐式地提供连接类型。...这是通过使用诸如“LEFT JOIN”、“INNER JOIN”和“FULL OUTER JOIN”等术语来实现的。 每个类别都有自己的一组应用程序。 希望下面的比较表可以帮助您识别它们的小差异。...因为 RIGHT JOIN 的结果可以通过在 LEFT JOIN 中交换两个连接的表名来实现,所以很少使用 RIGHT JOIN。...考虑如下的员工表: image.png 现在,上面解释的查询将产生如下结果: image.png 结论 这篇文章最重要的收获是 SQL JOIN可以分解为三个步骤: 选择您要使用的表和特征。...判断join的状态 从左连接、内连接、自连接和完全连接中选择合适的连接类型。 我希望通过阅读这篇文章,您将能够通过合并表来提高您的基本 SQL 能力并执行更复杂的分析。
我们使用书中的SQL实例来进行说明和实践,实例中有两个表,如下 msyql >SELECT * >FROM flags; +-----------+--------+ | country...(Alias) 第一点就是我们并没有使用原本的表名字,'flags' 和 'colors',而是用了'f' 和 'c' 作为表名称,这个其实就是别名,在MySQL中,并不限制表名称格式,但是尽量用规范和恰当的命名标准...而不像INNER JOIN语法是在表格指定时,使用ON子句或者USING子句中定义相关联的联接关系,,在WHERE子句中明确基于联接表的数据选择条件,这样就可以提高代码的可读性,并大大减少较为复杂的夺标语句中漏写某个联接列的可能...OUTER其实是可选的关键字,通常我们仅仅使用LEFT JOIN简化SQL语法 使用OUTER JION有两个原因, 一是当数据值集合未知时,仍要检索所有能匹配部分约束条件的数据集合 另一种情况是当规范化数据库没有强制参照完整性时...,需要用OUTER JOIN 一般我们外联分为左联和右联,推荐应用程序用左联,并且在应用程序的所有SQL语句中保持一致的写法 3 MySQL的合并查询(UNION) UNION语句主要用来为某SQL查询合并多个
通过对比优化前后的执行计划,可以明显看出,将SQL拆分成两个子查询,再使用union对结果进行合并,稳定性和安全性更好,性能更高。 案例二:同一列使用OR查询条件 1....= mci=category_no3 left join( select product_id, count(0) count from t2 pprod inner join t3 pinfo...=category_no3 left join( select product_id, count(0) count from t2 pprod inner join t3 pinfo...sql-01以user_msg 表为驱动,使用gmt_modified 索引过滤最新数据。...sql-03以group为驱动表,使用gmt_modified 索引过滤最新数据。
介绍 分享这篇文章是因为在SQL JOIN,你想知道的应该都有这篇文章中有个小伙伴问我,ON和WEHRE执行的顺序是怎样的,并且SQL执行顺序在面试中也经常被问,所以把姜承尧大佬《MySQL技术内幕...SQL编程》中关于SQL执行顺序的部分简单概述了一下,并配上例子,有想深入了解的可以去看书 SQL语言不同于其他编程语言(如C++,Java),最明显的不同体现在处理代码的顺序上。...> (3) JOIN (2)ON (4)WHERE (5)GROUP BY <group_by_list...如果FROM子句含两个以上表,则对上一个连接生成的结果表VT3和下一个表重复执行步骤1~步骤3,直到处理完所有的表为止 WHERE: 对虚拟表VT3应用VT3应用WEHRE过滤条件,只有符合<where_conditon...另外对使用了GROUP BY的查询,再使用DISTINCT是多余的,因为已经进行分组,不会移除任何行 10 应用ORDER BY子句 根据ORDER BY子句中指定的列对上一个输出的虚拟表进行排列,返回新的虚拟表
NAME = 'mike' GROUP BY a.uid HAVING count(b.oid) < 2 ORDER BY total DESC LIMIT 1; 下面我们现在开始 SQL...添加外部列 如果使用了外连接 (LEFT,RIGHT,FULL),主表(保留表)中的不符合 ON 条件的列也会被加入到 VT1-J2 中,作为外部行,生成虚拟表 VT1-J3。...注意:此时因为分组,不能使用聚合运算;也不能使用 SELECT 中创建的别名; 与 ON 的区别 如果有外部列,ON 针对过滤的是关联表,主表(保留表)会返回所有的列; 如果没有添加外部列,两者的效果是一样的...BY 这个子句会把 VT2 中生成的表按照 GROUP BY 中的列进行分组,生成 VT3 表。...mysql> SELECT -> a.uid, -> count(b.oid) AS total -> FROM -> table1 AS a -> LEFT JOIN
(7) 使用ORDER BY对结果集进行排序 oracle sql语句执行顺序: from(包括join 和left join 以及right join ) where group by having...4.group by (开始使用select中的别名,从group 开始往后都可用) 5.聚合函数 如Sum() avg() count(1)等 6.having 7.select 中若包含over...8.distinct 9.order by postgre sql执行顺序 8.select 9.distinct 1.from 3....OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2,生成t3,如果from包含两个以上表,则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束...mysql 执行顺序 1.from 2.on 3.join 4.where 5.group by 6.sum、count、max、avg 7.having 8.select 9.distinct
ON 3 JOIN 4 WHERE 5 GROUP BY <group_by_list...现在开始SQL解析之旅吧! 1. FROM 当涉及多个表的时候,左边表的输出会作为右边表的输入,之后会生成一个虚拟表VT1。...添加外部列 如果使用了外连接(LEFT,RIGHT,FULL),主表(保留表)中的不符合ON条件的列也会被加入到VT1-J2中,作为外部行,生成虚拟表VT1-J3。...注意: 此时因为分组,不能使用聚合运算;也不能使用SELECT中创建的别名; 与ON的区别: 如果有外部列,ON针对过滤的是关联表,主表(保留表)会返回所有的列; 如果没有添加外部列,两者的效果是一样的...GROUP BY 这个子句会把VT2中生成的表按照GROUP BY中的列进行分组。生成VT3表。
DISTINCT 3. FROM 4. JOIN 5....JOIN # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中 WHERE...# 排序 LIMIT 其实,sql引擎在执行上述每一步时,都会在内存中形成一张虚拟表,然后对虚拟表进行后续操作,并释放没用的虚拟表的内存,以此类推。...表中筛选符合条件的数据,形成VT2表; join: 将该 join 类型的数据补充到VT2表中,例如 left join 会将左表的剩余数据添加到虚表VT2中,形成VT3表;若表的数量大于2,则会重复1...-3步; where: 执行筛选,(不能使用聚合函数)得到VT4表; group by: 对VT4表进行分组,得到VT5表;其后处理的语句,如select,having,所用到的列必须包含在group
可以看到,这依然是一个分组汇总问题,使用group by子句组合count()函数进行计算。 需要注意的是:若一个玩家登录登出信息在“登录日志”和“登出日志”都有完整记录。...停留等级来自于问题2计算出的结果中,即下表: 我们需要根据这个表中的停留等级进行筛选,如何筛选呢? 可以使用left join联结进行筛选。....* from c left join d on c.停留等级 = d.角色等级; 可以看到,使用left join联结后的表已经同时存在停留于该等级的角色数、达到过该等级的总人数(总角色数),可以直接算出等级停滞率...那么,我们在用left join联结后,直接取表c中的停留等级,并取表c中的角色数,表d中的总角色数相除即可,无需将表c和表d中所有列都取出来。...by 角色等级) #临时表d的具体内容 将其带入left join联结的语句中,则计算各停留等级的停滞率的完整SQL的书写方法为: with c as( select 角色等级 as 停留等级,count
它的执行顺序: FROM / JOIN 和所有 ON 条件 WHERE GROUP BY HAVING SELECT ORDER BY LIMIT 以上是 SQL 标准定义的执行顺序...”SELECT deptno, COUNT(*) AS cnt FROM emp WHERE COUNT(*) > 0GROUP BY deptno 3....' 假如 emp 表和 dept 都是很大的表,emp 通过条件 job = 'PRESIDENT' 过滤后会得到很小的结果集。...如果按照标准的执行顺序先执行两个大表的 LEFT JOIN 再执行 WHERE 过滤,那整个 JOIN 操作将会占用很大的内存。...MySQL 可能会对 emp 表先执行WHERE 子句的过滤操作,过滤后的结果集再和 dept 表关联。
DISTINCT 3. FROM 4. JOIN 5....JOIN # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中...表中筛选符合条件的数据,形成VT2表; join: 将该 join 类型的数据补充到VT2表中,例如 left join 会将左表的剩余数据添加到虚表VT2中,形成VT3表;若表的数量大于2,则会重复1...-3步; where: 执行筛选,(不能使用聚合函数)得到VT4表; group by: 对VT4表进行分组,得到VT5表;其后处理的语句,如select,having,所用到的列必须包含在group...如下方SQL所示: SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*) FROM table GROUP BY full_name
作者:tomocat 来源:知乎 00 相关推荐 SQL | 数据分析面试必备SQL语句+语法 SQL | 开发人员必学的几点 SQL 优化点 接下来是是关于44道经典SQL测试题 01 建表语句...,sid,null))/count(sid) from sc left join course on sc.cid=course.cid group by sc.cid,cname 24....查询出只选修了一门课程的全部学生的学号和姓名 select sid from sc group by sid having count(cid) =1 28....查询同名同性学生名单,并统计同名人数 select ssex ,sname ,count(sid) from student group by ssex,sname having...要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 select cid ,count(sid) as cnt from sc group by cid having
因为需要全部的学生信息,则需要在 SC 表中得到符合条件的 SId 后与 Student 表进行 join,可以 left join 也可以 right join。...,但是请参考SQL查询中 in 和 exists 的区别分析,当表 2 的记录数量非常大的时候,选用 exists 比 in 要高效很多。...by 以后的查询结果无法使用别名,所以不要想着先单表 group by 计算出结果再从第二张表里添上课程信息,而应该先将两张表 join 在一起得到所有想要的属性再对这张总表进行统计计算。...student.Sname LIKE '%风%' 3.25 查询同名学生名单,并统计同名人数 找到同名的名字并统计个数 SELECT sname, count(*) FROM student GROUP...FROM sc a LEFT JOIN sc b ON a.cid = b.cid AND a.score < b.score GROUP BY a.cid, a.sid HAVING count
查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。 你可以在WHERE子句中指定任何条件。 你可以使用AND或者OR指定一个或多个条件。...演示代码 //需求:使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录: mysql> SELECT name, COUNT(*) FROM employee_tbl...INNER JOIN,LEFT JOIN,RIGHT JOIN JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。...LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。 RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。...runoob_count 列是否为 NULL,必须使用IS NULL和IS NOT NULL,如上实例。
【面试题】 "课程订单表”里记录了某在线教育App的用户购买课程的信息(部分数据截图)。 请使用sql将购买记录表中的信息,提取为下表(复购分析表)的格式。并用一条sql语句写出。...当有“每个”出现的时候,要想到《猴子从零学会SQL》中讲过的用“分组汇总来”来实现。 按每天分组(group by ),汇总购买用户数(计数函数count)。....* from 课程订单表 as a left join 课程订单表 as b on a.用户id = b.用户id; 把上面的联结结果记为临时表c,如何从临时表c中查找出时间间隔(用户第二次购买时间-...*,timestampdiff(month,a.购买时间,b.购买时间) as 时间间隔 from 课程订单表 as a left join 课程订单表 as b on a.用户id = b.用户id;...2.灵活使用case来统计when 函数与group by 进行自定义列联表统计。 3.遇到只有一个表,但是需要计数时间间隔的问题,就要想到用自联结来求时间间隔。
下图是MySQL练习题中涉及到的4张表和它们的具体字段: 学生表 课程表 成绩表 教师表 所有的题目都是根据4张表来进行出题,涉及到了很多的MySQL/SQL的知识点,希望对想提升SQL的读者朋友有所帮助...中也是很常见的,需要用到group by和sum、max、min、count等聚合函数 ?...left join Teacher t -- 教师表 on c.t_id = t.t_id left join Score s -- 成绩表 on c.c_id = s.c_id group by...group by a.s_id,a.s_name; 模糊匹配 在SQL中模糊匹配使用的关键字是like,符号是% ?...) from Teacher where t_name like "李%"; -- 模糊查询和通配符的使用 case语句 case语句用来进行条件判断,下图中介绍了SQL中的两种case表达式的写法
group by sex; --使用having子句进行分组筛选 显示分组后count(Age)>1的行,由于where只能在没有分组时使用, --分组后只能使用having来限制条件。...select sex as 性别,AVG(Age) as 平均年龄 from Employee group by Sex having COUNT(Age)>1; --查询前3行的所有数据 select...e left join Department d on e.DepId=d.DepId; --右连接 即使左表中没有匹配,也从右表返回所有的行 right join select * from...COUNT(EmpName)>1 ) --内外连接定义 --SQL内链接:将2张表按照on的条件,返回公共部分 --SQL外连接: 包含左链接和右连接 --INNER JOIN:如果表中有至少一个匹配...,则返回行 --LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行 --RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行 --FULL JOIN:只要其中一个表中存在匹配,则返回行
使用分区剪裁、列剪裁 在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。....* from a left join b on a.uid = b.uid where a.ds='2020-08-10' and b.ds='2020-08-10' 上面这个SQL...使用先GROUP BY再COUNT的方式替换,虽然会多用一个Job来完成,但在数据量大的情况下,这个绝对是值得的。...使用with as 拖慢Hive查询效率除了join产生的shuffle以外,还有一个就是子查询,在SQL语句里面尽量减少子查询。...但新版的hive已经对小表JOIN大表和大表JOIN小表进行了优化。小表放在左边和右边已经没有明显区别。不过在做join的过程中通过小表在前可以适当的减少数据量,提高效率。 5.
因为group by实际上执行相同的排序操作,所以group by基本上只是排序后的分组操作,这样,我们就可以一组一组地扫描数据,并动态地执行组。..., 1 我们的group by 或 distinct 操作的数据结果集是比较大的,则使用big_result,MYSQL会在磁盘创建临时表,并且很可能走全表扫描的方式 2 如果我们的预设的结果集比较小...,则结果集会在内存中进行存储,大家可以看到连中国香港的 file sort 都不在存在 3 如果希望更快的解锁查询的表,可以选择buffer_result, 将尽快的将表解锁并且将结果存储在本地机,...as e -> left join salaries as s on e.emp_no = s.emp_no -> left join dept_emp as d on d.emp_no...select d.dept_no,count(s.salary) as count_salary from employees as e left join salaries as s on e.emp_no
Course表,导致多使用了一个临时表的结果,现在改成使用Course表的统计值(3)作为课程的总数: select s.* from Student s where s_id not in ( select...having select s.* from Student s -- 学生表 left join Score s1 -- 成绩表 on s1.s_id = s.s_id group by s.s_id...by 3 desc; -- 降序 题目22 题目需求 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩 SQL实现 自己的方法 1、课程表和成绩表连接起来,显示所有的课程和成绩信息 select...left join Course c on t.t_id=c.t_id -- 教师表和课程表 left join Score sc on c.c_id=sc.c_id -- 课程表和成绩表 left...join Student s on s.s_id=sc.s_id -- 成绩表和学生信息表 where t.t_name='张三'; SQL实现 查询学过张三老师授课的同学的信息 题目需求 题目7
领取专属 10元无门槛券
手把手带您无忧上云