数据库(DATABASE)
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的数据集合。
特点
- 数据结构化:数据库中的数据是按照一定的结构(如关系型数据库中的表结构)进行组织的。以学生信息表为例,它可能包含 “学号”“姓名”“班级”“出生日期” 等字段,每个字段都有特定的数据类型,这样就使得数据具有清晰的结构,方便存储和查询。
- 数据共享性高:多个用户或者程序可以同时访问数据库中的数据。例如,学校的教务处、学生处、财务处等部门都可以根据自己的需求访问学生数据库,教务处查询成绩信息,学生处查询学生基本信息,财务处查询学费缴纳情况等。
- 数据独立性强:包括物理独立性和逻辑独立性。物理独立性是指数据的物理存储结构(如存储在磁盘的哪个位置、采用何种存储方式等)的改变不会影响到应用程序对数据的使用;逻辑独立性是指数据库的逻辑结构(如增加新的表或者修改表之间的关系)的改变也不会影响到应用程序的正常运行。
- 数据冗余度低:数据库会尽量减少数据的重复存储。例如,在存储学生和课程信息时,如果一个学生选了多门课程,只需要在选课关系表中记录学生 ID 和课程 ID 的对应关系,而不需要在每个课程信息中都重复存储学生的所有信息,这样可以节省存储空间,并且避免数据不一致的情况
类型
- 键 - 值(Key - Value)存储数据库:数据以键值对的形式存储,就像字典一样,通过键来快速查找对应的值。Redis 是典型的键 - 值存储数据库,它常用于缓存系统。例如,在一个网站的缓存系统中,可以将用户的登录状态(值)以用户 ID(键)的形式存储在 Redis 中,这样当用户再次访问网站时,可以快速根据用户 ID 获取其登录状态。
- 文档型数据库:数据以文档(如 JSON 格式)的形式存储,一个文档可以包含多个不同类型的字段,并且文档之间可以有不同的结构。MongoDB 是比较知名的文档型数据库。比如,在一个博客系统中,可以将一篇博客文章的标题、作者、内容、发布日期等所有信息作为一个文档存储在 MongoDB 中。
- 列存储数据库:主要是按照列来存储数据,而不是像关系型数据库那样按照行存储。这种数据库在处理大数据分析场景时非常有效,因为它可以快速地对某一列的数据进行查询和计算。例如,HBase 是一种列存储数据库,在对海量日志数据进行分析时,如果只需要对日志中的时间戳这一列进行统计分析,列存储数据库就能够更高效地完成任务。
- 图形数据库:用于存储和处理图形结构的数据,例如社交网络中的用户关系、知识图谱中的实体关系等。Neo4j 是比较著名的图形数据库。在社交网络应用中,用图形数据库可以很方便地表示用户之间的朋友关系、关注关系等,通过节点表示用户,边表示用户之间的关系,从而实现高效的关系查询,如查找某个用户的所有朋友的朋友。
SQL基础语言用法
一、数据查询(SELECT 语句)
- 简单查询
- 语法:
SELECT column1, column2,... FROM table_name; - 示例:假设有一个名为
students的表,包含id、name和age字段。要查询所有学生的姓名和年龄,可以使用以下语句:
- 语法:
收起
sql
复制
SELECT name, age FROM students;
- 查询所有列
- 语法:
SELECT * FROM table_name; - 示例:查询
students表中的所有信息。
- 语法:
收起
sql
复制
SELECT * FROM students;
- 使用条件查询(WHERE 子句)
- 语法:
SELECT column1, column2,... FROM table_name WHERE condition; - 示例:查询年龄大于 20 岁的学生姓名。
- 语法:
收起
sql
复制
SELECT name FROM students WHERE age > 20;
- 条件可以使用比较运算符(
=、>、<、>=、<=、<>),逻辑运算符(AND、OR、NOT)。例如,查询年龄大于 20 岁且姓名以 “张” 开头的学生姓名:
收起
sql
复制
SELECT name FROM students WHERE age > 20 AND name LIKE '张%';
- 排序查询结果(ORDER BY 子句)
- 语法:
SELECT column1, column2,... FROM table_name ORDER BY column_name [ASC|DESC]; - 其中
ASC表示升序(默认),DESC表示降序。 - 示例:查询所有学生的姓名和年龄,并按照年龄升序排列。
- 语法:
收起
sql
复制
SELECT name, age FROM students ORDER BY age ASC;
二、数据插入(INSERT 语句)
- 插入单条记录
- 语法:
INSERT INTO table_name (column1, column2,...) VALUES (value1, value2,...); - 示例:向
students表中插入一条新学生记录,包含姓名和年龄。
- 语法:
收起
sql
复制
INSERT INTO students (name, age) VALUES ('李四', 22);
- 如果要插入所有列的值,可以省略列名列表,但要保证
VALUES中的值顺序与表定义中的列顺序一致。例如:
收起
sql
复制
INSERT INTO students VALUES (3, '王五', 21);
- 插入多条记录(不同数据库有不同实现方式)
- 在 MySQL 中,可以使用多条
INSERT语句,也可以使用如下方式:
- 在 MySQL 中,可以使用多条
收起
sql
复制
INSERT INTO students (name, age) VALUES ('赵六', 20), ('孙七', 23);
三、数据更新(UPDATE 语句)
- 更新单条记录
- 语法:
UPDATE table_name SET column1 = value1, column2 = value2,... WHERE condition; - 示例:将姓名为 “李四” 的学生年龄更新为 23 岁。
- 语法:
收起
sql
复制
UPDATE students SET age = 23 WHERE name = '李四';
- 更新多条记录
- 示例:将所有年龄小于 20 岁的学生年龄加 1。
收起
sql
复制
UPDATE students SET age = age + 1 WHERE age < 20;
四、数据删除(DELETE 语句)
- 删除单条记录
- 语法:
DELETE FROM table_name WHERE condition; - 示例:删除姓名为 “赵六” 的学生记录。
- 语法:
收起
sql
复制
DELETE FROM students WHERE name = '赵六';
- 删除所有记录
- 语法:
DELETE FROM table_name;(这种操作要谨慎使用,因为会删除表中的所有数据) - 示例:
- 语法:
收起
sql
复制
DELETE FROM students;
SQL注入漏洞
- 定义
- SQL 注入漏洞是一种常见的安全漏洞,主要出现在 Web 应用程序与数据库交互的过程中。攻击者通过在用户输入或其他可控的数据字段中注入恶意的 SQL 语句,从而欺骗应用程序执行非预期的数据库操作。这些恶意操作可能包括窃取敏感数据、篡改数据、删除数据,甚至控制整个数据库服务器。
- 原理
- 当 Web 应用程序使用用户输入构建 SQL 查询时,如果没有对用户输入进行充分的验证和过滤,攻击者就可以利用这个漏洞。例如,一个简单的登录验证功能,可能会有一个 SQL 查询如下:
收起
sql
复制
SELECT * FROM users WHERE username = '$user_input' AND password = '$password_input';
- 正常情况下,
$user_input和$password_input是用户在登录表单中输入的用户名和密码。但是如果攻击者在用户名输入框中输入' OR '1'='1,那么 SQL 查询就会变成:
收起
sql
复制
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '$password_input';
- 由于
'1'='1'这个条件总是为真,攻击者就可以绕过用户名验证,有可能获取到用户表中的所有信息。