文章目录
数据类型
文本和字符串类型
-
text
任何长度的字符串,例如 Python str 或 unicode 类型 -
char(n)
长度为 n 个字符的字符串 -
varchar(n)
长度上限为 n 个字符的字符串
数值类型
-
integer
整型值,例如 Python int -
real
浮点型值,例如 Python float
精确到小数点后 6 位 -
double precision
精度更高的浮点型值
精确到小数点后 15 位 -
decimal
精确的十进制值
日期和时间类型
-
date
日历日期,包括年月日 -
time
一天中的时间 -
timestamp
日期和时间相结合
SQL
结构化查询语言(Structured Query Language)
DDL
数据定义语言
在数据库中创建新表或修改、删除表
为表加入索引等
-
增 :
create table 表名 (定义)
-
删:
drop datebase 库名
drop table 表名
truncate table 表名
-
改:
alter table 表名
DML
数据操作语言(Data Manipulation Language)
-
增:insert into 表 (列1, 列2 …) values (值1, 值2 …), (值1, 值2 …) …
-
删:delete from 表 where 条件
-
改:update 表 set 列 = 值 where 条件
insert 语句
insert into table ( column1, column2, … ) values ( val1, val2, … );
如果值和表格的列顺序一样(从第一列开始),则不需要在 insert 语句中指定列:
insert into table values ( val1, val2, … );
例如,如果表格有三列 (a, b, c),你想要向 a 和 b 中插入值,你可以在 insert 语句中省略列名称。但是如果你想向 b 和 c 或 a 和 c 中插入值,则需要指定列。
单个 insert 语句只能插入一个表格中(而 select 语句可以使用 join 从多个表格中获取数据)。
delete 命令
delete from table where restriction ; restriction 和 select 语句中的一样,允许使用相同的运算符。
update 语句
update table set column = value where restriction ;
restriction 和 select 语句中的一样,对列值支持相同的运算符集。
DQL
数据查询语言(Data Query Language)
- 查:select 列 from 表 where 条件 group by 组列 having 条件 order by 列 limit 行数
DCL
数据控制语言
通过 GRANT 或 REVOKE 实现权限控制,确定单个用户和用户组对数据库对象的访问
某些 RDBMS 可用 GRANT 或 REVOKE 控制对表单个列的访问
TCL
事务控制语言
它的语句能确保被 DML 语句影响的表的所有行及时得以更新
- commit(提交)命令
- savepoint(保存点)命令
- rollback(回滚)命令
- lock in share mode
- for update
begin 或 start transaction 开始一个事物
rollback 事务回滚
commit 事物确认
直接用 set 来改变 MySQL 的自动提交模式
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
select 子句
select columns from tables where condition ;
-
每列用逗号 , 分隔;使用 * 可选择所有列
-
condition 是列值的布尔表达式
-
SQL 支持布尔运算 and、or 和 not,和 Python 中的运算规则一样
-
表达式 (not X) and (not Y) 和 not (X or Y) 可以互换,这是由德摩根定律决定的
-
SQL 中的比较运算符和 Python 中的几乎一样:< 表示小于,> 表示大于,!= 表示不等于,<= 表示小于或等于
-
其中一个差别是 SQL 使用 =(而不是 ==)表示等于。你可以将所有的基本比较运算符应用于字符串、数字、日期以及其他值
-
要连接(join)两个表格,首先选择连接条件,即数据库将表格一中的行与表格二中的行相匹配时采用的规则。然后编写连接语句,包含每个表格中的列
where
- where 子句表示限制条件 — 从表格中过滤出符合特定规则的行
- where 支持等于、不等于和布尔运算符等
limit / offset
- limit 子句对结果表格可以返回的行数做出限制
- 可选 offset 子句表示要在结果中跳过多少行,所以 limit 10 offset 100 将返回 10 条结果,从第 101 行开始
order by
- order by 子句告诉数据库如何对结果排序 — 通常根据一个或多个列
- 比如 order by species, name 表示首先按 species 列排序,然后在每个 species 里按照 name 排序
- 排序发生在 limit/offset 之前,所可以使用它们来提取出按字母顺序排列的页面结果(想想字典的页面)
- 可选 desc 修饰符告诉数据库按照降序对结果排序,例如从大到小或从 Z 到 A
group by
- group by 子句只能用于汇总,例如 max 或 sum
- 没有 group by 子句的话,对集合执行选择语句将对整个选定表格进行汇总,只返回一行
- 对于 group by 子句,它将对 group by 子句中的列或表达式的每个唯一值返回一行
having
select columns from tables group by column having condition ;
- having 子句和 where 子句工作原理差不多
- 但是它应用于 group by 汇总发生之后
- 通常,至少有一 列 将是汇总函数,例如对表格的某列执行 count、max 或 sum 操作
- 要对汇总列应用 having,需要使用 as 为其设定名称
- 例如,一个商店所售商品的表格,并且想要找出售出数量超过 5 件的所有商品,则可以使用:
select name, *count(*) as num* from sales having num > 5;
like
- like 运算符支持简单的文本模式匹配
- 运算符左侧的内容(通常是文本列的名称)将与右侧的模式相匹配
- 该模式是一种 SQL 文本字符串(所以是单引号),并且可以使用 % 符号与任何子字符串相匹配,包括空字符串
- 如果你熟悉正则表达式的话,可以将 like 模式中的 % 看作正则表达式 .*(点星号)
- 如果你更加熟悉 Unix shell 或 Windows 命令提示符中的文件名模式,那么 % 就像这些系统里的 *(星号)。
在 select 语句中仅使用 where、仅使用 group by 、或使用 group by 和 having 、或使用 where 和 group by 或三个都用到!
但是如果没有 group by 的情况下,使用 having 通常是不合理的。
如果同时使用了 where 和 having, where 条件将过滤即将被汇总的行,having 条件将过滤汇总后的行。
规范化表格的规则
1. 每行都具有相同数量的列。
实际上,数据库系统不允许在不同的行里具有不同数量的列。但是如果某些列有时候为空,有时候不为空,或者如果我们将多个值放入一个字段里。
2. 表格存在唯一*键*,一行里的所有内容都围绕该键展开。
键可以是一列或多列。甚至可以是整行内容。但是一个表格里没有重复的行。
如果要存储不是唯一的内容,例如人们的姓名,就使用唯一标识符(例如序列号)区分它们。这样可以确保不会将两个姓名相同的人的分数或违规停车罚单汇总到一起。
3. 与唯一键不相关的内容放在其他表格中。
有条目、地点和地点的街道地址。地址不是关于条目的内容,是关于地点的内容。将地址放到另一表格里可以节省空间,并避免造成混淆,可以使用 join 重新组成原始表格。
4. 表格不应该暗示不存在的关系。
一行列出某人的技术技能(例如“Linux”)和某个语言技能(例如“法语”)。这样看起来就好像 Linux 技能是特定于法语,反之亦然,但现实中不是这种情况。规范化这一情况需要将技术技能和工作技能放在不同的表格里。