SQL注入基础语法
数据库的操作
查看数据库:
show databases;
创建数据库employees并选择字符集
create database employees charset utf-8;
删除数据库employees
drop database employees;
选择进入数据库
use employees;
数据表的操作:
创建数据表employee
create table employee(
id int,
name varchar(40),
sex char(4),
birthday date,
job varchar(100)
);
查看数据表信息
show full columns from employee.employee; //在一般的数据库里面是不支持full的
DESCRIBE employee; //后面的两个用的多
DESC employee;
查看数据表列表
select*from employee;
删除数据表
drop table employee;
修改数据表名称为user
rename table employees to user;
修改字符级
alter table user character set utf8;
数据列和数据行:
写入内容
insert into employees(
id,name,sex,birthday,job
)values(
1,'ctftu','male','1999-05-06','it'
);
增加一列内容
alter table employees add salary decimal(8,2); //数据类型,表示一个精度为 8 位,小数点后保留 2 位的十进制数
修改某一列的信息
update employees set salary = 500; //会把所有内容的后面添加500
指定修改某一类信息
update employees set name = 'benben' where id = 1; //修改id=1的行name为benben
update employees set name = 'benben',salary = 300 where id = 1;
删除列
alter table user drop salary;
删除行
alter table user where job = 'it';
删除表
delete from employees;
基础查询语句
SQL 的基本查询语句是 SELECT
语句,用于从数据库中检索数据。下面是 SELECT
语句的基本语法:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
解释:
- SELECT: 关键字,用于指定要检索的列。
- column1, column2, …: 要检索的列名,可以用逗号分隔多个列。
- FROM: 关键字,用于指定要检索的表名。
- table_name: 要检索的表的名称。
- WHERE: 可选关键字,用于指定检索条件,过滤要检索的数据。
- condition: 检索条件,可以是单个条件或多个条件组合。
示例:
假设我们有一个名为 employees
的表,包含以下列:
emp_id
(员工 ID)emp_name
(员工姓名)department
(部门)salary
(薪资)
以下是一些基本的 SELECT
语句示例:
- 检索所有列:
SELECT *
FROM employees;
- 检索特定列:
SELECT emp_name, salary
FROM employees;
- 使用 WHERE 子句过滤数据:
SELECT *
FROM employees
WHERE department = 'Sales';
- 使用多个条件:
SELECT *
FROM employees
WHERE department = 'Sales' AND salary > 50000;
- 使用别名:
SELECT emp_name AS name, salary AS pay
FROM employees;
- 使用 DISTINCT 去重:
SELECT DISTINCT department
FROM employees; //对有重复的结果进行去重
- 排序结果:
SELECT *
FROM employees
ORDER BY salary DESC;
//ASC: 指定升序排序,这是默认排序方式。
//DESC: 指定降序排序。
其他常用选项:
- LIMIT: 用于限制检索结果的数量。
- OFFSET: 用于跳过指定数量的结果。
- GROUP BY: 用于对数据进行分组。
- HAVING: 用于对分组结果进行过滤。
你说得没错,这些都是 SQL 查询语句中的常用子句,它们能够帮助你更精细地控制查询结果。下面就分别来详细解释一下:
1. LIMIT:
-
作用:
LIMIT
子句用于限制查询返回的结果数量。它可以用来限制查询返回的最大行数,防止一次查询返回过多的数据。 -
语法:
SELECT column1, column2, ... FROM table_name WHERE condition LIMIT number;
number
指定要返回的最大行数。
-
例子:
SELECT * FROM employees LIMIT 10; -- 返回前10行数据
2. OFFSET:
-
作用:
OFFSET
子句用于跳过查询结果中前offset
行数据,并返回剩余的数据。它可以用来实现分页功能,让查询结果分批显示。 -
语法:
SELECT column1, column2, ... FROM table_name WHERE condition LIMIT number OFFSET offset;
number
指定要返回的最大行数。offset
指定要跳过的行数。
-
例子:
SELECT * FROM employees LIMIT 10 OFFSET 20; -- 跳过前 20 行,再返回 10 行,返回第30行的数据
3. GROUP BY:
-
作用:
GROUP BY
子句用于将查询结果按照一个或多个列进行分组,并在每个分组上执行聚合函数。 -
语法:
SELECT column1, column2, ... FROM table_name WHERE condition GROUP BY column1, column2, ...;
column1, column2, ...
指定要分组的列。
-
例子:
SELECT department, COUNT(*) AS num_employees -- 统计每个部门的员工数量 FROM employees GROUP BY department; select group_concat(username) from users; //将多行直接显示为一行
-
COUNT(*)
: 一个聚合函数,它会计算查询结果中的行数。这里用*
表示计算所有行的数量,也就是统计所有员工数量。 -
AS num_employees
: 将COUNT(*)
计算的结果取一个别名为num_employees
,便于在结果集中用这个别名显示员工数量。 -
GROUP BY
是用于分组数据的子句。这里根据department
列进行分组,也就是说,把属于同一个部门的员工都归为一组。 -
emp_id emp_name department salary 1 John Smith Sales 50000 2 Jane Doe Marketing 60000 3 David Lee Sales 45000 4 Emily Chen Finance 55000 5 Michael Brown Marketing 58000 那么执行这段 SQL 代码后,将会返回以下结果:
department num_employees Sales 2 Marketing 2 Finance 1
4. HAVING:
-
作用:
HAVING
子句用于过滤GROUP BY
子句分组后的结果集。它类似于WHERE
子句,但用于过滤分组后的数据。 -
语法:
SELECT column1, column2, ... FROM table_name WHERE condition GROUP BY column1, column2, ... HAVING condition;
condition
指定过滤条件,用于过滤分组后的数据。
-
例子:
SELECT department, COUNT(*) AS num_employees FROM employees GROUP BY department HAVING COUNT(*) > 5; -- 只显示员工数量大于 5 的部门
总结:
LIMIT
、OFFSET
、GROUP BY
和 HAVING
这些子句能让你更加灵活地控制查询结果,实现更复杂的数据分析和处理。掌握这些子句,可以让你的 SQL 查询语句更加强大。
常见函数:
你说得对!仅仅列出 SQL 函数还不够,重要的是要了解如何使用它们。以下是一些常用函数的用法示例:
1. 聚合函数
-
COUNT():
SELECT COUNT(*) FROM employees; // 统计 `employees` 表中所有员工的数量 SELECT COUNT(DISTINCT department) FROM employees; // 统计 `employees` 表中不同部门的数量
-
SUM():
SELECT SUM(salary) FROM employees; // 计算 `employees` 表中所有员工的工资总和
-
AVG():
SELECT AVG(age) FROM employees; // 计算 `employees` 表中所有员工的平均年龄
-
MAX():
SELECT MAX(salary) FROM employees; // 找出 `employees` 表中工资最高的员工的工资
-
MIN():
SELECT MIN(salary) FROM employees;// 找出 `employees` 表中工资最低的员工的工资
2. 字符串函数
-
LENGTH(string):
SELECT LENGTH('Hello World'); // 返回 11,因为 "Hello World" 有 11 个字符
-
SUBSTRING(string, start, length):
SELECT SUBSTRING('Hello World', 7, 5);// 返回 "World",从第 7 个字符开始提取 5 个字符
-
UPPER(string):
SELECT UPPER('hello world');` // 返回 "HELLO WORLD"
-
LOWER(string):
SELECT LOWER('HELLO WORLD');// 返回 "hello world"
-
TRIM(string):
SELECT TRIM(' Hello World '); // 返回 "Hello World",去除两端的空格
-
REPLACE(string, old_string, new_string):
SELECT REPLACE('Hello World', 'World', 'Universe');` // 返回 "Hello Universe",将 "World" 替换成 "Universe"
-
CONCAT(string1, string2, …):
3. 数值函数
- ABS(number):
SELECT ABS(-10);
// 返回 10,取绝对值
- ROUND(number, precision):
SELECT ROUND(3.14159, 2);
// 返回 3.14,保留两位小数
- FLOOR(number):
SELECT FLOOR(3.14159);
// 返回 3,向下取整
- CEILING(number):
SELECT CEILING(3.14159);
// 返回 4,向上取整
- SQRT(number):
SELECT SQRT(16);
// 返回 4,计算平方根
4. 日期和时间函数
- NOW():
SELECT NOW();
// 返回当前日期和时间
- CURDATE():
SELECT CURDATE();
// 返回当前日期
- CURTIME():
SELECT CURTIME();
// 返回当前时间
- DATE(date_expression):
SELECT DATE('2023-03-15 10:30:00');
// 返回 “2023-03-15”
- TIME(date_expression):
SELECT TIME('2023-03-15 10:30:00');
// 返回 “10:30:00”
- DATE_ADD(date, INTERVAL expr type):
SELECT DATE_ADD('2023-03-15', INTERVAL 1 DAY);
// 返回 “2023-03-16”,添加一天
- DATE_SUB(date, INTERVAL expr type):
SELECT DATE_SUB('2023-03-15', INTERVAL 1 DAY);
// 返回 “2023-03-14”,减去一天
5. 其他常用函数
-
IFNULL(expr1, expr2):
SELECT IFNULL(NULL, 'Default Value');
// 返回 “Default Value”,因为第一个参数为空
-
COALESCE(expr1, expr2, …):
SELECT COALESCE(NULL, 0, 'Default Value');
// 返回 0,因为它是第一个非空值
-
CASE WHEN … THEN … ELSE … END:
-
SELECT CASE WHEN age < 18 THEN 'Minor' WHEN age >= 18 AND age < 65 THEN 'Adult' ELSE 'Senior' END AS age_group //筛选出的内容条被匿名为 age_group FROM employees;
// 根据员工的年龄,将他们分为 “Minor”,“Adult” 和 “Senior” 三组
-
联合注入:
select*from users where id=6 union select*from email where id=6;
这里需要注意,用union链接的查询,查询的列数必须一样,要不然会报错,如果不一样可以如下:
select*from users where id=6 union select*,3 from email where id=6;