学习SQL注入就要提及一下数据库的基本概念
数据库就是一个存储数据的仓库,数据库是以一定方式存储在一起,能与多个用户共享,具有尽可能小的冗余度,与应用程序彼此独立的数据集合。
数据库类型:
关系型数据库,存储的格式可以直观地反映实体间的关系。关系型数据库和常见的表格比较相似,关系型数据库表与表之间是有很多复杂的关联关系的。常见的关系型数据库有MySQL,Oracle,PostgreSQL,SQL,Server。
非关系型数据库: NoSQL数据库适合追求速度和可扩展性,业务多变的应用场景。MongoDB
MySQL四种库:
informance_schema库
informance_schema库是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息,比如数据库名,数据库表,表字段的数据类型与访问权限等。
mysql库
mysql库:MySQL的核心数据库,主要负责存储数据库的用户,权限设置,关键字等mysql自己需要使用的控制和管理信息。
performance_schema库
performance_schema库:内存数据库,数据放在内存中直接操作的数据库,相对于磁盘,内存的数据读写速度要高出几个数量级,将数据保存在内存中相比从磁盘上访问能够极大地提高应用的性能。
sys库
sys库:通过这个数据库,可以查询谁使用了最多的资源基于IP或是用户。那张表被访问最多等等信息。
现在我们进行一些数据库实操:
实操所用为Ubuntu 7.5.0,Docker 24.0.2,mysql 5.7.42,SQLyog
首先我们用docker创建启动MySQL并设置密码:
docker run --name sqlmysql -d -p 4001:3306 -e MYSQL_ROOT_PASSWORD=123 [IMAGE ID]
MYSQL_ROOT_PASSWORD可以自己设置想要的密码。
出现形如上图中最后一行的代码即为创建成功。
然后我们查看MySQL是否运行:
docker ps
如图即为运行中:
我们进入容器:
docker exec -it sqlmysql /bin/bash
连接MySQL:
mysql -uroot -p
然后我们使用SQLyog连接MySQL,并完成一些操作。
-- 列出所有数据库
SHOW DATABASES;
-- 查看某一个数据库里所有的表
需要先声明使用的库
USE mysql;
SHOW TABLES;
-- select特殊应用
-- 查看当前选择的哪个库
SELECT DATABASE();
-- 版本
SELECT VERSION();
-- 查看当前登录数据库的用户
SELECT USER();
-- 查看数据路径
SELECT @@datadir;
-- 查看mysql安装路径
SELECT @@basedir;
-- 查看mysql安装的系统
SELECT @@version_compile_os;
-- 查询数据
-- SELECT查询关键字
-- *代查表
SELECT * FROM mysql.user;
-- show databases;
SELECT * FROM information_schema.`SCHEMATA`;
show databases;
SELECT schema_name FROM information_schema.`SCHEMATA`;
-- 结果相同
-- 创建库
CREATE DATABASE test CHARSET utf8mb4;
-- 创建表
USE test;
CREATE TABLE t1(id INT);
-- 删除表
DROP TABLE t1;
-- 创建项
SHOW TABLES FROM test;
ALTER TABLE t1 ADD NAME VARCHAR(32);
DESC t1;
-- 插入数据
INSERT INTO t1 VALUES(1,"张三"),(2,"李四"),(3,"王五");
INSERT INTO t1 VALUES (4,'张三');
SELECT * FROM t1;
-- where and or
SELECT * FROM test.t1 WHERE NAME = '张三' AND id = 1;
SELECT * FROM test.t1 WHERE NAME = '张三' OR 1 = 1;
-- union
SELECT * FROM test.t1 UNION SELECT 1,2;
SELECT USER,HOST FROM mysql.user UNION SELECT * FROM test.`t1`;