SQL注入之SQL Server增删改查

kali里面docker拉了一个,怎么搭建把命令甩ai就行,启动命令如下:sudo docker exec -it sqlserver /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P 'Kali@2026Sec!' -C


建立库和表

首先还是创建数据库:

sql 复制代码
CREATE DATABASE testdb;
GO

这里的GO是确保命令立即生效,可以从下面的截图中看到输入第一行回车之后变成了第二行,说明这整一个语句还没有结束,这个GO会告诉sqlcmd将之前输入的所有T-SQL语句作为一个批次发送给服务器执行

然后是切换到刚刚建立的数据库:

sql 复制代码
USE testdb;
GO

可以看到在命令行中会有相应的提示:

再之后是建表:

sql 复制代码
CREATE TABLE Employees (
    ID INT PRIMARY KEY IDENTITY(1,1),
    Name VARCHAR(50),
    Age INT
);

这里面后两个好理解,关键是第一行:

部分 含义 底层解释
ID 列名 这一列的名称叫做 "ID"
INT 数据类型 整数类型(Integer),取值范围约为 -21亿 到 21亿
PRIMARY KEY 主键约束 唯一标识每一行,值必须 唯一且非空 。数据库会自动为该列创建 聚集索引(Clustered Index),数据在物理存储上按该列顺序排列
IDENTITY(1,1) 自增属性 (1,1) 表示:起始值为 1,每次递增 1。插入数据时无需手动指定该列值,数据库会自动生成顺序编号:1, 2, 3, 4...,保证永不重复

主键约束和自增属性也可以不加,如果不加主键约束的话就代表会产生以下效果:

  • 允许重复的 ID 值(插入两行 ID=1 都可以)
  • 允许 ID 为 NULL
  • 没有唯一标识每一行的保障
  • 查询大量数据时速度会慢(因为没有自动创建聚集索引)

自增不加的话就代表每次要手动指定ID的值,命令如下:

sql 复制代码
INSERT INTO Employees (ID, Name, Age) VALUES (1, 'Alice', 30);
INSERT INTO Employees (ID, Name, Age) VALUES (2, 'Bob', 25);

如果加了主键约束的话需要确保每次加入的id值不相同

那么再回到最开始的命令,后面就是在表格中填入相应的内容,然后进行查看:

sql 复制代码
INSERT INTO Employees (Name, Age) VALUES ('Alice', 30);
INSERT INTO Employees (Name, Age) VALUES ('Bob', 25);
GO
SELECT * FROM Employees;
GO

更新和删除

UPDATE

更新的语法如下:

sql 复制代码
UPDATE 表名 SET 列名 = 新值 WHERE 条件;

那么比如将Alice的年龄改为31:

sql 复制代码
UPDATE Employees  SET Age=31 where Name='Alice';
go

或者将原来的Bob改为另一个人

sql 复制代码
UPDATE Employees SET Name = 'ShoreKiten' WHERE Age=25;
UPDATE Employees SET Name = 'ShoreKiten' WHERE ID=2;
UPDATE Employees SET Name = 'ShoreKiten' WHERE Name='Bob';

如果where没有写的话那就是全部数据都进行更改

sql 复制代码
UPDATE Employees SET Age=18;
go

DELETE

语法如下:

sql 复制代码
DELETE FROM 表名 WHERE 条件;

删除Alice的数据:

sql 复制代码
DELETE FROM Employees WHERE Name = 'Alice';
GO

这里也可以看到Shorekiten的ID仍为2,并没有因为前一个数据的删除而减少

还有一种删除方法是对全表进行删除但保留表原来的结构

sql 复制代码
TRUNCATE TABLE Employees;
GO

WHERE进阶查询

先往表里面加几条数据,因为之前全删了因此把最开始的也放进来

sql 复制代码
INSERT INTO Employees (Name, Age) VALUES ('Alice', 30);
INSERT INTO Employees (Name, Age) VALUES ('Bob', 25);
INSERT INTO Employees (Name, Age) VALUES ('David', 35);
INSERT INTO Employees (Name, Age) VALUES ('Eva', 28);
INSERT INTO Employees (Name, Age) VALUES ('Frank', 42);
INSERT INTO Employees (Name, Age) VALUES ('Grace', 23);
INSERT INTO Employees (Name, Age) VALUES ('Henry', 31);
INSERT INTO Employees (Name, Age) VALUES ('Ivy', 29);
GO

AND / OR(组合条件)

sql 复制代码
SELECT * FROM Employees WHERE Age > 25 AND Age < 35;
GO

SELECT * FROM Employees WHERE Age < 25 OR Age > 40;
GO

IN(在某个集合中)

sql 复制代码
-- 年龄是 25、30、35 的人
SELECT * FROM Employees WHERE Age IN (25, 30, 35);
GO

-- 等价于用 OR 写
SELECT * FROM Employees WHERE Age = 25 OR Age = 30 OR Age = 35;
GO

BETWEEN(区间范围,包含边界)

sql 复制代码
SELECT * FROM Employees WHERE Age BETWEEN 25 AND 35;
GO

LIKE(模糊匹配)

sql 复制代码
-- 名字以 'A' 开头的人
SELECT * FROM Employees WHERE Name LIKE 'A%';
GO

-- 名字包含 'a' 的人(不区分大小写)
SELECT * FROM Employees WHERE Name LIKE '%a%';
GO

-- 名字以 'y' 结尾的人
SELECT * FROM Employees WHERE Name LIKE '%y';
GO

IS NULL / IS NOT NULL(空值判断)

先加一条有空值的测试数据:

sql 复制代码
INSERT INTO Employees (Name, Age) VALUES ('Jack', NULL);
GO

-- 查询 Age 为空的人
SELECT * FROM Employees WHERE Age IS NULL;
GO

-- 查询 Age 不为空的人
SELECT * FROM Employees WHERE Age IS NOT NULL;
GO

NOT(取反)

sql 复制代码
SELECT * FROM Employees WHERE Age NOT IN (25, 30, 35);
SELECT * FROM Employees WHERE age NOT BETWEEN 25 AND 35;
SELECT * FROM Employees WHERE Name NOT LIKE 'A%';

排序(ORDER BY)

sql 复制代码
-- 按年龄升序排列(默认 ASC)
SELECT * FROM Employees ORDER BY Age;
GO

-- 按年龄降序排列(DESC)
SELECT * FROM Employees ORDER BY Age DESC;
GO

-- 先按年龄降序,年龄相同再按名字升序【字母表顺序】
SELECT * FROM Employees ORDER BY Age DESC, Name ASC;
GO

分页(OFFSET FETCH)

分页公式:

每页 N 条,查第 P 页:OFFSET (P-1) * N ROWS FETCH NEXT N ROWS ONLY

例如第 3 页,每页 5 条:OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY

注意: OFFSET FETCH 必须有 ORDER BY 配合

sql 复制代码
-- 跳过前 3 条,取接下来 3 条(第 2 页,每页 3 条)
SELECT * FROM Employees 
ORDER BY ID 
OFFSET 3 ROWS 
FETCH NEXT 3 ROWS ONLY;
GO

最后小综合一下,就不给答案了:

查询出:年龄在 25 到 35 之间,名字以 'A' 开头或包含 'e',按年龄降序排列,只显示前 3 条

相关推荐
一只小bit39 分钟前
Redis哨兵机制、主从复制与集群搭建与维护
数据库·redis·bootstrap
zlwool7 小时前
图纸管理选型避坑指南
数据库·erp·设备erp·非标机械
小灰灰搞电子8 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
软件聚导航10 小时前
「聚小软 AI 助手」技术升级:从数据库检索到 RAG 知识库问答
前端·数据库·mysql·微信小程序·小程序·ai编程·rag
学习星球11 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
GoppViper11 小时前
RDF资源描述框架深度解析:语义Web的数据基石与实战逻辑
前端·数据库
2601_9621741712 小时前
Redis 简介
数据库·redis·wpf
夜雪一千12 小时前
MySQL 各种数据同步方案全梳理:从简单复制到异构同步实战
数据库·mysql
Highcharts.js13 小时前
Highcharts 下钻(Drilldown)柱状图 Demo
数据库·信息可视化·hbase·highcharts·drilldown·js模块·下钻图表
翼龙云_cloud13 小时前
阿里云国际渠道代理商:如何在ECS上部署Flask应用?
运维·数据库·阿里云·flask·云计算