本文是对《SQL基础教程》第一章的学习总结,主要包含了数据库及SQL的概要,表的创建、更新和删除。本文所有SQL语句在PostgreSQL数据库中验证过,其他数据库执行SQL语句可能需要适当更改,具体方法详见《SQL基础教程》书内说明。

SQL是用来操作关系数据库的语言,国际标准化组织(ISO)为SQL制定了标准,以此为基准的SQL称为标准SQL。但是完全基于标准SQL的关系数据库管理系统(RDBMS)较少,需要根据不同的RDBMS编写特定的SQL语句。

根据RDBMS赋予指令种类的不同,SQL语句可以分为一下三类:

  • DDL(Data Definition Language,数据定义语言),用于创建或删除存储数据用的数据库以及数据库中的表等对象。DDL包含的指令有:
    • CREATE: 创建数据库和表等对象
    • DROP: 删除数据库和表等对象
    • ALTER: 修改数据库和表等对象
  • DML(Data Manipulation Language, 数据操作语言),用来查询或者变更表中的记录。DML包含的指令有:
    • SELECT: 查询表中的数据
    • INSERT: 向表中插入数据
    • UPDATE: 变更表中数据
    • DELETE: 删除表中数据
  • DCL(Data Control Language, 数据控制语言),用来确认或者取消对数据库中的数据进行的变更。还可以对RDBMS的用户是否有权限操作数据库中的对象进行设定。DML包含的指令有:
    • COMMIT: 确认对数据库中的数据进行的变更
    • ROLLBACK: 取消对数据库中的数据进行的变更
    • GRANT: 赋予用户操作权限
    • REVOKE: 取消用户操作权限

SQL的基本书写规则:

  • SQL语句单词之间用半角空格或者换行进行分隔,以分号(;)结尾。
  • SQL语句中,不区分关键字、表名、列名的大小写,但是对插入到表中的数据是区分大小写的。一般关键字大写,表名的首字母大写,其余小写
  • SQL语句中含有字符串、日期时候,需要用单引号将其括起来,如'abc','2019-03-01',数字不需要引号。

创建数据库:

1
2
3
CREATE DATABASE <数据库名称>;
-- 示例
CREATE DATABASE shop;

创建表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE <表名称>
(
<列名称1> <数据类型> <该列所需约束>
<列名称2> <数据类型> <该列所需约束>
<列名称3> <数据类型> <该列所需约束>
....
);
-- 示例
CREATE TABLE Shohin
(shohin_id CHAR(4) NOT NULL,
shohin_mei VARCHAR(100) NOT NULL,
shohin_bunrui VARCHAR(32) NOT NULL,
hanbai_tanka INTEGER ,
shiire_tanka INTEGER ,
torokubi DATE ,
PRIMARY KEY (shohin_id));

命名规则:只能使用半角英文字母、数字、下划线作为数据库、表、表中列的名称,且以英文字母作为开头。同一数据库中不能创建名称相同的表,同一表中不能创建名称相同的列。

所有的列都必须指定数据类型来表示数据的种类,包括数字型、字符型和日期型等。

数据类型 描述
INTEGER(size)
INT(size)
SMALLINT(size)
TINYINT(size)
仅容纳整数。在括号内规定数字的最大位数。
DECIMAL(size, d)
NUMERIC(size, d)
容纳带有小数的数字。”size” 规定数字的最大位数。”d” 规定小数点右侧的最大位数。
CHAR(size) 容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。在括号中规定字符串的最大长度。
字符串超过最大长度的部分无法输入到该列中
VARCHAR(size) 容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。在括号中规定字符串的最大长度。
DATE(yyyymmdd) 容纳日期。

关于CHAR和VARCHAR:CHAR类型的列中字符串以定长字符串形式存储,当该字符串长度达不到指定的最大长度时候,使用半角空格补足。比如向CHAR(8)类型的列输入'abc'时,保存的是'abc空格空格空格空格空格';VARCHAR类型的列中字符串以可变长字符串的形式存储,当该字符串长度达不到指定的最大长度时候,不会用半角空格补足。比如向VARCHAR(8)类型的列输入'abc'时,保存的是'abc'

列除了必须指定数据类型外,还可以选择添加约束设置,实现对存储的数据进行限制或追加条件的功能。Shohin表中设置了两种约束,一种是对shohin_id等三列的NOT NULL约束,表明该列设定不能为空,必须输入;另一种是给shohin_id这一列设定主键约束PRIMARY KEY(shohin_id),将shohin_id列指定为主键,表明shohin_id必须唯一,不能重复。


删除表:

1
2
3
DROP TABLE <表明>;
-- 示例
DROP TABLE Shohin;

删除了的表是无法恢复的

更新表

  • 重命名表名

    1
    2
    3
    ALTER TABLE <原表名> RENAME TO <新表名>;
    --示例
    ALTER TABLE Shohin2 RENAME TO Shohin3;
  • 增加列

    1
    2
    3
    ALTER TABLE <表名> ADD COLUMN <列的定义>;
    --示例
    ALTER TABLE Shohin ADD COLUMN shohin_mei_kana VARCHAR(100);
  • 删除列

    1
    2
    3
    ALTER TABLE <表名> DROP COLUMN <列名>;
    --示例
    ALTER TABLE Shohin DROP COLUMN shohin_mei_kana;
  • 重命名列

    1
    2
    3
    ALTER TABLE <表名> RENAME COLUMN <原列名> TO <新列名>;
    -- 示例
    ALTER TABLE Shohin3 RENAME COLUMN shohin_id TO shohin_id2;
  • 更改列属性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    ALTER TABLE <表名> ALTER <表中某字段> TYPE <该字段的新类型>
    --示例
    shop=# \d Shohin3
    Table "public.shohin3"
    Column | Type | Collation | Nullable | Default
    ---------------+------------------------+-----------+----------+---------
    shohin_id2 | character(4) | | not null |
    shohin_mei | character varying(100) | | not null |
    shohin_bunrui | character varying(32) | | not null |
    hanbai_tanka | integer | | |
    shiire_tanka | integer | | |
    torokubi | date | | |
    ALTER TABLE Shohin3 ALTER haibai_tanka TYPE SMALLINT;
    shop=# \d Shohin3
    Table "public.shohin3"
    Column | Type | Collation | Nullable | Default
    ---------------+------------------------+-----------+----------+---------
    shohin_id2 | character(4) | | not null |
    shohin_mei | character varying(100) | | not null |
    shohin_bunrui | character varying(32) | | not null |
    hanbai_tanka | smallint | | |
    shiire_tanka | integer | | |
    torokubi | date | | |

向表中插入数据:

1
INSERT INTO Shohin VALUES ('001', 'T恤衫', '衣服', 1000, 500, '2009-03-04');