2023.9.30
目录
三、select 基本语法形式
select 属性名 from 表名 [where 子句][group by 属性名][order by 属性名[asc/desc]][limit 记录数]
select * from 表名:表示查找所有
where | 条件语句 |
group by | 根据一个或多个列对查询结果进行分组 |
order by | 排序 asc:升序 desc:降序 |
where 语法
where 查询条件 | 符号或关键字 |
---|---|
比较 | =、<、<=、>、>=、!=、<> |
指定范围 | BETWEEN AND 、NOT BETWEEN AND |
指定集合 | IN、 NOT IN |
匹配字符 | LIKE 、NOT LIKE |
多个查询条件 | AND、 OR |
• 比较
比较符 | |
---|---|
= | 等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!=“ | 不等于 |
<> | 不等于 |
• 指定范围
select 属性名 from 表名 where 属性名 [not] between 元素1 and 元素2;
• 指定集合
select 属性名 from 表名 where 属性名 [not] in (元素1,元素2,...);
ps:集合中的元素为字符时必须加上引号
ps:between 是范围,in 是集合
• 匹配字符
select 属性名 from 表名 where 属性名 [not] like 元素;
通配符 | |
---|---|
% | 匹配所有,但不能匹配空值 |
_ | 一个 _ 表示匹配一个字符 |
• 多个查询条件
ps:and 运算优先级高于 or,可以加括号解决
select 属性名 from 表名 where 条件表达式1 and/or 条件表达式2
group by 语法
group by 将查询结果按某个字段或多个字段进行分组。字段中的值相等的为一组。
语法规则如下:
group by 属性名 [having 条件表达式]
having:对分组后的结果按条件进行筛选,只能在group by子句后使用,不能单独使用,只能对分组计算的结果进行筛选,不能使用别名
order by 语法
order by 对记录进行排序
语法规则如下:
order by 属性名 [asc | desc]
asc:升序(默认升序)
desc:降序
可以给多个列排序,只需要指定列名,列名之间用逗号分开即可
limit 语法
limit 不指定初始位置,从第一条记录开始显示。
语法规则如下:
limit n,m
n:开始位置
m:要检索的行数行
0 :检索出来的第一行为行0,而不是行1, 因此,limit 1,1将检索出第二行而不是第一行
四、查找时去除重复值
select distinct 属性名 from 表名
五、集合函数
select 函数 from 表名
count() | 统计记录的条数 |
sum() | 计算字段的值的总和 |
avg() | 计算字段的值的平均值 |
max() | 查询字段的最大值 |
min() | 查询字段的最小值 |
六、正则表达式
select 属性名 from 表名 where 属性名 ergexp '匹配方式'
// 将 ergexp 换成 rlike 也可以
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置 如果设置了 regexp 对象的 multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置 |
$ | 匹配输入字符串的结束位置 如果设置了regexp 对象的 multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置 |
. | 匹配字符串中的任意一个字符 |
[...] | 字符集合,匹配所包含的任意一个字符 例如, '[abc]' 可以匹配 "plain" 中的 'a' |
[^...] | 非字符集合,匹配未包含的任意字符 例如, '[^abc]' 可以匹配 "plain" 中的'p' 'l' 'i' 'n' |
p1|p2|p3 | 匹配 p1 或 p2 或 p3 例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food" |
* | 匹配前面的子表达式零次或多次 例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,} |
+ | 匹配前面的子表达式一次或多次 例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,} |
{m} | m是一个非负整数。匹配确定的 m 次 例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o |
{m,n} | m 和 n 均为非负整数,其中m <= n 最少匹配 m次且最多匹配 n次 |
七、运算符
• 算术运算符
加减乘除求余,主要是用在数值计算上
运算符 | 作用 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ 或 DIV | 除法 |
% 或 MOD | 取余 |
• 比较运算符
大于、小于、 等于、不等于,主要用于数值 的比较和字符串的匹配上
符号 | 描述 |
---|---|
= | 等于 |
> | 大于 |
< | 小于 |
= | 等于 |
<> 或 != | 不等于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在两值之间 |
NOT BETWEEN | 不在两值之间 |
IN | 在集合中 |
NOT IN | 不在集合中 |
<=> | 严格比较两个NULL值是否相等 |
LIKE | 模糊匹配 |
REGEXP 或 RLIKE | 正则式匹配 |
IS NULL | 为空 |
IS NOT NULL | 不为空 |
• 逻辑运算符
与、或、非、异或等,结果只返回真值(1或者true)和假值(0或false)
运算符号 | 作用 |
---|---|
AND或&& | 逻辑与 |
OR或|| | 逻辑或 |
NOT 或 ! | 逻辑非 |
XOR | 逻辑异或 |
• 运算符优先级
优先级(高到低) | 运算符 |
---|---|
1 | ! |
2 | -(负号)、〜(位反转) |
3 | ^ |
4 | *、/、% |
5 | -(减号)、+ |
6 | >>、<< |
7 | & |
8 | | |
9 | =(比较运算)、<=>、>=、>、<、<=、<>、!=、 IS、 LIKE、REGEXP、IN |
10 | BETWEEN、CASE、WHEN、THEN、ELSE |
11 | NOT |
12 | &&、AND |
13 | XOR |
14 | ||、OR |
15 | =(赋值运算)、:= |
八、注释
sql注入中广泛运用
# | 表示单行注释 语法:#注释内容 |
-- | 表示单行注释 语法:-- 注释内容 |
/**/ | 表示多行注释 语法:/*注释内容*/ |
九、查询函数
• 联合查询
union | 并操作 |
intersect | 交操作 |
except | 差操作 |
union
1、用于合并具有相同字段结构的两个表的内容,主要用在一个结果中集中显示不同表的内容
2、查询默认不返回重复记录
3、查询的表的字段必须一样
4、查询的数据类型必须能兼容
5、查询结果只增加了行数而列数不变
select * from 语句 union select * from 语句
• 组合查询
union 试探列数
id = 1 order by 4 -- + 正常
id = 1 order by 5 -- + 异常
结论:当前语句查询了四列
求显示位的原因: 尽管查询出四列,但页面只显示出两列内容, 而需要求出到底用了哪两列,再在所用的列中插入paylaod
union select 1,2,3,4 -- #查看哪列内容被显示出来
• 嵌套查询
1.子查询
2.子查询可以继续嵌套
3.子查询中不可以使用order by子句,只对最后结果排序
4.子查询要用括号括起来
子查询结果为集合时可用如下关键字判断 | |
---|---|
[NOT]IN | [不]包含其中 |
ANY//ALL | 任何一个//所有的 |
[NOT]EXISTS | [不]存在 |
• 查询函数
名称类型 | 函数 | 查询语句 |
---|---|---|
系统用户名 | system_user() | select system_user(); select user from mysql.user; |
用户名 | user() | select user(); |
当前用户名 | current_user() | select current_user(); |
连接数据库用户名 | session_user() | select session_user(); |
数据库名 | database() | select database(); |
数据库版本 | version() | select version(); |
数据库读取路径 | @@basedir | show variables like '%basedir%'; |
MYSQL安装路径 | @@char | show variables like"%char%"; |
查看当前系统版本 | @@version_compile_os | select @@version_compile_os; |
其他相关函数 | 作用 | 示例 |
left(s,n) | 返回字符串s最左边的字符 n是个数 | |
right(s,n) | 返回字符串s最右边的字符 | |
substr(s,n,len) | 截取字符串s的第n个字符,且截取长度为len | |
mid(s,n,len) | ||
lpad(string,length,’str2’) | string:需要填充的字符串 length:填充之后的总长度 str:填充字符串,默认空格 | |
rpad(string,length,’str’) | | |
locate(s2,s1,pos) | 返回字符串s2在字符串s2中第一次出现的位置 pos:从pos位置开始检索 | |
insert(s1,pos,len,s2) | s1:指定字符串 pos:开始被替换的位置 len:被替换字符串长度 s2:新字符串 | |
instr(s1, s2) | 返回字符串s1中出现字符串s2的位置 | |
position(s2 in s1) | 返回字符串s1中第一次出现的子字符串s2的位置,若没有返回0 | |
concat(s1, s2,...) | 返回结果为连接参数产生的字符串 如果有字符串为 null 则为 null | |
concat_ws(s0, s1, s2, ...) | 用第一个参数作为连接符号将字符串连接 | |
group_concat(s) | 将group by产生的同一个分组中的值连接起来,返回一个字符串 | |
if(expr,v1,v2) | expr:条件 满足条件返回V1不满足条件返回V2 一般结合 substr() 进行爆破 | |
case when expr then v1 else v2 end | 满足expr,则返回V1,不满足则返回V2 同理 if | |
sleep(N) | 可以让此语句运行N秒 | |
oct() | 转换为8进制 | |
ord() | 返回第一个字符串的第一个字符的ASCII值 | |
hex() | 转换为16进制 | |
char() | 转换为字符串 | |
ascii() | ASCII值 | |