Basic SQL
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
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')