首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何写优雅的SQL原生语句?

sql各语句执行顺序概览与讲解 项目实战中的一段sql说明讲解 sql语句中别名的使用 书写sql语句的注意事项 前言 上一篇讲Mysql基本架构时,以“sql查询语句在MySql架构中具体是怎么执行的...知道了sql查询语句在MySql架构中的具体执行流程,但是为了能够更好更快的写出sql语句,我觉得非常有必要知道sql语句中各子句的执行顺序。...现在开始我们的学习 语句中各子句完整执行顺序概括(按照顺序号执行) from (注:这里也包括from中的子语句) join on where group by(开始使用select中的别名,后面的语句中都可以使用...1. from form是一次查询语句的开端。 如果是一张表,会直接操作这张表; 如果这个from后面是一个子查询,会先执行子查询中的内容,子查询的结果也就是第一个虚拟表T1。...如果需要关联表,使用join,请看2,3 2. join 如果from后面是多张表,join关联,会首先对前两个表执行一个笛卡尔乘积,这时候就会生成第一个虚拟表T1(注意:这里会选择相对小的表作为基础表

1.9K20

SQL Server 2012学习笔记 (三) ----- SQL Server SQL语句

2)子查询与嵌套查询:   子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。   ...嵌套查询是指将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询。嵌套查询中上层的查询块称为外侧查询或父查询,下层查询块称为内层查询或子查询。...使用比较运算符 使用IN关键字 使用ANY、SOME和ALL关键字 使用EXISTS关键字 3)联接查询:   联接查询是由一个笛卡尔乘积运算再加一个选取运算构成的查询。...首先用笛卡尔乘积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。...联接条件可在 FROM 或 WHERE 子句中指定,建议在 FROM 子句中指定联接条件。WHERE 和 HAVING 子句还可以包含搜索条件,以进一步筛选根据联接条件选择的行。

6.5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    SQL命令 FROM(一)

    后者产生一个更大的表,即笛卡尔乘积,其中第一个表中的每一行都与第二个表中的每一行相匹配,这一操作称为交叉联接(Cross Join)。...此优化选项禁用“扁平化”(默认),它通过将子查询有效地集成子查询到查询中来优化包含量化的子查询的查询:将子查询的表添加到查询的FROM子句中,并将子查询中的条件转换为查询的WHERE子句中的联接或限制。...%NOREDUCE 此可选关键字在流式子查询的FROM子句中指定-返回行的结果集的子查询,即封闭查询的FROM子句中的子查询。它指定编译器优化器应该禁止将子查询(或视图)合并到包含查询中。...在下面的示例中,查询优化器通常会通过对子查询执行Sample.Person的笛卡尔乘积联接来“减少”该查询。%NOREDUCE优化选项可防止出现这种情况。...相反,指定%NOTOPOPT(没有TOP优化)将优化查询,以最快地检索完整的结果集。 %NOUNIONOROPT 此可选关键字在查询或子查询的FROM子句中指定。

    2.1K40

    HiveSQL中的JOIN ON条件,你理解对了吗?

    情况1:过滤条件在子查询,即分别提前过滤要关联的两个表格数据,然后在根据ON条件进行关联。...即便是这样,在实际的开发过程中建议使用情况1的方式进行书写,避免不必要的问题出现。 LEFT JOIN LEFT JOIN对左右表执行笛卡尔乘积,输出满足ON表达式的行。...注意:输出满足ON表达式的行,输出满足ON表达式的行,输出满足ON表达式的行,只是ON条件,不是WHERE条件,此处最容易出问题 示例说明 情况1:过滤条件在子查询 此方式是规范的写法,建议使用此种方式...牢记LEFT JOIN的语义,对于左表中不满足ON表达式的行,输出左表,右表输出NULL RIGHT JOIN 参考LEFT JOIN FULL JOIN 示例说明 FULL JOIN对左右表执行笛卡尔乘积...情况1:过滤条件在子查询,规范写法 SELECT a.* ,b.* FROM ( SELECT * FROM a

    1.6K40

    Oracle数据库增删改查

    中4调数据,15*4=60条, 最终多表查询出的数据就是两张表中的数据量的乘积,这样数据显然存在重复,这种现象叫做笛卡尔积,在查询的时候需要消除笛卡尔积,只需要在查询中增加一个WHERE子句,WHERE...子句的过滤条件是两张数据表中的关联字段相等 DEMO:消除两张数据表的笛卡尔积 总结:1、多表查询就是从多张数据表中查询数据 2、多表查询又叫做连接查询 3、多表查询会产生笛卡尔积,在数据量大的时候不要使用多表查询...DEMO:查询出雇员的编号,姓名,职位,部门名称,部门位置,薪资等级 第一种内连接查询:在FROM 子句中查询多个数据来源,在WHERE子句中去掉笛卡尔积 第二种内连接查询:使用...,在WHERE条件中去掉笛卡尔积 b.使用INNER JOIN 进行连接,在ON 之后去掉笛卡尔积 2、通用的外连接查询 a.左外连接:使用LEFT OUTER JOIN 实现,在ON 之后去掉笛卡尔积...WHERE子句在GROUP BY 子句之前执行,不能在WHERE 子句中使用统计函数 HAVING子句在GROUP BY 子句之后执行,可以在HAVING子句中对统计函数进行过滤 子查询 子查询就是讲一个

    1.6K10

    MySQL多表联合查询

    在实际应用中,应避免使用笛卡尔积,因为笛卡尔积中容易存在大量的不合理数据,简单来说就是容易导致查询结果重复、混乱。...ON 语法是官方的标准写法,而且 WHERE 子句在某些时候会影响查询的性能。 内连接可以查询两个或两个以上的表,为了更好的理解,使用两个表的连接查询。...ON 子句:用来设置右连接的连接条件,不能省略。 注意 右连接以"表2"为基表,"表1"为参考表。右连接查询时,可以查询出"表2"中的所有记录和"表1"中匹配连接条件的记录。...在实际开发时,子查询经常出现在 WHERE 子句中。...例 1:使用子查询在 tb_students_info 表和 tb_course 表中查询学习 Java 课程的学生姓名 mysql> select name from tb_students_info

    10.6K50

    T-SQL基础(二)之关联查询

    JOIN:联接查询时使用 APPLY:用于FROM子句中,分为CROSS APPLY和OUTER APPLY两种形式 PIVOT:用于行转列 UNPIVOT:用于列传行 联接查询 联接查询分为外联接、内联接...、交叉联接,三者的区别在于如何应用逻辑查询处理阶段: 交叉联接仅应用一个阶段——笛卡尔乘积; 内联接应用两个阶段——笛卡尔乘积和基于谓词ON的筛选; 外联结应用三个极端——笛卡尔乘积,基于谓词ON的筛选...CROSS JOIN dbo.UAddress; 得到结果集如下: [1240] 交叉联接 SQL中使用CROSS JOIN语句进行交叉联接查询,在逻辑处理上,交叉联接是最为简单的联接类型,它只获取表的笛卡尔乘积...换句话说,外联接中ON子句的作用是进行表之间关联,如果外联接需要对结果集做进一步的筛选的话不能使用ON...AND...语句,而要使用WHERE条件。...SQL Server也常常出于优化查询的目的,在实际处理查询过程中对联接进行重新排序,但这不会影响到处理结果集的正确性。

    2.2K10

    T-SQL基础(二)之关联查询

    JOIN:联接查询时使用 APPLY:用于FROM子句中,分为CROSS APPLY和OUTER APPLY两种形式 PIVOT:用于行转列 UNPIVOT:用于列传行 联接查询 联接查询分为外联接、内联接...交叉联接 SQL中使用CROSS JOIN语句进行交叉联接查询,在逻辑处理上,交叉联接是最为简单的联接类型,它只获取表的笛卡尔乘积。...内联接的逻辑处理分为两步: 生成笛卡尔乘积 根据谓词ON对笛卡尔乘积进行筛选 与交叉联接一样,内联接有两种写法: USE WJChi; -- 使用JOIN,推荐使用这种方式 SELECT * FROM...换句话说,外联接中ON子句的作用是进行表之间关联,如果外联接需要对结果集做进一步的筛选的话不能使用ON...AND...语句,而要使用WHERE条件。...SQL Server也常常出于优化查询的目的,在实际处理查询过程中对联接进行重新排序,但这不会影响到处理结果集的正确性。

    2.1K40

    【MySQL】02_子查询与多表查询

    WHERE last_name = 'Abel' ); 子查询的基本使用 子查询的基本语法结构: 子查询(内查询)在主查询之前一次执行完成。...= 50); CASE中的子查询 在CASE表达式中使用单列子查询: # 题目:显式员工的employee_id,last_name和location。...一般情况建议你使用自连接,因为在许多 DBMS 的处理过 程中,对于自连接的处理速度要比子查询快得多。...employees CROSS JOIN departments; #错误原因:缺少了多表的连接条件,这种错误简称笛卡尔积错误 笛卡尔积(或交叉连接)的理解 ---- 笛卡尔乘积是一个数学运算。...组合的个数即为两个集合中元素 个数的乘积数 SQL92中,笛卡尔积也称为 交叉连接 ,英文是 CROSS JOIN 。在 SQL99 中也是使用 CROSS JOIN表示交 叉连接。

    2.8K40

    Oracle高级查询-imooc

    注意:在select列表中所有未包含在组函数中的列都应该包含在GROUP BY子句中;包含在GROUP BY子句中的列不必包含在SELECT列表中。...2000; where和having的区别:不能在where子句中使用组函数,可以在having子句中使用组函数。...,并进行笛卡尔全集,连接之后的记录数就是单张表记录数的平方(笛卡尔积行数是两张表行数的乘积)————解决办法:层次查询。...2、书写风格; 子查询应该有缩进,方便阅读。 3、在where,select,having,from中使用; select后只能接单行子查询。...但是实际上多表查询会产生笛卡尔积。 7、获取top-N需要先对数据进行排序,rownum行号是默认排序,要使用子查询先排序在选出,行号只能使用使用>,>=.

    2K40

    MySQL基础-多表查询

    ,结果是将每个员工分配了所有的部门所产生的 2、笛卡尔积的理解 笛卡尔乘积是一个数学运算。...组合的个数即为两个集合中元素个数的乘积数 笛卡尔积的错误会在下面条件下产生: 省略多个表的连接条件(或关联条件) 连接条件(或关联条件)无效 所有表中的所有行互相连接 为了避免笛卡尔积, 可以在 WHERE...FROM table2 注意:执行UNION ALL语句时所需要的资源比UNION语句少 如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率...虽然关联条件可以并到WHERE中和其他条件一起写,但分开写可读性更好 USING:只能和JOIN一起使用,而且要求两个关联字段在关联表中名称一致,而且只能表示关联字段值相等 它与下面的 SQL 查询结果是相同的...虽然关联条件可以并到WHERE中和其他条件一起写,但分开写可读性更好 USING:只能和JOIN一起使用,而且要求两个关联字段在关联表中名称一致,而且只能表示关联字段值相等

    2.8K20

    MySQL数据库,从入门到精通:第六篇——全面掌握MySQL多表查询技巧

    前言 在实际的应用中,单个表往往不能满足我们处理和查询数据的需求,这时就需要使用多表查询技术。MySQL的多表查询涉及到内外连接、笛卡尔积等概念,对于初学者来说会相对较难。...1.2 笛卡尔积(或交叉连接)的理解 笛卡尔乘积是一个数学运算。...组合的个数即为两个集合中元素个数的乘积数。 SQL92中,笛卡尔积也称为 交叉连接 ,英文是 CROSS JOIN 。在 SQL99 中也是使用 CROSS JOIN表示交 叉连接。...在MySQL中如下情况会出现笛卡尔积: #查询员工姓名和所在部门名称 SELECT last_name,department_name FROM employees,departments; SELECT...,在查询字段中、过滤条件中就只能使用别名进行代替,不能使用原有的表名,否则就会报错。

    16110

    MySQL从删库到跑路(五)——SQL查询

    select from TStudent where sname like '%志%'; 7、查询空值 在SELECT语句中使用IS NULL子句,可以查询某字段内容为空记录。...3、交叉连接 交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接有显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。...F、求差操作的时候用联合查询。 三、对查询结果排序 MySQL中可以通过在SELECT使用ORDER BY子句对查询的结果进行排序。...Where子句:从数据源去掉不符合搜索条件的数据; GROUP BY子句:分组,使用统计函数(聚合函数)为每组计算统计值; HAVING子句:在分好的组中去掉每组中不符合条件的数据行。...关键字的子查询 EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断子查询是否返回行,如果至少返回一行,那么EXISTS的结果为true,此时外层查询语句将进行查询;如果子查询没有返回任何行

    2.6K30

    MySQL多表查询笔记总结

    例如,同时从students表和classes表的“乘积”,即查询数据,可以这么写: SELECT * FROM students, classes; 这种一次查询两个表的数据,查询的结果也是一个二维表...这种多表查询又称笛卡尔查询,使用笛卡尔查询时要非常小心,由于结果集是目标表的行数乘积,对两个各自有100行记录的表进行笛卡尔查询将返回1万条记录,对两个各自有1万行记录的表进行笛卡尔查询将返回1亿条记录...但是,用表名.列名这种方式列举两个表的所有列实在是很麻烦,所以SQL还允许给表设置一个别名,让我们在投影查询中引用起来稍微简洁一点: SELECT s.id sid, s.name..., s.gender, s.score, c.id cid, c.name cname FROM students s, classes c; 注意到FROM子句给表设置别名的语法是...小结 使用多表查询可以获取M x N行记录; 多表查询的结果集可能非常巨大,要小心使用。

    43020

    MySQL多表查询笔记总结

    例如,同时从students表和classes表的“乘积”,即查询数据,可以这么写: SELECT * FROM students, classes; 这种一次查询两个表的数据,查询的结果也是一个二维表...这种多表查询又称笛卡尔查询,使用笛卡尔查询时要非常小心,由于结果集是目标表的行数乘积,对两个各自有100行记录的表进行笛卡尔查询将返回1万条记录,对两个各自有1万行记录的表进行笛卡尔查询将返回1亿条记录...但是,用表名.列名这种方式列举两个表的所有列实在是很麻烦,所以SQL还允许给表设置一个别名,让我们在投影查询中引用起来稍微简洁一点: SELECT s.id sid, s.name, s.gender..., s.score, c.id cid, c.name cname FROM students s, classes c; 注意到FROM子句给表设置别名的语法是FROM ...小结 使用多表查询可以获取M x N行记录; 多表查询的结果集可能非常巨大,要小心使用。

    1.7K30

    SQL必知必会:SQL 中的连接

    交叉连接 交叉连接 SQL99 采用的是 CROSS JOIN,常听听说的笛卡尔乘积其实是 SQL92 中的,而交叉连接实际上就是 SQL92 中的笛卡尔乘积,也就是说 交叉连接 == 笛卡尔乘积。...select * from t1 CROSS JOIN t2 CROSS JOIN T3 自然连接 自然连接则是 SQL92 标准中的等值连接,自然连接是一种关联查询方式,它不需要使用 ON 子句指定连接条件...在实际应用中,我们通常会使用明确的连接条件,以确保查询结果的正确性和可预测性。...自连接通常涉及到使用别名,因为需要对同一表进行两次或多次引用。自连接可以用于在一个表中根据某些条件查找与其他记录有关系的记录。 自连接可以对多个表进行操作,也可以对同一个表进行操作。...也就是说查询条件使用了当前表的字段。

    29120

    MySQL的JOIN用法

    1 笛卡尔积 笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。...数据 3 CROSS JOIN 笛卡尔积就是将表1的每条记录与表2中的每一条记录拼成数据对,CROSS JOIN的SQL执行语句如下: SELECT t1.id, t2.id FROM...从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录: SELECT t1.id, t2.id FROM t1 LEFT JOIN...再次从笛卡尔积的角度描述,右连接就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上右表中剩余的记录: SELECT t1.id, t2.id FROM t1 RIGHT...右连接 相关教程 笛卡尔乘积_百度百科 MySQL中的各种join | 雕刻時光 Join查询 | liucw's blog Mysql 连接的使用 | 菜鸟教程 MySQL的JOIN(一):用法

    3.3K20

    SQL语法(五) 多表联合查询

    前言 当需要获取的数据分布在多张中,考虑使用联合查询,本章将学习两种查询方式(sql92/sql99) 范例 1.笛卡儿积 将多个表的数据进行一一对应,所得到结果为多表的笛卡尔积。...结果的数量为所有表的数量的乘积。...–SQL92方式 –表名以逗号隔开实现多表查询 –SQL99方式 –使用cross join 关键字 2.等值连接筛选&不等值连接筛选(内连接) –概念:先做表的笛卡尔积,然后筛选,筛选条件为等值筛选...–where子句中在左边连接字段后加 (+),显示右边对应字段没有值的数据 –SQL99方式 –select 内容 from 表名 right (outer) join 表名 on 连接条件 (...(外连接,outer可以省略不写) 附录:多表联合查询示例(SQL99) --查询所有数据 select * from EMP for update; --笛卡尔积 (1,2,3) (5,6,7)

    3K10

    MySQL常用SQL语句:插入更新删除查询

    not like '%刘%' (8) 在where子句中规定多个值(使用in) select * from student where sno in (218001, 218002, 218004)...从数学的角度讲就是求两个表的交集,从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录。...从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录 #两个表 select * from student left join sc on student.sno...从笛卡尔积的角度描述,右连接就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上右表中剩余的记录 select * from student right join sc on student.sno =...从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录,最后加上右表中剩余的记录。

    6.7K30

    Oracle 高级查询-【联合语句】【联合查询】【层次查询】

    当排序列的数据类型是字符串时,将按照字符串在字母表中的顺序进行排序 SELECT column_name,...|* FROM table_name,......建立子查询的目的是更加有效的限制where 子句中的条件,并可以将复杂的查询逻辑梳理的更加清晰。 子查询可以访问父查询中的数据源,但是父查询不能够访问子查询from子句所定义的数据源。...子查询是根据父查询中的每条记录执行的。...子查询可以使用子查询的位置 : where,select,having,from 不可以使用子查询的位置:group by 一般不在子查询中使用排序 联合语句 联合语句是指两个或多个select...联接查询 联接用于指定多数据源之间如何组合,以形成最终的数据源。如果没有未显示指定联接,那么将获得多个数据源的笛卡尔积。 什么是多表查询 从多个表中获取数据就是多表查询。

    2.2K20
    领券