01-03章 检索排序数据

第1章 了解SQL

1.1 数据库基础

数据库(database)
数据库软件称为数据库管理系统(DBMS),数据库是通过 DBMS 创建和操纵的容器。

表(table)
某种特定类型数据的结构化清单,存储在表中的数据是同一种类型的数据或清单。

数据库中每个表都有唯一的名字标识自己,实际上是数据库名和表名等的组合。

表的特性定义数据在表中如何存储,存储哪类数据,数据如何分解,各部分信息如何命名等。
模式(schema)用来描述数据库中特定的表,也可以用来描述整个数据库(和其中表的关系)。

列和数据类型
表由列(column)组成,列存储表中某部分的信息,每个列都有相应的数据类型(datatype)。而行(row)是表中的一个记录。

主键(primary key)
有一列(或几列),用于唯一标识表中的每一行。任何列作为主键的条件:

  • 任意两行都不具有相同的主键值;
  • 每一行都必须具有一个主键值(主键列不允许NULL值);
  • 主键列中的值不允许修改或更新;
  • 主键值不能重用(某行从表中删除,它的主键不能赋给以后的新行)。

第2章 检索数据

2.1 SELECT语句

用于从一个或多个表中检索信息,必须指定两条信息,想选择什么,从什么地方选择。

关键字(keyword)
作为SQL组成部分的保留字,关键字不能用作表或列的名字。

2.2 检索单个列

用SELECT语句从Products表中检索名为prod_name的列。

SELECT prod_name FROM Products;
屏幕快照 2018-05-28 06.24.07.png

说明

  • 如果没有要求排序查询结果,则返回的数据没有特定的顺序。
  • 以上SELECT语句将返回表中所有行,数据没有过滤。
  • 多条SQL语句必须以分号(;)分隔。
  • SQL关键字应大写,列名和表名应小写。

2.3 检索多个列

在SELECT关键字后给出多个列名,列名之间必须以逗号分隔。

SELECT prod_id, prod_name, prod_price FROM Products;
屏幕快照 2018-05-24 05.34.56.png

说明
SQL语句一般返回原始的、无格式的数据。数据的格式化是表示问题,而不是检索问题。因此,表示(如把上面的价格值显示为正确的十进制数值货币金额)一般在显示该数据的应用程序中规定。

2.4 检索所有列

SELECT语句可以检索所有的列,在实际列名的位置使用星号(*)通配符。

SELECT * FROM Products;

2.5 检索不同的值

想检索Products表中所有供应商的ID(vend_id):

SELECT vend_id FROM Products;
屏幕快照 2018-05-28 06.30.40.png

SELECT语句返回9行(即使表中只有3个产品供应商),因为Products表中有9种产品。那么如何检索出不同的值?

使用DISTINCT关键字,作用于所有列,指示数据库只返回不同的值。

SELECT DISTINCT vend_id FROM Products;
屏幕快照 2018-05-28 06.32.36.png

2.6 限制结果

SELECT语句返回指定表中所有匹配的行,很可能是每一行。如果只想返回第一行或者一定数量的行,该如何操作?

在 SQL Server 中使用 SELECT 时,用 TOP 关键字来限制最多返回多少行:

SELECT TOP 5 prod_name FROM Products;
屏幕快照 2018-05-28 06.33.43.png

在 MySQL、MariaDB、PostgreSQL 或 SQLite,使用 LIMIT 子句:

SELECT prod_name FROM Products LIMIT 5; 

LIMIT 5 指示 MySQL 等 DBMS 返回不超过 5 行的数据。为了得到后面的 5 行数据,需要指定从哪儿开始以及检索的行数:

SELECT prod_name FROM Products LIMIT 5 OFFSET 5;

LIMIT 5 OFFSET 5指示返回从第 5 行起的 5 行数据。

  • LIMIT 指定返回的行数。
  • LIMIT 带的 OFFSET 指定从哪儿开始。
  • 例子中,Products表只有 9 种产品,所以 LIMIT 5 OFFSET 5 只返回 4 行数据。
屏幕快照 2018-05-28 06.36.27.png

注意
第 0 行,第一个被检索的行是第 0 行,而不是第 1 行。因此,LIMIT 1 OFFSET 1 会检索 1 行,从第 2 行开始。

MySQL、MariaDB 和 SQLite 支持简化版 LIMIT 4 OFFSET 3 语句,即
LIMIT 3,4
使用此语法,逗号之前的值对应 OFFSET,逗号之后的值对应 LIMIT。

2.7 使用注释

SQL 语句是由 DBMS 处理的指令。如果希望包括不进行处理和执行的文本,应使用注释。

行内注释

SELECT prod_name       -- 这是一条注释
FROM Products;

使用--(两个连字符)嵌在行内,-- 之后的文本就是注释。

多行注释

/* SELECT prod_name, vend_id FROM Products; */
SELECT prod_name FROM Products; 

注释从/*开始到*/结束,之间的任何内容都是注释。常用于给代码加注释,这里定义了两个 SELECT 语句,但是第一个不会执行,因为它已经被注释掉。

第3章

3.1 排序数据

子句(clause)
SQL 语句由子句构成,有些是必需的,有些是可选的。一个子句通常由一个关键字加上所提供的数据组成。

使用 ORDER BY 子句以字母顺序排序数据,取一个或多个列的名字,据此对输出进行排序。指定一条 ORDER BY 子句时,应该保证它是 SELECT 语句中最后一条子句。例子:

SELECT prod_name FROM Products ORDER BY prod_name;

3.2 按多个列排序

要按多个列排序,简单指定列名,列名之间用逗号分开即可。
下面代码检索 3 个列,按其中两个列对结果进行排序,首先按价格,然后按名称排序。
输入

SELECT prod_id, prod_price, prod_name
FROM Products ORDER BY prod_price, prod_name;

输出

屏幕快照 2018-05-25 06.04.04.png

对于上述例子中的输出,仅在多个行具有相同的 prod_price 值时才对产品按prod_name 进行排序。如果 prod_price 列中所有的值都是唯一的,则不会按 prod_name 排序。

3.3 按列位置排序

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

SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2, 3;

输出

屏幕快照 2018-05-26 19.35.57.png

分析
SELECT 清单中指定的是选择列的相对位置而不是列名。

  • ORDER BY 2 表示按 SELECT 清单中的第二个列 prod_price 进行排序。
  • ORDER BY 2,3 表示先按 prod_price,再按 prod_name 进行排序。

3.4 指定排序方向

数据默认升序排序,可以用ORDER BY ··· DESC子句进行降序排序。
例子以价格降序来排序产品:

SELECT prod_id, prod_price, prod_name FROM Products
ORDER BY prod_price DESC;
屏幕快照 2018-05-26 22.08.56.png

想用多个列排序,以降序排序产品,再加上产品名:

SELECT prod_id, prod_price, prod_name FROM Products
ORDER BY prod_price DESC, prod_name;
屏幕快照 2018-05-26 22.12.17.png

分析
DESC 关键字只应用到位于其前面的列名,要在多个列进行降序排序,必须对每一列指定 DESC 关键字。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 这一篇最主要是记录下命令,方便以后查找 使用Mysql 创建数据库 create database mysql_t...
    Treehl阅读 571评论 0 0
  • SQL与MySQL简介 数据库基础 从SQL的角度来看,数据库就是一个以某种有组织的方式存储的数据集合。我们可以采...
    heming阅读 3,062评论 1 8
  • (一)几个数据库相关的概念 1.数据库 数据库: 保存有组织数据的容器。 数据的所有存储、检索、管理和处理实际上是...
    快乐的小飞熊阅读 513评论 0 1
  • 表 存储在表中的数据是同一种类型的数据或清单。 数据库中的表有为一个名字来标识自己。 表具有一些特性,这些特性定义...
    蛐蛐囍阅读 1,300评论 0 7
  • 数据库入门 数据库: 保存有组织的数据的容器(通常是一个文件或一组文件).数据库软件应该称为 DBMS(DataB...
    Mjericho阅读 491评论 0 0