<Learning SQL> O'REILLY_Chap. 3_查询入门

<Learning SQL> O’REILLY_Chap. 3:查询入门

本博客的FollowMeReading系列初衷是在线的读书笔记. 为方便后期查阅, 故写成博客形式, 使用关键字查询便可以快读的找到相关的内容.

FollowMeReading系列所选的书籍一般选自O’REILLY或Apress出版社, 尽量保证笔记内容的权威性.

FollowMeReading系列的博客标题格式为: <书名> 出版社章节数章节名, 方便大家在纸质版书籍中查找.

FollowMeReading系列博文中的内容大部分是原文, 非原文部分前面将有’博主’字样提醒.

感谢<Learning SQL>作者 [美]Alan Beaulieu
感谢<Learning SQL>翻译 张伟超 林青松

正文

查询机制

原文

  • 首先打开mysql命令行工具, 然后使用用户名和密码登录.
  • 一旦服务器通过对用户名和密码的验证, 则为用户创建了一个数据库连接, 该连接从应用程序(即mysql)发出请求后一直保持, 直到应用程序释放连接(如输入quit命令)或者服务器关闭连接(如服务器关机). mysql服务器会给每个连接赋予一个标识符.
scott:~ scott$ mysql -u root -p
Enter password: 

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.11 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
  • 在服务器验证完用户名和密码, 并且创建连接后, 用户就可以执行查询了. 每当查询被发送到服务端是, 服务器在执行语句之前将会进行下面的查询:

    • 用户是否有权执行该语句?
    • 用户是否有权限访问目标数据?
    • 语句的语法是否正确?
  • 如果查询语句通过了这 3 个测试, 就会被传递给查询优化器, 它负责为查询找到最有效率的执行方式. 优化器通常会做诸如from子句后面各表的连接顺序, 或是可以使用哪些索引之类的工作, 然后选择一个执行方案, 以供服务器执行该查询.

  • 当服务器执行完查询之后, 将会向调用程序(mysql工具)返回一个结果集.

查询语句

原文
query子句

子句名称使用目的
select确定结果集中应该包含哪些列
from指明所要提取数据的表, 以及这些表示如何连接的
where过滤不需要的数据
group by用于对具有相同列值的行进行分组
having过滤掉不需要的组
order by按一个或多个列, 对最后结果集中的行进行排序

select子句

原文
尽量select子句是select语句中的第一个组成部分, 但实际上在数据库服务中, 它是最后被评估的.

原文
select子句的作用概括如下:select子句用于在所有可能的列中, 选择查询结果集要包含哪些列.

列的别名

原文
尽管mysql命令行工具为查询所返回的每个列表提供了默认标签, 但或许你希望使用自己定义的标签. 通过在select子句中的每个元素后面增加列别名可以实现此目的.

SELECT emp_id,
  'ACTIVE' status,
  emp_id * 3.1415926 empid_x_pi,
  UPPER(lname) last_name_upper
FROM employee;

/* 上述命令的status, empid_x_pi, last_name_upper就是列的别名. */

去除重复的行

原文
在某些情况下, 查询可能会返回重复的行数, 此时可以在select关键字之后加上distinct关键字.

SELECT DISTINCT cust_id
FROM account;

原文
如果你并需要服务器删除重复的数据, 或者你确信结果集中不会包含重复记录, 那么可以指定ALL关键字来替代DISTINCT关键字. 不过ALL关键字是系统默认的, 不需要被显式地列出.

警告(原文)
注意产生无重复的结果集需要首先对数据排序, 这对于大的结果集来说是相当耗时的. 因此不要为了确保去除重复行而随意的使用DISTINCT, 而是应该先了解所使用的数据是否可能包含重复行, 以减少对DISTINCT的不必要的使用.


from子句

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

表的感念

原文
当使用术语”表”的时候, 大多数人联想到的是存储在数据库中关联行的集合, 但这些实际上知识表的类型之一而已, 我们可以使用更广泛的方式使用这个术语, 去除其中蕴含的”被存储的数据”的含义, 而仅仅考虑其关联行集合的含义. 因此在对”表的”宽泛的定义下, 存在3种类型的表:
* 永久表 (使用 create table 语句创建的表).
* 临时表 (子查询所返回的表).
* 虚拟表 (使用create view 子句所创建的视图).

这3种类型的表都可以在查询的from子句中使用.

子查询产生的表
/* 本例中, 针对employee表的子查询返回5个列, 而外围的查询获取其中的3个列, 在外围查询中, 通过别名(e)来引用子查询. */
SELECT e.emp_id, e.fname, e.lname
FROM (SELECT emp_id, fname, lname, start_date, title FROM employee) e;
视图

原文
视图是存储在数据字典中的查询, 它的行为表现得像一个表, 但实际上并不拥有任何数据(因此称为虚拟表). 当发出一个对视图的查询时, 该查询会被绑定到视图定义上, 以产生最终被执行的查询.

/* 首先定义一个查询employee表的视图. */
CREATE VIEW employee_view AS
  SELECT emp_id, fname, lname,
    year(start_date) start_year
  FROM employee;

当视图被创建后, 并没有产生或存储任何数据, 服务器只是简单的保留该查询以供将来使用

/* 对视图进行查询. */
SELECT  emp_id, start_year
FROM employee_view;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值