学习知识
初识数据库
关系型数据库简介
特点是由行和列组成的二维表来管理数据,这种类型的 DBMS 称为关系数据库管理系统(Relational Database Management System,RDBMS)。本课程将向大家介绍使用 SQL 语言的数据库管理系统,也就是关系数据库管理系统(RDBMS)的操作方法。
在关系型数据库中,常见的是客户端 / 服务器类型(C/S类型)。通过客户端发出sql语言,向服务端请求数据,服务端像数据库中读取数据返回给客户端。
数据库中存储的表结构类似于excel中的行和列,在数据库中,行称为记录,它相当于一条记录,列称为字段,它代表了表中存储的数据项目。
SQL是为操作数据库而开发的语言。国际标准化组织(ISO)为 SQL 制定了相应的标准,以此为基准的SQL 称为标准 SQL。但实际上完全基于标准的RDBMS很少,不过datawhale教程中使用的都是标准的sql语言。
根据指令的不同,sql语句分为三类,数据定义语言DDL、数据操纵语言DML、数据控制语言DCL,教程中主要围绕DML来讲,因为其使用最多,实际使用的 SQL 语句当中有 90% 属于 DML。
语法规范
在datawhale的该项目的仓库中,有完整sql语法规范
命名规则
只能使用半角英文字母、数字、下划线(_)作为数据库、表和列的名称
名称必须以半角英文字母开头
数据类型的指定
在数据类型中,在其他语言中见得比较少的是VARCHAR类型,如其名“VAR CHAR"可变长字符串类型。
约束的设置
约束是除了数据类型之外,对列中存储的数据进行限制或者追加条件的功能。
NOT NULL是非空约束,即该列必须输入数据。
PRIMARY KEY是主键约束,代表该列是唯一值,可以通过该列取出特定的行的数据。
并且,在教程中给出的创建表的示例中,也可以把主键约束加到行后进行约束,即:
CREATE TABLE product
(
product_id CHAR(4) NOT NULL PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER,
purchase_price INTEGER,
regist_date DATE
);
或者我们也可以对约束进行命名,将约束写为:
CONSTRAINT pk_product PRIMARY KEY (product_id)
即把约束命名为pk_product
。
创建表时也可以用DEFAULT
设置默认值。
表的删除和更新
表的删除和更新主要有DROP、DELETE、ALTER、TRUNCATE等命令,需要注意的是删除后不可恢复的情况以及必须指定where的情况。
如果不指定where,那么修改(DELETE或UPDATE)将会作用于整个表。
UPDATE的SET语句也支持同时将多个列作为更新对象。
-- 合并后的写法
UPDATE product
SET sale_price = sale_price * 10,
purchase_price = purchase_price / 2
WHERE product_type = '厨房用具';
插入数据
INSERT语句可以用于添加数据。添加数据可以不列出列清单,不列出列清单将会从左往右依次添加。
-- 包含列清单
INSERT INTO productins (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
-- 省略列清单
INSERT INTO productins VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
并且,INSERT语句可以一次插入多行。
INSERT INTO productins VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11'),
('0003', '运动T恤', '衣服', 4000, 2800, NULL),
('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');
如果想要赋值为空,那么将值写为NULL
即可,但是只能对没有非空约束的列赋值为空哦。
也可以使用INSERT INTO...SELECT...FROM...
来复制其他表中的数据。
索引
索引分为主键索引、唯一索引、普通索引、前缀索引、全文索引*(利用“分词技术”实现在长文本中搜索关键字的一种索引)、单列索引、联合索引(复合索引、多列索引)*等。
练习题
1
编写一条 CREATE TABLE 语句,用来创建一个包含表 1-A 中所列各项的表 Addressbook (地址簿),并为 regist_no (注册编号)列设置主键约束。
CREATE TABLE Addressbook
(
regist_no INTEGER NOT NULL,
name VARCHAR(128) NOT NULL,
address VARCHAR(256) NOT NULL,
tel_no CHAR(10),
mail_address CHAR(20),
PRIMARY KEY (regist_no)
);
2
假设在创建练习1.1中的 Addressbook 表时忘记添加如下一列 postal_code (邮政编码)了,请编写 SQL 把此列添加到 Addressbook 表中。
列名 : postal_code
数据类型 :定长字符串类型(长度为 8)
约束 :不能为 NULL
ALTER TABLE Addressbook ADD postal_code CHAR(8) NOT NULL;
3
请补充如下 SQL 语句来删除 Addressbook 表。
DROP TABLE Addressbook;
4
这是不可恢复的,无论是使用TRUNCATE TABLE 或 DELETE 清除数据还是使用DROP删除表,使用ALTER删除一列,都是不可恢复的,因为删除后数据没有被存放在任何地方,当然也就无法被恢复。