数据库笔记1
前面一直没有重视数据库的知识,今天一上课发现有好多不懂的地方,现在开始补一补。本文将参考福达的SQL必知必会,强调SQL语句的使用,对于数据库的理论知识讲的不多。
数据库
数据库,表与模式
数据库:保存有组织的数据的容器。注意与数据库软件的区别,这些软件是DBMS,数据库管理系统。
表:某种特定类型的数据的结构化清单,一个数据库中的表的名字绝不能相同,但是不同数据库中的可以。
模式:关于数据库和表的布局及特征的信息。表具有一些特性,这些特性定义了数据如何存储,包含存储什么样数据,数据如何分解,各部分信息如何命名等信息,这就是模式。模式可以用于描述特定的表,也可以描述整个数据库。
列和数据类型
列(column):表中的一个字段,所有表都是由一个或多个列组成。在使用时应注意分解数据,将一条信息分解为合适的n个字段。例如:对于一条详细的地址,有的时候可以只要一个字段,但是有的时候需要门牌号单独作为一个字段用于排序。
数据类型:数据类型有多种,关于数字的,字符的,日期的,等等。问题在于,基本的数据类型基本都一样,但是部分高级的数据类型在某些SQL语言中是没有的。而且,偶然会有相同的数据类型在不同的DBMS有不同的名字。虽然有SQL标准,但是各大厂商显然没有对此达成一致。
行和主键
行:表中的数据是按行存储的,所保存的每个记录存储在行内。
主键:表中的每一行都应该有一列或几列唯一标识自己,顾客表可以使用顾客编号,订单表可以使用订单ID。可以没有主键,但是应该尽量保证每个表都有一个主键。主键的值不能重复,例如主键为学号,就不能有两个一样的学号。同时,也不能为空,不能某个学生没有学号。主键列中的值不允许修改或更新,也不能重用(删去某行后,这行的主键值不能给后面的新行)。
显然,这本书对于理论知识介绍的非常简略,E-R图,外键等东西都没有(外键有,但是放到了非常后面)。
检索数据
SELECT语句
SELECT
作为关键字可以大写也可以小写,大小写混用也没关系,但不允许用作表或者列的名字。同时语句应用分号结尾,多条SQL语句也要用分号分隔。语句间的空格也将被忽略,所以一条语句可以分成几行写,也可以写在一行。使用SELECT检索表数据,必须给出检索的内容和检索的范围。
检索单个列
输入:
1 | SELECT prod_name |
分析:
上面这句从Products表中检索prod_name这列。
输出:
1 | prod_name |
当没有明确排序查询结果时,则返回的数据没有特定的顺序。
检索多个列
输入:
1 | SELECT prod_id, prod_name, prod_price |
分析:
从Products中检索出三列数据。
输出:
1 | prod_id prod_name prod_price |
检索所有列
输入:
1 | SELECT * |
检索不同的值
假定某一列的值存在重复的,但是只想检索出具有唯一性的值时就可以用DISTINCT
。例如,供应商ID只有3个,但是检索产品ID时,会检索出许多个,这时就要用该关键字筛选。
1 | SELECT DISTINCT vend_id |
注意,如果该关键字的后面指定了多个列,这种筛选将会在所有列进行。
限制结果
检索的结果可能会很多,甚至是每一行。当只需要查看一定数量的行时,也可以写出SQL语句。但是各数据库的SQL语句并不一样。
在SQL Server和Access中可以使用TOP关键字限制最多返回几行:
1 | SELECT TOP 5 prod_name |
DB2:
1 | SELECT prod_name |
Oracle:
1 | SELECT prod_name |
MySQL、MariaDB、PostgreSQL或者SQLite:
1 | SELECT prod_name |
若要得到后面的数据可以这么写:
1 | SELECT prod_name |
LIMIT 5 OFFSET 5
指示MySQL等DBMS返回从第5行起的5行数据。第一个数字是指从哪儿开始,第二个数字是检索的行数。