进阶Mysql数据库----Mysql高级语句,你离sql高手只差这篇文章(详细图解)

一、按关键字排序

使用ORDER BY语句来实现排序

语法:

select column1,column2,… from 库名 order by column1,column,… asc | desc;

  • 排序可针对一个或多个字段

ASC:升序,默认排序方式

在这里插入图片描述

DESC:降序

select * from student order by age desc;

在这里插入图片描述

  • ORDER BY的语法结构
select * from student order by age;

按多字段排序

select * from student order by age desc,results desc;

在这里插入图片描述

二、对结果进行分组

GROUP BY分组

  • 使用GROUP BY语句来实现分组

  • 通常结合聚合函数一起使用

  • 可以按一个或多个字段对结果进行分组

语法:

select count(字段名1),字段名2 from 表名 group by 字段名2 ;

例:

select count(name),age from student group by age ;

在这里插入图片描述

GROUP BY结合ORDER BY

select count(name),age from student group by age  order by age desc;

在这里插入图片描述

三、限制结果条目

  • 使用limit语句限制条目
  • limit语法结构

只返回select查询结果的第一行或第几行

语法:

select column1,column2,… from 库名 limit 位置偏移量

例:

select * from student limit 3;
select * from student limit 3,3;

在这里插入图片描述

四、设置别名

  • 使用AS语句设置别名,关键字AS可省略

  • 设置别名时,保证不能与库中其他表或字段名称冲突

  • 别名的语法结构

列的别名:

select 列名 as 列名别名 from 库名;

表的别名:

select 列名 from 库名 as 库名别名;

例:

select t.id as 编号,t.name as 名字, t.age as 年龄, results as 成绩 from student as t;

在这里插入图片描述

五、通配符的使用

  • 用于替换字符串中的部分字符
  • 通常配合like一起使用,并协同where完成查询
  • 常用通配符
  • %:表示0个,1个或多个
  • _:表示单个字符

例:

select * from  student as t  where name like 'z%' ;
- %:表示0个,1个或多个

select * from  student as t  where name like 'zc_' ;
- _:表示单个字符

在这里插入图片描述

六、子查询

  • 也称作内查询或者嵌套查询
  • 先于主查询被执行,其结果将作为外层查询的条件
  • 在增删改查中都可以使用子查询
  • 支持多层嵌套
  • IN语句是用来判断某个值是否在给定的结果集中
  • 子查询的用法

例:

 select t.id as 编号,t.name as 名字, t.age as 年龄, results as  成绩 from student 
 as t where t.results in ( select results from student where results >= 60 ) ;

在这里插入图片描述
查询结合降序使用:

例:

select t.id as 编号,t.name as 名字, t.age as 年龄, results as  成绩 from student as t where t.results in ( select results from student where results >= 60 ) order by results desc;

在这里插入图片描述

插入语句结合子查询

例:

insert into newstudent select * from student where id in (select id from student);

在这里插入图片描述
#update / delete 等语句同理, where条件可以从子查询语句中获取。

update语法:

update 表名 set 要修改的字段=要修改成的结果值 where 条件字段1 in (select 需要被取的字段 from 表名
where 条件字段 >=条件值);

delete 语法:

delete from 表名 where 字段1 in(select 字段1 from (select * from 表名where 字段>=值 ) a);

七、NULL值

  • 表示缺失的值
  • 与数字0或者空白(spaces)是不同的
  • 使用IS NULL或IS NOT NULL进行判断
  • NULL值和空值的区别
  • 空值长度为0,不占空间;NULL值的长度为NULL,占用空间
  • IS NULL无法判断空值
  • 空值使用“=”或者“<>”来处理
  • COUNT()计算时,NULL会忽略,空值会加入计算

插入空值

 alter table student add class varchar(16); 
 # 插入一个空字段
 
 select * from student;
 #查询表内容
 
 insert into student (id,name,age,results,class) values(12,'hd',18,81,'');
 #插入一列空值,非NULL值

在这里插入图片描述
在这里插入图片描述

null的用法

例:

select * from student  where class is null;
# is null 就是为null的意思
select * from student  where class is not  null;
# is not null 就是不为空的意思

在这里插入图片描述

八、正则表达式

  • 根据指定的匹配模式匹配记录中符合要求的特殊字符
  • 使用REGEXP关键字指定匹配模式
  • 常用匹配模式
字符说明
^匹配开始字符
$匹配结束字符
.匹配任意单个或多个任意字符
*匹配任意个前面的字符
+匹配前面字符至少1次
p1|p2匹配p1或p2
[…]匹配字符集中括号内的任
[^…]匹配不在括号内的任何字
{n}匹配前面的字符串n次
{n,m}匹配前面的字符串至少n

以z开头的姓名:(^)

例:

select * from student where name regexp '^z' ;

在这里插入图片描述
以n结尾的姓名:

例:

select * from student where name   regexp 'n$' ;

在这里插入图片描述
匹配单个字符(.)

例:

select * from student where name regexp 'zc.' ;

在这里插入图片描述
匹配前面字符至少1次(+)

例:

select * from student where name regexp 'zc+' ;

在这里插入图片描述
匹配p1或p2(p1|p2)

例:

 select * from student  where name regexp 'z|c';

在这里插入图片描述
匹配字符集中括号内的任何字符([…])

例:

select * from student  where name regexp '[zics]';

在这里插入图片描述
匹配前面的字符串n次{n}

例:

select * from student  where name regexp 'c{3}';

在这里插入图片描述
匹配前面的字符串至少n次,至多m次({n,m})

例:

select * from student  where name regexp 'c{1,3}';

在这里插入图片描述

九、算术运算符

字符说明
+加法
-减法
*乘法
/除法
%取余数

例:

select 5+2 as addition,8-5 as subtraction,6*7 as multiplication,8/2 as division,9%4 as remainder;

在这里插入图片描述

比较运算符

  • 字符串的比较默认不区分大小写,可使用binary来区分
  • 常用比较运算符
运算符说明
=等于
>大于
<小于
>=大于或等于
<=小于或等于
!=或<>不等于
IN在集合中
LIKE通配符匹配
IS NULL判断一个值是否为NULL
IS NOT NULL判断一个值是否不为NULL
BETWEEN AND两者之间
GREATEST两个或多个参数时返回最大值
LEAST两个或多个参数时返回最小值

例:

 select 2=4,2='2','e'='e',(4+4)=(5+3),'n'=NULL;

在这里插入图片描述

select 2>4,2<'2', 'e'>='e',(4+4)<=(5+3);
                 
select 2!=4,null is null,null is not null,2 between 1 and 4;

select greatest (5,8,12),least (1,5,4);     

在这里插入图片描述
从以上查询可以看出:

①如果两者都是整数,则按整数值进行比较

②如果一个整数一个字符串,则会自动将字符串转换为数字,再进行比较

③如果两者都是字符串,则按照字符串进行比较

④如果两者中至少有一个值是NULL,则比较的结果是NULL

十、逻辑运算符

  • 又称为布尔运算符

  • 用来判断表达式的真假

  • 常用的逻辑运算符

运算符说明
NOT或!逻辑非
AND或&&逻辑与
OR或||逻辑或
XOR逻辑异或

《逻辑非》

例:

select not 2,!3,not 0,!(4-4);

在这里插入图片描述
《逻辑与》

例:

 select 2 and 3,4 && 0,0 && NULL,1 and NULL;

在这里插入图片描述

十一、位运算符

  • 对二进制数进行计算的运算符
  • 常用的位运算符
运算符说明
运算符说明
&按位与
|按位或
~按位取反
^按位异或
<<按位左移
>>按位右移

例:

select 4&5,4|5,4&~3,3^4,2<<2,2>>1;

在这里插入图片描述

十二、连接查询

MySQL的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接,首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上,使用较多的连接查询包括:内连接、左连接和右连接。

JOIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

实验环境:
在这里插入图片描述

内连接及示意图

在这里插入图片描述
例:

select a.id,a.name,b.results from student a  INNER JOIN newstudent b on a.id = b.id;

在这里插入图片描述
以上sql如果用where来写的话就是这样,效果一样

select a.id,a.name,b.results from student a , newstudent b where  a.id = b.id;

在这里插入图片描述

左连接及示意图

MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
在这里插入图片描述

例:

select a.id,a.name,b.results from student a LEFT JOIN newstudent b on a.id = b.id;

在这里插入图片描述

右连接及示意图

MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。

在这里插入图片描述

例:

select a.id,a.name,b.results from student a RIGHT JOIN newstudent b on a.id = b.id;

在这里插入图片描述

十三、函数

数学函数

函数含义
abs(x)返回x的绝对值
rand()返回0到1的随机数
mod(x,y)返回x除以y以后的余数
power(x,y)返回x的y次方
round(x)返回离x最近的整数
round(x,y)保留x的y位小数四舍五入后的值
sqrt(x)返回x的平方根
truncate(x,y)返回数字x截断为y位小树的值
ceil(x)返回大于或等于x的最小整数
floor(x)返回小于或等于x的最大整数
greatest(x1,x2…)返回集合中最大的值
least(x1,x2…)返回集合中最小的值

常用的数学函数举例说明

select abs(-12),rand(),rand(),mod(4,5),power(2,6); 

select round(2.4),round(2.5),round(2.4235,2),sqrt(2),truncate(2.4652,2);

select ceil(2.2),floor(2.8),greatest(1,2,3,4,5),least(1,2,3,4,5);

执行结果如下图:
在这里插入图片描述

聚合函数

对表中数据记录进行集中概括而设计的一类函数

函数含义
avg()返回指定列的平均值
count()返回指定列中非NULL值的个数
min()返回指定看列的最小值
max()返回指定列的最大值
sum()返回指定列的所有值之和

聚合函数举例:

select avg(age) from student;
# 平均值
select sum(results) from student;
# 总和
select min(results) from student;
# 最小值
select max(results) from student;
# 最大值
select count(*) from stundet;
# 总行数

在这里插入图片描述
在这里插入图片描述

字符串函数

函数含义
length(x)返回字符串x的长度
trim()返回去除指定格式的值
concat(x,y)将提供的参数x和y拼接成一个字符串
upper(x)将字符串x的所有字母变成大写字母
lower(x)将字符串x的所有字母变成小写字母
left(x,y)返回字符串x的前y个字符
right(x,y)返回字符串x的后y个字符
repeat(x.y)将字符串x重复y次
space(x)返回x个空格
replace(x,y,z)将字符串z替代字符串x中的字符串y
strcmp(x,y)比较x和y,返回的值可以位-1,0,1
substring(x,y,z)获取从从字符串x中的第y个位置开始长度为z的字符串
reverse(x)将字符串x反转

举例说明:

select length('abc'),trim(  'ab' ),concat('ab','cd'),upper('abc'),lower('ABC');

select left('abcd',2),right('abcd',2),repeat('abc',3);

select space(2),replace('abcde','e','g'),strcmp('a','b'),strcmp('a','a'),strcmp('b','a');

select substring('abcdefg',3,3),reverse('abcdefg');

在这里插入图片描述

日期时间函数

函数含义
curdate()返回当前时间的年月日
curtime()返回当前时间的时分秒
now()返回当前时间的日期和时间
month()返回日期x中的月份值
week(x)返回日期x是年度第几个星期
hour(x)返回x中的小时值
minute(x)返回x中的分钟值
second(x)返回x中的秒钟值
dayofweek(x)返回x是星期几,1星期日,2星期1
dayofmonth(x)计算日期x是本月的第几天
dayofyear(x)计算日期x是本年的第几天

例:

select curdate(),curtime(),now(),month('2021-02-07'),week('2020-02-07'); 

select hour('22:15:45'),minute('22:15:45'),second('22:15:45');    

select dayofweek('2020-02-07'),dayofmonth('2020-02-07'),dayofyear('2020-02-07');

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: SQL手工注入漏洞测试通常是通过构造恶意输入来测试数据库系统的安全性,以检测可能存在的漏洞。在针对MySQL数据库的字符型注入测试中,攻击者会尝试利用输入表单中的字符型数据来破坏SQL语句的可靠性,进而获取对数据库的访问权限。 攻击者通常会使用一些SQL注入工具,例如SQLMap、Havij等,通过模拟输入表单来测试Web应用程序是否存在SQL注入漏洞。在手动测试的过程中,攻击者需要了解目标系统中数据库的结构和使用的语言,并通过逐步构造恶意输入数据来尝试绕过系统的安全验证和防火墙,以获取对数据库的访问权限。 为避免SQL注入漏洞的产生,建议采用安全性更高的编程语言和框架,例如使用预处理语句、输入验证和过滤技术,同时定期对Web应用程序进行漏洞扫描和安全性检测,以降低数据库被攻击的风险。 ### 回答2: SQL注入是一种利用网站未正确过滤或验证用户输入数据的漏洞,通过构造一些特殊的SQL查询语句,来实现绕过网站的权限控制或者直接在数据库上执行一些恶意操作的攻击技术。SQL注入漏洞是常见的Web安全问题之一,并且MySQL是被广泛使用的数据库之一,因此测试MySQL数据库的手工注入漏洞测试也是非常必要的。 手工注入漏洞测试有多种方法,最常见的是利用逻辑性错误和SQL语句字符转义的脆弱性来构造恶意的SQL查询语句。首先,我们可以查找网站的URL参数和表单输入框,尝试在这些输入框中输入一些特殊字符(例如单引号,双引号和分号),看看是否能够返回一些不同寻常的错误信息。如果页面返回了一些SQL错误信息,那么很有可能存在SQL注入漏洞。 接下来的一步是手动构造SQL查询语句,注入恶意的代码。一般来说,SQL注入漏洞的主要攻击方法是利用SELECT,UPDATE,DELETE和INSERT等操作语句。我们可以在URL参数或表单输入框中输入如下代码片段,来测试是否存在漏洞: 1. SELECT * FROM users WHERE username='admin' AND password='' OR '1'='1'; 2. SELECT * FROM users WHERE username='admin' AND password='' UNION ALL SELECT 1,2,3; 3. SELECT * FROM users WHERE username='admin' OR 1=1# AND password=''; 上述代码分别用于测试逻辑性错误漏洞、UNION注入和基于SQL注释的漏洞。如果我们能够成功执行这些恶意代码,那么就说明存在SQL注入漏洞,攻击者可以使用类似的代码片段来执行任意的SQL查询。 为了防止SQL注入漏洞,可以采取以下措施: 1. 输入过滤:检查输入数据是否包含恶意代码和SQL语句特殊字符,并过滤或转义掉这些字符。 2. 预编译语句:使用PreparedStatement或其他预编译语句可以避免SQL语句被拼凑,从而避免SQL注入漏洞。 3. 限制查询权限:限制数据库用户的查询权限,并使用最小特权原则。 总之,在进行MySQL数据库的手工注入漏洞测试时,需要充分理解SQL注入漏洞的原理和漏洞类型,并采取适当的防护措施来保护Web应用程序的安全性。 ### 回答3: SQL注入漏洞是常见的网络安全漏洞之一,而SQL手工注入漏洞测试是一种检测和验证SQL注入漏洞的方法。在Mysql数据库字符型注入漏洞测试中,我们需要先准备好一台虚拟机或者真实主机,然后搭建好LAMP或者LEMP环境,以便进行后续的测试。 1. 测试目标 首先确定我们要测试的目标,这可以是一个网站,或者是一个具有数据库功能的应用程序。我们需要了解和分析目标,找到目标系统的漏洞点,才能有针对性地进行注入漏洞测试。 2. 确认注入点 找到目标系统的漏洞点后,我们需要确认注入点,这就是通过输入特定的字符序列来判断系统是否存在SQL注入漏洞。在Mysql数据库字符型注入漏洞测试中,我们可以使用’和”这两个字符进行测试来确定注入点。 例如:我们可以输入以下字符序列来测试系统是否存在SQL注入漏洞:“'or 1=1#”,如果直接返回了数据,则说明该系统存在SQL注入漏洞。 3. 确认数据库类型和版本 在进行注入漏洞测试之前,我们需要知道目标系统所使用的数据库类型和版本。在Mysql数据库字符型注入漏洞测试中,我们可以通过以下语句来确定数据库版本: select version(); 4. 利用SQL语句注入漏洞 当我们成功确认时,就可以利用SQL语句进行注入漏洞测试了,具体的方法如下: a. 使用union查询合并数据:可以输入以下字符序列来进行测试:‘+union+select+1,2,3#',如果成功,则系统会返回一个由“1,2,3”组成的数据集。 b. 使用group by控制查询结果:可以输入以下字符序列来进行测试:‘+union+select+1,count(*)+from+table_name+group+by+1#',如果成功,则系统会返回各个数据组的数量。 c. 使用order by控制查询结果排序:可以输入以下字符序列来进行测试:‘+union+select+1,2+from+table_name+order+by+3#',如果成功,则系统会返回具有排序的数据集。 5. 总结 以上就是Mysql数据库字符型注入漏洞测试的基本步骤和方法。当然,注入漏洞测试是一项繁琐的工作,需要有一定的技术水平和丰富的经验。在进行注入漏洞测试之前,一定要保证进行充分的备份和风险评估,以防止对目标系统造成不可逆转的损失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值