理解SQL
2016-04-13 14:28
134 查看
SQL是一种声明式的语言
SQL语言只是告知数据库你想取得什么样的数据结果,不告知数据库如何去取得这个数据结果
SQL执行顺序不同于语法顺序
一般情况下SQL的语法顺序如下:
SQL的执行顺序如下:
应注意如下几点:
(1)SQL是基于集合理论的,集合仅仅是数据的逻辑集合,不会对数据进行排序,所以不要为表中的行假定任何顺序
(2)FROM是整个SQL语句执行的起点,它将数据从磁盘加载到数据缓冲区中
(3)SELECT语句在FROM、WHERE和GROUP BY之句之后执行,所以,不能在WHERE子句中引用SELECT设定的别名
(4)SQL语法和执行上UNION都在ORDER BY之前,所以不是每个UNION中的字段都能进行排序
(5)ORDER BY是唯一可以使用SELECT子句中设定的别名的地方,它返回的不再是虚拟表,而是一个游标,所以使用了ORDER BY的子查询不能用作表表达式(视图、子查询、派生表等)
三、SQL的核心是对表的引用
从上面SQL的执行中可以看到每一步都是产生一张表(ORDER BY除外),所以SQL的核心是对表的引用,从集合理论的角度来看一张数据库表对应一组数据元,每个SQL子句的执行就会改变数据元的关系,从而生成新的数据元,也就产生了新的表
四、SQL的表连接
SQL中尽量使用JOIN而不要使用逗号在FROM中连接表
SQL中的连接可以分为5类:EQUI JOIN、SEMI JOIN、ANTI JOIN、CROSS JOIN、DIVISION
EQUI JOIN主要包括两种连接:INNER JOIN和OUTER JOIN(LEFT、RIGHT、FULL OUTER JOIN)
SEMI JOIN主要包括IN和EXISTS,SEMI在拉丁文中是半的意思,只连接目标表的一部分,使用IN与EXISTS之间并没有性能上的差异(尽管有些数据性能上的差异非常大),通常我们会有通过INNER JOIN后DISITINCT进行去重操作,但这样性能非常低下,所以不建议这么做
ANTI JOIN与SEMI JOIN相反,有NOT IN与NOT EXISTS
CROSS JOIN连接的结果时两个表的乘积
DIVISION是JOIN的一个逆过程,比较少用
五、SQL语句中GROUP BY是对表的引用进行的操作
注意:当你是使用GROUP BY子句时,SELECT后没有使用聚合函数的列都要出现在GROUP BY后面,但MySQL并非这样
SQL语言只是告知数据库你想取得什么样的数据结果,不告知数据库如何去取得这个数据结果
SQL执行顺序不同于语法顺序
一般情况下SQL的语法顺序如下:
SELECT [DISTINCT] FROM JOIN ON WHERE GROUP BY HAVING UNION ORDER BY
SQL的执行顺序如下:
FROM 对FROM中的前两个表执行笛卡尔积,生成虚拟表VT_1 ON 对VT_1使用ON条件进行过滤,生成虚拟表VT_2 JOIN 根据不同的连接类型确定保留表和需要插入到VT_2中的数据,生成虚拟表VT_3,若FROM多张表则重复上述操作WHERE 对VT_3表使用WHERE条件进行过滤,生成虚拟表VT_4 GROUP BY 对VT_4表使用GROUP BY中的列进行分组,生成虚拟表VT_5 HAVING 对VT_5表使用HAVING条件进行过滤,生成虚拟表VT_6 SELECT 选择出SELECT列出的列,生成虚拟表VT_7 DISTINCT 去除VT_7表中重复的行,生成虚拟表VT_8 UNION ORDER BY 对VT_8按照ORDER BY中的列进行排序,返回一个游标
应注意如下几点:
(1)SQL是基于集合理论的,集合仅仅是数据的逻辑集合,不会对数据进行排序,所以不要为表中的行假定任何顺序
(2)FROM是整个SQL语句执行的起点,它将数据从磁盘加载到数据缓冲区中
(3)SELECT语句在FROM、WHERE和GROUP BY之句之后执行,所以,不能在WHERE子句中引用SELECT设定的别名
(4)SQL语法和执行上UNION都在ORDER BY之前,所以不是每个UNION中的字段都能进行排序
(5)ORDER BY是唯一可以使用SELECT子句中设定的别名的地方,它返回的不再是虚拟表,而是一个游标,所以使用了ORDER BY的子查询不能用作表表达式(视图、子查询、派生表等)
三、SQL的核心是对表的引用
从上面SQL的执行中可以看到每一步都是产生一张表(ORDER BY除外),所以SQL的核心是对表的引用,从集合理论的角度来看一张数据库表对应一组数据元,每个SQL子句的执行就会改变数据元的关系,从而生成新的数据元,也就产生了新的表
四、SQL的表连接
SQL中尽量使用JOIN而不要使用逗号在FROM中连接表
SQL中的连接可以分为5类:EQUI JOIN、SEMI JOIN、ANTI JOIN、CROSS JOIN、DIVISION
EQUI JOIN主要包括两种连接:INNER JOIN和OUTER JOIN(LEFT、RIGHT、FULL OUTER JOIN)
SEMI JOIN主要包括IN和EXISTS,SEMI在拉丁文中是半的意思,只连接目标表的一部分,使用IN与EXISTS之间并没有性能上的差异(尽管有些数据性能上的差异非常大),通常我们会有通过INNER JOIN后DISITINCT进行去重操作,但这样性能非常低下,所以不建议这么做
ANTI JOIN与SEMI JOIN相反,有NOT IN与NOT EXISTS
CROSS JOIN连接的结果时两个表的乘积
DIVISION是JOIN的一个逆过程,比较少用
五、SQL语句中GROUP BY是对表的引用进行的操作
注意:当你是使用GROUP BY子句时,SELECT后没有使用聚合函数的列都要出现在GROUP BY后面,但MySQL并非这样
相关文章推荐
- redis.conf的配置说明
- 修改mysql中普通用户的密码
- mysql 忘记root 密码的解决方法
- SET FOREIGN_KEY_CHECKS=0;在Mysql中取消外键约束
- ambari-server启动报错 mysqladmin flush-hosts
- mysql运维-二进制日志BINARY LOG清理
- Node.js使用MongoDB模块时的常见错误
- PowerDesigner的使用安装和数据库创建
- Oracle:PL/SQL Developer 创建一个新用户
- Redis主从设置配置
- Mysql命令
- 利用NPOI组件操作Excel-数据库与EXCEl之间的操作
- mysql常用函数
- oracle--merge
- Hive在Mysql中对应的重要表说明
- Oracle数据库动态SQL生成游标
- SAP SYBASE16数据库恢复
- CDH Mysql数据库 JDBC driver cannot be found.
- linux下Oracle显示中文乱码
- 安装mysql后,开启远程登录