查询机制
- 打开mysql命令行工具,使用用户名和密码登陆
- 一旦服务器通过用户名和密码的验证,则为用户成立一个数据库链接
- 该连接从应用程序发出请求后一直保持,直到应用程序释放连接
- 数据库服务器会为每个连接赋予一个标识符(ID),当发生异常情况时,ID可以提供帮助(手动结束有问题的查询)。
- 执行查询语句,每个查询会进行以下检查:
用户是否有权限执行该语句?
用户是否有权限访问目标数据?
语句的语法是否正确?
- 通过测试后,查询会被传递给查询优化器,负责为查询找到最有效率的执行方式。
如何建立索引、分析执行方案等。
查询语句
query子句:select
:确定结果集中应该包含那些列from
: 指明所要提取数据的表,以及这些表是如何连接的where
:过滤不需要的数据group by
:用于对具有相同列值的行进行分组having
:过滤掉不需要的组order by
:按一个或多个列,对最后结果集中的行进行排序
SELECT
- 列的别名:mysql命令行工具为查询所返回的每个列提供了默认标签,但是可以使用自定义标签。
1)在每个查询的列后面直接加空格和别名(mysql)
2)在每个别名前面使用as
关键字(java、c#) - 去除重复的行:使用
dinsinct
去除重复的行,但是需要先排序(会十分耗时)
SELECT DISTINCT columns FROM table_name;
FROM
一般包含三种类型的表:
1)永久性表(create table
创建的);
2)临时表(子查询所返回的表);
3)虚拟表(create view
子句所创建的视图)。
视图是存储在数据字典中的查询,行为像一张表,但实际上并不拥有任何数据
CREATE VIEW table_view AS SELECT ... ...;
SELECT ... FORM table_view;
定义表别名:与列的命名方式类似
Group By
对数据库在返回结果前对数据进行提炼,一种方式是group by,用于根据列值对数据进行分组。