【MySQL】查询顺序与查询SQL
SQL执行过程
执行过程
我们发送一条SQL给数据库,其实数据库并没有马上执行,而是进行预处理,对SQL进行分析和优化,可以说最终执行的SQL不一定是我们提交的SQL。整个过程非常繁杂,详细过程见下图:
虚拟表
数据库提供临时表、内存表、永久表,虚拟表一般要么是临时表,要么是内存表,用完就删除。永久表则数据会存储在磁盘中。
游标
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。
游标类似java中的foreach循环,每次调用都自动走向下一行数据。
执行顺序
(8) SELECT (9) DISTINCT column,… 选择字段、去重
(6) AGG_FUNC(column or expression),… 聚合
(1) FROM [left_table] 选择表
(3) <join_type> JOIN <right_table> 链接
(2) ON <join_condition> 链接条件
(4) WHERE <where_condition> 条件过滤
(5) GROUP BY <group_by_list> 分组
(7) HAVING <having_condition> 分组过滤
(10) ORDER BY <order_by_list> 排序
(11) LIMIT count OFFSET count; 分页
SELECT
a. select_expr
-- 可以使用表达式(计算公式、函数调用、字段也是个表达式)
select stu, 29+25, now() from tb;
-- 可以为每个列使用别名。适用于简化列标识,避免多个列标识符重复。
- 使用 as 关键字,也可省略 as.
select stu+10 as add10 from tb;
①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
② 要查询的东西 可以是常量值、可以是表达式、可以是字段、可以是函数
数值型和日期型的常量值必须用单引号引起来,数值型不需要
b. FROM 子句
用于标识查询来源。
-- 可以为表起别名。使用as关键字。
SELECT * FROM tb1 AS tt, tb2 AS bb;
-- from子句后,可以同时出现多个表。
-- 多个表会横向叠加到一起,而数据会形成一个笛卡尔积。
SELECT * FROM tb1, tb2;
-- 向优化符提示如何选择索引
USE INDEX、IGNORE INDEX、FORCE INDEX
SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3;
SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;
c. WHERE 子句
-- 从from获得的数据源中进行筛选。
-- 整型1表示真,0表示假。
-- 表达式由运算符和运算数组成。
-- 运算数:变量(字段)、值、函数返回值
-- 运算符:
=, <=>, <>, !=, <=, <, >=, >, !, &&, ||,
in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor
is/is not 加上ture/false/unknown,检验某个值的真假
<=>与<>功能相同,<=>可用于null比较
-- 条件表达式
> < >= <= = != <>不等于,注意等于是=
-- 逻辑表达式
and(&&):两个条件如果同时成立,结果为true,否则为false
or(||):两个条件只要有一个成立,结果为true,否则为false
not(!):如果条件成立,则not后为false,否则为true
and并且,or或者 需要加括号
-- 模糊查询
like
通配符:
%任意多个字符
_任一个字符,可以用转义符
between x and y 在x和y之间的值
WHERE sal BETWEEN 5000 AND 10000;
等价于
WHERE sal >= 5000 AND sal <= 10000;
in//NOT IN
SELECT * FROM `employees`