前面一直没有重视数据库的知识,今天一上课发现有好多不懂的地方,现在开始补一补。本文将参考福达的SQL必知必会,强调SQL语句的使用,对于数据库的理论知识讲的不多。

数据库

数据库,表与模式

 数据库:保存有组织的数据的容器。注意与数据库软件的区别,这些软件是DBMS,数据库管理系统。

 表:某种特定类型的数据的结构化清单,一个数据库中的表的名字绝不能相同,但是不同数据库中的可以。

 模式:关于数据库和表的布局及特征的信息。表具有一些特性,这些特性定义了数据如何存储,包含存储什么样数据,数据如何分解,各部分信息如何命名等信息,这就是模式。模式可以用于描述特定的表,也可以描述整个数据库。

列和数据类型

 列(column):表中的一个字段,所有表都是由一个或多个列组成。在使用时应注意分解数据,将一条信息分解为合适的n个字段。例如:对于一条详细的地址,有的时候可以只要一个字段,但是有的时候需要门牌号单独作为一个字段用于排序。

 数据类型:数据类型有多种,关于数字的,字符的,日期的,等等。问题在于,基本的数据类型基本都一样,但是部分高级的数据类型在某些SQL语言中是没有的。而且,偶然会有相同的数据类型在不同的DBMS有不同的名字。虽然有SQL标准,但是各大厂商显然没有对此达成一致。

行和主键

 行:表中的数据是按行存储的,所保存的每个记录存储在行内。
 主键:表中的每一行都应该有一列或几列唯一标识自己,顾客表可以使用顾客编号,订单表可以使用订单ID。可以没有主键,但是应该尽量保证每个表都有一个主键。主键的值不能重复,例如主键为学号,就不能有两个一样的学号。同时,也不能为空,不能某个学生没有学号。主键列中的值不允许修改或更新,也不能重用(删去某行后,这行的主键值不能给后面的新行)。

 显然,这本书对于理论知识介绍的非常简略,E-R图,外键等东西都没有(外键有,但是放到了非常后面)。

检索数据

SELECT语句

SELECT作为关键字可以大写也可以小写,大小写混用也没关系,但不允许用作表或者列的名字。同时语句应用分号结尾,多条SQL语句也要用分号分隔。语句间的空格也将被忽略,所以一条语句可以分成几行写,也可以写在一行。使用SELECT检索表数据,必须给出检索的内容和检索的范围。

检索单个列

输入:

1
2
SELECT prod_name
FROM Products;

分析:
上面这句从Products表中检索prod_name这列。

输出:

1
2
3
4
5
6
7
8
9
10
11
prod_name
------------------
Fish bean bag toy
Bird bean bag toy
Rabbit bean bag toy
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Raggedy Ann
King doll
Queen doll

当没有明确排序查询结果时,则返回的数据没有特定的顺序。

检索多个列

输入:

1
2
SELECT prod_id, prod_name, prod_price
FROM Products;

分析:
从Products中检索出三列数据。

输出:

1
2
3
4
5
6
7
8
9
10
11
prod_id       prod_name                prod_price
--------- -------------------- ---------
BNBG01 Fish bean bag toy 3.4900
BNBG02 Bird bean bag toy 3.4900
BNBG03 Rabbit bean bag toy 3.4900
BR01 8 inch teddy bear 5.9900
BR02 12 inch teddy bear 8.9900
BR03 18 inch teddy bear 11.9900
RGAN01 Raggedy Ann 4.9900
RYL01 King doll 9.4900
RYL02 Queen dool 9.4900

检索所有列

输入:

1
2
SELECT *
FROM Products;

检索不同的值

 假定某一列的值存在重复的,但是只想检索出具有唯一性的值时就可以用DISTINCT。例如,供应商ID只有3个,但是检索产品ID时,会检索出许多个,这时就要用该关键字筛选。

1
2
SELECT DISTINCT vend_id
FROM Products;

 注意,如果该关键字的后面指定了多个列,这种筛选将会在所有列进行。

限制结果

 检索的结果可能会很多,甚至是每一行。当只需要查看一定数量的行时,也可以写出SQL语句。但是各数据库的SQL语句并不一样。

在SQL Server和Access中可以使用TOP关键字限制最多返回几行:

1
2
SELECT TOP 5 prod_name
FROM Products;

DB2:

1
2
3
SELECT prod_name
FROM Products
FETCH FIRST 5 ROWS ONLY;

Oracle:

1
2
3
SELECT prod_name
FROM Products
WHERE ROWNUM <= 5;

MySQL、MariaDB、PostgreSQL或者SQLite:

1
2
3
SELECT prod_name
FROM Products
LIMIT 5;

若要得到后面的数据可以这么写:

1
2
3
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;

LIMIT 5 OFFSET 5指示MySQL等DBMS返回从第5行起的5行数据。第一个数字是指从哪儿开始,第二个数字是检索的行数。