基础知识
数据库与数据库软件
- 数据库:保存有组织的数据的容器(通常是一个文件或一组文件)
- 数据库软件:确切的说,数据库软件应称为数据库管理系统(DBMS)。数据库是通过DBMS创建和操纵的容器。
SQL是什么
- SQL(Structured Query Language)中文名结构化查询语句,是一种专门用来与数据库沟通的语言。
- SQL不是某个特定DBMS的语言,几乎所有重要的DBMS都支持SQL。
- 许多DBMS厂商都通过增加语句或指令对SQL进行了扩展,但是一般只应用于特定的DBMS。
表
- 数据存储在数据库的一张张表中,而表又可以分为行和列,每一行代表一个记录,每一行都可以分为一个或多个列,每一列的数据类型可以不同,分别储存着不同的信息。其中我们应该正确的分解数据,将他们保存在不同的列中,便于对数据进行分类和过滤。
主键
- 唯一标识表中每行的一列(或几列)称为主键。主键使得更新、删除表中特定的行变得简单。
- 作为主键的条件:
- 任意两行都不具有相同的主键值;
- 每一行都必须具有一个主键值(主键列不允许NULL值);
- 主键列的值不允许修改或更新;
- 主键值不能重用(如果某行从列表中删除,它的主键不能赋给以后的新行)。
PS:后续部分DBMS以MySQL为例讲解,独有部分会标注。
检索篇
普通检索
基础语句
1 | SELECT column1 |
- 大写单词为SQL关键字,不能用做表或列的名字。值得注意的是SQL并不区分大小写,只不过是关键字用大写来表示比较好区分。
- column表示表中的某一列,并且column可以不唯一,多个column是中间用 , 号隔开, table表示某一张表。
- 通配符
*
表示显示该表中所有的列,列的顺序一般是在表中定义中出现的物理顺序。另外应注意,除非确实需要表中的每一列,否则最好不要使用通配符 * ,这样会降低检索和应用程序的性能。
扩展选项
检索不同的值
- DISTINCT 用于返回不同的值,相同时只返回一次。应注意的是其作用范围是所有的列,而不是紧跟其后的一列。
- 代码示例:
1
2SELECT DISTINCT column1
FROM table;
限制返回结果(数量等)
- LIMIT 与 OFFSET 结合使用(适用于MySQL、MariaDB、PostgreSQL、SQLite)
- LIMIT 后跟返回的行数,OFFSET 后跟起始位置(从0开始)
代码示例:
1
2
3SELECT column1
FROM table1
LIMIT num1 OFFSET num2;
检索
ORDER BY
- 采用 ORDER BY 进行检索约束时,检索结果将按照指定顺序返回。
基础语句:
1
2
3SELECT column1
FROM table1
ORDER BY column2;此时检索结果按照column2的大小排序返回,默认生序排列
扩展语法:
- 可以按照多个列进行排序,此时只需要在 column2 后添加需要的列即可。当按照column2排列时某几行的大小相同将会按照后续的column排序。
在排序列的后变添加关键字 DESC 时将会按照降序排列。需要注意的是 DESC 与 DISTINCT
不同,DESC的作用范围只有其前边一个column。1
2
3SELECT column1
FROM table1
ORDER BY column2 DESC, column3;
PS:
ORDER BY
应当位于所有语句的最后,但是当语句中含有LIMIT
时,ORDER BY
应位于LIMIT
之后。
WHERE
- 采用 WHERE 进行检索时,检索结果将会返回指定要求的结果。
基础语句:
1
2
3SELECT column1
FROM table1
WHERE column2 = value;此时检索结果将返回 column2 = value 那些行的 column1。
- WHERE 子句操作符 :
操作符 | 说明 | 操作符 | 说明 |
---|---|---|---|
= | 等于 | > | 大于 |
<> | 不等于 | >= | 大于等于 |
!= | 不等于 | !> | 不大于 |
< | 小于 | BETWEEN | 在指定的两个值之间 |
<= | 小于等于 | IS NULL | 为NULL值 |
!< | 不小于 |
使用示例:
1
2
3SELECT column1
FROM table1
WHERE column2 BETWEEN num1 AND num2;此时检索结果将返回 column2 在 num1 和 num2 之间的那些行的 column1
高级过滤
WHERE扩展
与AND
:
1 | SELECT column1, column2 |
与OR
:
1 | SELECT column1, column2 |
PS: 当多个AND
与OR
连用时注意用括号分割,避免逻辑性错误,避免歧义。
与IN
:
1 | SELECT column1, column2 |
可以看出IN
与OR
相当,但是当合法选项很多时,前者的语法更清楚,更直观。
与NOT
:
1 | SELECT column1, column2 |
其中NOT
只否定其后一个语句,而不是全部语句。
通配符过滤–LIKE
操作符:
%
通配符:
1 | SELECT column1, column2 |
%
表示任何字符出现任意次数,上例表示找出所有以 value2起头的单词,其中%
可以使用任意次数。
应注意的是若指定value1 = 'value2%y'
, 即以value2
起头,以y
结尾,但是许多DBMS用空格填补字段,则无返回,应该为value1 = 'value2%y%'
_
通配符:
与%
类似,但是_
只匹配一个字符。
[]
通配符:
[]
用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符,[JM]
表示此处的字符可以为 J 或 M。应注意的是[]
通配符只有Access和SQL Server支持。
Summary:
- 使用通配符导致搜索时间变长
- 不要过度使用通配符,若可以达到相同目的,应使用其他操作符
- 使用通配符时不要把它放在开始的位置,应尽量往后放。
创建计算字段
拼接字段
MySQL中使用Concat
函数创建拼接字段,使用AS
为新的字段创建一个名字, 其中AS
是可选的,但是最好使用。
1 | SELECT Concat(column1, '(', column2, ')') |
算术计算
可用操作符:
操作符 | 说明 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
函数处理
常用函数
函数 | 说明 |
---|---|
SUBSTRING() | 提取字符串的组成部分 |
CONCERT() | 数据类型转换 |
CURDATE() | 提取当前日期 |
LEFT() | 返回字符串左边的字符 |
LENGTH() | 返回字符串的长度 |
LOWER() | 将字符串转换为小写 |
LTRIM() | 去掉字符串左边的空格 |
RIGHT() | 返回字符串右边的字符 |
RTRIM() | 去掉字符串右边的空格 |
SOUNDEX() | 返回字符串的SOUNDEX的值(可以用发音来进行相似性检测) |
UPPER() | 将字符串转换为大写 |
常用数值处理函数: 虽然该类型函数使用较少,但是在主要的DBMS中一致性、统一性最高,故而此处不做列举。