1:常见的SQL语句
1.1:SQL介绍
- SQL 是用于访问和处理数据库的标准的计算机语言。
- SQL,指结构化查询语言,全称是 Structured Query Language。
- SQL 让您可以访问和处理数据库。
- SQL 是一种 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言。
- 简单来说就是按照 数据结构来组织、 存储和管理数据的仓库。
- 数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
- MySQL也是一个关系型数据库管理系统,也是最受欢迎的开源软件之一。
1.2:SQL特点
- SQL 面向数据库执行查询
- SQL 可从数据库取回数据
- SQL 可在数据库中插入新的记录
- SQL 可更新数据库中的数据
- SQL 可从数据库删除记录
- SQL 可创建新数据库
- SQL 可在数据库中创建新表
- SQL 可在数据库中创建存储过程
- SQL 可在数据库中创建视图
- SQL 可以设置表、存储过程和视图的权限
1.3:数据库操作
连接数据库
明文连接
mysql -h127.0.0.1 -P3306 -uroot -proot -- 明文
如果连接本地数据库 -h可以省略 如果服务器端口是3306,-P端口号也可以省略
mysql -uroot -proot -- 明文
密文连接
mysql -uroot -p
Enter password: ****
退出数据库
EXIT --方法一
quit --方法二
\q --方法三
ctrl+c --方法四
注意
sql语句最后需要有分号;结尾
1.4:常用的SQL语句
查询当前数据库版本: select version();
查询当前数据库用户: select user();
查询当前路径: select @@basedir;
查询所有数据库: show databases;
选择一个数据库: use + 数据库名;
查询当前数据库: select database();
查询所有表名: show tables;
创建一个数据库: create database 数据库名;
删除一个数据库: drop database 数据库名;
查询一个表的结构: desc 表名;
1.5:数据库表,字段的运用
数据库表
- 一个数据库通常包含一个或多个表。每个表由一个名字标识(例如“客户”或者“订单”);表包含带有数据的记录(行)。
- 下面的例子是一个名为 "Persons" 的表:
表包含三条记录(每一条对应一个人)和五个列(Id、姓、名、地址和城市)
SQL DML 和 DDL
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
SQL 的 DML 部分
- SELECT - 从数据库表中获取数据
- UPDATE - 更新数据库表中的数据
- DELETE - 从数据库表中删除数据
- INSERT INTO - 向数据库表中插入数据
SQL DML 和 DDL
- CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
SQL对大小写不敏感;
创建表
语法:create table 数据表名字 (字段 类型 约束[, 字段 类型 约束]);
约束:
auto_increment 表示自动增长
not null 表示不能为空
primary key 表示主键
FOREIGN KEY 标识该属性为该表的外键,是与之联系某表的主键
default 默认值
UNIQUE 标识该属性的值是唯一的
举例(针对表常用命令)
在 class 数据库下创建student表(id、name、age、sex、birthday)
create table student(id int,name varchar(20),age int,sex varchar(20),birthday int);
查看表结构
desc student;
各字段的含义解释
- Null:表示该列是否可以存储 NULL 值。
- Key:表示该列是否已编制索引。PRI 表示该列是表主键的一部分,UNI 表示该列是 UNIQUE 索引的一部分,MUL 表示在列中某个给定值允许出现多次。
- Default:表示该列是否有默认值,如果有,值是多少。
- Extra:表示可以获取的与给定列有关的附加信息,如 AUTO_INCREMENT 等。
查看创建表时的CREATE TABLE语句
SHOW CREATE TABLE 表名\G; 如果不加\G参数显示会混乱,加了显示结果易于查看,比较直观。
删除表
drop table student;
修改表名
ALTER TABLE 旧表名 RENAME 新表名;
举例(针对字段常用命令)
修改字段名
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
添加字段
ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] [FIRST|AFTER 已存在的字段名];
ALTER TABLE admin ADD user_name varchar(20) DEFAULT NULL age int(10) DEFAULT NULL;
新字段名为需要添加的字段的名称;
FIRST 为可选参数,其作用是将新添加的字段设置为表的第一个字段;
AFTER 为可选参数,其作用是将新添加的字段添加到指定的已存在的字段名的后面;
DEFAULT NULL默认为NULL。
删除字段
ALTER TABLE 表名 DROP 字段名;
1.6:Mysql常见的数据类型
数值类型
日期和时间类型
字符串类型
MYSQL整数类型
MySQL 主要提供的整数类型有 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,其属性字段可以添加 AUTO_INCREMENT 自增约束条件。下表中列出了 MySQL 中的数值类型:
MYSQL小数类型
浮点类型有两种,分别是单精度浮点数(FLOAT)和双精度浮点数(DOUBLE):
MYSQL字符串类型
VARCHAR 和 TEXT 类型是变长类型,其存储需求取决于列值的实际长度(在前面的表格中用 L 表示),而不是取决于类型的最大可能尺寸。
例如,一个 VARCHAR(10) 列能保存一个最大长度为 10 个字符的字符串,实际的存储需要字符串的长度 L 加上一个字节以记录字符串的长度。对于字符 “abcd”,L 是 4,而存储要求 5 个字节。
对比结果可以看到,CHAR(4) 定义了固定长度为 4 的列,无论存入的数据长度为多少,所占用的空间均为 4 个字节。VARCHAR(4) 定义的列所占的字节数为实际长度加
1.7:Mysql主键
MySQL主键(PRIMARY KEY)
"主键(PRIMARY KEY)"的完整称呼是"主键约束"。
选取设置主键约束的字段
- 主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符。主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键。主键应该遵守下面的规则:每个表只能定义一个主键。
- 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在两行数据有相同的主键值。这是唯一性原则。
- 一个列名只能在复合主键列表中出现一次。
- 复合主键不能包含不必要的多余列。当把复合主键的某一列删除后,如果剩下的列构成的主键仍然满足唯一性原则,那么这个复合主键是不正确的。这是最小化原则。
在创建表时设置主键约束
- 在 CREATE TABLE 语句中,主键是通过 PRIMARY KEY 关键字来指定的。
- 在定义列的同时指定主键,语法规则如下:
字段名 数据类型 PRIMARY KEY;
在创建表时设置复合主键
主键由多个字段联合组成,语法规则如下:
PRIMARY KEY [字段1,字段2,…,字段n];
在修改表时添加主键约束
在修改数据表时添加主键约束的语法规则为:
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
MySQL唯一约束(UNIQUE KEY)
MySQL唯一约束(Unique Key)
要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。
在定义完列之后直接使用 UNIQUE 关键字指定唯一约束,语法规则如下:
<字段名> <数据类型> UNIQUE
MySQL查看表中的约束
查看数据表中的约束语法格式如下:
SHOW CREATE TABLE <数据表名>;
2:SQL之增删改查
2.1:添加数据
①:为表中所有字段添加数据
i:INSERT 语句中指定所有字段名
语法:INSERT INTO 表名(字段名1,字段名2,…)VALUES(值1,值2,…);
例题:向student表中插入(id为1,姓名:xiaoqiao,年龄:18,性别:woman,生日:2002)数据。
insert into student(id,name,age,sex,birthday) values(1,"xiaoqiao",18,"woman","2002");
ii:INSERT语句中不指定字段名
语法:INSERT INTO 表名 VALUES(值11,值2,…);
例题:向student表中插入(id为2,姓名:daqiao,年龄:20,性别:woman,生日:2004)数据。
insert into student values(2,"daqiao",20,"woman","2000");
②:为表的指定字段添加数据
i:为指定字段添加数据,即只向部分字段添加值,而其它字段的值为表定义时的默认值。
语法:INSERT INTO 表名(字段1,字段2,…)VALUES(值1,值2,…);
例题:向student表中插入(id为3,姓名:zhouyu,年龄:18,)数据。
insert into student(id,name,age) values(3,"xaoqiao",18);
③:同时添加多条数据
语法:INSERT INTO 表名(字段名1,字段名2,…) VALUES (值1,值2,…),(值1,值2);
例题:向student表中插入(id为4,姓名:sunce,年龄:20,性别:man,生日:2004)和(id为5,姓名:caocao,年龄:20,性别:man,生日:2004)数据
insert into student values(4,"sunce",20,"man","2000"),(5,"caocao",20,"man","2000");
2.2:删除数据
①:删除部分数据
i:即删除指定的部分数据,需要使用WHERE子句来指定删除记录的条件。
语法:DELETE FROM 表名 WHERE 条件表达式;
例题:向student表中删除id为1的数据。
delete from student where id=1;
②:删除全部数据
i:若 DELETE 语句中没有使用WHERE语句,则会将表中所有记录都删除。
语法:DELETE FROM 表名;
例题:向student表中删除所有的数据。
delete from student ;
2.3:修改数据
①:UPDATE 更新部分数据
i:指更新指定表中的指定记录,使用WHERE 子句来指定。
语法:UPDATE 表名 SET 字段名1=值1,[ ,字段名2=值2,…] [ WHERE 条件表达式 ];
例题:向student表中id为1的数据中字段age改为16,字段birthday改为2004。
update student set age=16,birthday=2004 where id=1;
②:UPDATE 更新全部数据
i:若 UPDATE 语句中没有使用WHERE语句,则会将表中所有记录都删除。
语法:UPDATE FROM 表名;
例题:向student表中将age字段都该为17。
update student set age=17;
2.4:查询数据
①:简单查询
i:查询所有字段
语法:SELECT 字段名1,字段名2,…FROM 表名;
例题:查询student表中所有数据。
SELECT id,name,age ,sex,birthday FROM student;
select * from student;
ii:查询指定的部分字段
语法:SELECT 字段名1,字段名2,… FROM 表名;
例题:查询student表中所有的name字段和sex字段。
SELECT name,sex FROM student;
注意:字段顺序可以更改,则显示的结果也会作出对应的调整。
②:按条件查询
- 带关系运算符的查询
语法:SELECT 字段名1,字段名2,…FROM 表名 WHERE 条件表达式;
例题:查询student表中id为4的人的id和name字段。
SELECT id,name FROM student WHERE id=4;
- 带 IN 关键字的查询
语法:SELECT * 字段名1,字段名2,…FROM 表名 WHERE 字段名 [ NOT ] IN (元素1,元素2,…);
解释:IN关键字用于判断某个字段的值是否在指定集合中,若在,则该字段所在的记录将会被查询出来
例题:查询student表中id值为1,2,3的记录。
SELECT * FROM student WHERE id IN (1,2,3);
- 带 BETWEEN AND 关键字的查询
语法:SELECT * { 字段名1,字段名2,… FROM 表名WHERE 字段名 [ NOT ] BETWEEN 值1 AND 值2;
解释:BETWEEN AND 用于判断某个字段的值是否在指定范围之内,若在,则该字段所在的记录会被 查询出来,反之不会。
例题:查询student表中id值在2~5之间的人的id和name。
SELECT id,name FROM student WHERE id BETWEEN 2 AND 5;
- 空值查询
语法:SELECT * 字段名1,字段名2,…FROM 表名 WHERE 字段名 IS [ NOT ] NULL
解释:在数据表中有些值可能为空值(NULL),空值不同于0,也不同于空字符串,需要使用 IS NULL 来判断字段的值是否为空值。
例题:查询student表中sex值为空值的记录。
SELECT * FROM student WHERE sex IS NULL;
注意:IS NOT NULL 关键字用来查询字段不为空值的记录。
- 带 DISTINCT 关键字的查询
语法:SELECT DISTINCT 字段名 FROM 表名;
解释:很多表中某些字段的数据存在重复的值,可以使用DISTINCT关键字来过滤重复的值,只保留一个值。
例题:查询student表中birthday字段的值,结果中不允许出行重复的值。
SELECT DISTINCT birthday FROM student;
- 带 LIKE 关键字的查询
- 百分号(%)通配符
语法:SELECT * | 字段名1,字段名2,…FROM 表名 WHERE 字段名 [ NOT ] LIKE ‘匹配字符串’;
解释:匹配任意长度的字符串,包括空字符串。例如,字符串“c% ”匹配以字符 C开始,任意长度的字符串,如“ ct ”,“ cut ”,“ current ”等;字符串“ c%g ”表示以字符 c 开始,以 g 结尾的字符串;字符串“ %y% ”表示包含字符“ y ”的字符串,无论“ y ”在字符串的什么位置。
例题:查询student表中name字段以字符“ s ”开头的人的id,name。
SELECT id,name FROM student WHERE name LIKE "s%";
- 下划线(_)通配符
语法:SELECT * | 字段名1,字段名2,…FROM 表名 WHERE 字段名 [ NOT ] LIKE ‘匹配字符串’;
解释:下划线通配符只匹配单个字符,若要匹配多个字符,需要使用多个下划线通配符。例如,字符串“ cu_ ”匹配以字符串“ cu ”开始,长度为3的字符,如“ cut ”,“ cup ”;字符串“ c_ _l”匹配在“ c ”和“ l ”之间包含两个字符的字符串,如“ cool ”。需要注意的是,连续的“_”之间不能有空格,例如“M_ _QL”只能匹配“MySQL”,不能匹配“My SQL”。
例题:查询student表中name字段值以“ xia”开始,以“ qiao ”结束,并且中间只有一个字符的记录。
SELECT * FROM student WHERE name LIKE 'xia_qiao';
注意:若要查询的字段值本来就含有“ % ”或者“ _ ”,则要用“ \ ”进行转义,如要查询本身含有“ % ”的字符串,命令应改为 “ %\%%”。
- 带 AND 关键字的多条件查询
语法:SELECT * | 字段名1,字段名2,…FROM 表名;
解释:在使用SELECT语句查询数据时,优势为了使查询结果更加精确,可以使用多个查询条件,如使用 AND 关键字可以连接两个或多个查询条件。
例题:查询student表中 id 字段小于5,并且 sex 字段值为“ woman ”的人的id和name
SELECT id,name FROM student WHERE id<5 AND sex='woman';
- 带 OR 关键字的多条件查询
语法:SELECT * | 字段名1,字段名2,…FROM 表名 WHERE 条件表达式1 OR 条件表达式2 [ … OR 条件表达式 n ];
解释:与 AND 关键字不同,OR 关键字只要满足任意一个条件就会被查询出来。
例题:查询student表中 id 字段小于5,或者 sex 字段值为“ woman ”的人的id和name
SELECT id,name FROM student WHERE id<5 OR sex='woman';
- OR 和 AND 一起使用的情况
语法:SELECT * | 字段名1,字段名2,…FROM 表名;
解释:OR 和 AND 一起使用的时候,AND 的优先级高于 OR,因此二者一起使用时,会先运算 AND 两边的表达式,再运算 OR 两边的表达式。
例题:查询student表中sex值为“woman”或者sex值为“man”并且age字段值为16的人的记录
SELECT * FROM student WHERE sex='woman' OR sex='man' AND age=16;
③:聚合函数
- COUNT()函数:统计记录的条数
语法:SELECT COUNT(*) FROM 表名;
例题:查询student表中一共有多少条记录。
SELECT COUNT(*) FROM student;
- SUM()函数:求出表中某个字段所有值的总和
语法:SELECT SUM(字段名) FROM 表名;
例题:查询student表中 age 字段的总和
SELECT SUM(age) FROM student;
- AVG()函数:求出表中某个字段所有值的平均值
语法:SELECT AVG(字段名) FROM 表名;
例题:查询student表中表中age字段的平均值。
SELECT AVG(age) FROM student;
- MAX()函数:求出表中某个字段所有值的最大值
语法:SELECT MAX(字段名) FROM 表名;
例题:查询student表中 age 字段的最大值
SELECT MAX(age) FROM student;
- MIN()函数:求出表中某个字段所有值的最小值
语法:SELECT MIN(字段名) FROM 表名;
例题:查询student表中 grade字段的最小值
SELECT MIN(age) FROM student;
④:对查询结果进行排序
- 带 ORDER BY 关键字的排序
语法:SELECT 字段名1,字段名2,…FROM 表名 ORDER BY 字段名1 [ ASC | DESC ],字段名2 [ ASC | DESC ]…;
解释:在该语法中指定的字段名是对查询结果进行排序的依据,ASC表示升序排列,DESC 表示降序排列,默认情况是升序排列。
例题:查询student表中的所有记录,并按照age字段进行升序排序
SELECT * FROM student ORDER BY age;
- 带 GROUP BY 关键字的分组查询
语法:SELECT 字段名1,字段名2,…FROM 表名 GROUP BY 字段名1,字段名2,… [ HAVING 条件表达式 ];
解释:在对表中数据进行统计的时候,可以使用GROUP BY 按某个字段或者多个字段进行分组,字段中值相同的为一组,如男生分为一组,女生分为一组。
注意点使用*无法查询解决方法:
- 1.关闭 ONLY_FULL_GROUP_BY
查询:SELECT @@sql_mode;
关闭:SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY,',''));
- 单独使用 GROUP BY 进行分组
解释:单独使用GROUP BY 关键字,查询的是每个分组中的一条记录。
例题:查询student表中的数据,按照sex字段进行分组
SELECT * FROM student GROUP BY sex;
- GROUP BY 和聚合函数一起使用
解释:GROUP BY 和聚合函数一起使用,可以统计出某个或者某些字段在一个分组中的最大值、最小值、平均值等。
例题:查询student表中按照age字段进行分组查询,计算出每组共有多少个人。
SELECT COUNT(*) ,age FROM student GROUP BY age;
- GROUP BY 和 HAVING 关键字一起使用
解释:关键HAVING字和WHERE关键字的作用相同,区别在于HAVING 关键字可以跟聚合函数,而WHERE 关键字不能。通常HAVING 关键字都和GROUP BY一起使用,用于对分组后的结果进行过滤。
例题:查询student表中按照sex字段进行分组查询,查询出age字段值之和小于300的分组
SELECT sum(age),sex FROM student GROUP BY sex HAVING SUM(age) < 300;
- 使用 LIMIT 限制查询结果的数量
语法:SELECT 字段名2,字段名2,…FROM 表名 LIMIT 记录数 [ OFFSET ] 记录数 LIMIT Y OFFSET X 向后偏移 x位。
解释:在此语法中,LIMIT 后面可以跟两个参数,第一个参数“ OFFSET ”表示偏移量,如果偏移量为0,则从查询结果的第一条记录开始,偏移量为1则从查询结果中的第二条记录开始,以此类推。OFFSET为可选值,默认值为0,第二个参数“记录数”表示指定返回查询记录的条数。
例题:查询tudent表中的前四条记录
SELECT * FROM student LIMIT 4;
例题:查询student表中从0开始查询4条记录
SELECT * FROM student LIMIT 0,4;
⑤:为表和字段取别名
- 为表取别名
语法:SELECT * FROM 表名 [ AS ] 别名;
解释:在进行查询操作时,如果表名很长使用起来不方便,可以为表取一个别名来代替表的名称。
例题:为student表起一个别名s,并查询student表中sex字段值为“woman”的记录
SELECT * FROM student AS s WHERE s.sex='woman';
- 为字段取别名
语法:SELECT 字段名 [ AS ] 别名 [ ,字段名 [AS] 别名,…] FROM 表名 ;
例题:查询student表中的所有记录的name和sex字段值,并为这两个字段起别名stu_name和stu_sex
SELECT name AS stu_name,sex AS stu_gender FROM student;
⑥:子查询
select name from student where id < (select age from student where name='sunce');
⑦:联合查询(union)
select version() union select user();
⑧:利用内置表查询
查询数据库:select schema_name from information_schema.schemata;
查询表名:select table_name from information_schema.tables;
查询列名:select column_name from information_schema.columns;
3:MySQL内置库
在MySQL>5.0的版本中,把information_schema看作是一个自带的内置数据库,确切说是信息数据库。它保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。
这里我们重点学习下schemata、tables、columns以及相关的字段名。
schemata表:这里重点关注schema_name这个字段,它存放着所有数据库库名,在SQL注入中我们可以使用它来进行来查询所有数据库,然后进行高权限的跨库查询。
tables表:tables表用来存储所有数据库里的表名等信息,其中table_schema列用来存放所有数据库的库名,table_name用来存放MySQL数据库中的所有表名。
columns表:columns表用来存放数据库里的所有字段信息,其中table_schema列用来存放数据库库名,table_name列用来存放所有数据库里的所有表名,column_name列用来存放所有的字段/内容(值)。
4:SQL中tips
4.1:符号运用
= 数据库的赋值符号
or/|| 逻辑或 左右两边有一条成立 那么返回true 否则false
xor 逻辑异或。 如果任一操作数为NULL,则返回NULL。 对于非NULL操作数,如果奇数个操作数非零,则求值为1,否则返回0。
&&/And 逻辑与,并且的意思 左右两边的条件必须同时成立则返回true 否则返回false
NOT/! 逻辑非
+、-、*、/ 运算符 加减乘除
4.2:常用注释符
在MySQL中,常见的注释符有以下几种:
- #
- --空格
- /**/
内联注释符及特性:
- /*!code */
- 内联注释符是一种基于注块注释衍生出来的注释风格,它可以用于整个SQL语句中,用来执行SQL语句,内联注释有个特殊点,和MySQL版本息息相关,也就是:当内联注释中出现小于或等于当前版本号的时候,内联注释符里的子句会被执行,大于时则不会被执行,注意版本的写法,例如,5.5.34,在内联注释中需要写为50534,版本号第二位加0,然后注意版本号和内联注释中间不能有空格。
常见的空格符号:
- 两个空格代替一个空格,用Tab代替空格,%a0=空格
- %20(空格) %09(tab) %0a(回车符) %0b %0c %0d %a0(空格) %00 /**/ /*!*/
4.3:内联注释
select user()/*version()*/;
4.4:常见空格表示符号
两个空格代替一个空格,用Tab代替空格,%0a=空格
%20 %09 %0a %0b %0c %0d %a0 %00 /**/ /*!*/
5:注入中常见的sql函数
5.1:rand()函数 //生成一个0~1之间的随机数
语句:select rand();
5.2:floor()函数 //向下取整
语句:select floor(rand()*2);
5.3:concat()函数 //将符合条件的同一列中的不同行数据进行拼接,选择好数据库
语句:concat(0x3a,database(),0x3a);0x3a为:号
5.4:concat_ws()函数 //第一个参数是其它参数的分隔符。分隔符的位置在连接的两个字符串之间。
语句:select concat_ws('!',database(),'haha');
5.5:group_concat
语句:select group_concat(username,'~',password) from dh_admin_user;
5.6:extractvalue()函数 //对xml文档进行查询的函数 语法:extractvalue(目标xml文档,xml路径).
语句:select extractvalue('anything',concat('~',(select user())));
5.7:sleep()函数 //对数据库进行延时的函数 语法:后面直接跟需要延时的时间即可,默认单位为s
语句:select sleep(5);
5.8:updatexml() //语法updatexml(目标xml文档,xml路径,更新的内容)
语句:select updatexml('anything',concat('~',(select version())),'xxx');
5.9:exp()函数 //此函数返回e(自然对数的底)的X次方的值,用于将E提升为指定数字的幂,当传递一个大于709的值时,函数exp()就会引起一个溢出错误。
语句:select exp(2);
5.10:length()函数 //返回参数的长度
语句:select length(user());
5.11:substr()函数 //从字符串 s 的 start 位置截取长度为 length 的子字符串,select substr(user(),1,2);
语句:select substr(user(),1,2);
5.12:substring()函数,left() ,mid()函数 //同substr
语句:select substring(user(),1,2);
语句:select left(user(),5);
语法:select mid(user(),1);
5.13:ascii()、ord()函数返回第一个字符的ascii码 //返回字符的ascii码
语句:select ascii(mid(user(),1));
语句:select ord(mid(user(),1));
5.14:name_const()函数 //构造一个临时列,列名为xx,值为xx
语句:select name_const('name',15);
5.15:strcmp()函数 //strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数
语句:select strcmp(version(),user());
5.16:if(a,b,c) //如果a为真,则返回b,否则返回c
语句:select if(length(database())=5,1,0);
5.17:BENCHMARK(count,expr) //重复计算expr表达式count次
语句:select benchmark(5,1);
执行表达式expr count次,返回的结果都是0。看返回结果是没有任何意义的,它的意义在于可以得到计算count次表达式expr后所需要的时间。表达式可以是sql语句,这样就可以看出一个sql语句写出来后效率怎么样,从而进行一定的优化。
5.18:locate()函数 //locate(substr,str)返回substr字符串在str中出现的位置,没有返回0
语句:select locate('r',user());
5.19:position()函数 //position(substr in str)返回substr字符串在str中出现的位置,没有返回0
语句:select position('r' in user());
5.20:instr()函数 //instr(str,substr)返回substr字符串在str中出现的位置,与locate相同,只是参数顺序相反
语句:select instr('qweasdzXC','w');
5.21:hex()&unhex()函数
渗透中有些注入点因为数据库中对数据字段的类型定义,可能不支持union来显示某些不同类型的内容,所以使用hex对数据进行十六进制编码;
hex参数可用于任何参数外面
select hex(concat(user(),1));
select hex(user()),hex(database());
unhex()则是用来将十六进制的内容转换回十进制
select unhex('726F6F74406C6F63616C686F737431');
5.22:load_file()函数
load_file()函数是MySQL读取本地/远程文件的函数
前提条件:
- 必须有权限读取且文件是可读的,低权限无法读取高权限用户文件
- 被文件必须在服务器上
- 必须知道文件的绝对路径 可用:select @@basedir;
- 读取的文件必须小于设定:max_allowed_packet
- secure_file_priv的值不为NULL 使用show global variables like '%secure%';查询是否为空,在my.ini设置为:secure_file_priv = ''
- 查询结果为:secure_file_priv NULL时,表示不允许导入导出;
- 查询结果为:secure_file_priv /xxx/时,表示只允许在当前目录导入导出;
- 查询结果为:secure_file_priv(空白)时,表示可以在任意目录进行导入导出;
Windows:my.ini中添加secure_file_priv=
Linux:/etc/my.cnf的[mysqld]下面添加local-infile=0
语法:select load_file('D:/phpstudy_pro/Extensions/MySQL5.7.26/my.ini');
5.23:into outfile()函数
into outfile()函数是用来导出文件的
用法示例:select "hello word" into outfile 'D:\phpstudy_pro\WWW\1.txt';
注意:
- 在SQL注入时,我们可以利用load_file或者 into outfile()对文件进行读取,或者写入Webshell;
- 若过滤了单引号,则可以将函数中的字符进行hex编码。