摘要:本文主要是对《SQL必知必会》Lesson 1-3学习总结,主要包括数据库的相关概念,简单的SELECT语句(没有WHERE)以及带ORDER BY的排序检索。
1、数据库相关概念
数据库,一个存储有组织有结构数据的容器。数据库管理系统(DBMS)是用来管理数据库的一个软件,包括一些数据库的创建、删除等等。
表(Table),一种结构化数据的容器,里面存储着多条结构化的记录。
列(Column),一个单一的特定类型的数据域,一个表中的记录由一个或多个列构成,这也就是所谓的结构化。
行(Row),表中的一条记录叫做一行,它由一个或多个列组成,是结构化的,表是行的集合。如果把行比作一个结构体类型,那么表便是该结构体的数组。
主键(Primary Key),一列或者多列,能够唯一的标识表中一条记录的数据域。尽管主键不是一定要求每张表结构都有,但经验告诉我们,务必每张表都定义主键,便于数据库的操作和管理。那么,什么样的数据域(列)可以定义为主键呢?只要满足下面所列条件,即可定义为主键:
(1)任意两行都不具有相同的主键值;
(2)每个行的主键值不允许为NULL;
(3)主键列中的值不允许修改或者更新;
(4)主键值不能被二次重用;也即,如果某行从表中删除,它的主键值不能赋给以后的新行作为主键值。
SQL,Structured Query Language的缩写,结构化查询语言,专门用来和数据库通信的语言。
2、简单SELECT语句
SELECT语句,它的功能是从数据库中检索数据,也即读数据,并不作修改。可以检索单个列,也可以检索多个列,也可以附加一些过滤规则和条件;当然,这里介绍的简单SELECT语句没有包括条件过滤语句,而且是单表检索。
2.1 检索单列
语法格式: SELECT 列名 FROM 表名; --尾部的’;‘不要忘记,SELECT 和 FROM 我们称为SQL的关键字
看个例子:从Products中检索所有的产品名称,SELECT prod_name FROM Products; 结果如下图左图所示:
在书写sql语句的时候,可以使用一个大长行把所有语句写下来,但通常不易读;像其他的语言一样,可以采用换行缩进,mysql是忽略空白符的,这样一目了然。
2.2 检索多个列
语法格式:SELECT 列名1 [, 列名2, …] FROM 表名; --在选择多个列时,注意列名之间用’,‘隔开
看个例子,我们检索产品id,产品名和产品的价格,SELECT prod_name, prod_price FROM Products; 如上图右图所示。
2.3 检索所有列
语法格式: SELECT * FROM 表名;
或 SELECT 列名1,列名2, …… , 列名n FROM 表名; --这里的表共有n个列,全部一一列出
第一种格式使用通配符 ‘ * ’ 代表所有一个表中所有列,检索的列名位置和表定义时的列名顺序一致;第二种格式是将所有列名写出来,这样检索出来的列名的位置和sql语句中列名位置一致。
看个例子,我们检索Orders表中所有的列,用两种方式:(a)SELECT * FROM Orders; (b) SELECT order_num, order_date, cust_id FROM Orders; (c)SELECT order_num, cust_id, order_date FROM Orders; 其中c是为了作对比,检索出来的列的位置不一样。如下图所示:
3、排序检索
前面两部分讲了简单的SELECT语句,但是有时候我们希望检索的结果按照某个字段或多个字段有序排列,在这里需要用到ORDER BY子句。
3.1 单列排序
语法格式:SELECT 列名 FROM 表名 ORDER BY 列名;
看个例子,从Products中检索所有的产品名称和价格,并按照价格排序:SELECT prod_name, prod_price FROM Products ORDER BY prod_price; 如下图所示,
上面左图是使用了ORDER BY子句,右图没有使用,可以看到左边是有序的。除了按照单列,也可以按照多列进行排序。
3.2 多列排序
语法格式:SELECT 列名 FROM 表名 ORDER BY 列名1,列名2,…,列名n;
看个例子,检索prod_id, prod_price, prod_name,并首先按价格排序,然后再按名称排序: SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price, prod_name; 结果如下图所示:
可以看到,首先按价格有序;其次,价格相同的,再按照name排序。这类似于数据结构中的基数排序,即多关键字排序。
3.3 排序方向
上面排序的例子,我们发现,排序都是从小到大排序,即升序,这是ORDER BY子句默认的排序方向,那么如果我们想某列从大到小排序,即降序,该怎么办呢?我们只需要在该列后加上关键词DESC,descending的缩写。升序的关键词为ASC, ascending的缩写。注意:DESC或ASC只对其紧邻的前面的列起作用,若是需要指定多个列的排序方向,则需要在每个列后都指定方向。
语法格式: ORDER BY 列名1 DESC|ASC, 列名2 DESC | ASC, …;
看个例子,我们按照检索的prod_price价格降序排列: SELECT prod_name, prod_price FROM Products ORDER BY prod_price DESC; 如下图左图所示:
同时,我们可以对3.2中的例子进行改变,先按照price升序排序,再按照price降序排列,如上图右图所示。
注意:ORDER BY子句必须是SELECT语句中的最后一个子句。