SQL = Structured Query Language

至于怎么读音官方是字母,很多人(懒人)读squeal,当然还有我们强大的本土程序员读成circle。

数据库结构

数据库有关系型(Mysql, SqLite, Oracle, …….)和非关系型(Redis - key-value, MongoDB - 文档型, ….)两种,这里我们只考虑关系型,为了应付考试,并且背下来一些概念。

  • 数据库(Database):一个按照数据结构来组织、存储和管理数据的仓库。
  • 数据表(Table):数据库中的基本存储单位,以行和列的形式组织数据。
  • 字段(Field):表中的一列,代表数据的一个属性。
  • 记录(Record):表中的一行,是一组相关的数据项的集合。
  • 主键(Primary Key):唯一标识表中每条记录的字段或字段组合。
  • 外键(Foreign Key):表中的一个字段,它是另一个表的主键,用于关联两个表。

将数据库的概念类比成Excel,可以这样理解:

  • 数据库(Database):相当于一个Excel工作簿(Workbook),里面可以包含多个工作表(Sheet),每个工作表可以存储不同的数据。

  • 数据表(Table):相当于Excel工作簿中的一个工作表(Sheet),用于存储特定类型的数据。例如,一个工作表可以存储员工信息,另一个工作表可以存储部门信息。

  • 字段(Field):相当于Excel工作表中的一列(Column),每一列代表数据的一个属性。例如,在员工信息表中,可能有“姓名”、“工号”、“部门”等列。

  • 记录(Record):相当于Excel工作表中的一行(Row),每一行代表一条完整的数据记录。例如,在员工信息表中,每一行可能代表一个员工的信息。

  • 主键(Primary Key):相当于Excel工作表中唯一标识每一行的列(Column)。例如,在员工信息表中,“工号”列可以作为主键,因为每个员工的工号是唯一的。

  • 外键(Foreign Key):相当于Excel工作表中的一列(Column),它引用了另一个工作表中的主键。例如,在员工信息表中,“部门”列可以作为外键,它引用了部门信息表中的“部门编号”列,从而将员工信息与部门信息关联起来。

基本操作

注意sql不区分大小写。

  • 创建表

    1
    2
    3
    4
    5
    6
    
    CREATE TABLE students (
        id INT PRIMARY KEY,
        name TEXT,
        age INT,
        grade INT
    );
    
  • 插入数据

    1
    
    INSERT INTO students (id, name, age, grade) VALUES (1, 'Alice', 20, 3);
    
  • 查询数据

    1
    
    SELECT * FROM students WHERE age > 18;
    
  • 更新数据

    1
    
    UPDATE students SET grade = 4 WHERE id = 1;
    
  • 删除数据

    1
    
    DELETE FROM students WHERE id = 1;
    

数据类型和运算符

根据第四版计科导论的教材内容推断,用的应该是PostgreSQL作为案例,但是教材惨不忍睹一片错误。

下面用加粗表示教材中出现过的。

(正常应该根据不同厂家数据库查文档后使用)

数值类型

数值类型由 2 字节、4 字节或 8 字节的整数以及 4 字节或 8 字节的浮点数和可选精度的十进制数组成。

名字 存储长度 描述 范围
smallint 2 字节 小范围整数 -32768 到 +32767
integer 4 字节 常用的整数 -2147483648 到 +2147483647
bigint 8 字节 大范围整数 -9223372036854775808 到 +9223372036854775807
decimal 可变长 用户指定的精度,精确 小数点前 131072 位;小数点后 16383 位
numeric(p, d) 可变长 p位数字(不含小数点和符号)定点小数,小数点后有d位数字 小数点前 131072 位;小数点后 16383 位
real 4 字节 可变精度,不精确 6 位十进制数字精度
double precision 8 字节 可变精度,不精确 15 位十进制数字精度
smallserial 2 字节 自增的小范围整数 1 到 32767
serial 4 字节 自增整数 1 到 2147483647
bigserial 8 字节 自增的大范围整数 1 到 9223372036854775807

字符类型

名字 描述
character varying(n), varchar(n) 变长,有长度限制
character(n), char(n) 定长,不足补空白
text 变长,无长度限制

日期/时间类型

名字 存储空间 描述 最低值 最高值 分辨率
timestamp [ (p) ] [ without time zone ] 8 字节 日期和时间(无时区) 4713 BC 294276 AD 1 毫秒 / 14 位
timestamp [ (p) ] with time zone 8 字节 日期和时间,有时区 4713 BC 294276 AD 1 毫秒 / 14 位
date 4 字节 只用于日期 YYYY-MM-DD 4713 BC 5874897 AD 1 天
time [ (p) ] [ without time zone ] 8 字节 只用于一日内时间**HH:MI:SS** 00:00:00 24:00:00 1 毫秒 / 14 位
time [ (p) ] with time zone 12 字节 只用于一日内时间,带时区 00:00:00+1459 24:00:00-1459 1 毫秒 / 14 位
interval [ fields ] [ (p) ] 12 字节 时间间隔 -178000000 年 178000000 年 1 毫秒 / 14 位

[ (p) ] 是一个可选参数,用于指定时间类型的小数部分精度。如果不指定,系统会使用默认值(通常是 6)。通过调整 p,可以控制时间数据的精度,以满足不同的需求。

运算符

在where中使用

运算符 描述
= 等于
<> 不等于。**注释:**在 SQL 的一些版本中,该操作符可被写成 !=
> 大于
< 小于
>= 大于等于
<= 小于等于
IN / NOT IN 指定针对某个列的多个可能值
+, -, *, / 算术运算
AND ,OR ,NOT 逻辑运算
EXISTS ALL SOME UNIQUE 谓词

常见函数

  • AVG() - 返回列平均值
  • COUNT() - 返回行数
  • MAX() - 返回列最大值
  • MIN() - 返回列最小值
  • SUM() - 返回列总和

多表查询

书本的例子是隐式连接,假设存在三个表

TABLE 属性
S 学号,姓名,年龄,性别(男/女 一个汉字两个CHAR),系别
C 课程号,课程名,教师名
SC 学号(外键S.学号),课程号(外键C.课程号),成绩

找到选课C001的学生姓名,学号

SELECT S.学号,姓名 FROM S,SC WHERE S.学号 = SC.学号 AND 课程号 = 'C001'

找到选操作系统学生的姓名,学号

SELECT S.学号,姓名 FROM S,C,SC WHERE S.学号 = SC.学号 AND C.课程号 = SC.课程号 AND 课程名 = '操作系统'

嵌套查询

where后面可以出现另一个select查询,然后通过select返回的值与table里面的值运算组合成一个条件。

找到选课C001的学生姓名,学号

SELECT S.学号,姓名 FROM S,SC WHERE S.学号 = SC.学号 AND 课程号 = 'C001'

也可写成

SELECT 学号,姓名 FROM S WHERE S.学号 IN (SELECT 学号 FROM SC WHERE 课程号='C001')