SQL查询入门

    本文是基本的SQL查询语句用法,内容主要来自Alan Learning SQL这本书第3章,包括select,from,where,group by,having,order by六个查询子句,后续会深入介绍每个查询子句的用法。

1. 查询机制

在已经创建数据库连接的情况下,当查询被发送到服务器端时,服务器在执行查询语句之前需要进行检查:

  1. 用户是否有权限执行该语句?
  2. 用户是否有权限访问目标数据?
  3. 语句的语法是否正确?

通过3项检查后,传递给查询优化器,从from语句开始执行。

2. 查询语句

一般来说,查询语句包含以下6个子句中的2-3个

3. select子句

select子句用于结果集中需要显示的列

尽管select子句是查询语句中第一个组成部分,但实际上在数据库服务中,它是最后被评估的,因为在确定结果集最后包含哪些列之前,必须先要知道结果集所有可能的列。

select 语句除了能选择表中的列,还可以包含其他内容,包括:

  1. 字符
  2. 表达式,比如emp_id*3.14
  3. 调用内建函数,比如UPPER(lname)
  4. 用户自定义函数

也可以对查询的列名设置别名,例如:

mysql> SELECT emp_id,

                 -> 'ACTIVE' status,

                 -> emp_id * 3.14159 empid_x_pi,

                 -> UPPER(lname) last_name_upper

          -> FROM employee;

status, empid_x_pi等是列的别名,使得输出结果更容易理解,有时为了清楚的表示别名,一般加挂检测AS

如:mysql> SELECT emp_id,

                 -> 'ACTIVE' AS status,

                 -> emp_id * 3.14159 AS empid_x_pi,

                 -> UPPER(lname) AS last_name_upper

          -> FROM employee;

4. from子句

from子句 定义查询中所使用的表,以及这些表的连接方式。

4.1 表的概念

其中表既包括永久表(create table产生的表),也包括临时表(子查询所返回的表),虚拟表(使用create view子句创建的试图)

比如子查询产生的表

SELECT e.emp_id, e.fname, e.lname

FROM (SELECT emp_id, fname, lname, start_date, title

              FROM employee) e;

4.2 表的连接

目前表中为ANSI标准,引入了ON语句,举例:

SELECT e.emp_id, e.fname, e.lname, d.name dept_name  #d.name 使用别名dept_name

FROM employee e INNER JOIN department d          ## 使用了表别名employee e

ON e.dept_id = d.dept_id;

表别名也可以使用AS关键词,比如 FROM employee AS e INNER JOIN department AS d

5. Where子句

Where子句用于在结果集中过滤掉不需要的行。

可以使用 AND,OR,NOT包含更多的条件

SELECT emp_id, fname, lname, start_date, title

FROM employee

WHERE (title = 'Head Teller' AND start_date > '2006-01-01')

        OR (title = 'Teller' AND start_date > '2007-01-01');

6. group by和having子句

group by对查询结果进行分组,having对分组结果进行过滤(类似于where子句,但此处不能用Where子句,二者的区别https://www.cnblogs.com/yzdqxing/p/4603508.html

例如:

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;

7. order by子句

order by子句对结果集中原始列或者计算表达式的结果进行排序。

例如:

SELECT open_emp_id, product_cd

FROM account

ORDER BY open_emp_id, product_cd;

默认是排序为升序,如果需要降序,可以加上关键词DESC

SELECT account_id, product_cd, open_date, avail_balance

FROM account

ORDER BY avail_balance DESC;

也可以对表达式进行排序:

SELECT cust_id, cust_type_cd, city, state, fed_id

FROM customer

ORDER BY RIGHT(fed_id, 3);

还可以制定列的位置进行排序,比如用第2列和第5列进行排序:

SELECT emp_id, title, start_date, fname, lname

FROM employee

ORDER BY 2, 5;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章