【SQL必知必会笔记(2)】检索数据、排序检索数据

时间:2021-10-31 21:48:02

上个笔记中介绍了一些关于数据库、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。

【SQL必知必会笔记(2)】检索数据、排序检索数据的更多相关文章

  1. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  2. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  3. 《SQL必知必会》学习笔记二&rpar;

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  4. 【SQL必知必会笔记&lpar;3&rpar;】SELECT语句的WHERE子句数据过滤操作

    上个笔记主要介绍了利用SELECT语句检索单个/多个/所有列,并利用DISTINCT关键字检索具有唯一性的值.利用LIMIT/OFFSET子句限制结果:以及利用ORDER BY子句排序检索出的数据,主 ...

  5. 读书笔记--SQL必知必会12--联结表

    12.1 联结 联结(join),利用SQL的SELECT在数据查询的执行中联结表. 12.1.1 关系表 关系数据库中,关系表的设计是把信息分解成多个表,一类数据一个表,各表通过某些共同的值互相关联 ...

  6. 0005 《SQL必知必会》笔记01-SELECT语句

    1.SELECT基本语句: SELECT 字段名1,···,字段名n FROM 表名 2.检索所有字段,用"*"替换字段名,这会导致效率低下 SELECT * FROM 表名; 3 ...

  7. 图灵程序设计丛书&lpar;SQL必知必会&rpar;笔记

    SQL必知必会 第二课:检索数据 1.分页 (1).SQL Server 栗子 : select top 2 columns from tableName (2).Oracle 栗子 :select ...

  8. 《SQL必知必会》笔记

    SQL必知必会(第4版) 作者:[美]Ben Forta 本书介绍了sql在不同数据库工具(Oracle.SQLite.SQL server.MySQL.MariaDB.PostgreSQL...)是 ...

  9. SQL语法语句总结&lpar;《SQL必知必会》读书笔记&rpar;

    一.SQL语句语法 ALTER TABLE ALTER TABLE 用来更新已存在表的结构. ALTER TABLE tablename (ADD|DROP column datatype [NULL ...

随机推荐

  1. Node&period;js 安装与配置

    引言: JavaScript是一种运行在浏览器的脚本,它简单,轻巧,易于编辑,这种脚本通常用于浏览器的前端编程,但是一位开发者Ryan有一天发现这种前端式的脚本语言可以运行在服务器上的时候,一场席卷全 ...

  2. tab选项卡&lpar;选择上面的菜单&comma;下面出现对应的不同的内容&rpar;

    使用jQuery完成 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  3. Python MySQL ORM QuickORM hacking

    # coding: utf-8 # # Python MySQL ORM QuickORM hacking # 说明: # 以前仅仅是知道有ORM的存在,但是对ORM这个东西内部工作原理不是很清楚, ...

  4. elasticsearch从mysql导入数据

    详细:https://github.com/jprante/elasticsearch-jdbc(最下面有各数据库的导入方法说明) elasticsearch版本为1.5.2 1.下载 elastic ...

  5. 用实例给新手讲解RSA加密算法

    图为 RSA公开密钥算法的发明人,从左到右Ron Rivest, Adi Shamir, Leonard Adleman. 照片摄于1978年 RSA加密算法是最常用的非对称加密算法,CFCA在证书服 ...

  6. 指尖上的电商---&lpar;2&rpar;Solr全文搜索引擎的准备工作

    Solr是一个基于Lucene的全文搜索引擎.提供了更丰富的搜索语言.更灵活的配置.更高的查询效率. 一句话.与Lucene相比.有过之而无不及.这一节里, 主要谈论两个知识点:Jdk的安装和Tomc ...

  7. HDU 4763 Theme Section

    题目: It's time for music! A lot of popular musicians are invited to join us in the music festival. Ea ...

  8. SpringMVC注解控制器详解

    主要包括四类:@Component.@Repository @Service.@Controller 说明: @Controller 控制层,就是我们的action层 @Service 业务逻辑层,就 ...

  9. 死磕 java集合之PriorityQueue源码分析

    问题 (1)什么是优先级队列? (2)怎么实现一个优先级队列? (3)PriorityQueue是线程安全的吗? (4)PriorityQueue就有序的吗? 简介 优先级队列,是0个或多个元素的集合 ...

  10. rest framework 分页,版本

    分页 分页器的引入 from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorP ...