#CPT103 #Database
CPT103 Lecture的第二节课,主要讲了SQL(Structured Query Language)、一些基本的创建表格的语法和一些元组(Tuple)的操作。
- 推荐一个网站:网站链接,系统介绍讲解了数据库,可以参考。
SQL
SQL(Structured Query Language, 结构化查询语言),是一种特定目的编程语言,用于管理关系数据库管理系统(RDBMS),或在关系流数据管理系统(RDSMS)中进行流处理。
SQL有三个重要的部分:
- 数据定义语言(Data Definition Language, DDL):
用于定义和管理数据库对象,包括数据库、表、索引、视图、存储过程、触发器等。DDL语句用于定义和修改数据库对象的结构,不会直接对数据库中的数据进行操作。
DDL语句常用的关键字包括:
CREATE
:用于创建数据库对象,例如表、索引、视图等。ALTER
:用于修改数据库对象的结构,例如添加或删除列、修改列的数据类型等。DROP
:用于删除数据库对象。
- 数据操纵语言(Data Manipulation Language, DML):
是SQL语言的一个子集,用于对数据库中的数据进行操作,包括插入、更新、删除和检索数据。DML语句用于对数据库中的数据进行增删改查,不会直接对数据库对象的结构进行操作。
DML语句常用的关键字包括:
INSERT
:用于插入一条或多条数据到数据库中。UPDATE
:用于更新数据库中的数据。DELETE
:用于删除数据库中的数据。SELECT
:用于从数据库中检索数据。
- 数据控制语言(Data Control Language, DCL):
是 SQL 语言的一个子集,用于控制数据库用户对数据库对象的访问权限。DCL 语句不会直接对数据库中的数据或结构进行操作,而是用于授予或收回用户对数据库对象的权限。
DCL 语句常用的关键字包括:
GRANT
:用于授予用户对数据库对象的权限。REVOKE
:用于收回用户对数据库对象的权限。
SQL的格式
- 需要注意的是,SQL语言对关键字的大小写并不敏感,原则上大写小写都没问题,但一般为了更好的可读性和代码的整洁规范,我们选择关键字全部大写;
- 而表格的名字、列的名字往往是大小写敏感的,所以我们选择这么写:
1 | SELECT (sName) FROM Student; |
创建一个逻辑结构(Schema)
可以:
1 | CREATE SCHEMA name; |
或者:
1 | CREATE DATABASE name; |
Schema 指的是数据库对象的逻辑结构,包括表、视图、索引、存储过程、触发器等。它定义了数据库中数据的组织方式,以及数据库对象之间的关系。
创建我们的第一个表格
1 | CREATE TABLE my_table ( |
SQL语法
‘USE’关键字
1 | USE schema_name; |
USE关键字用于选择要使用的数据库,通常在连接到数据库服务器后立即使用,以便后续的查询和操作都针对该数据库进行。如果不使用USE关键字,则默认情况下使用当前连接的数据库。
Inserting Values(插入值)
1 | INSERT INTO my_table VALUES (1, 'ABC'), (2, 'DEF'); |
INSERT关键字用于向表中插入新记录。它是一种非常常用的SQL语句,可以用于将数据导入数据库中。
tips: (1, 'ABC')
, (2, 'DEF')
就是该table的两个元组(Tuple)。
此外,还可以使用**反引号(`)**,这样表格或列名字命名时如果有空格,就不需要使用’_’,直接空格即可:
1 | CREATE TABLE `my table` ( |
但是非常不建议这么做!正常我们就用上面的普通的命名方式my_table
就好。
Numercial Data Types(数字的数据类型)
Integers(整数)
example:
INT
orINT(5)
- 括号内表示 integer 的总位数。SMALLINT
- 占用:2字节(byte)
- 范围:-32,768 到 32,767,是左闭右开区间,即包括-32,768但不包括32,767。INT or INTEGER
- 占用:4字节
- 范围:-2,147,483,648 到 2,147,483,647(无符号:0 到 4,294,967,295,也是左闭右开区间。
- 是最经典和常用的选择。(废话BIGINT
- 占用:8字节
- 范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
Fixed Point(定点数)
这是个全新的东西,细细说一下这个定点数是什么:
example:
DECIMAL[(M[, D])]
orNUMERIC[(M[, D])]
(tips: 中括号[]之间的是optional的,可有可无)
M -> 总位数,D -> 小数点后的位数
example:price DECIMAL(10,2)
定点数是什么?
- 定点数(Fixed-point number)是一种表示实数的格式,其特点是小数点的位置是固定的。相比于浮点数,定点数的优点:
- 精度更高:浮点数的精度会受到指数的影响,而定点数的精度是固定的。
- 速度更快:定点数的运算速度比浮点数更快,因为不需要进行指数运算。
- 存储空间更小:定点数占用更少的存储空间,因为不需要存储指数。定点数的缺点:
- 表示范围有限:定点数的表示范围由小数点的位置决定,无法表示超出范围的数字。
- 不适用于科学计算:定点数不适用于需要很高精度的科学计算。定点数的表示方法:
- 定点数通常使用二进制表示,小数点的位置由整数部分和小数部分的位数决定。例如,一个8位定点数,其中4位整数部分,4位小数部分,可以表示的范围为-2^4到2^4-2^(-4),精度为1/2^(-4)。常见的应用场景:
- 金融计算:定点数用于计算利率、汇率等金融数据。
- 嵌入式系统:定点数用于控制电机、温度等设备。
- 数字信号处理:定点数用于滤波、傅里叶变换等信号处理操作。
Float(浮点数)
- example:
FLOAT
orFLOAT(5)
orFLOAT(3, 2)
- 括号内如果只有一个参数,则表示总位数;
- 如果有两个参数,则第一个表示总位数,第二个表示小数点后的位数。
String Types(字符串类型)
CHAR[(M)]
orVARCHAR(M)
M -> 总位数
(tips: 中括号[]之间的是optional的,可有可无)
二者之间的区别:
- 存储方式:
CHAR:固定长度,以空格填充不足部分。例如,CHAR(10)类型的列,如果存储的字符串长度不足10,则会用空格补足到10个字符。
VARCHAR:可变长度,只存储字符串实际占用的空间。例如,VARCHAR(10)类型的列,如果存储的字符串长度为5,则只占用5个字节的存储空间。
- 性能:
CHAR:查询效率较高,因为长度固定,可以直接进行比较。
VARCHAR:查询效率略低,因为需要先获取字符串的实际长度,然后进行比较。
- 使用场景:
CHAR:适用于存储长度固定且需要精确比较的字符串,例如身份证号码、密码等。
VARCHAR:适用于存储长度可变且不需要精确比较的字符串,例如姓名、地址等。
String Values(字符串值)
- SQL中,字符串值使用单引号:
'I AM A STRING'
(tips: 用双引号其实也可以,这方面也不严格) - 在字符串内部使用单引号时,前面加上反斜杠:
'I\'M A STRING'
或使用双引号:'I"M A STRING'
Date and Time(日期与时间)
DATE
:
- 支持的范围:’1000-01-01’ to ‘9999-12-31’.
- MySQL展示日期的格式:’YYYY-MM-DD’.DATETIME[(fsp)]
- 支持的范围:’1000-01-01 00:00:00.000000’ to ‘9999-12-31 23:59:59.999999’.
- MySQL展示日期的格式:’YYYY-MM-DD hh:mm:ss[.fraction]’.
1 | CREATE TABLE `staff` ( |
TIMESTAMP
- 和DATETIME相似,但是保存UTC时间。
NULL and Special Values(特殊值)
NULL:
NULL
表示未知或缺失,它不是0、””或任何其他值。NULL可以出现在任何数据类型中,包括数字、字符串、日期等。
- 常用于:数据尚未收集;数据无法获得;数据被删除。Special Values:
指具有特殊含义的值。
example:NaN
: 表示非数字Infinity
: 表示正无穷-Infinity
: 表示负无穷
- 常用于:表示数据溢出或数据无效等情况。
Column Options(列选项)
col-name datatype [col-options]
NOT NULL
: 这个列的值不能为NULL;UNIQUE
: 每个值都必须独一无二,不能重复;DEFAULT value
: 默认值。(在MS access中不工作)AUTO_INCREMENT
: 自动生成唯一数字,通常用于主键——每次向表中插入新记录时,MySQL会自动将AUTO_INCREMENT设置的列的值加1;也可以指定自增起始值,默认值为1。
example:
1 | CREATE TABLE Persons ( |
Tuple Manipulation(元组操作)
INSERT
- 添加一横排数据:
1 | INSERT INTO tablename (col1, col2, …) |
- 如果每一列都要添加值,就不用一一列出来了:
1 |
|
UPDATE
- 更新一横排数据:
1 | UPDATE table_name |
- 关于condition:
- condition为true的横排,对应列的值都会改变;
- 如果不给condition,所有横排都会被改变。
DELETE
- 删除一横排数据:
1 | DELETE FROM |
- condition同上。
如有错误,请及时指出~评论发邮件均可,欧内盖!