一文带你真正了解-SQL¶
写在前面¶
关于 SQL,论坛里常常有很多人会发帖询问:
“有哪个代码师会 SQL 啊”
“谁帮我看看报错啊“
”求大佬帮忙做一下 SQL 啊“
而往往都是招空气,而且有很多人表示对 SQL 很感兴趣,所以我就做了一篇 JS 基础教程
但是, 真正的进步需要靠自己的努力 ,本篇文章仅做总结与入门,其他内容自行学习
再次声明:请利用 搜索引擎
同时我还遇见了一个奇怪的问题:有人叫我出关于分号的教程(?
还是同一句话,利用 搜索引擎
Alan 碎碎念:这个文档里已经有了:关于分号和括号引发的问题
什么是 SQL¶
关于 SQL
SQL 是一种用于编程的特定于领域的语言,设计用于管理关系数据库管理系统(RDBMS)中保存的数据,或用于关系数据流管理系统(RDSMS)中的流处理。它在处理结构化数据(即包含实体和变量之间关系的数据)时特别有用
SQL,全名Structured Query Language,中文为"结构化查询语言"
是一种数据库管理语言,可用于处理结构化的数据(例如表格,带有键值关系的数据)
总而言之,是用于管理和结构化数据库的一种语言, 而不是数据库本身
其主要用于对于数据库数据的增删改查,具体到数据库编程以及维护等功能
主流数据库有很多, 本文以 SQLite 为基础进行讲解 ,但是大部分数据库都以 SQL 为查询语言
如有更多需要,请访问 SQLite 官方网站和网络教程
SQLite 必须使用大写语句吗?
其实不一定,目前来说 SQLite 对于大小写不敏感,至于为什么要大写,或许是为了遵守开发规范吧 但是在实际代码中,我们一般都大写
表格操作¶
创建表格 - CREATE TABLE¶
我们使用CREAT TABLE语句来创建表格
SQLite 中创建表格的语法是
请注意,表格名称不能是 table 以及保留字等,或以 sqlite_开头的名称,因为以此开头的名称是 SQLite 自行内建,自行管理的表格
datatype 表示数据类型,例如小数、字符串、金钱、时间、整数等
在 SQL 中,数据是以行-列来储存的,这种结构化管理可以认为是表格
我们能通过使用某列来查询,或其他表达式,例如,我们命名了一个叫 id 的列,那么就能通过 id 来查询表格数据
例如上面的代码中
创建了一个名为 Nomen 的表格,拥有 id 和 value 两列
id 列的规则是整数,精度 16,不为空
value 的规则是字符串
| id | value | |
|---|---|---|
| row1 | ||
| row2 | ||
| row3 |
我们就生成了如上图的一个抽象表格
我们也可以使用一个表作为模板导入
这样,我们就使用了 customers 的指定内容创建了一个新表格 TestTable
列规则/属性约束¶
SQLite 中常见的约束
NOT NULL:列内容不能为空
DEFAULT:当为空值时,为其提供一个默认值
UNIQUE:强制当前列所有项不能相同
PRIMARY Key:作为唯一标识符,一个表格仅有一个,且自带 NOT NULL 和 UNIQUE 属性 一个表格的主键,作为唯一标识符,可以由多个列组成,成为复合键
CHECK:确保某列中的所有值满足一定条件
如上约束在符合逻辑条件的情况下可以叠加,例如
一个属性可以是 UNIQUE(不能相同)并且 NOT NULL(不为空)
举个栗子,用一个表格记录一名员工
CREATE TABLE Company(
id INT PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
age INT NOT NULL,
address CHAR(50),
salary REAL CHECK(SALARY > 0)
);
其包含了五个属性:
id,作为主键,自带不能重复,不能为空
name,字符串,不能为空
age,整数,不能为空
地址,字符串,长度为 50
薪资,实数,精度 8 位,并且需大于 0
SQLite 无法使用代码对约束进行删除或增加
删除表格 - DROP TABLE¶
删除表格无法撤销
请注意,使用此语句删除表格后,其中信息会永久丢失,再次读取会抛出no such table报错
删除表格基本语法
项目操作¶
在任何集合的数据前,我们都能用 增删改查 来概括其操作
增加数据 - INSERT INTO¶
SQLite 中使用 INSERT INTO 语句来插入数据
column 表示列名称,value 表示按照顺序插入到的列中
列不一定要全,但是具有 NOT NULL 约束的列必须插入非空值内容
也可以简写,直接写
则会按照列的排序按顺序插入空值,当插入的数据小于列时,则会报错,提示拥有行 5,但插入数据是 4 之类的
我们也可以使用另一个表来插入数据
INSERT INTO first_table (column1, column2, columnN)
SELECT column1, column2, columnN
FROM second_table
WHERE [condition];
这句话的意思是:从 second_table 中选取指定列中符合表达式(condition)的项目插入 first_table 中
我们会在稍后了解 SELECT
那么我们就向表格中插入了一行数据
| ID | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 1 | Paul | 32 | California | 20000.0 |
删除数据 - DELETE¶
DELETE 基本语法:
从 table1 中删除 所有 符合表达式的项目
请注意,如果表达式缺失,则会清空整个表格所有内容
Alan: 此即为著名的删库跑路()
| id | name | age |
|---|---|---|
| 1 | Paul | 32 |
| 2 | Allen | 25 |
| 4 | Teddy | 23 |
| 5 | Paul | 21 |
进行删除操作:
则表格最终为
| id | name | age |
|---|---|---|
| 2 | Allen | 25 |
| 4 | Teddy | 23 |
更新数据 - UPDATE¶
在 SQLite 中,更新数据基本语法是
意思为:
在 table_name 表格中选取所有符合表达式的项目,并且对于其指定列内容设置
请注意,如果未指定某个列,则这个列不会被更新
如果指定列不存在,则抛出报错
实例中,更新玩家数据
| ID | name | coin | address |
|---|---|---|---|
| 1 | Paul | 329 | California |
| 2 | Allen | 251 | Texas |
| 3 | Teddy | 0 | Norway |
| 4 | Mark | 256 | Rich-Mond |
| 5 | David | 2756 | Texas |
则更新列表中名字为 Allen 的项目的金币为 123
如果表达式缺失,则会修改所有内容
例如
则最终表格为
| ID | name | coin | address |
|---|---|---|---|
| 1 | Paul | 0 | California |
| 2 | Allen | 0 | Texas |
| 3 | Teddy | 0 | Norway |
| 4 | Mark | 0 | Rich-Mond |
| 5 | David | 0 | Texas |
查询数据 - SELECT¶
在 SQLite 中,我们使用 SELECT 语句来查询项目
注意, SELECT 语句能够被引用和嵌套,例如在创建表格时,我们能 SELECT 另一个表格数据来创建表格
SELECT 基本语法为
我们能通过表达式访问指定项目,例如查询玩家 userID
查询创建的表格
补充一个小知识,大家在神岛中会遇到不知道到底创建了几个表格的问题,我们能通过访问SELECT * FROM sqlite_master; 来获取所有表格的名字,索引,构建代码和数据等等信息
在岛三中的实际应用中,我们 SELECT 语句后会返回一个列表,表示查询到的所有内容,例如
| ID | name | coin | address |
|---|---|---|---|
| 1 | Paul | 0 | California |
| 2 | Allen | 4 | Texas |
| 3 | Teddy | 2 | Norway |
| 4 | Mark | 3 | Rich-Mond |
| 5 | David | 3 | Texas |
子句¶
ORDER BY¶
在 SQLite 中,我们使用 ORDER BY 来对于 SELECT 返回的数据进行排序
其基本语法为
SELECT column1
FROM table_name
WHERE [condition]
ORDER BY column1, column2,columnN --ASC | DESC;此处选择两者其一--
ASC 默认值,从小到大,升序排列
DESC 从大到小,降序排列
例如按照玩家金币数量进行排序
请注意,ORDER BY 不会更改数据库内容,仅对返回结果产生影响
DISTINCT¶
DISTINCT 是用于去重的关键字,其在选择时,不会获取重复记录
让我们看一看来源于菜鸟教程提供的实例
| ID | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 1 | Paul | 32 | California | 20000.0 |
| 2 | Allen | 25 | Texas | 15000.0 |
| 3 | Teddy | 23 | Norway | 20000.0 |
| 4 | Mark | 25 | Rich-Mond | 65000.0 |
| 5 | David | 27 | Texas | 85000.0 |
| 6 | Kim | 22 | South-Hall | 45000.0 |
| 7 | James | 24 | Houston | 10000.0 |
| 8 | Paul | 24 | Houston | 20000.0 |
| 9 | James | 44 | Norway | 5000.0 |
| 10 | James | 45 | Texas | 5000.0 |
最终返回结果为
| NAME |
|---|
| Paul |
| Allen |
| Teddy |
| Mark |
| David |
| Kim |
| James |
表达式¶
相信大家在看完上述所有栗子中的表达式(condition)不太理解,此段落将为大家简述关于表达式的语句
表达式也叫条件表达式,其与运算符共用按逻辑返回 true 或 false (真与假)两种值
运算符也分为算数运算符、逻辑运算符和比较运算符
使用 WHERE 语句可以引用表达式进行判断
例如,我们需要获取名字为保罗的信息
表达式较杂,请自行搜索网络教程进行学习,此处仅举例
文章结束¶
好了,SQL 的基础知识已经交给你们了
如果要学习更高阶的知识,请自行阅读网络教程
补充资料 - 来源于网络¶
算数运算符¶
| 运算符 | 含义 | 例子 |
|---|---|---|
| + 加法 | 把运算符两边的值相加 | a + b 将得到 30 |
| - 减法 | 左操作数减去右操作数 | a - b 将得到 -10 |
| * 乘法 | 把运算符两边的值相乘 | a * b 将得到 200 |
| / 除法 | 左操作数除以右操作数 | b / a 将得到 2 |
| % 取模 | 左操作数除以右操作数后得到的余数 | b % a 将得到 0 |
比较运算符¶
| 运算符 | 含义 | 例子 |
|---|---|---|
| == | 检查两个操作数的值是否相等 | (a == b) 不为真。 |
| = | 检查两个操作数的值是否相等 | (a = b) 不为真。 |
| != | 检查两个操作数的值是否不相等 | (a != b) 为真。 |
| <> | 检查两个操作数的值是否不相等 | (a <> b) 为真。 |
| > | 检查左操作数的值是否大于右操作数的值 | (a > b) 不为真。 |
| < | 检查左操作数的值是否小于右操作数的值 | (a < b) 为真。 |
| >= | 检查左操作数的值是否大于等于右操作数的值 | (a >= b) 不为真。 |
| <= | 检查左操作数的值是否小于等于右操作数的值 | (a <= b) 为真。 |
| !< | 检查左操作数的值是否不小于右操作数的值 | (a !< b) 为假。 |
| !> | 检查左操作数的值是否不大于右操作数的值 | (a !> b) 为真。 |
逻辑运算符¶
| 运算符 | 描述 |
|---|---|
| AND | AND 运算符允许在一个 SQL 语句的 WHERE 子句中的多个条件的存在。 |
| BETWEEN | BETWEEN 运算符用于在给定最小值和最大值范围内的一系列值中搜索值。 |
| EXISTS | EXISTS 运算符用于在满足一定条件的指定表中搜索行的存在。 |
| IN | IN 运算符用于把某个值与一系列指定列表的值进行比较。 |
| NOT IN | IN 运算符的对立面,用于把某个值与不在一系列指定列表的值进行比较。 |
| LIKE | LIKE 运算符用于把某个值与使用通配符运算符的相似值进行比较。 |
| GLOB | GLOB 运算符用于把某个值与使用通配符运算符的相似值进行比较。GLOB 与 LIKE 不同之处在于,它是大小写敏感的。 |
| NOT | NOT 运算符是所用的逻辑运算符的对立面。比如 NOT EXISTS、NOT BETWEEN、NOT IN,等等。它是否定运算符。 |
| OR | OR 运算符用于结合一个 SQL 语句的 WHERE 子句中的多个条件。 |
| IS NULL | NULL 运算符用于把某个值与 NULL 值进行比较。 |
| IS | IS 运算符与 = 相似。 |
| IS NOT | IS NOT 运算符与 != 相似。 |
| || | 连接两个不同的字符串,得到一个新的字符串。 |
| UNIQUE | UNIQUE 运算符搜索指定表中的每一行,确保唯一性(无重复)。 |