CHAPTER 3 Query

第三章 查询入门


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;

猜你喜欢

转载自blog.csdn.net/qq_23129193/article/details/84978371