第三章 查询入门
3.1 查询机制
当把查询发送到服务端时,服务器会在执行语句前进行如下三点检查:
- 用户是否有权限执行该语句
- 用户是否有权限访问目标数据
- 语句的语法是否正确
通过后查询语句就会被传递给查询优化器,它将为查讯找到最有效率的执行方式。
3.2 查询语句
SELECT语句:
query子句(属于ANSI标准)
子句名称 | 使用目的 |
---|---|
select | 确定结果集包含哪些列 |
from | 指明所需要提取数据的表,以及这些表示如何连接的 |
where | 过滤 |
group by | 用于对具有相同列值的行进行分组 |
having | 过滤掉不需要的组 |
order by | 按一个或多个列,对最后结果集中的行进行排序 |
limit | 限制结果集的记录数(行数) |
into outfile | 将查询结果写入一个文件中(该方法可用FIELDS TERMINATED BY '_'来定义保存文档分隔符,还可以用LINES TERMINATED BY ''来取代换行符) |
3.3 SELECT子句
第一个部分,但是最后一个被评估。
作用:用于在所有可能列中,选择查询结果集所要包含哪些列。
注:可在SELECT部分可添加字符串或数字,表达式,调用内建函数,调用用户自定义函数。
3.3.1 列的别名
SELECT emp_id,'ACTIVE' AS status, emp_id*3.14159 AS emp_id_X3,
UPPER(lname) AS last_name_upper
FROM employee;
在Java或C#中进行查询时,这样做能使得输出结果更便于理解。
3.3.2 去除重复的行
在SELECT语句后加上DISTINCT关键字,以去重。
3.4 FROM语句
3.4.1 表的概念
- 永久表(使用create table语句创建的表)
- 临时表(子查询所返回的表)
SELECT e.emp_id,e.fname,e,lname
FROM(SELECT emp_id,fname,lname,start_data,title
FROM employee) e;
- 虚拟表(使用create view子句所创建的视图)
CREATE VIEW employee_vw AS
SELECT emp_id, fname, lname,
YEAR(start_date) start_year
FROM employee;
3.4.2表连接
如果FROM语句后又不止一个表,根据ANSI,要求同时包含各表之间的连接条件。
SELECT employee.emp_id,employ.fname,
employee.lname,department.name dept_name
FROM employee INNER JOIN department
ON employee.dept_id = department.dept_id;
这里的连接条件为ON employee.dept_id = department.dept_id
3.4.3 定义表别名
在FROM语句中引用表时可在表后面空格(或加上AS语句)加别名定义表别名,则该select语句可用别名调用表。
3.5 where子句
过滤语句,可包含多个过滤条件,用AND语句或OR语句连接。同时用AND 和OR 语句时,需要用括号括起来。
3.6 group by和having子句
SELECT d.name,COUNT(e.emp_id) num_employees
FROM department d INNER JOIN employee e
ON d.dept_id=e.dept_id
GROUP BY d.name
HAVING COUNT(e.emp_id)>2;
3.7 order by 子句
3.7.1 升序或降序排序
默认下是升序排序,若想改为降序,在ORDER BY 名称后面加上一个DESC即可。
3.7.2 根据表达式排序
对于某些识别号码,你可能需要用一组数据中的几个数据进行排序,这时候就要求用到一些特殊方法,如:
ORDER BY RIGHT(emp_id,3)
就表示根据emp_id的最右边三个数字进行排序。
3.7.3 根据数字占位符排序
可以按SELECT子句选出的列数位置来排序,如:
SELECT emp_id, title, start_date, fname, lname
FROM employee
ORDER BY 2, 5;