上个笔记中介绍了一些关于数据库、SQL的基础知识,并且创建我们后续练习所需的数据库、表以及表之间的关系,从本文开始进入我们的正题:SQL语句的练习。



正如上个笔记中所说,SQL语句是由简单的英语单词构成。这些单词称为关键字,每个SQL语句都是由一个或多个关键字构成的。

  • 关键字(keyword):作为SQL组成部分的保留字。关键字不能用作表或列的名字。书中附录E列出了某些经常使用的保留字。

注意:SQL是一种语言,而不是一个应用程序。具体如何写SQL语句并显示语句输出,是随不同应用程序而变化的。


1.检索数据(SELECT语句)

SELECT语句:

  • SELECT语句大概是SQL语句中最经常使用的语句,它的用途是:从一个或多个表中检索一个或多个数据列。

  • 为了使用SELECT检索数据,必须至少给出两条信息:

    想选择什么;
    从什么地方选择;

1.1 检索列

1.1.1 检索单个列,语句:

SELECT 列名
FROM 表;

分析:

  • 该语句将返回表中该列的所有行

注意:

  • SQL语句不区分大小写,因此SELECT和select是相同的。
  • 不过要注意,虽然SQL是不区分大小写的,但是表名、列名和值可能有所不同。(要根据具体DBMS及其配置来看)
  • 在处理SQL语句时,其中所有空格都被忽略。所以SQL语句可以写成长长的一行,也可以分写在多行。不过,多数SQL开发人员认为,将SQL语句分成多行更容易阅读和理解。

1.1.2 检索多个列,语句:

SELECT 列名1,列名2,列名3
FROM 表;

注意:

  • 列名之间用逗号隔开;
  • 最后一个列名后不加逗号

    1.2.3 检索所有列,语句:
SELECT *
FROM 表;

分析:

  • *为通配符;
  • 在这里使用 *通配符,结果返回表中所有列。列的顺序一般是列在表定义中出现的物理顺序,但并不总是如此。

注意:

  • 谨慎使用 *通配符。除非你确实需要表中的每一列,否则最好别使用 *通配符。
  • 使用 *通配符有一个大优点:能检索出列名未知的列。

1.2 检索不同的值(DISTINCT)

语句:

SELECT DISTINCT 列名
FROM 表;

分析:

  • 在列名前加上DISTINCT关键字,则指示DBMS只返回该列不同(具有唯一性)的行

注意:

  • 如果使用DISTINCT关键字,它必须直接放在第一个列名的前面;
  • 不能部分使用DISTINCT关键字。它作用于所有的列,不仅仅是跟在其后面那一列。也就是说,该关键字后面有多个列的话,则返回该列组合具有唯一性的行。

1.3 限制结果(LIMIT、OFFSET)(DBMS:MySQL)

  • 语句1:
SELECT 列名
FROM 表
LIMIT 5;
  • 语句2:
SELECT 列名
FROM 表
LIMIT 5 OFFSET 2;
  • 语句3:
SELECT 列名
FROM 表
LIMIT 5,2;

分析:

  • 语句1返回:从第1行开始,最多5行的数据;

  • 语句2返回:从第3行开始,最多5行的数据;

    OFFSET后面的数字表示:从哪开始;
    LIMIT后面的数字表示:检索的行数;
  • 语句3:语句2的简化版,逗号之前的值对应OFFSET,之后的值对应LIMIT;

注意:

  • 并非所有的SQL实现都一样。非常基本的语句往往是容易移植的,但较复杂的语句就不同了。要视具体的DBMS而定。

1.4 使用注释(–、#、/* */)

  • 行内注释:
形式1:
SELECT 列名 -- 这是一条注释
FROM 表; 形式2:
# 这是一条注释
SELECT 列名
FROM 表;
  • 多行注释:
/* SELECT prod_name, vend_id
FROM Products; */
SELECT prod_name
FROM
Products;

分析:

  • 在行内注释中,形式2很少得到支持。但是MySQL中是支持的。

  • 多行注释中,

    注释从 /* 开始,到 */ 结束,/* 和 */之间的任何内容都是注释。
    这种方式常用于给代码加注释。

2.排序检索数据(ORDER BY子句)

本小节将介绍如何使用SELECT语句的ORDER BY子句,根据需要排序检索出的数据。

通过SELECT检索出的数据,如果不排序,数据一般将以它在底层表中出现的顺序显示,这有可能是数据最初添加到表中的顺序。但是,如果数据随后进行过更新或删除,就不一定了。因此,关系数据库设计理论认为,如果不明确规定排序顺序,则不应假定检索出的数据的顺序有任何意义

子句(clause):

  • SQL语句由子句构成,有些子句是必需的,有些则是可选的。一个子句通常由一个关键字加上所提供的数据组成。
  • 子句的例子有前面看到的,SELECT语句的FROM子句。

2.1 按列名排序数据

为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。

  • 单个列名排序,语句:
SELECT 列名
FROM 表
ORDER BY 列名;
  • 多个列名排序,语句:
SELECT 列名1,列名2,列名3
FROM 表
ORDER BY 列名1,列名2;

提示:

  • 通过非选择列进行排序。用非检索的列排序数据是完全合法的。
  • 多个列名排序时,首先按列名1,然后按列名2排序。也就是说,只有多个行具有相同的列名1的值时,才继续按照列名2进行排序。如果列名1中所有的值都是唯一的,则不会继续按列名2排序。

注意:

  • ORDER BY子句的位置。应保证它是SELECT语句中最后一条子句,否则会出错。

2.2 按列位置排序

除了能用列名指出排序顺序外,ORDER BY还支持按相对列位置进行排序。

语句:

SELECT 列名1,列名2,列名3
FROM 表
ORDER BY 2,3;

提示:

  • 按列位置排序时,无法使用非检索列进行排序。
  • 若有必要,可以混合使用实际列名和相对列位置。

2.3 指定排序方向

利用DESC(降序)、ASC(升序、默认)

  • 单个列排序,语句:
SELECT 列名1,列名2,列名3
FROM 表
ORDER BY 列名1 DESC;
  • 多个列排序,语句:
SELECT 列名1,列名2,列名3
FROM 表
ORDER BY 列名1 DESC, 列名2;

分析:

  • DESC关键字之应用到直接位于其前面的列名。
  • 若想在多个列上进行降序排序,必须对每一列指定DESC关键字。

提示:

  • 区分大小写与排序顺序。在字典排序顺序中,A与a相同,大多数DBMS也默认这种顺序。

参考资料:

1.《SQL必知必会》Ben Forta。

最新文章

  1. Web 开发人员必备的随机 JSON 数据生成工具
  2. Mysql 学习笔记 20140219
  3. 解决matplotlib中文乱码问题(Windows)
  4. 51nod 平均数(二分+树状数组)
  5. 万网空间如何安装wordpress
  6. Android HttpClient get传递数组
  7. 原生js方法document.getElementsByClassName在ie8及其以下的兼容性问题
  8. 报错:loaded the "" nib but didn't get a UITableView
  9. Android开发之style属性和提前定义样式
  10. 你可以不知道原因,但是,我们不能停止努力。httplook抓取路由配置界面信息
  11. [转] Building xnu for OS X 10.10 Yosemite
  12. Arduino 不同Arduino衍生板子的问题
  13. Spring AOP中的动态代理
  14. h5分享页面打开APP
  15. Intellij IDEA导入eclipse项目配置jdk、tomcat到浏览器正常访问
  16. HDU - 5073 Galaxy(数学)
  17. ES--01
  18. 深入理解linux关闭文件和删除文件
  19. Java利用递归实现扫雷
  20. 使用u盘重装双系统中的乌班图

热门文章

  1. iOS直播集成和问题总结(阿里云直播)
  2. Lesson 12 banks and their customers
  3. MyBatis 学习二之简单练习巩固
  4. jqGrid一次性读取本地数据
  5. 初识PromQL
  6. java创建线程方式
  7. 有时间会做系列一(Dice)
  8. 留学生想要搞定Reading List?只需这三步即可
  9. NO27 定时任务
  10. LR_问题_平均响应时间解释,summary与analysis不一致----Summary Report中的时间说明