文章目录
准备工作
- 配置环境变量:当在自己的计算机上下载并安装好MySQL数据库后,需要找到安装目录中的
mysql.exe
文件所在的目录,并且将其添加到计算机的Path
环境变量中。 - 准备数据库管理工具:常用的数据库管理工具有很多,例如
Navicat
、phpMyAdmin
、DBeaver
等等,使用这些工具可以在可视化的界面中来操作数据库,更加简单和方便。我自己使用的是HeidiSQL
。
基本操作语句
数据库的基本操作包括增删改查四大部分,因此下面也将主要分为这四个大的部分进行介绍。另外,对于一些特殊的语句,将单独在一部分中进行介绍。
查操作语句
查看数据库服务器上所有可用数据库
- 基本语法:
show databases;
。 - 返回结果:返回一个结果集,该结果集中包含当前数据库服务器上所有数据库的名称。
查看某个数据库中的所有数据表
- 基本语法:
show tables; # 查看当前数据库中的所有数据表
show tables from 数据库名称; # 查看指定数据库中的所有数据表
- 返回结果:返回一个结果集,包含查找的数据库中的所有表名。
查找某个数据表中的数据(难点)
- 基本语法:
SELECT column1, column2, ...
FROM table_name
WHERE condition
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...
LIMIT number;
- 详细说明:
-
SELECT:
- 指定要检索的列。可以使用
*
表示选择所有列。 - 语法:
SELECT column1, column2,...
或SELECT *
。
- 指定要检索的列。可以使用
-
FROM:
- 指定要查询的表。
- 语法:
FROM table_name
。
-
WHERE:
- 指定查询的条件。只有满足条件的行才会被返回。
- 语法:
WHERE condition
。 - 常见的条件:
- 大小比较运算符:
=
(等于)<>
或!=
(不等于)>
(大于)<
(小于)>=
(大于等于)<=
(小于等于)
- 逻辑表达式:
AND
(逻辑与)OR
(逻辑或)NOT
(逻辑非)
- LIKE:进行模式匹配,即找出满足某种模式的字符串。通常与两种通配符
%
和_
搭配使用。%
:表示任意数量的字符(包括零个字符)。例如,%abc%
匹配包含abc
的任何字符串。_
:表示单个字符。例如,_abc
匹配以abc
结尾且前面有一个字符的字符串。
- IS NULL和IS NOT NULL:
IS NULL
用于查找列值为NULL
的记录,而IS NOT NULL
用于查找列值不为NULL
的记录。 - IN:用于在
WHERE
子句中指定多个可能的值。它允许你检查某个列的值是否在给定的值列表中。
- 大小比较运算符:
-
ORDER BY
:- 指定查询结果的排序顺序。可以按一个或多个列排序。ASC表示升序(默认),DESC表示降序。
- 语法:
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...
。
-
LIMIT
:- 限制返回的行数。通常用于分页查询。
- 语法:
LIMIT number
。
-
增操作语句
创建一个数据库
- 基本语法:
create database [if not exists] 数据库名称;
。- IF NOT EXISTS:这是一个可选的子句,用于防止在数据库已经存在的情况下创建数据库时出现错误。如果数据库已经存在,SQL语句不会执行任何操作,也不会返回错误。
- 其他备注:实际情况中很少使用这条SQL语句创建数据库,而是使用数据库管理工具,在可视化的界面中手动创建一个。
创建一张数据表
- 基本语法:
create table [if not exists]table_name (
column1 datatype [column_constraint],
column2 datatype [column_constraint],
column3 datatype [column_constraint],
...
[table_constraint]
);
-
table_name
:要创建的表的名称。表名在数据库中必须是唯一的。 -
column1, column2, column3, ...
:这些是表中的列名。每个列名后面跟着它的数据类型和可选的列约束。 -
datatype
:这是列的数据类型,定义了该列可以存储的数据类型。常见的数据类型包括:INT或INTEGER
: 整数。VARCHAR(n)
: 可变长度的字符串,n是最大长度。CHAR(n)
: 固定长度的字符串,n是长度。DATE
: 日期。DATETIME
: 日期和时间。FLOAT
: 浮点数。BOOLEAN
: 布尔值。
-
column_constraint
:这是列级别的约束,定义了列的规则。常见的列约束包括:NOT NULL
: 该列不能为空。UNIQUE
: 该列的值必须是唯一的。PRIMARY KEY
: 该列是表的主键,唯一标识表中的每一行。FOREIGN KEY
: 该列引用另一个表的主键。CHECK
: 定义一个条件,该列的值必须满足该条件。DEFAULT X
: 如果没有为该列提供值,则使用默认值X。
-
table_constraint
:这是表级别的约束,定义了整个表的规则。常见的表约束包括:PRIMARY KEY (column1, column2, ...)
:定义复合主键。FOREIGN KEY (column) REFERENCES other_table(other_column)
: 定义外键。UNIQUE (column1, column2, ...)
: 定义复合唯一约束。CHECK (condition)
: 定义整个表的条件。
向指定数据表中插入数据
- 给所有列都插入值:
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
- 给表中指定的列插入值:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
- 在表中插入多行数据:
INSERT INTO Employees (EmployeeID, FirstName, LastName, BirthDate)
VALUES
(3, 'Alice', 'Johnson', '1990-05-10'),
(4, 'Bob', 'Williams', '1988-07-18');
改操作语句
修改数据表中的数据
- 基本语法:
UPDATE 表名
SET 列名1 = 新值1, 列名2 = 新值2,...
WHERE 条件
- 语法解释:首先通过
WHERE
语句找到需要更新数据的行(这里WHERE
语句的使用方法和查询部分的WHERE
语句的用法相同),然后通过SET
语句对这些行中的指定列的数据进行更新。另外,新的值可以是一个计算表达式,例如列名1 = 列名1 + 1
。 - 注意事项:由于
UPDATE
会修改原有的数据,因此建议在进行此操作前先对数据进行备份。
修改数据表本身
- 修改表名:
alter table 旧表名 rename 新表名;
- 重置自增起始值:
alter table 表名 auto_increment = 新起始值;
- 向指定表添加新的列:
alter table 表名 add column 新列名 数据类型;
- 修改指定表中某列的列名和数据类型:
alter table 表名 change column 旧列名 新列名 新数据类型;
- 修改列的默认值:
alter table 表名 alter column 列名 set default 新默认值;
- 删除列:
alter table 表名 drop column 列名;
删操作语句
删除数据表中的数据
DELETE FROM 表名
WHERE 条件
- 注意事项:
DELETE
操作会删除表中的数据,因此建议在操作前先对数据进行备份。另外,DELETE
操作的本质是删除满足条件的数据表行,而不是简单的清除表单数据。
删除指定的数据表
drop table [if exists] 要删除的表名
- 注意事项:该操作有较大的风险,一定要慎重进行。
清空数据表
truncate table 要清空数据的数据表名称
删除数据库(也就是删库)
drop database;
特殊操作语句
设置当前操作的数据库
- 基本语法:
use 数据库名称;
。 - 使用效果:执行这个语句后,所有后续的SQL操作(除非重新指定其他数据库)都会在这个指定的数据库上执行。
SQL注入攻击和预处理语句
SQL注入攻击的概念
- 基本概念:SQL注入攻击是一种常见的网络安全漏洞,攻击者通过在应用程序的输入字段中插入恶意的SQL代码,从而操纵数据库查询,获取或篡改数据库中的数据。
- 攻击案例介绍:
- 假设你有一个简单的登录页面,用户输入用户名和密码来登录。后台的SQL查询可能是这样的:
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';
如果用户输入的用户名是admin
,密码是123456
,那么SQL查询会变成如下这样,这个查询会检查数据库中是否有用户名为admin
且密码为123456
的记录。
SELECT * FROM users WHERE username = 'admin' AND password = '123456';
现在,假设攻击者在用户名输入框中输入了以下内容:admin' --
,密码输入框中输入任意内容,比如abc
。那么SQL查询会变成:
SELECT * FROM users WHERE username = 'admin' --' AND password = 'abc';
注意这里的 – 是SQL中的注释符号,它会使后面的内容被忽略。因此,这个查询实际上变成了:
SELECT * FROM users WHERE username = 'admin';
这个查询会返回所有用户名为admin
的记录,而不管密码是什么。攻击者就可以成功登录,即使他们不知道正确的密码。
SQL预处理语句
- 基本作用:
- 性能优化:预处理语句可以被数据库服务器编译和优化一次,然后在多次执行时重用,从而减少了编译的开销。
- 安全性:预处理语句可以有效防止SQL注入攻击,因为参数值在执行时是独立处理的,不会影响SQL语句本身的结构。
- 理解方式:简单来说,预处理语句就是参数化的SQL语句。